From f81a5a5cb1cd30678061bff31b2156090abe2a57 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 21 Dec 2025 13:12:43 +0100 Subject: [PATCH 001/630] sceNpClans: cleanup --- rpcs3/Emu/Cell/Modules/sceNp.h | 2 +- rpcs3/Emu/Cell/Modules/sceNpClans.cpp | 160 +++---- rpcs3/Emu/NP/clans_client.cpp | 603 +++++++++++++------------- rpcs3/Emu/NP/clans_client.h | 61 ++- rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 12 + rpcs3/rpcs3.vcxproj.filters | 6 +- 7 files changed, 420 insertions(+), 426 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.h b/rpcs3/Emu/Cell/Modules/sceNp.h index 6f29a2f8a9..88dd2d816b 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.h +++ b/rpcs3/Emu/Cell/Modules/sceNp.h @@ -1265,7 +1265,7 @@ struct SceNpCommunicationId // OnlineId structure struct SceNpOnlineId { - char data[16 + 1]; // char term; + char data[SCE_NET_NP_ONLINEID_MAX_LENGTH + 1]; // char term; char dummy[3]; }; diff --git a/rpcs3/Emu/Cell/Modules/sceNpClans.cpp b/rpcs3/Emu/Cell/Modules/sceNpClans.cpp index 64ac967d8e..1a9491ae6e 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpClans.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpClans.cpp @@ -144,9 +144,9 @@ error_code sceNpClansCreateRequest(vm::ptr handle, u64 } auto& clans_manager = g_fxo->get(); - + s32 reqId = 0; - SceNpClansError res = clans_manager.client->create_request(&reqId); + const SceNpClansError res = clans_manager.client->create_request(reqId); if (res != SCE_NP_CLANS_SUCCESS) { return res; @@ -167,8 +167,8 @@ error_code sceNpClansDestroyRequest(SceNpClansRequestHandle handle) } auto& clans_manager = g_fxo->get(); - - SceNpClansError res = clans_manager.client->destroy_request(handle); + + const SceNpClansError res = clans_manager.client->destroy_request(handle); if (res != SCE_NP_CLANS_SUCCESS) { return res; @@ -220,7 +220,7 @@ error_code sceNpClansCreateClan(SceNpClansRequestHandle handle, vm::cptr n std::string tag_str; vm::read_string(tag.addr(), SCE_NP_CLANS_CLAN_TAG_MAX_LENGTH, tag_str); - SceNpClansError res = clans_manager.client->create_clan(nph, handle, name_str, tag_str, clanId); + const SceNpClansError res = clans_manager.client->create_clan(nph, handle, name_str, tag_str, clanId); if (res != SCE_NP_CLANS_SUCCESS) { return res; @@ -246,7 +246,7 @@ error_code sceNpClansDisbandClan(SceNpClansRequestHandle handle, SceNpClanId cla auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpClansError res = clans_manager.client->disband_dlan(nph, handle, clanId); + const SceNpClansError res = clans_manager.client->disband_dlan(nph, handle, clanId); if (res != SCE_NP_CLANS_SUCCESS) { return res; @@ -283,13 +283,13 @@ error_code sceNpClansGetClanList(SceNpClansRequestHandle handle, vm::cptr host_clanList(SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX); SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->get_clan_list(nph, handle, &host_paging, host_clanList, &host_pageResult); + const SceNpClansError ret = clans_manager.client->get_clan_list(nph, handle, host_paging, host_clanList, host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -297,9 +297,9 @@ error_code sceNpClansGetClanList(SceNpClansRequestHandle handle, vm::cptr 0) { - std::memcpy(clanList.get_ptr(), host_clanList, sizeof(SceNpClansEntry) * host_pageResult.count); + std::memcpy(clanList.get_ptr(), host_clanList.data(), sizeof(SceNpClansEntry) * host_pageResult.count); } - std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); + *pageResult = host_pageResult; return CELL_OK; } @@ -383,16 +383,15 @@ error_code sceNpClansSearchByName(SceNpClansRequestHandle handle, vm::cptr host_results(SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX); SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->clan_search(handle, &host_paging, &host_search, host_results, &host_pageResult); + const SceNpClansError ret = clans_manager.client->clan_search(handle, host_paging, host_search, host_results, host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -400,9 +399,9 @@ error_code sceNpClansSearchByName(SceNpClansRequestHandle handle, vm::cptr 0) { - std::memcpy(results.get_ptr(), host_results, sizeof(SceNpClansClanBasicInfo) * host_pageResult.count); + std::memcpy(results.get_ptr(), host_results.data(), sizeof(SceNpClansClanBasicInfo) * host_pageResult.count); } - std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); + *pageResult = host_pageResult; return CELL_OK; } @@ -425,14 +424,14 @@ error_code sceNpClansGetClanInfo(SceNpClansRequestHandle handle, SceNpClanId cla auto& clans_manager = g_fxo->get(); SceNpClansClanInfo host_info = {}; - - SceNpClansError ret = clans_manager.client->get_clan_info(handle, clanId, &host_info); + + const SceNpClansError ret = clans_manager.client->get_clan_info(handle, clanId, host_info); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; } - - std::memcpy(info.get_ptr(), &host_info, sizeof(SceNpClansClanInfo)); + + *info = host_info; return CELL_OK; } @@ -455,10 +454,9 @@ error_code sceNpClansUpdateClanInfo(SceNpClansRequestHandle handle, SceNpClanId auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpClansUpdatableClanInfo host_info = {}; - std::memcpy(&host_info, info.get_ptr(), sizeof(SceNpClansUpdatableClanInfo)); + const SceNpClansUpdatableClanInfo host_info = *info; - SceNpClansError ret = clans_manager.client->update_clan_info(nph, handle, clanId, &host_info); + const SceNpClansError ret = clans_manager.client->update_clan_info(nph, handle, clanId, host_info); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -495,13 +493,13 @@ error_code sceNpClansGetMemberList(SceNpClansRequestHandle handle, SceNpClanId c SceNpClansPagingRequest host_paging = {}; if (paging) { - std::memcpy(&host_paging, paging.get_ptr(), sizeof(SceNpClansPagingRequest)); + host_paging = *paging; } - SceNpClansMemberEntry host_memList_addr[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; + std::vector host_memList_addr(SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX); SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->get_member_list(nph, handle, clanId, &host_paging, status, host_memList_addr, &host_pageResult); + const SceNpClansError ret = clans_manager.client->get_member_list(nph, handle, clanId, host_paging, status, host_memList_addr, host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -509,9 +507,9 @@ error_code sceNpClansGetMemberList(SceNpClansRequestHandle handle, SceNpClanId c if (memList && host_pageResult.count > 0) { - std::memcpy(memList.get_ptr(), host_memList_addr, sizeof(SceNpClansMemberEntry) * host_pageResult.count); + std::memcpy(memList.get_ptr(), host_memList_addr.data(), sizeof(SceNpClansMemberEntry) * host_pageResult.count); } - std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); + *pageResult = host_pageResult; return CELL_OK; } @@ -533,18 +531,17 @@ error_code sceNpClansGetMemberInfo(SceNpClansRequestHandle handle, SceNpClanId c auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_npid = {}; - std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); + const SceNpId host_npid = *npid; SceNpClansMemberEntry host_memInfo = {}; - SceNpClansError ret = clans_manager.client->get_member_info(nph, handle, clanId, host_npid, &host_memInfo); + const SceNpClansError ret = clans_manager.client->get_member_info(nph, handle, clanId, host_npid, host_memInfo); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; } - std::memcpy(memInfo.get_ptr(), &host_memInfo, sizeof(SceNpClansMemberEntry)); + *memInfo = host_memInfo; return CELL_OK; } @@ -566,10 +563,9 @@ error_code sceNpClansUpdateMemberInfo(SceNpClansRequestHandle handle, SceNpClanI auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpClansUpdatableMemberInfo host_info = {}; - std::memcpy(&host_info, info.get_ptr(), sizeof(SceNpClansUpdatableMemberInfo)); + const SceNpClansUpdatableMemberInfo host_info = *info; - SceNpClansError ret = clans_manager.client->update_member_info(nph, handle, clanId, &host_info); + const SceNpClansError ret = clans_manager.client->update_member_info(nph, handle, clanId, host_info); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -595,10 +591,9 @@ error_code sceNpClansChangeMemberRole(SceNpClansRequestHandle handle, SceNpClanI auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_npid = {}; - std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); + const SceNpId host_npid = *npid; - SceNpClansError ret = clans_manager.client->change_member_role(nph, handle, clanId, host_npid, static_cast(role)); + const SceNpClansError ret = clans_manager.client->change_member_role(nph, handle, clanId, host_npid, static_cast(role)); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -650,7 +645,7 @@ error_code sceNpClansJoinClan(SceNpClansRequestHandle handle, SceNpClanId clanId auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpClansError ret = clans_manager.client->join_clan(nph, handle, clanId); + const SceNpClansError ret = clans_manager.client->join_clan(nph, handle, clanId); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -671,7 +666,7 @@ error_code sceNpClansLeaveClan(SceNpClansRequestHandle handle, SceNpClanId clanI auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpClansError ret = clans_manager.client->leave_clan(nph, handle, clanId); + const SceNpClansError ret = clans_manager.client->leave_clan(nph, handle, clanId); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -705,16 +700,15 @@ error_code sceNpClansKickMember(SceNpClansRequestHandle handle, SceNpClanId clan auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_npid = {}; - std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); + const SceNpId host_npid = *npid; SceNpClansMessage host_message = {}; if (message) { - std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); + host_message = *message; } - SceNpClansError ret = clans_manager.client->kick_member(nph, handle, clanId, host_npid, &host_message); + const SceNpClansError ret = clans_manager.client->kick_member(nph, handle, clanId, host_npid, host_message); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -748,16 +742,15 @@ error_code sceNpClansSendInvitation(SceNpClansRequestHandle handle, SceNpClanId auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_npid = {}; - std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); + const SceNpId host_npid = *npid; SceNpClansMessage host_message = {}; if (message) { - std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); + host_message = *message; } - SceNpClansError ret = clans_manager.client->send_invitation(nph, handle, clanId, host_npid, &host_message); + const SceNpClansError ret = clans_manager.client->send_invitation(nph, handle, clanId, host_npid, host_message); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -783,10 +776,9 @@ error_code sceNpClansCancelInvitation(SceNpClansRequestHandle handle, SceNpClanI auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_npid = {}; - std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); + const SceNpId host_npid = *npid; - SceNpClansError ret = clans_manager.client->cancel_invitation(nph, handle, clanId, host_npid); + const SceNpClansError ret = clans_manager.client->cancel_invitation(nph, handle, clanId, host_npid); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -818,15 +810,10 @@ error_code sceNpClansSendInvitationResponse(SceNpClansRequestHandle handle, SceN SceNpClansMessage host_message = {}; if (message) { - std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); + host_message = *message; } - if (message) - { - std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); - } - - SceNpClansError ret = clans_manager.client->send_invitation_response(nph, handle, clanId, &host_message, accept); + const SceNpClansError ret = clans_manager.client->send_invitation_response(nph, handle, clanId, host_message, accept); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -858,10 +845,10 @@ error_code sceNpClansSendMembershipRequest(SceNpClansRequestHandle handle, u32 c SceNpClansMessage host_message = {}; if (message) { - std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); + host_message = *message; } - SceNpClansError ret = clans_manager.client->request_membership(nph, handle, clanId, &host_message); + const SceNpClansError ret = clans_manager.client->request_membership(nph, handle, clanId, host_message); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -882,8 +869,7 @@ error_code sceNpClansCancelMembershipRequest(SceNpClansRequestHandle handle, Sce auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpClansError ret = clans_manager.client->cancel_request_membership(nph, handle, clanId); - + const SceNpClansError ret = clans_manager.client->cancel_request_membership(nph, handle, clanId); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -917,16 +903,15 @@ error_code sceNpClansSendMembershipResponse(SceNpClansRequestHandle handle, SceN auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_npid = {}; - std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); + const SceNpId host_npid = *npid; SceNpClansMessage host_message = {}; if (message) { - std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); + host_message = *message; } - SceNpClansError ret = clans_manager.client->send_membership_response(nph, handle, clanId, host_npid, &host_message, allow); + const SceNpClansError ret = clans_manager.client->send_membership_response(nph, handle, clanId, host_npid, host_message, allow); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -963,13 +948,13 @@ error_code sceNpClansGetBlacklist(SceNpClansRequestHandle handle, SceNpClanId cl SceNpClansPagingRequest host_paging = {}; if (paging) { - std::memcpy(&host_paging, paging.get_ptr(), sizeof(SceNpClansPagingRequest)); + host_paging = *paging; } - SceNpClansBlacklistEntry host_blacklist[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; + std::vector host_blacklist(SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX); SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->get_blacklist(nph, handle, clanId, &host_paging, host_blacklist, &host_pageResult); + const SceNpClansError ret = clans_manager.client->get_blacklist(nph, handle, clanId, host_paging, host_blacklist, host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -977,9 +962,9 @@ error_code sceNpClansGetBlacklist(SceNpClansRequestHandle handle, SceNpClanId cl if (bl && host_pageResult.count > 0) { - std::memcpy(bl.get_ptr(), host_blacklist, sizeof(SceNpClansBlacklistEntry) * host_pageResult.count); + std::memcpy(bl.get_ptr(), host_blacklist.data(), sizeof(SceNpClansBlacklistEntry) * host_pageResult.count); } - std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); + *pageResult = host_pageResult; return CELL_OK; } @@ -1001,10 +986,9 @@ error_code sceNpClansAddBlacklistEntry(SceNpClansRequestHandle handle, SceNpClan auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_member = {}; - std::memcpy(&host_member, member.get_ptr(), sizeof(SceNpId)); + const SceNpId host_member = *member; - SceNpClansError ret = clans_manager.client->add_blacklist_entry(nph, handle, clanId, host_member); + const SceNpClansError ret = clans_manager.client->add_blacklist_entry(nph, handle, clanId, host_member); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -1030,10 +1014,9 @@ error_code sceNpClansRemoveBlacklistEntry(SceNpClansRequestHandle handle, SceNpC auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_member = {}; - std::memcpy(&host_member, member.get_ptr(), sizeof(SceNpId)); + const SceNpId host_member = *member; - SceNpClansError ret = clans_manager.client->remove_blacklist_entry(nph, handle, clanId, host_member); + const SceNpClansError ret = clans_manager.client->remove_blacklist_entry(nph, handle, clanId, host_member); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -1070,13 +1053,13 @@ error_code sceNpClansRetrieveAnnouncements(SceNpClansRequestHandle handle, SceNp SceNpClansPagingRequest host_paging = {}; if (paging) { - std::memcpy(&host_paging, paging.get_ptr(), sizeof(SceNpClansPagingRequest)); + host_paging = *paging; } - SceNpClansMessageEntry host_announcements[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; + std::vector host_announcements(SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX); SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->retrieve_announcements(nph, handle, clanId, &host_paging, host_announcements, &host_pageResult); + const SceNpClansError ret = clans_manager.client->retrieve_announcements(nph, handle, clanId, host_paging, host_announcements, host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -1084,9 +1067,9 @@ error_code sceNpClansRetrieveAnnouncements(SceNpClansRequestHandle handle, SceNp if (mlist && host_pageResult.count > 0) { - std::memcpy(mlist.get_ptr(), host_announcements, sizeof(SceNpClansMessageEntry) * host_pageResult.count); + std::memcpy(mlist.get_ptr(), host_announcements.data(), sizeof(SceNpClansMessageEntry) * host_pageResult.count); } - std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); + *pageResult = host_pageResult; return CELL_OK; } @@ -1113,17 +1096,16 @@ error_code sceNpClansPostAnnouncement(SceNpClansRequestHandle handle, SceNpClanI auto& clans_manager = g_fxo->get(); auto& nph = g_fxo->get>(); - SceNpClansMessage host_announcement = {}; - std::memcpy(&host_announcement, message.get_ptr(), sizeof(SceNpClansMessage)); + const SceNpClansMessage host_announcement = *message; SceNpClansMessageData host_data = {}; if (data) { - std::memcpy(&host_data, data.get_ptr(), sizeof(SceNpClansMessageData)); + host_data = *data; } SceNpClansMessageId host_announcementId = 0; - SceNpClansError ret = clans_manager.client->post_announcement(nph, handle, clanId, &host_announcement, &host_data, duration, &host_announcementId); + const SceNpClansError ret = clans_manager.client->post_announcement(nph, handle, clanId, host_announcement, host_data, duration, host_announcementId); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -1146,7 +1128,7 @@ error_code sceNpClansRemoveAnnouncement(SceNpClansRequestHandle handle, SceNpCla auto& clans_manager = g_fxo->get(); auto& nph = g_fxo->get>(); - SceNpClansError ret = clans_manager.client->delete_announcement(nph, handle, clanId, mId); + const SceNpClansError ret = clans_manager.client->delete_announcement(nph, handle, clanId, mId); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; diff --git a/rpcs3/Emu/NP/clans_client.cpp b/rpcs3/Emu/NP/clans_client.cpp index 7883901476..da3f506c91 100644 --- a/rpcs3/Emu/NP/clans_client.cpp +++ b/rpcs3/Emu/NP/clans_client.cpp @@ -128,18 +128,18 @@ void fmt_class_string::format(std::string& out, u64 arg namespace clan { - struct curl_memory - { + struct curl_memory + { char* response; size_t size; - }; + }; size_t clans_client::curl_write_callback(void* data, size_t size, size_t nmemb, void* clientp) { - size_t realsize = size * nmemb; + const size_t realsize = size * nmemb; std::vector* mem = static_cast*>(clientp); - size_t old_size = mem->size(); + const size_t old_size = mem->size(); mem->resize(old_size + realsize); memcpy(mem->data() + old_size, data, realsize); @@ -169,11 +169,11 @@ namespace clan CURL* curl = nullptr; // TODO: this was arbitrarily chosen -- see if there's a real amount - static const u32 SCE_NP_CLANS_MAX_CTX_NUM = 16; - - static const u32 id_base = 0xA001; - static const u32 id_step = 1; - static const u32 id_count = SCE_NP_CLANS_MAX_CTX_NUM; + static constexpr u32 SCE_NP_CLANS_MAX_CTX_NUM = 16; + + static constexpr u32 id_base = 0xA001; + static constexpr u32 id_step = 1; + static constexpr u32 id_count = SCE_NP_CLANS_MAX_CTX_NUM; SAVESTATE_INIT_POS(55); }; @@ -187,7 +187,7 @@ namespace clan idm::clear(); } - SceNpClansError clans_client::create_request(s32* req_id) + SceNpClansError clans_client::create_request(s32& req_id) { if (!g_cfg.net.clans_enabled) { @@ -201,14 +201,14 @@ namespace clan return SceNpClansError::SCE_NP_CLANS_ERROR_EXCEEDS_MAX; } - auto ctx = idm::get_unlocked(id); + const auto ctx = idm::get_unlocked(id); if (!ctx || !ctx->curl) { idm::remove(id); return SceNpClansError::SCE_NP_CLANS_ERROR_NOT_INITIALIZED; } - *req_id = id; + req_id = id; return SceNpClansError::SCE_NP_CLANS_SUCCESS; } @@ -221,7 +221,7 @@ namespace clan return SceNpClansError::SCE_NP_CLANS_ERROR_INVALID_ARGUMENT; } - SceNpClansError clans_client::send_request(u32 req_id, ClanRequestAction action, ClanManagerOperationType op_type, pugi::xml_document* xml_body, pugi::xml_document* out_response) + SceNpClansError clans_client::send_request(u32 req_id, ClanRequestAction action, ClanManagerOperationType op_type, const pugi::xml_document& xml_body, pugi::xml_document& out_response) { auto ctx = idm::get_unlocked(req_id); @@ -231,20 +231,20 @@ namespace clan CURL* curl = ctx->curl; ClanRequestType req_type = ClanRequestType::FUNC; - pugi::xml_node clan = xml_body->child("clan"); + const pugi::xml_node clan = xml_body.child("clan"); if (clan && clan.child("ticket")) { req_type = ClanRequestType::SEC; } - std::string host = g_cfg_clans.get_host(); - std::string protocol = g_cfg_clans.get_use_https() ? "https" : "http"; - std::string url = fmt::format("%s://%s/clan_manager_%s/%s/%s", protocol, host, op_type, req_type, action); + const std::string host = g_cfg_clans.get_host(); + const std::string protocol = g_cfg_clans.get_use_https() ? "https" : "http"; + const std::string url = fmt::format("%s://%s/clan_manager_%s/%s/%s", protocol, host, op_type, req_type, action); std::ostringstream oss; - xml_body->save(oss, "\t", 8U); + xml_body.save(oss, "\t", 8U); - std::string xml = oss.str(); + const std::string xml = oss.str(); char err_buf[CURL_ERROR_SIZE]; err_buf[0] = '\0'; @@ -264,11 +264,10 @@ namespace clan curl_easy_setopt(curl, CURLOPT_POSTFIELDS, xml.c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, xml.size()); - CURLcode res = curl_easy_perform(curl); + const CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { - out_response = nullptr; clan_log.error("curl_easy_perform() failed: %s", curl_easy_strerror(res)); clan_log.error("Error buffer: %s", err_buf); return SCE_NP_CLANS_ERROR_BAD_REQUEST; @@ -276,22 +275,22 @@ namespace clan response_buffer.push_back('\0'); - pugi::xml_parse_result xml_res = out_response->load_string(response_buffer.data()); + const pugi::xml_parse_result xml_res = out_response.load_string(response_buffer.data()); if (!xml_res) { clan_log.error("XML parsing failed: %s", xml_res.description()); return SCE_NP_CLANS_ERROR_BAD_RESPONSE; } - pugi::xml_node clan_result = out_response->child("clan"); + const pugi::xml_node clan_result = out_response.child("clan"); if (!clan_result) return SCE_NP_CLANS_ERROR_BAD_RESPONSE; - pugi::xml_attribute result = clan_result.attribute("result"); + const pugi::xml_attribute result = clan_result.attribute("result"); if (!result) return SCE_NP_CLANS_ERROR_BAD_RESPONSE; - std::string result_str = result.as_string(); + const std::string result_str = result.as_string(); if (result_str != "00") return static_cast(0x80022800 | std::stoul(result_str, nullptr, 16)); @@ -331,16 +330,16 @@ namespace clan std::vector ticket_bytes(1024); uint32_t ticket_size = UINT32_MAX; - Base64_Encode_NoNl(clan_ticket.data(), clan_ticket.size(), ticket_bytes.data(), &ticket_size); - std::string ticket_str = std::string(reinterpret_cast(ticket_bytes.data()), ticket_size); + Base64_Encode_NoNl(clan_ticket.data(), static_cast(clan_ticket.size()), ticket_bytes.data(), &ticket_size); + const std::string ticket_str = std::string(reinterpret_cast(ticket_bytes.data()), ticket_size); return ticket_str; } #pragma region Outgoing API Requests - SceNpClansError clans_client::get_clan_list(np::np_handler& nph, u32 req_id, SceNpClansPagingRequest* paging, SceNpClansEntry* clan_list, SceNpClansPagingResult* page_result) + SceNpClansError clans_client::get_clan_list(np::np_handler& nph, u32 req_id, const SceNpClansPagingRequest& paging, std::vector& clan_list, SceNpClansPagingResult& page_result) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -348,47 +347,47 @@ namespace clan pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("start").text().set(paging->startPos); - clan.append_child("max").text().set(paging->max); + clan.append_child("start").text().set(paging.startPos); + clan.append_child("max").text().set(paging.max); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetClanList, ClanManagerOperationType::VIEW, &doc, &response); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetClanList, ClanManagerOperationType::VIEW, doc, response); if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - pugi::xml_node clan_result = response.child("clan"); - pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"); + const pugi::xml_node list = clan_result.child("list"); - pugi::xml_attribute results = list.attribute("results"); - uint32_t results_count = results.as_uint(); + const pugi::xml_attribute results = list.attribute("results"); + const uint32_t results_count = results.as_uint(); - pugi::xml_attribute total = list.attribute("total"); - uint32_t total_count = total.as_uint(); + const pugi::xml_attribute total = list.attribute("total"); + const uint32_t total_count = total.as_uint(); int i = 0; for (pugi::xml_node info = list.child("info"); info; info = info.next_sibling("info"), i++) { - pugi::xml_attribute id = info.attribute("id"); - uint32_t clan_id = id.as_uint(); + const pugi::xml_attribute id = info.attribute("id"); + const uint32_t clan_id = id.as_uint(); - pugi::xml_node name = info.child("name"); - std::string name_str = name.text().as_string(); + const pugi::xml_node name = info.child("name"); + const std::string name_str = name.text().as_string(); - pugi::xml_node tag = info.child("tag"); - std::string tag_str = tag.text().as_string(); + const pugi::xml_node tag = info.child("tag"); + const std::string tag_str = tag.text().as_string(); - pugi::xml_node role = info.child("role"); - int32_t role_int = role.text().as_uint(); + const pugi::xml_node role = info.child("role"); + const int32_t role_int = role.text().as_uint(); - pugi::xml_node status = info.child("status"); - uint32_t status_int = status.text().as_uint(); + const pugi::xml_node status = info.child("status"); + const uint32_t status_int = status.text().as_uint(); - pugi::xml_node onlinename = info.child("onlinename"); - std::string onlinename_str = onlinename.text().as_string(); + const pugi::xml_node onlinename = info.child("onlinename"); + const std::string onlinename_str = onlinename.text().as_string(); - pugi::xml_node members = info.child("members"); - uint32_t members_int = members.text().as_uint(); + const pugi::xml_node members = info.child("members"); + const uint32_t members_int = members.text().as_uint(); SceNpClansEntry entry = SceNpClansEntry{ .info = SceNpClansClanBasicInfo{ @@ -402,41 +401,41 @@ namespace clan .status = static_cast(status_int)}; strcpy_trunc(entry.info.name, name_str); - strcpy_trunc(entry.info.tag, tag_str); + strcpy_trunc(entry.info.tag, tag_str); - clan_list[i] = entry; + ::at32(clan_list, i) = std::move(entry); i++; } - *page_result = SceNpClansPagingResult{ + page_result = SceNpClansPagingResult{ .count = results_count, .total = total_count}; return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::get_clan_info(u32 req_id, SceNpClanId clan_id, SceNpClansClanInfo* clan_info) + SceNpClansError clans_client::get_clan_info(u32 req_id, SceNpClanId clan_id, SceNpClansClanInfo& clan_info) { pugi::xml_document doc = pugi::xml_document(); pugi::xml_node clan = doc.append_child("clan"); clan.append_child("id").text().set(clan_id); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetClanInfo, ClanManagerOperationType::VIEW, &doc, &response); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetClanInfo, ClanManagerOperationType::VIEW, doc, response); if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - pugi::xml_node clan_result = response.child("clan"); - pugi::xml_node info = clan_result.child("info"); + const pugi::xml_node clan_result = response.child("clan"); + const pugi::xml_node info = clan_result.child("info"); - std::string name_str = info.child("name").text().as_string(); - std::string tag_str = info.child("tag").text().as_string(); - uint32_t members_int = info.child("members").text().as_uint(); - std::string date_created_str = info.child("date-created").text().as_string(); - std::string description_str = info.child("description").text().as_string(); + const std::string name_str = info.child("name").text().as_string(); + const std::string tag_str = info.child("tag").text().as_string(); + const uint32_t members_int = info.child("members").text().as_uint(); + const std::string date_created_str = info.child("date-created").text().as_string(); + const std::string description_str = info.child("description").text().as_string(); - *clan_info = SceNpClansClanInfo{ + clan_info = SceNpClansClanInfo{ .info = SceNpClansClanBasicInfo{ .clanId = clan_id, .numMembers = members_int, @@ -447,16 +446,16 @@ namespace clan .description = "", }}; - strcpy_trunc(clan_info->info.name, name_str); - strcpy_trunc(clan_info->info.tag, tag_str); - strcpy_trunc(clan_info->updatable.description, description_str); + strcpy_trunc(clan_info.info.name, name_str); + strcpy_trunc(clan_info.info.tag, tag_str); + strcpy_trunc(clan_info.updatable.description, description_str); return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::get_member_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMemberEntry* mem_info) + SceNpClansError clans_client::get_member_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMemberEntry& mem_info) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -464,22 +463,22 @@ namespace clan pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - - std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); - clan.append_child("jid").text().set(jid_str.c_str()); + + const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetMemberInfo, ClanManagerOperationType::VIEW, &doc, &response); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetMemberInfo, ClanManagerOperationType::VIEW, doc, response); if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - pugi::xml_node clan_result = response.child("clan"); - pugi::xml_node member_info = clan_result.child("info"); + const pugi::xml_node clan_result = response.child("clan"); + const pugi::xml_node member_info = clan_result.child("info"); - pugi::xml_attribute member_jid = member_info.attribute("jid"); - std::string member_jid_str = member_jid.as_string(); - std::string member_username = fmt::split(member_jid_str, {"@"})[0]; + const pugi::xml_attribute member_jid = member_info.attribute("jid"); + const std::string member_jid_str = member_jid.as_string(); + const std::string member_username = fmt::split(member_jid_str, {"@"})[0]; SceNpId member_npid; if (strncmp(member_username.c_str(), nph.get_npid().handle.data, 16) == 0) @@ -491,18 +490,18 @@ namespace clan np::string_to_npid(member_username, member_npid); } - pugi::xml_node role = member_info.child("role"); - uint32_t role_int = role.text().as_uint(); + const pugi::xml_node role = member_info.child("role"); + const uint32_t role_int = role.text().as_uint(); - pugi::xml_node status = member_info.child("status"); - uint32_t status_int = status.text().as_uint(); + const pugi::xml_node status = member_info.child("status"); + const uint32_t status_int = status.text().as_uint(); - pugi::xml_node description = member_info.child("description"); - std::string description_str = description.text().as_string(); + const pugi::xml_node description = member_info.child("description"); + const std::string description_str = description.text().as_string(); - *mem_info = SceNpClansMemberEntry + mem_info = SceNpClansMemberEntry { - .npid = member_npid, + .npid = std::move(member_npid), .role = static_cast(role_int), .status = static_cast(status_int), .updatable = SceNpClansUpdatableMemberInfo{ @@ -510,47 +509,47 @@ namespace clan } }; - strcpy_trunc(mem_info->updatable.description, description_str); + strcpy_trunc(mem_info.updatable.description, description_str); return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::get_member_list(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansPagingRequest* paging, SceNpClansMemberStatus /*status*/, SceNpClansMemberEntry* mem_list, SceNpClansPagingResult* page_result) - { - std::string ticket = get_clan_ticket(nph); + SceNpClansError clans_client::get_member_list(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansPagingRequest& paging, SceNpClansMemberStatus /*status*/, std::vector& mem_list, SceNpClansPagingResult& page_result) + { + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; - pugi::xml_document doc = pugi::xml_document(); + pugi::xml_document doc = pugi::xml_document(); pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - clan.append_child("start").text().set(paging->startPos); - clan.append_child("max").text().set(paging->max); + clan.append_child("start").text().set(paging.startPos); + clan.append_child("max").text().set(paging.max); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetMemberList, ClanManagerOperationType::VIEW, &doc, &response); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetMemberList, ClanManagerOperationType::VIEW, doc, response); if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - pugi::xml_node clan_result = response.child("clan"); - pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"); + const pugi::xml_node list = clan_result.child("list"); - pugi::xml_attribute results = list.attribute("results"); - uint32_t results_count = results.as_uint(); + const pugi::xml_attribute results = list.attribute("results"); + const uint32_t results_count = results.as_uint(); - pugi::xml_attribute total = list.attribute("total"); - uint32_t total_count = total.as_uint(); - - int i = 0; - for (pugi::xml_node member_info = list.child("info"); member_info; member_info = member_info.next_sibling("info")) - { - std::string member_jid = member_info.attribute("jid").as_string(); - std::string member_username = fmt::split(member_jid, {"@"})[0]; + const pugi::xml_attribute total = list.attribute("total"); + const uint32_t total_count = total.as_uint(); + + int i = 0; + for (pugi::xml_node member_info = list.child("info"); member_info; member_info = member_info.next_sibling("info")) + { + const std::string member_jid = member_info.attribute("jid").as_string(); + const std::string member_username = fmt::split(member_jid, {"@"})[0]; SceNpId member_npid; - if (strncmp(member_username.c_str(), nph.get_npid().handle.data, 16) == 0) + if (strncmp(member_username.c_str(), nph.get_npid().handle.data, SCE_NET_NP_ONLINEID_MAX_LENGTH) == 0) { member_npid = nph.get_npid(); } @@ -559,67 +558,67 @@ namespace clan np::string_to_npid(member_username, member_npid); } - uint32_t role_int = member_info.child("role").text().as_uint(); - uint32_t status_int = member_info.child("status").text().as_uint(); - std::string description_str = member_info.child("description").text().as_string(); + const uint32_t role_int = member_info.child("role").text().as_uint(); + const uint32_t status_int = member_info.child("status").text().as_uint(); + const std::string description_str = member_info.child("description").text().as_string(); - SceNpClansMemberEntry entry = SceNpClansMemberEntry - { - .npid = member_npid, - .role = static_cast(role_int), - .status = static_cast(status_int), - }; + SceNpClansMemberEntry entry = SceNpClansMemberEntry + { + .npid = std::move(member_npid), + .role = static_cast(role_int), + .status = static_cast(status_int), + }; strcpy_trunc(entry.updatable.description, description_str); - - mem_list[i] = entry; - i++; - } - *page_result = SceNpClansPagingResult - { + ::at32(mem_list, i) = std::move(entry); + i++; + } + + page_result = SceNpClansPagingResult + { .count = results_count, .total = total_count - }; + }; return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::get_blacklist(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* page_result) - { - std::string ticket = get_clan_ticket(nph); + SceNpClansError clans_client::get_blacklist(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansPagingRequest& paging, std::vector& bl, SceNpClansPagingResult& page_result) + { + const std::string ticket = get_clan_ticket(nph); - pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("ticket").text().set(ticket.c_str()); - clan.append_child("id").text().set(clan_id); - clan.append_child("start").text().set(paging->startPos); - clan.append_child("max").text().set(paging->max); + pugi::xml_document doc = pugi::xml_document(); + pugi::xml_node clan = doc.append_child("clan"); + clan.append_child("ticket").text().set(ticket.c_str()); + clan.append_child("id").text().set(clan_id); + clan.append_child("start").text().set(paging.startPos); + clan.append_child("max").text().set(paging.max); - pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetBlacklist, ClanManagerOperationType::VIEW, &doc, &response); + pugi::xml_document response = pugi::xml_document(); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::GetBlacklist, ClanManagerOperationType::VIEW, doc, response); - if (clan_res != SCE_NP_CLANS_SUCCESS) - return clan_res; + if (clan_res != SCE_NP_CLANS_SUCCESS) + return clan_res; - pugi::xml_node clan_result = response.child("clan"); - pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"); + const pugi::xml_node list = clan_result.child("list"); - pugi::xml_attribute results = list.attribute("results"); - uint32_t results_count = results.as_uint(); + const pugi::xml_attribute results = list.attribute("results"); + const uint32_t results_count = results.as_uint(); - pugi::xml_attribute total = list.attribute("total"); - uint32_t total_count = total.as_uint(); + const pugi::xml_attribute total = list.attribute("total"); + const uint32_t total_count = total.as_uint(); - int i = 0; - for (pugi::xml_node member = list.child("entry"); member; member = member.next_sibling("entry")) - { - pugi::xml_node member_jid = member.child("jid"); - std::string member_jid_str = member_jid.text().as_string(); - std::string member_username = fmt::split(member_jid_str, {"@"})[0]; + int i = 0; + for (pugi::xml_node member = list.child("entry"); member; member = member.next_sibling("entry")) + { + const pugi::xml_node member_jid = member.child("jid"); + const std::string member_jid_str = member_jid.text().as_string(); + const std::string member_username = fmt::split(member_jid_str, {"@"})[0]; SceNpId member_npid = {}; - if (strncmp(member_username.c_str(), nph.get_npid().handle.data, 16) == 0) + if (strncmp(member_username.c_str(), nph.get_npid().handle.data, SCE_NET_NP_ONLINEID_MAX_LENGTH) == 0) { member_npid = nph.get_npid(); } @@ -628,27 +627,27 @@ namespace clan np::string_to_npid(member_username.c_str(), member_npid); } - SceNpClansBlacklistEntry entry = SceNpClansBlacklistEntry - { - .entry = member_npid, - }; + SceNpClansBlacklistEntry entry = SceNpClansBlacklistEntry + { + .entry = std::move(member_npid), + }; - bl[i] = entry; - i++; - } + ::at32(bl, i) = std::move(entry); + i++; + } - *page_result = SceNpClansPagingResult - { - .count = results_count, - .total = total_count - }; + page_result = SceNpClansPagingResult + { + .count = results_count, + .total = total_count + }; - return SCE_NP_CLANS_SUCCESS; - } + return SCE_NP_CLANS_SUCCESS; + } - SceNpClansError clans_client::add_blacklist_entry(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id) + SceNpClansError clans_client::add_blacklist_entry(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -657,14 +656,14 @@ namespace clan clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::RecordBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::RecordBlacklistEntry, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::remove_blacklist_entry(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id) + SceNpClansError clans_client::remove_blacklist_entry(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id) { std::string ticket = get_clan_ticket(nph); if (ticket.empty()) @@ -674,50 +673,50 @@ namespace clan pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - - std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); - clan.append_child("jid").text().set(jid_str.c_str()); + + const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::DeleteBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::DeleteBlacklistEntry, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::clan_search(u32 req_id, SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clan_list, SceNpClansPagingResult* page_result) + SceNpClansError clans_client::clan_search(u32 req_id, const SceNpClansPagingRequest& paging, const SceNpClansSearchableName& search, std::vector& clan_list, SceNpClansPagingResult& page_result) { pugi::xml_document doc = pugi::xml_document(); - pugi::xml_node clan = doc.append_child("clan"); - clan.append_child("start").text().set(paging->startPos); - clan.append_child("max").text().set(paging->max); + pugi::xml_node clan = doc.append_child("clan"); + clan.append_child("start").text().set(paging.startPos); + clan.append_child("max").text().set(paging.max); pugi::xml_node filter = clan.append_child("filter"); pugi::xml_node name = filter.append_child("name"); - - std::string op_name = fmt::format("%s", static_cast(static_cast(search->nameSearchOp))); + + const std::string op_name = fmt::format("%s", static_cast(static_cast(search.nameSearchOp))); name.append_attribute("op").set_value(op_name.c_str()); - name.append_attribute("value").set_value(search->name); + name.append_attribute("value").set_value(search.name); - pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::ClanSearch, ClanManagerOperationType::VIEW, &doc, &response); + pugi::xml_document response = pugi::xml_document(); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::ClanSearch, ClanManagerOperationType::VIEW, doc, response); - if (clan_res != SCE_NP_CLANS_SUCCESS) - return clan_res; + if (clan_res != SCE_NP_CLANS_SUCCESS) + return clan_res; - pugi::xml_node clan_result = response.child("clan"); - pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"); + const pugi::xml_node list = clan_result.child("list"); - pugi::xml_attribute results = list.attribute("results"); - uint32_t results_count = results.as_uint(); + const pugi::xml_attribute results = list.attribute("results"); + const uint32_t results_count = results.as_uint(); - pugi::xml_attribute total = list.attribute("total"); - uint32_t total_count = total.as_uint(); + const pugi::xml_attribute total = list.attribute("total"); + const uint32_t total_count = total.as_uint(); - int i = 0; - for (pugi::xml_node node = list.child("info"); node; node = node.next_sibling("info")) - { - uint32_t clan_id = node.attribute("id").as_uint(); - std::string name_str = node.child("name").text().as_string(); - std::string tag_str = node.child("tag").text().as_string(); - uint32_t members_int = node.child("members").text().as_uint(); + int i = 0; + for (pugi::xml_node node = list.child("info"); node; node = node.next_sibling("info")) + { + const uint32_t clan_id = node.attribute("id").as_uint(); + const std::string name_str = node.child("name").text().as_string(); + const std::string tag_str = node.child("tag").text().as_string(); + const uint32_t members_int = node.child("members").text().as_uint(); SceNpClansClanBasicInfo entry = SceNpClansClanBasicInfo { @@ -731,22 +730,22 @@ namespace clan strcpy_trunc(entry.name, name_str); strcpy_trunc(entry.tag, tag_str); - clan_list[i] = entry; - i++; - } + ::at32(clan_list, i) = std::move(entry); + i++; + } - *page_result = SceNpClansPagingResult - { - .count = results_count, - .total = total_count - }; + page_result = SceNpClansPagingResult + { + .count = results_count, + .total = total_count + }; - return SCE_NP_CLANS_SUCCESS; + return SCE_NP_CLANS_SUCCESS; } SceNpClansError clans_client::create_clan(np::np_handler& nph, u32 req_id, std::string_view name, std::string_view tag, vm::ptr clan_id) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -758,14 +757,14 @@ namespace clan clan.append_child("tag").text().set(tag.data()); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::CreateClan, ClanManagerOperationType::UPDATE, &doc, &response); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::CreateClan, ClanManagerOperationType::UPDATE, doc, response); if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - pugi::xml_node clan_result = response.child("clan"); - pugi::xml_attribute id = clan_result.attribute("id"); - uint32_t clan_id_int = id.as_uint(); + const pugi::xml_node clan_result = response.child("clan"); + const pugi::xml_attribute id = clan_result.attribute("id"); + const uint32_t clan_id_int = id.as_uint(); *clan_id = clan_id_int; @@ -774,7 +773,7 @@ namespace clan SceNpClansError clans_client::disband_dlan(np::np_handler& nph, u32 req_id, SceNpClanId clan_id) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -784,7 +783,7 @@ namespace clan clan.append_child("id").text().set(clan_id); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::DisbandClan, ClanManagerOperationType::UPDATE, &doc, &response); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::DisbandClan, ClanManagerOperationType::UPDATE, doc, response); if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; @@ -792,9 +791,9 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::request_membership(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage* /*message*/) + SceNpClansError clans_client::request_membership(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage& /*message*/) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -804,12 +803,12 @@ namespace clan clan.append_child("id").text().set(clan_id); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::RequestMembership, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::RequestMembership, ClanManagerOperationType::UPDATE, doc, response); } SceNpClansError clans_client::cancel_request_membership(np::np_handler& nph, u32 req_id, SceNpClanId clan_id) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -819,12 +818,12 @@ namespace clan clan.append_child("id").text().set(clan_id); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::CancelRequestMembership, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::CancelRequestMembership, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::send_membership_response(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMessage* /*message*/, b8 allow) + SceNpClansError clans_client::send_membership_response(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMessage& /*message*/, b8 allow) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -832,17 +831,17 @@ namespace clan pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - - std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); - clan.append_child("jid").text().set(jid_str.c_str()); + + const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, allow ? ClanRequestAction::AcceptMembershipRequest : ClanRequestAction::DeclineMembershipRequest, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, allow ? ClanRequestAction::AcceptMembershipRequest : ClanRequestAction::DeclineMembershipRequest, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::send_invitation(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMessage* /*message*/) + SceNpClansError clans_client::send_invitation(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMessage& /*message*/) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -850,17 +849,17 @@ namespace clan pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - - std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); - clan.append_child("jid").text().set(jid_str.c_str()); + + const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::SendInvitation, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::SendInvitation, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::cancel_invitation(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id) + SceNpClansError clans_client::cancel_invitation(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -868,17 +867,17 @@ namespace clan pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - - std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); - clan.append_child("jid").text().set(jid_str.c_str()); + + const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::CancelInvitation, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::CancelInvitation, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::send_invitation_response(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage* /*message*/, b8 accept) + SceNpClansError clans_client::send_invitation_response(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage& /*message*/, b8 accept) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -888,12 +887,12 @@ namespace clan clan.append_child("id").text().set(clan_id); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, accept ? ClanRequestAction::AcceptInvitation : ClanRequestAction::DeclineInvitation, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, accept ? ClanRequestAction::AcceptInvitation : ClanRequestAction::DeclineInvitation, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::update_member_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansUpdatableMemberInfo* info) + SceNpClansError clans_client::update_member_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansUpdatableMemberInfo& info) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -906,33 +905,33 @@ namespace clan role.text().set(nph.get_npid().handle.data); pugi::xml_node description = clan.append_child("description"); - description.text().set(info->description); - + description.text().set(info.description); + pugi::xml_node status = clan.append_child("bin-attr1"); byte bin_attr_1[SCE_NP_CLANS_MEMBER_BINARY_ATTRIBUTE1_MAX_SIZE * 2 + 1] = {0}; uint32_t bin_attr_1_size = UINT32_MAX; - Base64_Encode_NoNl(info->binAttr1, info->binData1Size, bin_attr_1, &bin_attr_1_size); + Base64_Encode_NoNl(info.binAttr1, info.binData1Size, bin_attr_1, &bin_attr_1_size); if (bin_attr_1_size == UINT32_MAX) return SCE_NP_CLANS_ERROR_INVALID_ARGUMENT; - - // `reinterpret_cast` used to let the compiler select the correct overload of `set` + + // `reinterpret_cast` used to let the compiler select the correct overload of `set` status.text().set(reinterpret_cast(bin_attr_1)); pugi::xml_node allow_msg = clan.append_child("allow-msg"); - allow_msg.text().set(static_cast(info->allowMsg)); + allow_msg.text().set(static_cast(info.allowMsg)); pugi::xml_node size = clan.append_child("size"); - size.text().set(info->binData1Size); + size.text().set(info.binData1Size); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::UpdateMemberInfo, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::UpdateMemberInfo, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::update_clan_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansUpdatableClanInfo* info) + SceNpClansError clans_client::update_clan_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansUpdatableClanInfo& info) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -944,15 +943,15 @@ namespace clan // TODO: implement binary and integer attributes (not implemented in server yet) pugi::xml_node description = clan.append_child("description"); - description.text().set(info->description); + description.text().set(info.description); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::UpdateClanInfo, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::UpdateClanInfo, ClanManagerOperationType::UPDATE, doc, response); } SceNpClansError clans_client::join_clan(np::np_handler& nph, u32 req_id, SceNpClanId clan_id) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -962,12 +961,12 @@ namespace clan clan.append_child("id").text().set(clan_id); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::JoinClan, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::JoinClan, ClanManagerOperationType::UPDATE, doc, response); } SceNpClansError clans_client::leave_clan(np::np_handler& nph, u32 req_id, SceNpClanId clan_id) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -977,12 +976,12 @@ namespace clan clan.append_child("id").text().set(clan_id); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::LeaveClan, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::LeaveClan, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::kick_member(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMessage* /*message*/) + SceNpClansError clans_client::kick_member(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMessage& /*message*/) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -990,17 +989,17 @@ namespace clan pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - - std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); - clan.append_child("jid").text().set(jid_str.c_str()); + + const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::KickMember, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::KickMember, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::change_member_role(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMemberRole role) + SceNpClansError clans_client::change_member_role(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMemberRole role) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -1008,20 +1007,20 @@ namespace clan pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - - std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); - clan.append_child("jid").text().set(jid_str.c_str()); + + const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_node role_node = clan.append_child("role"); role_node.text().set(static_cast(role)); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::ChangeMemberRole, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::ChangeMemberRole, ClanManagerOperationType::UPDATE, doc, response); } - SceNpClansError clans_client::retrieve_announcements(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* page_result) + SceNpClansError clans_client::retrieve_announcements(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansPagingRequest& paging, std::vector& announcements, SceNpClansPagingResult& page_result) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -1029,39 +1028,39 @@ namespace clan pugi::xml_node clan = doc.append_child("clan"); clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - clan.append_child("start").text().set(paging->startPos); - clan.append_child("max").text().set(paging->max); + clan.append_child("start").text().set(paging.startPos); + clan.append_child("max").text().set(paging.max); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::RetrieveAnnouncements, ClanManagerOperationType::VIEW, &doc, &response); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::RetrieveAnnouncements, ClanManagerOperationType::VIEW, doc, response); if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - pugi::xml_node clan_result = response.child("clan"); - pugi::xml_node list = clan_result.child("list"); + const pugi::xml_node clan_result = response.child("clan"); + const pugi::xml_node list = clan_result.child("list"); - pugi::xml_attribute results = list.attribute("results"); - uint32_t results_count = results.as_uint(); + const pugi::xml_attribute results = list.attribute("results"); + const uint32_t results_count = results.as_uint(); - pugi::xml_attribute total = list.attribute("total"); - uint32_t total_count = total.as_uint(); + const pugi::xml_attribute total = list.attribute("total"); + const uint32_t total_count = total.as_uint(); int i = 0; for (pugi::xml_node node = list.child("msg-info"); node; node = node.next_sibling("msg-info")) { - pugi::xml_attribute id = node.attribute("id"); - uint32_t msg_id = id.as_uint(); + const pugi::xml_attribute id = node.attribute("id"); + const uint32_t msg_id = id.as_uint(); - std::string subject_str = node.child("subject").text().as_string(); - std::string msg_str = node.child("msg").text().as_string(); - std::string author_jid = node.child("jid").text().as_string(); - std::string msg_date = node.child("msg-date").text().as_string(); + const std::string subject_str = node.child("subject").text().as_string(); + const std::string msg_str = node.child("msg").text().as_string(); + const std::string author_jid = node.child("jid").text().as_string(); + const std::string msg_date = node.child("msg-date").text().as_string(); SceNpId author_npid; - std::string author_username = fmt::split(author_jid, {"@"})[0]; + const std::string author_username = fmt::split(author_jid, {"@"})[0]; - if (strncmp(author_username.c_str(), nph.get_npid().handle.data, 16) == 0) + if (strncmp(author_username.c_str(), nph.get_npid().handle.data, SCE_NET_NP_ONLINEID_MAX_LENGTH) == 0) { author_npid = nph.get_npid(); } @@ -1079,18 +1078,18 @@ namespace clan .subject = "", .body = "", }, - .npid = author_npid, + .npid = std::move(author_npid), .postedBy = clan_id, }; strcpy_trunc(entry.message.subject, subject_str); strcpy_trunc(entry.message.body, msg_str); - announcements[i] = entry; + ::at32(announcements, i) = std::move(entry); i++; } - *page_result = SceNpClansPagingResult + page_result = SceNpClansPagingResult { .count = results_count, .total = total_count @@ -1099,9 +1098,9 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::post_announcement(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage* announcement, SceNpClansMessageData* /*data*/, u32 duration, SceNpClansMessageId* msg_id) + SceNpClansError clans_client::post_announcement(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansMessage& announcement, const SceNpClansMessageData& /*data*/, u32 duration, SceNpClansMessageId& msg_id) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -1111,30 +1110,30 @@ namespace clan clan.append_child("id").text().set(clan_id); pugi::xml_node subject = clan.append_child("subject"); - subject.text().set(announcement->subject); + subject.text().set(announcement.subject); pugi::xml_node msg = clan.append_child("msg"); - msg.text().set(announcement->body); + msg.text().set(announcement.body); pugi::xml_node expire_date = clan.append_child("expire-date"); expire_date.text().set(duration); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clan_res = send_request(req_id, ClanRequestAction::PostAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response); + const SceNpClansError clan_res = send_request(req_id, ClanRequestAction::PostAnnouncement, ClanManagerOperationType::UPDATE, doc, response); if (clan_res != SCE_NP_CLANS_SUCCESS) return clan_res; - pugi::xml_node clan_result = response.child("clan"); - pugi::xml_node msg_id_node = clan_result.child("id"); - *msg_id = msg_id_node.text().as_uint(); + const pugi::xml_node clan_result = response.child("clan"); + const pugi::xml_node msg_id_node = clan_result.child("id"); + msg_id = msg_id_node.text().as_uint(); return SCE_NP_CLANS_SUCCESS; } SceNpClansError clans_client::delete_announcement(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessageId announcement_id) { - std::string ticket = get_clan_ticket(nph); + const std::string ticket = get_clan_ticket(nph); if (ticket.empty()) return SCE_NP_CLANS_ERROR_SERVICE_UNAVAILABLE; @@ -1145,7 +1144,7 @@ namespace clan clan.append_child("msg-id").text().set(announcement_id); pugi::xml_document response = pugi::xml_document(); - return send_request(req_id, ClanRequestAction::DeleteAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response); + return send_request(req_id, ClanRequestAction::DeleteAnnouncement, ClanManagerOperationType::UPDATE, doc, response); } } #pragma endregion diff --git a/rpcs3/Emu/NP/clans_client.h b/rpcs3/Emu/NP/clans_client.h index 68ed4a1cf1..d56fb4bbb9 100644 --- a/rpcs3/Emu/NP/clans_client.h +++ b/rpcs3/Emu/NP/clans_client.h @@ -25,15 +25,15 @@ namespace clan }; enum class ClanSearchFilterOperator : u8 - { - Equal, - NotEqual, - GreaterThan, - GreaterThanOrEqual, - LessThan, - LessThanOrEqual, - Like, - }; + { + Equal, + NotEqual, + GreaterThan, + GreaterThanOrEqual, + LessThan, + LessThanOrEqual, + Like, + }; enum class ClanRequestAction { @@ -70,9 +70,8 @@ namespace clan { private: - static size_t curl_write_callback(void* data, size_t size, size_t nmemb, void* clientp); - SceNpClansError send_request(u32 reqId, ClanRequestAction action, ClanManagerOperationType type, pugi::xml_document* xml_body, pugi::xml_document* out_response); + SceNpClansError send_request(u32 reqId, ClanRequestAction action, ClanManagerOperationType type, const pugi::xml_document& xml_body, pugi::xml_document& out_response); /// @brief Forge and get a V2.1 Ticket for clan operations std::string get_clan_ticket(np::np_handler& nph); @@ -81,43 +80,43 @@ namespace clan clans_client(); ~clans_client(); - SceNpClansError create_request(s32* req_id); + SceNpClansError create_request(s32& req_id); SceNpClansError destroy_request(u32 req_id); - SceNpClansError clan_search(u32 req_id, SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clan_list, SceNpClansPagingResult* page_result); + SceNpClansError clan_search(u32 req_id, const SceNpClansPagingRequest& paging, const SceNpClansSearchableName& search, std::vector& clan_list, SceNpClansPagingResult& page_result); SceNpClansError create_clan(np::np_handler& nph, u32 req_id, std::string_view name, std::string_view tag, vm::ptr clan_id); SceNpClansError disband_dlan(np::np_handler& nph, u32 req_id, SceNpClanId clan_id); - SceNpClansError get_clan_list(np::np_handler& nph, u32 req_id, SceNpClansPagingRequest* paging, SceNpClansEntry* clan_list, SceNpClansPagingResult* page_result); - SceNpClansError get_clan_info(u32 req_id, SceNpClanId clan_id, SceNpClansClanInfo* clan_info); + SceNpClansError get_clan_list(np::np_handler& nph, u32 req_id, const SceNpClansPagingRequest&, std::vector& clan_list, SceNpClansPagingResult& page_result); + SceNpClansError get_clan_info(u32 req_id, SceNpClanId clan_id, SceNpClansClanInfo& clan_info); - SceNpClansError get_member_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMemberEntry* mem_info); - SceNpClansError get_member_list(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansPagingRequest* paging, SceNpClansMemberStatus status, SceNpClansMemberEntry* mem_list, SceNpClansPagingResult* page_result); + SceNpClansError get_member_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMemberEntry& mem_info); + SceNpClansError get_member_list(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansPagingRequest& paging, SceNpClansMemberStatus status, std::vector& mem_list, SceNpClansPagingResult& page_result); - SceNpClansError get_blacklist(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* page_result); - SceNpClansError add_blacklist_entry(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id); - SceNpClansError remove_blacklist_entry(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id); + SceNpClansError get_blacklist(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansPagingRequest& paging, std::vector& bl, SceNpClansPagingResult& page_result); + SceNpClansError add_blacklist_entry(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id); + SceNpClansError remove_blacklist_entry(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id); - SceNpClansError request_membership(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage* message); + SceNpClansError request_membership(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage& message); SceNpClansError cancel_request_membership(np::np_handler& nph, u32 req_id, SceNpClanId clan_id); - SceNpClansError send_membership_response(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMessage* message, b8 allow); + SceNpClansError send_membership_response(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMessage& message, b8 allow); - SceNpClansError send_invitation(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMessage* message); - SceNpClansError cancel_invitation(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id); - SceNpClansError send_invitation_response(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage* message, b8 accept); + SceNpClansError send_invitation(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMessage& message); + SceNpClansError cancel_invitation(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id); + SceNpClansError send_invitation_response(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage& message, b8 accept); SceNpClansError join_clan(np::np_handler& nph, u32 req_id, SceNpClanId clan_id); SceNpClansError leave_clan(np::np_handler& nph, u32 req_id, SceNpClanId clan_id); - SceNpClansError update_member_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansUpdatableMemberInfo* info); - SceNpClansError update_clan_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansUpdatableClanInfo* info); + SceNpClansError update_member_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansUpdatableMemberInfo& info); + SceNpClansError update_clan_info(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansUpdatableClanInfo& info); - SceNpClansError kick_member(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMessage* message); - SceNpClansError change_member_role(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpId np_id, SceNpClansMemberRole role); + SceNpClansError kick_member(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMessage& message); + SceNpClansError change_member_role(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpId& np_id, SceNpClansMemberRole role); - SceNpClansError retrieve_announcements(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* page_result); - SceNpClansError post_announcement(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessage* announcement, SceNpClansMessageData* data, u32 duration, SceNpClansMessageId* announcement_id); + SceNpClansError retrieve_announcements(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansPagingRequest& paging, std::vector& announcements, SceNpClansPagingResult& page_result); + SceNpClansError post_announcement(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, const SceNpClansMessage& announcement, const SceNpClansMessageData& data, u32 duration, SceNpClansMessageId& announcement_id); SceNpClansError delete_announcement(np::np_handler& nph, u32 req_id, SceNpClanId clan_id, SceNpClansMessageId announcement_id); }; } // namespace clan diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 63f080c5c9..cd5e1cedf3 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -627,6 +627,8 @@ + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 17ccca3792..7e2c398090 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1396,6 +1396,12 @@ Emu\Io + + Emu\NP + + + Emu\NP + @@ -2806,6 +2812,12 @@ Emu\Io + + Emu\NP + + + Emu\NP + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 2e9340b01b..470ab36812 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -915,9 +915,6 @@ Gui\rpcn - - Gui\clans - Gui\message dialog @@ -1245,6 +1242,9 @@ rpcs3 + + Gui\rpcn + From df6a3d01dfebf875dda08efe6d22b93b1a5b5d3a Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Wed, 24 Dec 2025 01:55:47 +0100 Subject: [PATCH 002/630] Clean UsbTransfer state --- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index 78183293e7..ad5808e0f7 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -878,7 +878,9 @@ std::pair usb_handler_thread::get_free_transfer() u32 transfer_id = get_free_transfer_id(); auto& transfer = get_transfer(transfer_id); - transfer.busy = true; + + libusb_transfer* const transfer_buf = transfer.transfer; + transfer = {.transfer_id = transfer_id, .transfer = transfer_buf, .busy = true}; return {transfer_id, transfer}; } From 847a147002dcac3fb90dedf836d91bc9ae0d10b8 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Wed, 24 Dec 2025 02:11:03 +0100 Subject: [PATCH 003/630] Improve usb timing accuracy --- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index ad5808e0f7..ba9beba3ab 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -636,6 +636,8 @@ void usb_handler_thread::operator()() // Process asynchronous requests that are pending libusb_handle_events_timeout_completed(ctx, &lusb_tv, nullptr); + u64 delay = 1'000; + // Process fake transfers if (!fake_transfers.empty()) { @@ -650,6 +652,13 @@ void usb_handler_thread::operator()() if (transfer->expected_time > timestamp) { + const u64 diff_time = transfer->expected_time - timestamp; + + if (diff_time < delay) + { + delay = diff_time; + } + ++it; continue; } @@ -668,7 +677,7 @@ void usb_handler_thread::operator()() if (handled_devices.empty()) thread_ctrl::wait_for(500'000); else - thread_ctrl::wait_for(1'000); + thread_ctrl::wait_for(delay); } } From 77aa5d4bbfc9ab572b678f872bf8083e0dc0725e Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Wed, 24 Dec 2025 19:21:57 +0000 Subject: [PATCH 004/630] =?UTF-8?q?[macOS]=20Don=E2=80=99t=20compile=20in?= =?UTF-8?q?=20GL-related=20code=20or=20link=20GLEW?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This seems sensible enough since macOS’s archaic, deprecated OpenGL implementation isn’t supported by RPCS3 anyways. Also fixes some CI fails caused by GLEW as a consequence. --- .ci/build-mac-arm64.sh | 2 +- .ci/build-mac.sh | 2 +- 3rdparty/CMakeLists.txt | 6 ++---- rpcs3/Emu/CMakeLists.txt | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.ci/build-mac-arm64.sh b/.ci/build-mac-arm64.sh index 49b82737c7..043e421d80 100755 --- a/.ci/build-mac-arm64.sh +++ b/.ci/build-mac-arm64.sh @@ -6,7 +6,7 @@ export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 export HOMEBREW_NO_ENV_HINTS=1 export HOMEBREW_NO_INSTALL_CLEANUP=1 -brew install -f --overwrite --quiet googletest opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" glew sdl3 vulkan-headers vulkan-loader +brew install -f --overwrite --quiet googletest opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative brew link -f --quiet "llvm@$LLVM_COMPILER_VER" ffmpeg@5 diff --git a/.ci/build-mac.sh b/.ci/build-mac.sh index 6328ce05d3..e391e3e575 100755 --- a/.ci/build-mac.sh +++ b/.ci/build-mac.sh @@ -10,7 +10,7 @@ brew install -f --overwrite --quiet ccache "llvm@$LLVM_COMPILER_VER" brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" # shellcheck disable=SC3009 arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" glew sdl3 vulkan-headers vulkan-loader +arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader arch -x86_64 /usr/local/bin/brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative arch -x86_64 /usr/local/bin/brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" ffmpeg@5 diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index a800ba1dd5..3b2dc05f1f 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -107,7 +107,7 @@ add_subdirectory(yaml-cpp) # OpenGL -if (NOT ANDROID) +if (NOT ANDROID AND NOT APPLE) find_package(OpenGL REQUIRED OPTIONAL_COMPONENTS EGL) add_library(3rdparty_opengl INTERFACE) @@ -119,8 +119,6 @@ if (NOT ANDROID) else() target_link_libraries(3rdparty_opengl INTERFACE dxgi.lib d2d1.lib dwrite.lib) endif() - elseif(APPLE) - target_link_libraries(3rdparty_opengl INTERFACE OpenGL::GL OpenGL::GLU) else() target_link_libraries(3rdparty_opengl INTERFACE OpenGL::GL OpenGL::GLU OpenGL::GLX) endif() @@ -335,7 +333,7 @@ endif() # GLEW add_library(3rdparty_glew INTERFACE) -if(NOT MSVC AND NOT ANDROID) +if(NOT MSVC AND NOT ANDROID AND NOT APPLE) find_package(GLEW REQUIRED) target_link_libraries(3rdparty_glew INTERFACE GLEW::GLEW) endif() diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index defa1ef670..3769071ad7 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -545,7 +545,7 @@ target_sources(rpcs3_emu PRIVATE RSX/rsx_vertex_data.cpp ) -if(NOT ANDROID) +if(NOT ANDROID AND NOT APPLE) target_sources(rpcs3_emu PRIVATE RSX/GL/GLCommonDecompiler.cpp RSX/GL/GLCompute.cpp From 739c178aacc37acb61e8e34ddb108e4822ff7a40 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 27 Dec 2025 15:49:10 +0100 Subject: [PATCH 005/630] Qt/cheats: don't accept imported cheats unless valid --- Utilities/cheat_info.cpp | 2 +- rpcs3/rpcs3qt/cheat_manager.cpp | 25 ++++++++++++++++++++----- rpcs3/rpcs3qt/cheat_manager.h | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Utilities/cheat_info.cpp b/Utilities/cheat_info.cpp index cc8934f15a..7745d26732 100644 --- a/Utilities/cheat_info.cpp +++ b/Utilities/cheat_info.cpp @@ -34,7 +34,7 @@ bool cheat_info::from_str(std::string_view cheat_line) s64 val64 = 0; if (cheat_vec.size() != 5 || !try_to_int64(&val64, cheat_vec[2], 0, cheat_type_max - 1)) { - log_cheat.fatal("Failed to parse cheat line"); + log_cheat.error("Failed to parse cheat line: '%s'", cheat_line); return false; } diff --git a/rpcs3/rpcs3qt/cheat_manager.cpp b/rpcs3/rpcs3qt/cheat_manager.cpp index a24a2cd5fc..fa8d0b4d58 100644 --- a/rpcs3/rpcs3qt/cheat_manager.cpp +++ b/rpcs3/rpcs3qt/cheat_manager.cpp @@ -129,16 +129,27 @@ void cheat_engine::save() const cheat_file.write(out.c_str(), out.size()); } -void cheat_engine::import_cheats_from_str(std::string_view str_cheats) +bool cheat_engine::import_cheats_from_str(std::string_view str_cheats) { const auto cheats_vec = fmt::split_sv(str_cheats, {"^^^"}); + std::vector valid_cheats; + for (const auto& cheat_line : cheats_vec) { cheat_info new_cheat; - if (new_cheat.from_str(cheat_line)) - cheats[new_cheat.game][new_cheat.offset] = new_cheat; + if (!new_cheat.from_str(cheat_line)) + return false; + + valid_cheats.push_back(std::move(new_cheat)); } + + for (const cheat_info& new_cheat : valid_cheats) + { + cheats[new_cheat.game][new_cheat.offset] = new_cheat; + } + + return true; } std::string cheat_engine::export_cheats_to_str() const @@ -677,7 +688,7 @@ cheat_manager_dialog::cheat_manager_dialog(QWidget* parent) { const int row = sel->row(); - if (rows.count(row)) + if (rows.contains(row)) continue; g_cheat.erase(tbl_cheats->item(row, cheat_table_columns::title)->text().toStdString(), tbl_cheats->item(row, cheat_table_columns::offset)->data(Qt::UserRole).toUInt()); @@ -690,7 +701,11 @@ cheat_manager_dialog::cheat_manager_dialog(QWidget* parent) connect(import_cheats, &QAction::triggered, [this]() { QClipboard* clipboard = QGuiApplication::clipboard(); - g_cheat.import_cheats_from_str(clipboard->text().toStdString()); + if (!g_cheat.import_cheats_from_str(clipboard->text().toStdString())) + { + QMessageBox::warning(this, tr("Failure"), tr("Failed to import cheats.")); + return; + } update_cheat_list(); }); diff --git a/rpcs3/rpcs3qt/cheat_manager.h b/rpcs3/rpcs3qt/cheat_manager.h index b915faa8a2..c09f47428f 100644 --- a/rpcs3/rpcs3qt/cheat_manager.h +++ b/rpcs3/rpcs3qt/cheat_manager.h @@ -25,7 +25,7 @@ public: cheat_info* get(const std::string& game, const u32 offset); bool erase(const std::string& game, const u32 offset); - void import_cheats_from_str(std::string_view str_cheats); + bool import_cheats_from_str(std::string_view str_cheats); std::string export_cheats_to_str() const; void save() const; From 908c616783eea3b637e8bec8297775db8b830f72 Mon Sep 17 00:00:00 2001 From: Antonino Di Guardo <64427768+digant73@users.noreply.github.com> Date: Sat, 27 Dec 2025 17:54:03 +0100 Subject: [PATCH 006/630] Improve Manage menu (#17919) --- rpcs3/rpcs3qt/main_window.ui | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index c9c8c0645d..b62e26492e 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -281,11 +281,8 @@ - - - - + @@ -296,18 +293,35 @@ - + + + Network Services + + + + + + + + + Portals and Gates + + + + + + + + + - - - - + + - From 0ce686b1f1434f7e28fb580bebcfc229dbc4c3e6 Mon Sep 17 00:00:00 2001 From: oltolm Date: Mon, 22 Dec 2025 00:25:45 +0100 Subject: [PATCH 007/630] fix lld warning LNK4217 --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/rpcs3.vcxproj | 6 +++--- rpcs3/rpcs3qt/curl_handle.h | 3 --- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 3769071ad7..8754df84c1 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -666,6 +666,7 @@ target_link_libraries(rpcs3_emu 3rdparty::yaml-cpp 3rdparty::zlib 3rdparty::zstd + 3rdparty::libcurl ) if(APPLE) diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index d8d5053179..a824f65267 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -77,7 +77,7 @@ 4577;4467;4281;%(DisableSpecificWarnings) $(IntDir) MaxSpeed - _WINDOWS;UNICODE;WIN32;WIN64;WIN32_LEAN_AND_MEAN;HAVE_VULKAN;HAVE_OPENCV;CV_IGNORE_DEBUG_BUILD_GUARD;MINIUPNP_STATICLIB;ZLIB_CONST;AL_LIBTYPE_STATIC;WOLFSSL_USER_SETTINGS;HAVE_SDL3;WITH_DISCORD_RPC;QT_NO_DEBUG;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;NDEBUG;QT_CONCURRENT_LIB;QT_MULTIMEDIA_LIB;QT_MULTIMEDIAWIDGETS_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) + _WINDOWS;UNICODE;WIN32;WIN64;WIN32_LEAN_AND_MEAN;HAVE_VULKAN;HAVE_OPENCV;CV_IGNORE_DEBUG_BUILD_GUARD;MINIUPNP_STATICLIB;ZLIB_CONST;AL_LIBTYPE_STATIC;WOLFSSL_USER_SETTINGS;HAVE_SDL3;WITH_DISCORD_RPC;QT_NO_DEBUG;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;NDEBUG;QT_CONCURRENT_LIB;QT_MULTIMEDIA_LIB;QT_MULTIMEDIAWIDGETS_LIB;QT_SVG_LIB;CURL_STATICLIB;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb true @@ -138,7 +138,7 @@ 4577;4467;4281;%(DisableSpecificWarnings) $(IntDir) Disabled - _WINDOWS;UNICODE;WIN32;WIN64;WIN32_LEAN_AND_MEAN;HAVE_VULKAN;HAVE_OPENCV;CV_IGNORE_DEBUG_BUILD_GUARD;MINIUPNP_STATICLIB;ZLIB_CONST;AL_LIBTYPE_STATIC;WOLFSSL_USER_SETTINGS;HAVE_SDL3;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;QT_CONCURRENT_LIB;QT_MULTIMEDIA_LIB;QT_MULTIMEDIAWIDGETS_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) + _WINDOWS;UNICODE;WIN32;WIN64;WIN32_LEAN_AND_MEAN;HAVE_VULKAN;HAVE_OPENCV;CV_IGNORE_DEBUG_BUILD_GUARD;MINIUPNP_STATICLIB;ZLIB_CONST;AL_LIBTYPE_STATIC;WOLFSSL_USER_SETTINGS;HAVE_SDL3;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;QT_CONCURRENT_LIB;QT_MULTIMEDIA_LIB;QT_MULTIMEDIAWIDGETS_LIB;QT_SVG_LIB;CURL_STATICLIB;%(PreprocessorDefinitions) false true true @@ -2230,4 +2230,4 @@ - \ No newline at end of file + diff --git a/rpcs3/rpcs3qt/curl_handle.h b/rpcs3/rpcs3qt/curl_handle.h index e0d4db22d3..090c198215 100644 --- a/rpcs3/rpcs3qt/curl_handle.h +++ b/rpcs3/rpcs3qt/curl_handle.h @@ -2,9 +2,6 @@ #include -#ifndef CURL_STATICLIB -#define CURL_STATICLIB -#endif #include namespace rpcs3::curl From fdbf25076ec991af2316623ce376c570459bf261 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 27 Dec 2025 18:56:36 +0100 Subject: [PATCH 008/630] Fix lld warning LNK4286 --- rpcs3/emucore.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index cd5e1cedf3..357dfe238d 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -42,8 +42,8 @@ Use ..\3rdparty\miniupnp\miniupnp\miniupnpc\include;..\3rdparty\wolfssl\wolfssl;..\3rdparty\flatbuffers\include;..\3rdparty\libusb\libusb\libusb;..\3rdparty\yaml-cpp\yaml-cpp\include;..\3rdparty\SoundTouch\soundtouch\include;..\3rdparty\rtmidi\rtmidi;..\3rdparty\zlib\zlib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\include;$(VULKAN_SDK)\Include;..\3rdparty\zstd\zstd\lib;$(SolutionDir)3rdparty\fusion\fusion\Fusion;$(SolutionDir)3rdparty\wolfssl\extra\win32;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(SolutionDir)3rdparty\glslang\glslang;$(SolutionDir)3rdparty\curl\curl\include MaxSpeed - AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL3;ZLIB_CONST;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) - AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL3;ZLIB_CONST;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL3;ZLIB_CONST;WOLFSSL_USER_SETTINGS;CURL_STATICLIB;%(PreprocessorDefinitions) + AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL3;ZLIB_CONST;WOLFSSL_USER_SETTINGS;CURL_STATICLIB;%(PreprocessorDefinitions) %(AdditionalModuleDependencies) %(AdditionalModuleDependencies) From ce0a6da88e81506b8b59e8b3adbe6c74da1b6eab Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Tue, 23 Dec 2025 22:12:28 +0200 Subject: [PATCH 009/630] Docs: Update clone instructions --- BUILDING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BUILDING.md b/BUILDING.md index 60b7046cb2..32cdc6cc03 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -108,9 +108,10 @@ Clone and initialize the repository ```bash git clone --recurse-submodules https://github.com/RPCS3/rpcs3.git cd rpcs3 +git submodule sync # This is automatically done by `git clone --recurse-submodules`, # but in case you forgot it, you can manually fetch submodules this way: -git submodule update --init +git submodule update --init --recursive ``` ### Windows From eafe0f76cfedc4820a95ddd72d6af70178e26990 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Tue, 23 Dec 2025 22:08:55 +0200 Subject: [PATCH 010/630] USB: Update Kamen Rider Summonride virtual portal - Increase ack time for interrupt packets - Add missing HID Descriptor Node --- rpcs3/Emu/Io/KamenRider.cpp | 60 +++++++++++++++++++++++----- rpcs3/Emu/Io/KamenRider.h | 10 ++--- rpcs3/rpcs3qt/kamen_rider_dialog.cpp | 4 +- 3 files changed, 57 insertions(+), 17 deletions(-) diff --git a/rpcs3/Emu/Io/KamenRider.cpp b/rpcs3/Emu/Io/KamenRider.cpp index aaa4836f08..df7b86a07f 100644 --- a/rpcs3/Emu/Io/KamenRider.cpp +++ b/rpcs3/Emu/Io/KamenRider.cpp @@ -39,7 +39,7 @@ kamen_rider_figure& rider_gate::get_figure_by_uid(const std::array uid) return figures[7]; } -void rider_gate::get_blank_response(u8 command, u8 sequence, std::array& reply_buf) +void rider_gate::get_blank_response(std::array& reply_buf, u8 command, u8 sequence) { reply_buf = {0x55, 0x02, command, sequence}; reply_buf[4] = generate_checksum(reply_buf, 4); @@ -93,7 +93,7 @@ void rider_gate::query_block(std::array& reply_buf, u8 command, u8 seque reply_buf[21] = generate_checksum(reply_buf, 21); } -void rider_gate::write_block(std::array& replyBuf, u8 command, u8 sequence, const u8* uid, u8 sector, u8 block, const u8* to_write_buf) +void rider_gate::write_block(std::array& reply_buf, u8 command, u8 sequence, const u8* uid, u8 sector, u8 block, const u8* to_write_buf) { std::lock_guard lock(kamen_mutex); @@ -108,7 +108,7 @@ void rider_gate::write_block(std::array& replyBuf, u8 command, u8 sequen } } - get_blank_response(command, sequence, replyBuf); + get_blank_response(reply_buf, command, sequence); } std::optional> rider_gate::pop_added_removed_response() @@ -190,11 +190,50 @@ u8 rider_gate::load_figure(const std::array& buf, fs::file in_f usb_device_kamen_rider::usb_device_kamen_rider(const std::array& location) : usb_device_emulated(location) { - device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, UsbDeviceDescriptor{0x200, 0x0, 0x0, 0x0, 0x40, 0x0E6F, 0x200A, 0x100, 0x1, 0x2, 0x3, 0x1}); - auto& config0 = device.add_node(UsbDescriptorNode(USB_DESCRIPTOR_CONFIG, UsbDeviceConfiguration{0x29, 0x1, 0x1, 0x0, 0x80, 0xFA})); - config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, UsbDeviceInterface{0x0, 0x0, 0x2, 0x3, 0x0, 0x0, 0x0})); - config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT, UsbDeviceEndpoint{0x81, 0x3, 0x40, 0x1})); - config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT, UsbDeviceEndpoint{0x1, 0x3, 0x40, 0x1})); + device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, UsbDeviceDescriptor{ + .bcdUSB = 0x0200, + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = 0x40, + .idVendor = 0x0E6F, + .idProduct = 0x200A, + .bcdDevice = 0x0100, + .iManufacturer = 0x01, + .iProduct = 0x02, + .iSerialNumber = 0x03, + .bNumConfigurations = 0x01}); + auto& config0 = device.add_node(UsbDescriptorNode(USB_DESCRIPTOR_CONFIG, UsbDeviceConfiguration{ + .wTotalLength = 0x0029, + .bNumInterfaces = 0x01, + .bConfigurationValue = 0x01, + .iConfiguration = 0x00, + .bmAttributes = 0x80, + .bMaxPower = 0xFA})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, UsbDeviceInterface{ + .bInterfaceNumber = 0x00, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x02, + .bInterfaceClass = 0x03, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_HID, UsbDeviceHID{ + .bcdHID = 0x0100, + .bCountryCode = 0x00, + .bNumDescriptors = 0x01, + .bDescriptorType = 0x22, + .wDescriptorLength = 0x001d})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT, UsbDeviceEndpoint{ + .bEndpointAddress = 0x81, + .bmAttributes = 0x03, + .wMaxPacketSize = 0x0040, + .bInterval = 0x1})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT, UsbDeviceEndpoint{ + .bEndpointAddress = 0x01, + .bmAttributes = 0x03, + .wMaxPacketSize = 0x0040, + .bInterval = 0x1})); } usb_device_kamen_rider::~usb_device_kamen_rider() @@ -227,7 +266,7 @@ void usb_device_kamen_rider::interrupt_transfer(u32 buf_size, u8* buf, u32 endpo if (endpoint == 0x81) { // Respond after FF command - transfer->expected_time = get_timestamp() + 1000; + transfer->expected_time = get_timestamp() + 22000; std::optional> response = g_ridergate.pop_added_removed_response(); if (response) { @@ -246,6 +285,7 @@ void usb_device_kamen_rider::interrupt_transfer(u32 buf_size, u8* buf, u32 endpo } else if (endpoint == 0x01) { + transfer->expected_time = get_timestamp() + 10; const u8 command = buf[2]; const u8 sequence = buf[3]; @@ -261,7 +301,7 @@ void usb_device_kamen_rider::interrupt_transfer(u32 buf_size, u8* buf, u32 endpo case 0xC0: case 0xC3: // Color Commands { - g_ridergate.get_blank_response(command, sequence, q_result); + g_ridergate.get_blank_response(q_result, command, sequence); break; } case 0xD0: // Tag List diff --git a/rpcs3/Emu/Io/KamenRider.h b/rpcs3/Emu/Io/KamenRider.h index 0e30024b06..6c4bea29ee 100644 --- a/rpcs3/Emu/Io/KamenRider.h +++ b/rpcs3/Emu/Io/KamenRider.h @@ -18,11 +18,11 @@ struct kamen_rider_figure class rider_gate { public: - void get_blank_response(u8 command, u8 sequence, std::array& reply_buf); - void wake_rider_gate(std::array& replyBuf, u8 command, u8 sequence); - void get_list_tags(std::array& replyBuf, u8 command, u8 sequence); - void query_block(std::array& replyBuf, u8 command, u8 sequence, const u8* uid, u8 sector, u8 block); - void write_block(std::array& replyBuf, u8 command, u8 sequence, const u8* uid, u8 sector, u8 block, const u8* to_write_buf); + void get_blank_response(std::array& reply_buf, u8 command, u8 sequence); + void wake_rider_gate(std::array& reply_buf, u8 command, u8 sequence); + void get_list_tags(std::array& reply_buf, u8 command, u8 sequence); + void query_block(std::array& reply_buf, u8 command, u8 sequence, const u8* uid, u8 sector, u8 block); + void write_block(std::array& reply_buf, u8 command, u8 sequence, const u8* uid, u8 sector, u8 block, const u8* to_write_buf); std::optional> pop_added_removed_response(); bool remove_figure(u8 position); diff --git a/rpcs3/rpcs3qt/kamen_rider_dialog.cpp b/rpcs3/rpcs3qt/kamen_rider_dialog.cpp index 61932f4cd1..8a4ef3e930 100644 --- a/rpcs3/rpcs3qt/kamen_rider_dialog.cpp +++ b/rpcs3/rpcs3qt/kamen_rider_dialog.cpp @@ -31,7 +31,7 @@ static const std::map, const std::string> li {{0x12, 0x30}, "Kamen Rider Wizard Fire"}, {{0x13, 0x40}, "Kamen Rider Fourze Light"}, {{0x14, 0x20}, "Kamen Rider 000 Water"}, - {{0x15, 0x10}, "Kamen Rider Double Wind"}, + {{0x15, 0x10}, "Kamen Rider W (Double) Wind"}, {{0x16, 0x50}, "Kamen Rider Decade Dark"}, {{0x17, 0x50}, "Kamen Rider Kiva Dark"}, {{0x18, 0x40}, "Kamen Rider Den-O Light"}, @@ -409,7 +409,7 @@ void kamen_rider_dialog::update_edits() } else { - display_string = QString(tr("Unknown (Id:%1 Var:%2)")).arg(fig_id).arg(fig_type); + display_string = QString(tr("Unknown (Id:%1 Type:%2)")).arg(fig_id).arg(fig_type); } } else From 80d7db520b4bb31d2ea6d824194168e9fac6a074 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Tue, 23 Dec 2025 22:15:28 +0200 Subject: [PATCH 011/630] USB: Remove unused method --- rpcs3/Emu/Io/Dimensions.cpp | 5 ----- rpcs3/Emu/Io/Dimensions.h | 1 - 2 files changed, 6 deletions(-) diff --git a/rpcs3/Emu/Io/Dimensions.cpp b/rpcs3/Emu/Io/Dimensions.cpp index e80a64c0c9..84a604a86e 100644 --- a/rpcs3/Emu/Io/Dimensions.cpp +++ b/rpcs3/Emu/Io/Dimensions.cpp @@ -700,8 +700,3 @@ void usb_device_dimensions::interrupt_transfer(u32 buf_size, u8* buf, u32 endpoi break; } } - -void usb_device_dimensions::isochronous_transfer(UsbTransfer* transfer) -{ - usb_device_emulated::isochronous_transfer(transfer); -} diff --git a/rpcs3/Emu/Io/Dimensions.h b/rpcs3/Emu/Io/Dimensions.h index e2bfbd1e7f..d25fb8ed2e 100644 --- a/rpcs3/Emu/Io/Dimensions.h +++ b/rpcs3/Emu/Io/Dimensions.h @@ -76,7 +76,6 @@ public: void control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) override; void interrupt_transfer(u32 buf_size, u8* buf, u32 endpoint, UsbTransfer* transfer) override; - void isochronous_transfer(UsbTransfer* transfer) override; protected: std::queue> m_queries; From bdcde24e28dfbe538f9fb3f47003e38c50da32fd Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Tue, 23 Dec 2025 22:09:08 +0200 Subject: [PATCH 012/630] USB: Remove a duplicate PSP entry --- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index ba9beba3ab..cf6339081e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -246,7 +246,7 @@ private: {0x054C, 0x01C8, 0x01C8, "PSP Type A", nullptr, nullptr}, {0x054C, 0x01C9, 0x01C9, "PSP Type B", nullptr, nullptr}, {0x054C, 0x01CA, 0x01CA, "PSP Type C", nullptr, nullptr}, - {0x054C, 0x01CB, 0x01CB, "PSP Type D", nullptr, nullptr}, + {0x054C, 0x01CB, 0x01CB, "PSP Type D", nullptr, nullptr}, // UsbPspCm {0x054C, 0x02D2, 0x02D2, "PSP Slim", nullptr, nullptr}, // 0x0900: "H050 USJ(C) PCB rev00", 0x0910: "USIO PCB rev00" @@ -261,9 +261,6 @@ private: // Tony Hawk RIDE Skateboard {0x12BA, 0x0400, 0x0400, "Tony Hawk RIDE Skateboard Controller", nullptr, nullptr}, - // PSP in UsbPspCm mode - {0x054C, 0x01CB, 0x01CB, "UsbPspcm", nullptr, nullptr}, - // Sony Stereo Headsets {0x12BA, 0x0032, 0x0032, "Wireless Stereo Headset", nullptr, nullptr}, {0x12BA, 0x0042, 0x0042, "Wireless Stereo Headset", nullptr, nullptr}, From 0536ad3b230d0012bfa203e9d751058a3d13e8fa Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Tue, 23 Dec 2025 22:09:40 +0200 Subject: [PATCH 013/630] USB: Fix an incorrect log --- rpcs3/Emu/Io/TopShotElite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Io/TopShotElite.cpp b/rpcs3/Emu/Io/TopShotElite.cpp index c241fe1ed4..0cbbd5287c 100644 --- a/rpcs3/Emu/Io/TopShotElite.cpp +++ b/rpcs3/Emu/Io/TopShotElite.cpp @@ -274,7 +274,7 @@ void usb_device_topshotelite::interrupt_transfer(u32 buf_size, u8* buf, u32 /*en if (m_controller_index >= g_cfg_topshotelite.players.size()) { - topshotelite_log.warning("Top Shot Fearmaster controllers are only supported for Player1 to Player%d", g_cfg_topshotelite.players.size()); + topshotelite_log.warning("Top Shot Elite controllers are only supported for Player1 to Player%d", g_cfg_topshotelite.players.size()); prepare_data(&ts, buf); return; } From 5e4c2433c1924f4c47309ae9dd380c3ee7d0ac7b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 13 Dec 2025 14:35:31 +0300 Subject: [PATCH 014/630] vk/gl: Mark unused FP outputs as unused --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 15 +++++++++++++-- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 18 ++++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 4cbd92eecd..0879e5e987 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -103,8 +103,19 @@ void GLFragmentDecompilerThread::insertOutputs(std::stringstream & OS) const auto reg_type = float_type ? "vec4" : getHalfTypeName(4); for (uint i = 0; i < std::size(table); ++i) { - if (m_parr.HasParam(PF_PARAM_NONE, reg_type, table[i].second)) - OS << "layout(location=" << i << ") out vec4 " << table[i].first << ";\n"; + if (!m_parr.HasParam(PF_PARAM_NONE, reg_type, table[i].second)) + { + continue; + } + + if (i >= m_prog.mrt_buffers_count) + { + // Dead writes. Declare as temp variables for DCE to clean up. + OS << "vec4 " << table[i].first << "; // Unused\n"; + continue; + } + + OS << "layout(location=" << i << ") out vec4 " << table[i].first << ";\n"; } } diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index ea9d7cd0f1..ecca27f0df 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -150,17 +150,27 @@ void VKFragmentDecompilerThread::insertOutputs(std::stringstream & OS) { "ocol3", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r4" : "h8" }, }; - //NOTE: We do not skip outputs, the only possible combinations are a(0), b(0), ab(0,1), abc(0,1,2), abcd(0,1,2,3) + // NOTE: We do not skip outputs, the only possible combinations are a(0), b(0), ab(0,1), abc(0,1,2), abcd(0,1,2,3) u8 output_index = 0; const bool float_type = (m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) || !device_props.has_native_half_support; const auto reg_type = float_type ? "vec4" : getHalfTypeName(4); for (uint i = 0; i < std::size(table); ++i) { - if (m_parr.HasParam(PF_PARAM_NONE, reg_type, table[i].second)) + if (!m_parr.HasParam(PF_PARAM_NONE, reg_type, table[i].second)) { - OS << "layout(location=" << std::to_string(output_index++) << ") " << "out vec4 " << table[i].first << ";\n"; - vk_prog->output_color_masks[i] = -1; + continue; } + + if (i >= m_prog.mrt_buffers_count) + { + // Dead writes. Declare as temp variables for DCE to clean up. + OS << "vec4 " << table[i].first << "; // Unused\n"; + vk_prog->output_color_masks[i] = 0; + continue; + } + + OS << "layout(location=" << std::to_string(output_index++) << ") " << "out vec4 " << table[i].first << ";\n"; + vk_prog->output_color_masks[i] = -1; } } From 308adca20657215bd8d191dfd6bc56c87c243a1b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 13 Dec 2025 14:37:01 +0300 Subject: [PATCH 015/630] rsx/fp: Stop referencing wpos when the value is just getting discarded. --- .../RSX/Program/FragmentProgramDecompiler.cpp | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index 94b92ce98e..1ba30e45b3 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -551,18 +551,22 @@ template std::string FragmentProgramDecompiler::GetSRC(T src) { std::string ret; u32 precision_modifier = 0; + u32 register_index = umax; if constexpr (std::is_same_v) { precision_modifier = src1.src0_prec_mod; + register_index = 0; } else if constexpr (std::is_same_v) { precision_modifier = src1.src1_prec_mod; + register_index = 1; } else if constexpr (std::is_same_v) { precision_modifier = src1.src2_prec_mod; + register_index = 2; } switch (src.reg_type) @@ -645,18 +649,29 @@ template std::string FragmentProgramDecompiler::GetSRC(T src) { // TEX0 - TEX9 // Texcoord 2d mask seems to reset the last 2 arguments to 0 and w if set + + // Opt: Skip emitting w dependency unless w coord is actually being sampled + ensure(register_index != umax); + const auto lane_mask = FP::get_src_vector_lane_mask_shuffled(m_prog, m_instruction, register_index); + const auto touches_z = !!(lane_mask & (1u << 2)); + const bool touches_w = !!(lane_mask & (1u << 3)); + const u8 texcoord = u8(register_id) - 4; if (m_prog.texcoord_is_point_coord(texcoord)) { // Point sprite coord generation. Stacks with the 2D override mask. - if (m_prog.texcoord_is_2d(texcoord)) + if (!m_prog.texcoord_is_2d(texcoord)) { - ret += getFloatTypeName(4) + "(gl_PointCoord, 0., in_w)"; - properties.has_w_access = true; + ret += getFloatTypeName(4) + "(gl_PointCoord, 1., 0.)"; + } + else if (!touches_w) + { + ret += getFloatTypeName(4) + "(gl_PointCoord, 0., 0.)"; } else { - ret += getFloatTypeName(4) + "(gl_PointCoord, 1., 0.)"; + ret += getFloatTypeName(4) + "(gl_PointCoord, 0., in_w)"; + properties.has_w_access = true; } } else if (src2.perspective_corr) @@ -673,14 +688,19 @@ template std::string FragmentProgramDecompiler::GetSRC(T src) } else { - if (m_prog.texcoord_is_2d(texcoord)) + const bool skip_zw_load = !touches_z && !touches_w; + if (!m_prog.texcoord_is_2d(texcoord) || skip_zw_load) { - ret += getFloatTypeName(4) + "(" + reg_var + ".xy, 0., in_w)"; - properties.has_w_access = true; + ret += reg_var; + } + else if (!touches_w) + { + ret += getFloatTypeName(4) + "(" + reg_var + ".xy, 0., 0.)"; } else { - ret += reg_var; + ret += getFloatTypeName(4) + "(" + reg_var + ".xy, 0., in_w)"; + properties.has_w_access = true; } } break; From 215880cd1a2fc88e6b0ac252012fe79f6ade5f63 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 13 Dec 2025 14:59:54 +0300 Subject: [PATCH 016/630] rsx/vk/gl: Make texture parameter reads backend-dependent - Allows optimizations and improvements per-backend --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 3 ++- rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp | 1 + .../RSXFragmentTextureDepthConversion.glsl | 6 +++--- .../RSXProg/RSXFragmentTextureMSAAOps.glsl | 2 +- .../RSXProg/RSXFragmentTextureOps.glsl | 16 ++++++++-------- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 3 ++- rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp | 1 + 7 files changed, 18 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 0879e5e987..cc28c0c98f 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -201,7 +201,8 @@ void GLFragmentDecompilerThread::insertConstants(std::stringstream & OS) " uvec4 stipple_pattern[8];\n" "};\n\n" - "#define texture_base_index 0\n\n"; + "#define texture_base_index 0\n" + "#define TEX_PARAM(index) texture_parameters[index]\n\n"; } void GLFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) diff --git a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp index 9606ca7b16..c7f9ec2622 100644 --- a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp @@ -300,6 +300,7 @@ namespace gl } builder << "\n" + "#define TEX_PARAM(index) texture_parameters[index + texture_base_index]\n" "#define IS_TEXTURE_RESIDENT(index) (texture_handles[index] < 0xFF)\n" "#define SAMPLER1D(index) sampler1D_array[texture_handles[index]]\n" "#define SAMPLER2D(index) sampler2D_array[texture_handles[index]]\n" diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureDepthConversion.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureDepthConversion.glsl index ef77ae179d..a9737e97fa 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureDepthConversion.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureDepthConversion.glsl @@ -1,8 +1,8 @@ R"( #define ZS_READ(index, coord) vec2(texture(TEX_NAME(index), coord).r, float(texture(TEX_NAME_STENCIL(index), coord).x)) -#define TEX1D_Z24X8_RGBA8(index, coord1) _process_texel(convert_z24x8_to_rgba8(ZS_READ(index, COORD_SCALE1(index, coord1)), texture_parameters[index + texture_base_index].remap, TEX_FLAGS(index)), TEX_FLAGS(index)) -#define TEX2D_Z24X8_RGBA8(index, coord2) _process_texel(convert_z24x8_to_rgba8(ZS_READ(index, COORD_SCALE2(index, coord2)), texture_parameters[index + texture_base_index].remap, TEX_FLAGS(index)), TEX_FLAGS(index)) -#define TEX3D_Z24X8_RGBA8(index, coord3) _process_texel(convert_z24x8_to_rgba8(ZS_READ(index, COORD_SCALE3(index, coord3)), texture_parameters[index + texture_base_index].remap, TEX_FLAGS(index)), TEX_FLAGS(index)) +#define TEX1D_Z24X8_RGBA8(index, coord1) _process_texel(convert_z24x8_to_rgba8(ZS_READ(index, COORD_SCALE1(index, coord1)), TEX_PARAM(index).remap, TEX_FLAGS(index)), TEX_FLAGS(index)) +#define TEX2D_Z24X8_RGBA8(index, coord2) _process_texel(convert_z24x8_to_rgba8(ZS_READ(index, COORD_SCALE2(index, coord2)), TEX_PARAM(index).remap, TEX_FLAGS(index)), TEX_FLAGS(index)) +#define TEX3D_Z24X8_RGBA8(index, coord3) _process_texel(convert_z24x8_to_rgba8(ZS_READ(index, COORD_SCALE3(index, coord3)), TEX_PARAM(index).remap, TEX_FLAGS(index)), TEX_FLAGS(index)) // NOTE: Memory layout is fetched as byteswapped BGRA [GBAR] (GOW collection, DS2, DeS) // The A component (Z) is useless (should contain stencil8 or just 1) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOps.glsl index 37f2427ba0..965eac5276 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOps.glsl @@ -4,7 +4,7 @@ R"( #define TEX2D_MS(index, coord2) _process_texel(sampleTexture2DMS(TEX_NAME(index), coord2, index), TEX_FLAGS(index)) #define TEX2D_SHADOW_MS(index, coord3) vec4(comparison_passes(sampleTexture2DMS(TEX_NAME(index), coord3.xy, index).x, coord3.z, ZCOMPARE_FUNC(index))) #define TEX2D_SHADOWPROJ_MS(index, coord4) TEX2D_SHADOW_MS(index, (coord4.xyz / coord4.w)) -#define TEX2D_Z24X8_RGBA8_MS(index, coord2) _process_texel(convert_z24x8_to_rgba8(ZS_READ_MS(index, coord2), texture_parameters[index + texture_base_index].remap, TEX_FLAGS(index)), TEX_FLAGS(index)) +#define TEX2D_Z24X8_RGBA8_MS(index, coord2) _process_texel(convert_z24x8_to_rgba8(ZS_READ_MS(index, coord2), TEX_PARAM(index).remap, TEX_FLAGS(index)), TEX_FLAGS(index)) vec3 compute2x2DownsampleWeights(const in float coord, const in float uv_step, const in float actual_step) { diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index 7ef54a244d..e231333184 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -24,17 +24,17 @@ R"( uint _texture_flag_override = 0; #define _enable_texture_expand() _texture_flag_override = SIGN_EXPAND_MASK #define _disable_texture_expand() _texture_flag_override = 0 - #define TEX_FLAGS(index) (texture_parameters[index + texture_base_index].flags | _texture_flag_override) + #define TEX_FLAGS(index) (TEX_PARAM(index).flags | _texture_flag_override) #else - #define TEX_FLAGS(index) texture_parameters[index + texture_base_index].flags + #define TEX_FLAGS(index) TEX_PARAM(index).flags #endif #define TEX_NAME(index) tex##index #define TEX_NAME_STENCIL(index) tex##index##_stencil -#define COORD_SCALE1(index, coord1) _texcoord_xform(coord1, texture_parameters[index + texture_base_index]) -#define COORD_SCALE2(index, coord2) _texcoord_xform(coord2, texture_parameters[index + texture_base_index]) -#define COORD_SCALE3(index, coord3) _texcoord_xform(coord3, texture_parameters[index + texture_base_index]) +#define COORD_SCALE1(index, coord1) _texcoord_xform(coord1, TEX_PARAM(index)) +#define COORD_SCALE2(index, coord2) _texcoord_xform(coord2, TEX_PARAM(index)) +#define COORD_SCALE3(index, coord3) _texcoord_xform(coord3, TEX_PARAM(index)) #define COORD_PROJ1(index, coord2) COORD_SCALE1(index, coord2.x / coord2.y) #define COORD_PROJ2(index, coord3) COORD_SCALE2(index, coord3.xy / coord3.z) #define COORD_PROJ3(index, coord4) COORD_SCALE3(index, coord4.xyz / coord4.w) @@ -57,9 +57,9 @@ R"( #ifdef _ENABLE_SHADOW #ifdef _EMULATED_TEXSHADOW - #define SHADOW_COORD(index, coord3) _texcoord_xform_shadow(coord3, texture_parameters[index + texture_base_index]) - #define SHADOW_COORD4(index, coord4) _texcoord_xform_shadow(coord4, texture_parameters[index + texture_base_index]) - #define SHADOW_COORD_PROJ(index, coord4) _texcoord_xform_shadow(coord4.xyz / coord4.w, texture_parameters[index + texture_base_index]) + #define SHADOW_COORD(index, coord3) _texcoord_xform_shadow(coord3, TEX_PARAM(index)) + #define SHADOW_COORD4(index, coord4) _texcoord_xform_shadow(coord4, TEX_PARAM(index)) + #define SHADOW_COORD_PROJ(index, coord4) _texcoord_xform_shadow(coord4.xyz / coord4.w, TEX_PARAM(index)) #define TEX2D_SHADOW(index, coord3) texture(TEX_NAME(index), SHADOW_COORD(index, coord3)) #define TEX3D_SHADOW(index, coord4) texture(TEX_NAME(index), SHADOW_COORD4(index, coord4)) diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index ecca27f0df..0cba2fa80b 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -346,7 +346,8 @@ void VKFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) } OS << - "#define texture_base_index _fs_texture_base_index\n\n"; + "#define texture_base_index _fs_texture_base_index\n" + "#define TEX_PARAM(index) texture_parameters[index + texture_base_index]\n\n"; glsl::insert_glsl_legacy_function(OS, m_shader_props); } diff --git a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp index 083c3f8c7f..9315ac1593 100644 --- a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp @@ -264,6 +264,7 @@ namespace vk } builder << "\n" + "#define TEX_PARAM(index) texture_parameters[index + texture_base_index]\n" "#define IS_TEXTURE_RESIDENT(index) true\n" "#define SAMPLER1D(index) sampler1D_array[index]\n" "#define SAMPLER2D(index) sampler2D_array[index]\n" From 3cb3f6972e5152a9e2130aa8b08c539f8332aee6 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 13 Dec 2025 15:18:43 +0300 Subject: [PATCH 017/630] vk: Hoist texture param loads --- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 0cba2fa80b..c720ae8550 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -347,7 +347,7 @@ void VKFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) OS << "#define texture_base_index _fs_texture_base_index\n" - "#define TEX_PARAM(index) texture_parameters[index + texture_base_index]\n\n"; + "#define TEX_PARAM(index) texture_parameters_##index\n\n"; glsl::insert_glsl_legacy_function(OS, m_shader_props); } @@ -433,6 +433,16 @@ void VKFragmentDecompilerThread::insertMainStart(std::stringstream & OS) if (properties.in_register_mask & in_spec_color) OS << " vec4 spec_color = gl_FrontFacing ? spec_color1 : spec_color0;\n"; } + + for (u16 i = 0, mask = (properties.common_access_sampler_mask | properties.shadow_sampler_mask); mask != 0; ++i, mask >>= 1) + { + if (!(mask & 1)) + { + continue; + } + + OS << " const sampler_info texture_parameters_" << i << " = texture_parameters[texture_base_index + " << i << "];\n"; + } } void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) From 20dcfa5c8a56882669aef6333a5d0b3ee086465c Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Dec 2025 07:26:30 +0300 Subject: [PATCH 018/630] rsx: Move heavy codegen capabilities to permutation flags from runtime checks --- rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp | 68 ------------------- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 12 +++- rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 30 ++++++-- .../RSXProg/RSXFragmentPrologue.glsl | 4 +- .../RSXProg/RSXFragmentTextureOps.glsl | 2 + .../GLSLSnippets/RSXProg/RSXROPEpilogue.glsl | 42 +++++------- rpcs3/Emu/RSX/Program/GLSLTypes.h | 9 ++- rpcs3/Emu/RSX/RSXThread.cpp | 39 +++++++++++ rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 12 +++- rpcs3/Emu/RSX/gcm_enums.h | 14 +++- 10 files changed, 123 insertions(+), 109 deletions(-) diff --git a/rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp b/rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp index 449900cef1..ed2447ab24 100644 --- a/rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp +++ b/rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp @@ -687,73 +687,6 @@ namespace rsx rop_control.enable_alpha_test(); } - if (REGS(m_ctx)->polygon_stipple_enabled()) - { - rop_control.enable_polygon_stipple(); - } - - auto can_use_hw_a2c = [&]() -> bool - { - const auto& config = RSX(m_ctx)->get_backend_config(); - if (!config.supports_hw_a2c) - { - return false; - } - - if (config.supports_hw_a2c_1spp) - { - return true; - } - - return REGS(m_ctx)->surface_antialias() != rsx::surface_antialiasing::center_1_sample; - }; - - if (REGS(m_ctx)->msaa_alpha_to_coverage_enabled() && !can_use_hw_a2c()) - { - // TODO: Properly support alpha-to-coverage and alpha-to-one behavior in shaders - // Alpha values generate a coverage mask for order independent blending - // Requires hardware AA to work properly (or just fragment sample stage in fragment shaders) - // Simulated using combined alpha blend and alpha test - rop_control.enable_alpha_to_coverage(); - if (REGS(m_ctx)->msaa_sample_mask()) - { - rop_control.enable_MSAA_writes(); - } - - // Sample configuration bits - switch (REGS(m_ctx)->surface_antialias()) - { - case rsx::surface_antialiasing::center_1_sample: - break; - case rsx::surface_antialiasing::diagonal_centered_2_samples: - rop_control.set_msaa_control(1u); - break; - default: - rop_control.set_msaa_control(3u); - break; - } - } - - // Check if framebuffer is actually an XRGB format and not a WZYX format - switch (REGS(m_ctx)->surface_color()) - { - case rsx::surface_color_format::w16z16y16x16: - case rsx::surface_color_format::w32z32y32x32: - case rsx::surface_color_format::x32: - // These behave very differently from "normal" formats. - break; - default: - // Integer framebuffer formats. - rop_control.enable_framebuffer_INT(); - - // Check if we want sRGB conversion. - if (REGS(m_ctx)->framebuffer_srgb_enabled()) - { - rop_control.enable_framebuffer_sRGB(); - } - break; - } - // Generate wpos coefficients // wpos equation is now as follows (ignoring pixel center offset): // wpos.y = (frag_coord / resolution_scale) * ((window_origin!=top)?-1.: 1.) + ((window_origin!=top)? window_height : 0) @@ -766,7 +699,6 @@ namespace rsx payload.rop_control = rop_control.value; payload.alpha_ref = REGS(m_ctx)->alpha_ref(); - const auto window_origin = REGS(m_ctx)->shader_window_origin(); const u32 window_height = REGS(m_ctx)->shader_window_height(); const auto pixel_center = REGS(m_ctx)->pixel_center(); diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index cc28c0c98f..047b362bae 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -219,16 +219,24 @@ void GLFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) m_shader_props.require_srgb_to_linear = properties.has_upg; m_shader_props.require_linear_to_srgb = properties.has_pkg; m_shader_props.require_fog_read = properties.in_register_mask & in_fogc; - m_shader_props.emulate_coverage_tests = !rsx::get_renderer_backend_config().supports_hw_a2c_1spp; m_shader_props.emulate_shadow_compare = device_props.emulate_depth_compare; + m_shader_props.low_precision_tests = ::gl::get_driver_caps().vendor_NVIDIA && !(m_prog.ctrl & RSX_SHADER_CONTROL_ATTRIBUTE_INTERPOLATION); m_shader_props.disable_early_discard = !::gl::get_driver_caps().vendor_NVIDIA; m_shader_props.supports_native_fp16 = device_props.has_native_half_support; - m_shader_props.ROP_output_rounding = g_cfg.video.shader_precision != gpu_preset_level::low; + + m_shader_props.ROP_output_rounding = (g_cfg.video.shader_precision != gpu_preset_level::low) && !!(m_prog.ctrl & RSX_SHADER_CONTROL_8BIT_FRAMEBUFFER); + m_shader_props.ROP_sRGB_packing = !!(m_prog.ctrl & RSX_SHADER_CONTROL_SRGB_FRAMEBUFFER); + m_shader_props.ROP_alpha_test = !!(m_prog.ctrl & RSX_SHADER_CONTROL_ALPHA_TEST); + m_shader_props.ROP_alpha_to_coverage_test = !!(m_prog.ctrl & RSX_SHADER_CONTROL_ALPHA_TO_COVERAGE); + m_shader_props.ROP_polygon_stipple_test = !!(m_prog.ctrl & RSX_SHADER_CONTROL_POLYGON_STIPPLE); + m_shader_props.ROP_discard = !!(m_prog.ctrl & RSX_SHADER_CONTROL_USES_KIL); + m_shader_props.require_tex1D_ops = properties.has_tex1D; m_shader_props.require_tex2D_ops = properties.has_tex2D; m_shader_props.require_tex3D_ops = properties.has_tex3D; m_shader_props.require_shadowProj_ops = properties.shadow_sampler_mask != 0 && properties.has_texShadowProj; + m_shader_props.require_alpha_kill = !!(m_prog.ctrl & RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL); glsl::insert_glsl_legacy_function(OS, m_shader_props); } diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index afebcce7ed..1421b179fc 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -216,12 +216,12 @@ namespace glsl enabled_options.push_back("_32_BIT_OUTPUT"); } - if (!props.fp32_outputs) + if (props.ROP_sRGB_packing) { enabled_options.push_back("_ENABLE_FRAMEBUFFER_SRGB"); } - if (props.disable_early_discard) + if (props.disable_early_discard && props.ROP_discard) { enabled_options.push_back("_DISABLE_EARLY_DISCARD"); } @@ -231,7 +231,15 @@ namespace glsl enabled_options.push_back("_ENABLE_ROP_OUTPUT_ROUNDING"); } - enabled_options.push_back("_ENABLE_POLYGON_STIPPLE"); + if (props.ROP_alpha_test) + { + enabled_options.push_back("_ENABLE_ALPHA_TEST"); + } + + if (props.ROP_polygon_stipple_test) + { + enabled_options.push_back("_ENABLE_POLYGON_STIPPLE"); + } } // Import common header @@ -276,12 +284,12 @@ namespace glsl return; } - if (props.emulate_coverage_tests) + if (props.ROP_alpha_to_coverage_test) { - enabled_options.push_back("_EMULATE_COVERAGE_TEST"); + enabled_options.push_back("_ENABLE_ALPHA_TO_COVERAGE_TEST"); } - if (!props.fp32_outputs || props.require_linear_to_srgb) + if (props.ROP_sRGB_packing || props.require_linear_to_srgb) { enabled_options.push_back("_ENABLE_LINEAR_TO_SRGB"); } @@ -296,6 +304,11 @@ namespace glsl enabled_options.push_back("_ENABLE_WPOS"); } + if (props.ROP_alpha_test || (props.require_msaa_ops && props.require_tex_shadow_ops)) + { + enabled_options.push_back("_ENABLE_COMPARISON_FUNC"); + } + if (props.require_fog_read) { program_common::define_glsl_constants(OS, @@ -385,6 +398,11 @@ namespace glsl enabled_options.push_back("_ENABLE_SHADOWPROJ"); } + if (props.require_alpha_kill) + { + enabled_options.push_back("_ENABLE_TEXTURE_ALPHA_KILL"); + } + program_common::define_glsl_switches(OS, enabled_options); enabled_options.clear(); diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentPrologue.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentPrologue.glsl index e40373f64c..2fe1277ea9 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentPrologue.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentPrologue.glsl @@ -81,7 +81,7 @@ vec4 fetch_fog_value(const in uint mode) } #endif -#ifdef _EMULATE_COVERAGE_TEST +#ifdef _ENABLE_ALPHA_TO_COVERAGE_TEST // Purely stochastic bool coverage_test_passes(const in vec4 _sample) { @@ -109,6 +109,7 @@ vec4 srgb_to_linear(const in vec4 cs) } #endif +#ifdef _ENABLE_COMPARISON_FUNC // Required by all fragment shaders for alpha test bool comparison_passes(const in float a, const in float b, const in uint func) { @@ -125,5 +126,6 @@ bool comparison_passes(const in float a, const in float b, const in uint func) case 7: return true; //always } } +#endif )" diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index e231333184..f0457f0034 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -188,6 +188,7 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) return rgba; } +#ifdef _ENABLE_TEXTURE_ALPHA_KILL if (_test_bit(control_bits, ALPHAKILL)) { // Alphakill @@ -197,6 +198,7 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) return rgba; } } +#endif if (_test_bit(control_bits, RENORMALIZE)) { diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl index aaaaa559ca..283371d0ed 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl @@ -8,43 +8,33 @@ R"( #endif #ifdef _ENABLE_FRAMEBUFFER_SRGB - if (_test_bit(rop_control, SRGB_FRAMEBUFFER_BIT)) - { - col0.rgb = _mrt_color_t(linear_to_srgb(col0)).rgb; - col1.rgb = _mrt_color_t(linear_to_srgb(col1)).rgb; - col2.rgb = _mrt_color_t(linear_to_srgb(col2)).rgb; - col3.rgb = _mrt_color_t(linear_to_srgb(col3)).rgb; - } + col0.rgb = _mrt_color_t(linear_to_srgb(col0)).rgb; + col1.rgb = _mrt_color_t(linear_to_srgb(col1)).rgb; + col2.rgb = _mrt_color_t(linear_to_srgb(col2)).rgb; + col3.rgb = _mrt_color_t(linear_to_srgb(col3)).rgb; #endif #ifdef _ENABLE_ROP_OUTPUT_ROUNDING - if (_test_bit(rop_control, INT_FRAMEBUFFER_BIT)) - { - col0 = round_to_8bit(col0); - col1 = round_to_8bit(col1); - col2 = round_to_8bit(col2); - col3 = round_to_8bit(col3); - } + col0 = round_to_8bit(col0); + col1 = round_to_8bit(col1); + col2 = round_to_8bit(col2); + col3 = round_to_8bit(col3); #endif // Post-output stages // Alpha Testing - if (_test_bit(rop_control, ALPHA_TEST_ENABLE_BIT)) +#ifdef _ENABLE_ALPHA_TEST + const uint alpha_func = _get_bits(rop_control, ALPHA_TEST_FUNC_OFFSET, ALPHA_TEST_FUNC_LENGTH); + if (!comparison_passes(col0.a, alpha_ref, alpha_func)) { - const uint alpha_func = _get_bits(rop_control, ALPHA_TEST_FUNC_OFFSET, ALPHA_TEST_FUNC_LENGTH); - if (!comparison_passes(col0.a, alpha_ref, alpha_func)) - { - discard; - } + discard; } +#endif -#ifdef _EMULATE_COVERAGE_TEST - if (_test_bit(rop_control, ALPHA_TO_COVERAGE_ENABLE_BIT)) +#ifdef _ENABLE_ALPHA_TO_COVERAGE_TEST + if (!_test_bit(rop_control, MSAA_WRITE_ENABLE_BIT) || !coverage_test_passes(col0)) { - if (!_test_bit(rop_control, MSAA_WRITE_ENABLE_BIT) || !coverage_test_passes(col0)) - { - discard; - } + discard; } #endif diff --git a/rpcs3/Emu/RSX/Program/GLSLTypes.h b/rpcs3/Emu/RSX/Program/GLSLTypes.h index 4716c845d2..5b1b61396e 100644 --- a/rpcs3/Emu/RSX/Program/GLSLTypes.h +++ b/rpcs3/Emu/RSX/Program/GLSLTypes.h @@ -36,12 +36,18 @@ namespace glsl bool require_srgb_to_linear : 1; bool require_linear_to_srgb : 1; bool require_fog_read : 1; - bool emulate_coverage_tests : 1; bool emulate_shadow_compare : 1; bool low_precision_tests : 1; bool disable_early_discard : 1; bool supports_native_fp16 : 1; + + // ROP control flags bool ROP_output_rounding : 1; + bool ROP_sRGB_packing : 1; + bool ROP_alpha_test : 1; + bool ROP_alpha_to_coverage_test : 1; + bool ROP_polygon_stipple_test : 1; + bool ROP_discard : 1; // Texturing spec bool require_texture_ops : 1; // Global switch to enable/disable all texture code @@ -53,5 +59,6 @@ namespace glsl bool require_tex2D_ops : 1; // Include 2D texture stuff bool require_tex3D_ops : 1; // Include 3D texture stuff (including cubemap) bool require_shadowProj_ops : 1; // Include shadow2DProj projection textures (1D is unsupported anyway) + bool require_alpha_kill : 1; // Include alpha kill checking code }; }; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 73c86907f1..dc4f01f010 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2063,6 +2063,26 @@ namespace rsx { current_fragment_program.ctrl |= RSX_SHADER_CONTROL_ATTRIBUTE_INTERPOLATION; } + + if (method_registers.alpha_test_enabled()) + { + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_ALPHA_TEST; + } + + if (method_registers.polygon_stipple_enabled()) + { + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_POLYGON_STIPPLE; + } + + if (method_registers.msaa_alpha_to_coverage_enabled()) + { + const bool is_multiple_samples = method_registers.surface_antialias() != rsx::surface_antialiasing::center_1_sample; + if (!backend_config.supports_hw_a2c || (!is_multiple_samples && !backend_config.supports_hw_a2c_1spp)) + { + // Emulation required + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_ALPHA_TO_COVERAGE; + } + } } else if (method_registers.point_sprite_enabled() && method_registers.current_draw_clause.primitive == primitive_type::points) @@ -2071,6 +2091,24 @@ namespace rsx current_fragment_program.texcoord_control_mask |= u32(method_registers.point_sprite_control_mask()) << 16; } + // Check if framebuffer is actually an XRGB format and not a WZYX format + switch (method_registers.surface_color()) + { + case rsx::surface_color_format::w16z16y16x16: + case rsx::surface_color_format::w32z32y32x32: + case rsx::surface_color_format::x32: + // These behave very differently from "normal" formats. + break; + default: + // Integer framebuffer formats. These can support sRGB output as well as some special rules for output quantization. + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_8BIT_FRAMEBUFFER; + if (method_registers.framebuffer_srgb_enabled()) + { + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_SRGB_FRAMEBUFFER; + } + break; + } + for (u32 textures_ref = current_fp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) continue; @@ -2098,6 +2136,7 @@ namespace rsx { //alphakill can be ignored unless a valid comparison function is set texture_control |= (1 << texture_control_bits::ALPHAKILL); + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL; } //const u32 texaddr = rsx::get_address(tex.offset(), tex.location()); diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index c720ae8550..ab06fbdade 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -318,16 +318,24 @@ void VKFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) m_shader_props.require_srgb_to_linear = properties.has_upg; m_shader_props.require_linear_to_srgb = properties.has_pkg; m_shader_props.require_fog_read = properties.in_register_mask & in_fogc; - m_shader_props.emulate_coverage_tests = g_cfg.video.antialiasing_level == msaa_level::none; m_shader_props.emulate_shadow_compare = device_props.emulate_depth_compare; + m_shader_props.low_precision_tests = device_props.has_low_precision_rounding && !(m_prog.ctrl & RSX_SHADER_CONTROL_ATTRIBUTE_INTERPOLATION); m_shader_props.disable_early_discard = !vk::is_NVIDIA(vk::get_driver_vendor()); m_shader_props.supports_native_fp16 = device_props.has_native_half_support; - m_shader_props.ROP_output_rounding = g_cfg.video.shader_precision != gpu_preset_level::low; + + m_shader_props.ROP_output_rounding = (g_cfg.video.shader_precision != gpu_preset_level::low) && !!(m_prog.ctrl & RSX_SHADER_CONTROL_8BIT_FRAMEBUFFER); + m_shader_props.ROP_sRGB_packing = !!(m_prog.ctrl & RSX_SHADER_CONTROL_SRGB_FRAMEBUFFER); + m_shader_props.ROP_alpha_test = !!(m_prog.ctrl & RSX_SHADER_CONTROL_ALPHA_TEST); + m_shader_props.ROP_alpha_to_coverage_test = !!(m_prog.ctrl & RSX_SHADER_CONTROL_ALPHA_TO_COVERAGE); + m_shader_props.ROP_polygon_stipple_test = !!(m_prog.ctrl & RSX_SHADER_CONTROL_POLYGON_STIPPLE); + m_shader_props.ROP_discard = !!(m_prog.ctrl & RSX_SHADER_CONTROL_USES_KIL); + m_shader_props.require_tex1D_ops = properties.has_tex1D; m_shader_props.require_tex2D_ops = properties.has_tex2D; m_shader_props.require_tex3D_ops = properties.has_tex3D; m_shader_props.require_shadowProj_ops = properties.shadow_sampler_mask != 0 && properties.has_texShadowProj; + m_shader_props.require_alpha_kill = !!(m_prog.ctrl & RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL); // Declare global constants if (m_shader_props.require_fog_read) diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index 61b51c3857..7fd9437f66 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -454,9 +454,17 @@ namespace gcm RSX_SHADER_CONTROL_UNKNOWN1 = 0x8000, // seemingly set when srgb packer is used?? // Custom - RSX_SHADER_CONTROL_ATTRIBUTE_INTERPOLATION = 0x10000, // Rasterizing triangles and not lines or points - RSX_SHADER_CONTROL_INSTANCED_CONSTANTS = 0x20000, // Support instance ID offsets when loading constants - RSX_SHADER_CONTROL_INTERPRETER_MODEL = 0x40000, // Compile internals expecting interpreter + RSX_SHADER_CONTROL_ATTRIBUTE_INTERPOLATION = 0x0010000, // Rasterizing triangles and not lines or points + RSX_SHADER_CONTROL_INSTANCED_CONSTANTS = 0x0020000, // Support instance ID offsets when loading constants + RSX_SHADER_CONTROL_INTERPRETER_MODEL = 0x0040000, // Compile internals expecting interpreter + + RSX_SHADER_CONTROL_8BIT_FRAMEBUFFER = 0x0080000, // Quantize outputs to 8-bit FBO + RSX_SHADER_CONTROL_SRGB_FRAMEBUFFER = 0x0100000, // Outputs are SRGB. We could reuse UNKNOWN1 but we just keep the namespaces separate. + + RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL = 0x0200000, // Uses alpha kill on texture input + RSX_SHADER_CONTROL_ALPHA_TEST = 0x0400000, // Uses alpha test on the outputs + RSX_SHADER_CONTROL_POLYGON_STIPPLE = 0x0800000, // Uses polygon stipple for dithered rendering + RSX_SHADER_CONTROL_ALPHA_TO_COVERAGE = 0x1000000, // Alpha to coverage }; // GCM Reports From 1a733353dee7c758796013c554707e0327e1219b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Dec 2025 15:23:56 +0300 Subject: [PATCH 019/630] rsx: Fix MSAA sampling operations --- .../RSXProg/RSXFragmentTextureMSAAOps.glsl | 6 ++--- .../RSXFragmentTextureMSAAOpsInternal.glsl | 24 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOps.glsl index 965eac5276..00e81c39c5 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOps.glsl @@ -1,8 +1,8 @@ R"( #define ZCOMPARE_FUNC(index) _get_bits(TEX_FLAGS(index), DEPTH_COMPARE, 3) -#define ZS_READ_MS(index, coord) vec2(sampleTexture2DMS(TEX_NAME(index), coord, index).r, float(sampleTexture2DMS(TEX_NAME_STENCIL(index), coord, index).x)) -#define TEX2D_MS(index, coord2) _process_texel(sampleTexture2DMS(TEX_NAME(index), coord2, index), TEX_FLAGS(index)) -#define TEX2D_SHADOW_MS(index, coord3) vec4(comparison_passes(sampleTexture2DMS(TEX_NAME(index), coord3.xy, index).x, coord3.z, ZCOMPARE_FUNC(index))) +#define ZS_READ_MS(index, coord) vec2(sampleTexture2DMS(TEX_NAME(index), coord, TEX_PARAM(index)).r, float(sampleTexture2DMS(TEX_NAME_STENCIL(index), coord, TEX_PARAM(index)).x)) +#define TEX2D_MS(index, coord2) _process_texel(sampleTexture2DMS(TEX_NAME(index), coord2, TEX_PARAM(index)), TEX_FLAGS(index)) +#define TEX2D_SHADOW_MS(index, coord3) vec4(comparison_passes(sampleTexture2DMS(TEX_NAME(index), coord3.xy, TEX_PARAM(index)).x, coord3.z, ZCOMPARE_FUNC(index))) #define TEX2D_SHADOWPROJ_MS(index, coord4) TEX2D_SHADOW_MS(index, (coord4.xyz / coord4.w)) #define TEX2D_Z24X8_RGBA8_MS(index, coord2) _process_texel(convert_z24x8_to_rgba8(ZS_READ_MS(index, coord2), TEX_PARAM(index).remap, TEX_FLAGS(index)), TEX_FLAGS(index)) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOpsInternal.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOpsInternal.glsl index 0bf734ab35..5bf5ab9f9a 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOpsInternal.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureMSAAOpsInternal.glsl @@ -1,5 +1,5 @@ R"( -vec4 texelFetch2DMS(in _MSAA_SAMPLER_TYPE_ tex, const in vec2 sample_count, const in ivec2 icoords, const in int index, const in ivec2 offset) +vec4 texelFetch2DMS(in _MSAA_SAMPLER_TYPE_ tex, const in vec2 sample_count, const in ivec2 icoords, const in ivec2 offset) { const vec2 resolve_coords = vec2(icoords + offset); const vec2 aa_coords = floor(resolve_coords / sample_count); // AA coords = real_coords / sample_count @@ -8,15 +8,15 @@ vec4 texelFetch2DMS(in _MSAA_SAMPLER_TYPE_ tex, const in vec2 sample_count, cons return texelFetch(tex, ivec2(aa_coords), int(sample_index)); } -vec4 sampleTexture2DMS(in _MSAA_SAMPLER_TYPE_ tex, const in vec2 coords, const in int index) +vec4 sampleTexture2DMS(in _MSAA_SAMPLER_TYPE_ tex, const in vec2 coords, const in sampler_info tex_params) { - const uint flags = TEX_FLAGS(index); - const vec2 scaled_coords = COORD_SCALE2(index, coords); + const uint flags = tex_params.flags; + const vec2 scaled_coords = _texcoord_xform(coords, tex_params); const vec2 normalized_coords = texture2DMSCoord(scaled_coords, flags); const vec2 sample_count = vec2(2., textureSamples(tex) * 0.5); const vec2 image_size = textureSize(tex) * sample_count; const ivec2 icoords = ivec2(normalized_coords * image_size); - const vec4 sample0 = texelFetch2DMS(tex, sample_count, icoords, index, ivec2(0)); + const vec4 sample0 = texelFetch2DMS(tex, sample_count, icoords, ivec2(0)); if (_get_bits(flags, FILTERED_MAG_BIT, 2) == 0) { @@ -35,7 +35,7 @@ vec4 sampleTexture2DMS(in _MSAA_SAMPLER_TYPE_ tex, const in vec2 coords, const i vec4 a, b; float factor; - const vec4 sample2 = texelFetch2DMS(tex, sample_count, icoords, index, ivec2(0, 1)); // Top left + const vec4 sample2 = texelFetch2DMS(tex, sample_count, icoords, ivec2(0, 1)); // Top left if (no_filter.x) { @@ -46,21 +46,21 @@ vec4 sampleTexture2DMS(in _MSAA_SAMPLER_TYPE_ tex, const in vec2 coords, const i else { // Filter required, sample more data - const vec4 sample1 = texelFetch2DMS(tex, sample_count, icoords, index, ivec2(1, 0)); // Bottom right - const vec4 sample3 = texelFetch2DMS(tex, sample_count, icoords, index, ivec2(1, 1)); // Top right + const vec4 sample1 = texelFetch2DMS(tex, sample_count, icoords, ivec2(1, 0)); // Bottom right + const vec4 sample3 = texelFetch2DMS(tex, sample_count, icoords, ivec2(1, 1)); // Top right if (actual_step.x > uv_step.x) { // Downscale in X, centered const vec3 weights = compute2x2DownsampleWeights(normalized_coords.x, uv_step.x, actual_step.x); - const vec4 sample4 = texelFetch2DMS(tex, sample_count, icoords, index, ivec2(2, 0)); // Further bottom right - a = fma(sample0, weights.xxxx, sample1 * weights.y) + (sample4 * weights.z); // Weighted sum + const vec4 sample4 = texelFetch2DMS(tex, sample_count, icoords, ivec2(2, 0)); // Further bottom right + a = fma(sample0, weights.xxxx, sample1 * weights.y) + (sample4 * weights.z); // Weighted sum if (!no_filter.y) { - const vec4 sample5 = texelFetch2DMS(tex, sample_count, icoords, index, ivec2(2, 1)); // Further top right - b = fma(sample2, weights.xxxx, sample3 * weights.y) + (sample5 * weights.z); // Weighted sum + const vec4 sample5 = texelFetch2DMS(tex, sample_count, icoords, ivec2(2, 1)); // Further top right + b = fma(sample2, weights.xxxx, sample3 * weights.y) + (sample5 * weights.z); // Weighted sum } } else if (actual_step.x < uv_step.x) From 8030b01064113c9c9a41d7946f4e1d0d3ee1b6e5 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Dec 2025 15:24:32 +0300 Subject: [PATCH 020/630] rsx: Propagate shader kill flag and refactor texture flags processing a bit --- rpcs3/Emu/RSX/RSXThread.cpp | 378 ++++++++++++++++++------------------ 1 file changed, 190 insertions(+), 188 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index dc4f01f010..dd272d5f84 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2052,7 +2052,7 @@ namespace rsx m_graphics_state.clear(rsx::pipeline_state::fragment_program_dirty); - current_fragment_program.ctrl = m_ctx->register_state->shader_control() & (CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS | CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT); + current_fragment_program.ctrl = m_ctx->register_state->shader_control() & (CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS | CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_USES_KIL); current_fragment_program.texcoord_control_mask = m_ctx->register_state->texcoord_control_mask(); current_fragment_program.two_sided_lighting = m_ctx->register_state->two_side_light_en(); current_fragment_program.mrt_buffers_count = rsx::utility::get_mrt_buffers_count(m_ctx->register_state->surface_color_target()); @@ -2116,195 +2116,197 @@ namespace rsx auto &tex = rsx::method_registers.fragment_textures[i]; current_fp_texture_state.clear(i); - if (tex.enabled() && sampler_descriptors[i]->format_class != RSX_FORMAT_CLASS_UNDEFINED) + if (!tex.enabled() || sampler_descriptors[i]->format_class == RSX_FORMAT_CLASS_UNDEFINED) { - std::memcpy(current_fragment_program.texture_params[i].scale, sampler_descriptors[i]->texcoord_xform.scale, 6 * sizeof(f32)); - current_fragment_program.texture_params[i].remap = tex.remap(); - - m_graphics_state |= rsx::pipeline_state::fragment_texture_state_dirty; - - u32 texture_control = 0; - current_fp_texture_state.set_dimension(sampler_descriptors[i]->image_type, i); - - if (sampler_descriptors[i]->texcoord_xform.clamp) - { - std::memcpy(current_fragment_program.texture_params[i].clamp_min, sampler_descriptors[i]->texcoord_xform.clamp_min, 4 * sizeof(f32)); - texture_control |= (1 << rsx::texture_control_bits::CLAMP_TEXCOORDS_BIT); - } - - if (tex.alpha_kill_enabled()) - { - //alphakill can be ignored unless a valid comparison function is set - texture_control |= (1 << texture_control_bits::ALPHAKILL); - current_fragment_program.ctrl |= RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL; - } - - //const u32 texaddr = rsx::get_address(tex.offset(), tex.location()); - const u32 raw_format = tex.format(); - const u32 format = raw_format & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN); - - if (raw_format & CELL_GCM_TEXTURE_UN) - { - if (tex.min_filter() == rsx::texture_minify_filter::nearest || - tex.mag_filter() == rsx::texture_magnify_filter::nearest) - { - // Subpixel offset so that (X + bias) * scale will round correctly. - // This is done to work around fdiv precision issues in some GPUs (NVIDIA) - // We apply the simplification where (x + bias) * z = xz + zbias here. - constexpr auto subpixel_bias = 0.01f; - current_fragment_program.texture_params[i].bias[0] += (subpixel_bias * current_fragment_program.texture_params[i].scale[0]); - current_fragment_program.texture_params[i].bias[1] += (subpixel_bias * current_fragment_program.texture_params[i].scale[1]); - current_fragment_program.texture_params[i].bias[2] += (subpixel_bias * current_fragment_program.texture_params[i].scale[2]); - } - } - - if (backend_config.supports_hw_msaa && sampler_descriptors[i]->samples > 1) - { - current_fp_texture_state.multisampled_textures |= (1 << i); - texture_control |= (static_cast(tex.zfunc()) << texture_control_bits::DEPTH_COMPARE_OP); - texture_control |= (static_cast(tex.mag_filter() != rsx::texture_magnify_filter::nearest) << texture_control_bits::FILTERED_MAG); - texture_control |= (static_cast(tex.min_filter() != rsx::texture_minify_filter::nearest) << texture_control_bits::FILTERED_MIN); - texture_control |= (((tex.format() & CELL_GCM_TEXTURE_UN) >> 6) << texture_control_bits::UNNORMALIZED_COORDS); - - if (rsx::is_texcoord_wrapping_mode(tex.wrap_s())) - { - texture_control |= (1 << texture_control_bits::WRAP_S); - } - - if (rsx::is_texcoord_wrapping_mode(tex.wrap_t())) - { - texture_control |= (1 << texture_control_bits::WRAP_T); - } - - if (rsx::is_texcoord_wrapping_mode(tex.wrap_r())) - { - texture_control |= (1 << texture_control_bits::WRAP_R); - } - } - - if (sampler_descriptors[i]->format_class != RSX_FORMAT_CLASS_COLOR) - { - switch (sampler_descriptors[i]->format_class) - { - case RSX_FORMAT_CLASS_DEPTH16_FLOAT: - case RSX_FORMAT_CLASS_DEPTH24_FLOAT_X8_PACK32: - texture_control |= (1 << texture_control_bits::DEPTH_FLOAT); - break; - default: - break; - } - - switch (format) - { - case CELL_GCM_TEXTURE_A8R8G8B8: - case CELL_GCM_TEXTURE_D8R8G8B8: - { - // Emulate bitcast in shader - current_fp_texture_state.redirected_textures |= (1 << i); - const auto float_en = (sampler_descriptors[i]->format_class == RSX_FORMAT_CLASS_DEPTH24_FLOAT_X8_PACK32)? 1 : 0; - texture_control |= (float_en << texture_control_bits::DEPTH_FLOAT); - break; - } - case CELL_GCM_TEXTURE_X16: - { - // A simple way to quickly read DEPTH16 data without shadow comparison - break; - } - case CELL_GCM_TEXTURE_DEPTH16: - case CELL_GCM_TEXTURE_DEPTH24_D8: - case CELL_GCM_TEXTURE_DEPTH16_FLOAT: - case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT: - { - // Natively supported Z formats with shadow comparison feature - const auto compare_mode = tex.zfunc(); - if (!tex.alpha_kill_enabled() && - compare_mode < rsx::comparison_function::always && - compare_mode > rsx::comparison_function::never) - { - current_fp_texture_state.shadow_textures |= (1 << i); - } - break; - } - default: - rsx_log.error("Depth texture bound to pipeline with unexpected format 0x%X", format); - } - } - else if (!backend_config.supports_hw_renormalization /* && - tex.min_filter() == rsx::texture_minify_filter::nearest && - tex.mag_filter() == rsx::texture_magnify_filter::nearest*/) - { - // FIXME: This check should only apply to point-sampled textures. However, it severely regresses some games (id tech 5). - // This is because even when filtering is active, the error from the PS3 texture expansion still applies. - // A proper fix is to expand these formats into BGRA8 when high texture precision is required. That requires different GUI settings and inflation shaders, so it will be handled separately. - - switch (format) - { - case CELL_GCM_TEXTURE_A1R5G5B5: - case CELL_GCM_TEXTURE_A4R4G4B4: - case CELL_GCM_TEXTURE_D1R5G5B5: - case CELL_GCM_TEXTURE_R5G5B5A1: - case CELL_GCM_TEXTURE_R5G6B5: - case CELL_GCM_TEXTURE_R6G5B5: - texture_control |= (1 << texture_control_bits::RENORMALIZE); - break; - default: - break; - } - } - - if (rsx::is_int8_remapped_format(format)) - { - // Special operations applied to 8-bit formats such as gamma correction and sign conversion - // NOTE: The unsigned_remap=bias flag being set flags the texture as being compressed normal (2n-1 / BX2) (UE3) - // NOTE: The ARGB8_signed flag means to reinterpret the raw bytes as signed. This is different than unsigned_remap=bias which does range decompression. - // This is a separate method of setting the format to signed mode without doing so per-channel - // Precedence = SNORM > GAMMA > UNSIGNED_REMAP (See Resistance 3 for GAMMA/BX2 relationship, UE3 for BX2 effect) - - const u32 argb8_signed = tex.argb_signed(); // _SNROM - const u32 gamma = tex.gamma() & ~argb8_signed; // _SRGB - const u32 unsigned_remap = (tex.unsigned_remap() == CELL_GCM_TEXTURE_UNSIGNED_REMAP_NORMAL)? 0u : (~(gamma | argb8_signed) & 0xF); // _BX2 - u32 argb8_convert = gamma; - - // The options are mutually exclusive - ensure((argb8_signed & gamma) == 0); - ensure((argb8_signed & unsigned_remap) == 0); - ensure((gamma & unsigned_remap) == 0); - - // Helper function to apply a per-channel mask based on an input mask - const auto apply_sign_convert_mask = [&](u32 mask, u32 bit_offset) - { - // TODO: Use actual remap mask to account for 0 and 1 overrides in default mapping - // TODO: Replace this clusterfuck of texture control with matrix transformation - const auto remap_ctrl = (tex.remap() >> 8) & 0xAA; - if (remap_ctrl == 0xAA) - { - argb8_convert |= (mask & 0xFu) << bit_offset; - return; - } - - if ((remap_ctrl & 0x03) == 0x02) argb8_convert |= (mask & 0x1u) << bit_offset; - if ((remap_ctrl & 0x0C) == 0x08) argb8_convert |= (mask & 0x2u) << bit_offset; - if ((remap_ctrl & 0x30) == 0x20) argb8_convert |= (mask & 0x4u) << bit_offset; - if ((remap_ctrl & 0xC0) == 0x80) argb8_convert |= (mask & 0x8u) << bit_offset; - }; - - if (argb8_signed) - { - // Apply integer sign extension from uint8 to sint8 and renormalize - apply_sign_convert_mask(argb8_signed, texture_control_bits::SEXT_OFFSET); - } - - if (unsigned_remap) - { - // Apply sign expansion, compressed normal-map style (2n - 1) - apply_sign_convert_mask(unsigned_remap, texture_control_bits::EXPAND_OFFSET); - } - - texture_control |= argb8_convert; - } - - current_fragment_program.texture_params[i].control = texture_control; + continue; } + + std::memcpy(current_fragment_program.texture_params[i].scale, sampler_descriptors[i]->texcoord_xform.scale, 6 * sizeof(f32)); + current_fragment_program.texture_params[i].remap = tex.remap(); + + m_graphics_state |= rsx::pipeline_state::fragment_texture_state_dirty; + + u32 texture_control = 0; + current_fp_texture_state.set_dimension(sampler_descriptors[i]->image_type, i); + + if (sampler_descriptors[i]->texcoord_xform.clamp) + { + std::memcpy(current_fragment_program.texture_params[i].clamp_min, sampler_descriptors[i]->texcoord_xform.clamp_min, 4 * sizeof(f32)); + texture_control |= (1 << rsx::texture_control_bits::CLAMP_TEXCOORDS_BIT); + } + + if (tex.alpha_kill_enabled()) + { + //alphakill can be ignored unless a valid comparison function is set + texture_control |= (1 << texture_control_bits::ALPHAKILL); + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL; + } + + //const u32 texaddr = rsx::get_address(tex.offset(), tex.location()); + const u32 raw_format = tex.format(); + const u32 format = raw_format & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN); + + if (raw_format & CELL_GCM_TEXTURE_UN) + { + if (tex.min_filter() == rsx::texture_minify_filter::nearest || + tex.mag_filter() == rsx::texture_magnify_filter::nearest) + { + // Subpixel offset so that (X + bias) * scale will round correctly. + // This is done to work around fdiv precision issues in some GPUs (NVIDIA) + // We apply the simplification where (x + bias) * z = xz + zbias here. + constexpr auto subpixel_bias = 0.01f; + current_fragment_program.texture_params[i].bias[0] += (subpixel_bias * current_fragment_program.texture_params[i].scale[0]); + current_fragment_program.texture_params[i].bias[1] += (subpixel_bias * current_fragment_program.texture_params[i].scale[1]); + current_fragment_program.texture_params[i].bias[2] += (subpixel_bias * current_fragment_program.texture_params[i].scale[2]); + } + } + + if (backend_config.supports_hw_msaa && sampler_descriptors[i]->samples > 1) + { + current_fp_texture_state.multisampled_textures |= (1 << i); + texture_control |= (static_cast(tex.zfunc()) << texture_control_bits::DEPTH_COMPARE_OP); + texture_control |= (static_cast(tex.mag_filter() != rsx::texture_magnify_filter::nearest) << texture_control_bits::FILTERED_MAG); + texture_control |= (static_cast(tex.min_filter() != rsx::texture_minify_filter::nearest) << texture_control_bits::FILTERED_MIN); + texture_control |= (((tex.format() & CELL_GCM_TEXTURE_UN) >> 6) << texture_control_bits::UNNORMALIZED_COORDS); + + if (rsx::is_texcoord_wrapping_mode(tex.wrap_s())) + { + texture_control |= (1 << texture_control_bits::WRAP_S); + } + + if (rsx::is_texcoord_wrapping_mode(tex.wrap_t())) + { + texture_control |= (1 << texture_control_bits::WRAP_T); + } + + if (rsx::is_texcoord_wrapping_mode(tex.wrap_r())) + { + texture_control |= (1 << texture_control_bits::WRAP_R); + } + } + + if (sampler_descriptors[i]->format_class != RSX_FORMAT_CLASS_COLOR) + { + switch (sampler_descriptors[i]->format_class) + { + case RSX_FORMAT_CLASS_DEPTH16_FLOAT: + case RSX_FORMAT_CLASS_DEPTH24_FLOAT_X8_PACK32: + texture_control |= (1 << texture_control_bits::DEPTH_FLOAT); + break; + default: + break; + } + + switch (format) + { + case CELL_GCM_TEXTURE_A8R8G8B8: + case CELL_GCM_TEXTURE_D8R8G8B8: + { + // Emulate bitcast in shader + current_fp_texture_state.redirected_textures |= (1 << i); + const auto float_en = (sampler_descriptors[i]->format_class == RSX_FORMAT_CLASS_DEPTH24_FLOAT_X8_PACK32)? 1 : 0; + texture_control |= (float_en << texture_control_bits::DEPTH_FLOAT); + break; + } + case CELL_GCM_TEXTURE_X16: + { + // A simple way to quickly read DEPTH16 data without shadow comparison + break; + } + case CELL_GCM_TEXTURE_DEPTH16: + case CELL_GCM_TEXTURE_DEPTH24_D8: + case CELL_GCM_TEXTURE_DEPTH16_FLOAT: + case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT: + { + // Natively supported Z formats with shadow comparison feature + const auto compare_mode = tex.zfunc(); + if (!tex.alpha_kill_enabled() && + compare_mode < rsx::comparison_function::always && + compare_mode > rsx::comparison_function::never) + { + current_fp_texture_state.shadow_textures |= (1 << i); + } + break; + } + default: + rsx_log.error("Depth texture bound to pipeline with unexpected format 0x%X", format); + } + } + else if (!backend_config.supports_hw_renormalization /* && + tex.min_filter() == rsx::texture_minify_filter::nearest && + tex.mag_filter() == rsx::texture_magnify_filter::nearest*/) + { + // FIXME: This check should only apply to point-sampled textures. However, it severely regresses some games (id tech 5). + // This is because even when filtering is active, the error from the PS3 texture expansion still applies. + // A proper fix is to expand these formats into BGRA8 when high texture precision is required. That requires different GUI settings and inflation shaders, so it will be handled separately. + + switch (format) + { + case CELL_GCM_TEXTURE_A1R5G5B5: + case CELL_GCM_TEXTURE_A4R4G4B4: + case CELL_GCM_TEXTURE_D1R5G5B5: + case CELL_GCM_TEXTURE_R5G5B5A1: + case CELL_GCM_TEXTURE_R5G6B5: + case CELL_GCM_TEXTURE_R6G5B5: + texture_control |= (1 << texture_control_bits::RENORMALIZE); + break; + default: + break; + } + } + + if (rsx::is_int8_remapped_format(format)) + { + // Special operations applied to 8-bit formats such as gamma correction and sign conversion + // NOTE: The unsigned_remap=bias flag being set flags the texture as being compressed normal (2n-1 / BX2) (UE3) + // NOTE: The ARGB8_signed flag means to reinterpret the raw bytes as signed. This is different than unsigned_remap=bias which does range decompression. + // This is a separate method of setting the format to signed mode without doing so per-channel + // Precedence = SNORM > GAMMA > UNSIGNED_REMAP (See Resistance 3 for GAMMA/BX2 relationship, UE3 for BX2 effect) + + const u32 argb8_signed = tex.argb_signed(); // _SNROM + const u32 gamma = tex.gamma() & ~argb8_signed; // _SRGB + const u32 unsigned_remap = (tex.unsigned_remap() == CELL_GCM_TEXTURE_UNSIGNED_REMAP_NORMAL)? 0u : (~(gamma | argb8_signed) & 0xF); // _BX2 + u32 argb8_convert = gamma; + + // The options are mutually exclusive + ensure((argb8_signed & gamma) == 0); + ensure((argb8_signed & unsigned_remap) == 0); + ensure((gamma & unsigned_remap) == 0); + + // Helper function to apply a per-channel mask based on an input mask + const auto apply_sign_convert_mask = [&](u32 mask, u32 bit_offset) + { + // TODO: Use actual remap mask to account for 0 and 1 overrides in default mapping + // TODO: Replace this clusterfuck of texture control with matrix transformation + const auto remap_ctrl = (tex.remap() >> 8) & 0xAA; + if (remap_ctrl == 0xAA) + { + argb8_convert |= (mask & 0xFu) << bit_offset; + return; + } + + if ((remap_ctrl & 0x03) == 0x02) argb8_convert |= (mask & 0x1u) << bit_offset; + if ((remap_ctrl & 0x0C) == 0x08) argb8_convert |= (mask & 0x2u) << bit_offset; + if ((remap_ctrl & 0x30) == 0x20) argb8_convert |= (mask & 0x4u) << bit_offset; + if ((remap_ctrl & 0xC0) == 0x80) argb8_convert |= (mask & 0x8u) << bit_offset; + }; + + if (argb8_signed) + { + // Apply integer sign extension from uint8 to sint8 and renormalize + apply_sign_convert_mask(argb8_signed, texture_control_bits::SEXT_OFFSET); + } + + if (unsigned_remap) + { + // Apply sign expansion, compressed normal-map style (2n - 1) + apply_sign_convert_mask(unsigned_remap, texture_control_bits::EXPAND_OFFSET); + } + + texture_control |= argb8_convert; + } + + current_fragment_program.texture_params[i].control = texture_control; } // Update texture configuration From 69cdded5ba54c577d139e5415926da64ef2865a1 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Dec 2025 20:38:12 +0300 Subject: [PATCH 021/630] rsx: Fix sRGB control flag propagation to shader control - Also clean up the texturing code and fix some memcpy overflow bugs. --- rpcs3/Emu/RSX/RSXThread.cpp | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index dd272d5f84..638814fda1 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2057,26 +2057,26 @@ namespace rsx current_fragment_program.two_sided_lighting = m_ctx->register_state->two_side_light_en(); current_fragment_program.mrt_buffers_count = rsx::utility::get_mrt_buffers_count(m_ctx->register_state->surface_color_target()); - if (method_registers.current_draw_clause.classify_mode() == primitive_class::polygon) + if (m_ctx->register_state->current_draw_clause.classify_mode() == primitive_class::polygon) { if (!backend_config.supports_normalized_barycentrics) { current_fragment_program.ctrl |= RSX_SHADER_CONTROL_ATTRIBUTE_INTERPOLATION; } - if (method_registers.alpha_test_enabled()) + if (m_ctx->register_state->alpha_test_enabled()) { current_fragment_program.ctrl |= RSX_SHADER_CONTROL_ALPHA_TEST; } - if (method_registers.polygon_stipple_enabled()) + if (m_ctx->register_state->polygon_stipple_enabled()) { current_fragment_program.ctrl |= RSX_SHADER_CONTROL_POLYGON_STIPPLE; } - if (method_registers.msaa_alpha_to_coverage_enabled()) + if (m_ctx->register_state->msaa_alpha_to_coverage_enabled()) { - const bool is_multiple_samples = method_registers.surface_antialias() != rsx::surface_antialiasing::center_1_sample; + const bool is_multiple_samples = m_ctx->register_state->surface_antialias() != rsx::surface_antialiasing::center_1_sample; if (!backend_config.supports_hw_a2c || (!is_multiple_samples && !backend_config.supports_hw_a2c_1spp)) { // Emulation required @@ -2084,15 +2084,15 @@ namespace rsx } } } - else if (method_registers.point_sprite_enabled() && - method_registers.current_draw_clause.primitive == primitive_type::points) + else if (m_ctx->register_state->point_sprite_enabled() && + m_ctx->register_state->current_draw_clause.primitive == primitive_type::points) { // Set high word of the control mask to store point sprite control - current_fragment_program.texcoord_control_mask |= u32(method_registers.point_sprite_control_mask()) << 16; + current_fragment_program.texcoord_control_mask |= u32(m_ctx->register_state->point_sprite_control_mask()) << 16; } // Check if framebuffer is actually an XRGB format and not a WZYX format - switch (method_registers.surface_color()) + switch (m_ctx->register_state->surface_color()) { case rsx::surface_color_format::w16z16y16x16: case rsx::surface_color_format::w32z32y32x32: @@ -2102,7 +2102,8 @@ namespace rsx default: // Integer framebuffer formats. These can support sRGB output as well as some special rules for output quantization. current_fragment_program.ctrl |= RSX_SHADER_CONTROL_8BIT_FRAMEBUFFER; - if (method_registers.framebuffer_srgb_enabled()) + if (!(current_fragment_program.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) && // Cannot output sRGB from 32-bit registers + m_ctx->register_state->framebuffer_srgb_enabled()) { current_fragment_program.ctrl |= RSX_SHADER_CONTROL_SRGB_FRAMEBUFFER; } @@ -2113,7 +2114,7 @@ namespace rsx { if (!(textures_ref & 1)) continue; - auto &tex = rsx::method_registers.fragment_textures[i]; + auto &tex = m_ctx->register_state->fragment_textures[i]; current_fp_texture_state.clear(i); if (!tex.enabled() || sampler_descriptors[i]->format_class == RSX_FORMAT_CLASS_UNDEFINED) @@ -2121,7 +2122,11 @@ namespace rsx continue; } - std::memcpy(current_fragment_program.texture_params[i].scale, sampler_descriptors[i]->texcoord_xform.scale, 6 * sizeof(f32)); + std::memcpy( + current_fragment_program.texture_params[i].scale, + sampler_descriptors[i]->texcoord_xform.scale, + sizeof(sampler_descriptors[i]->texcoord_xform.scale)); + current_fragment_program.texture_params[i].remap = tex.remap(); m_graphics_state |= rsx::pipeline_state::fragment_texture_state_dirty; @@ -2131,7 +2136,11 @@ namespace rsx if (sampler_descriptors[i]->texcoord_xform.clamp) { - std::memcpy(current_fragment_program.texture_params[i].clamp_min, sampler_descriptors[i]->texcoord_xform.clamp_min, 4 * sizeof(f32)); + std::memcpy( + current_fragment_program.texture_params[i].clamp_min, + sampler_descriptors[i]->texcoord_xform.clamp_min, + sizeof(sampler_descriptors[i]->texcoord_xform.clamp_min)); + texture_control |= (1 << rsx::texture_control_bits::CLAMP_TEXCOORDS_BIT); } @@ -2316,7 +2325,7 @@ namespace rsx if (current_fragment_program.ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) { //Check that the depth stage is not disabled - if (!rsx::method_registers.depth_test_enabled()) + if (!m_ctx->register_state->depth_test_enabled()) { rsx_log.trace("FS exports depth component but depth test is disabled (INVALID_OPERATION)"); } From da21b101442c295769cd3086a3f96a291be251ff Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Dec 2025 21:25:37 +0300 Subject: [PATCH 022/630] rsx: Propagate state changes to trigger permutation lookup - Alpha test - MSAA (for CSAA enable flag) - Polygon stipple --- rpcs3/Emu/RSX/NV47/HW/nv4097.cpp | 8 ++++++-- rpcs3/Emu/RSX/rsx_methods.cpp | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp index d0298cf359..8db588da60 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp @@ -250,8 +250,12 @@ namespace rsx const auto current = REGS(ctx)->decode(arg); const auto previous = REGS(ctx)->decode(REGS(ctx)->latch); - if (*current.antialias() != *previous.antialias() || // Antialias control has changed, update ROP parameters - current.is_integer_color_format() != previous.is_integer_color_format()) // The type of color format also requires ROP control update + if (current.is_integer_color_format() != previous.is_integer_color_format()) // Different ROP emulation + { + RSX(ctx)->m_graphics_state |= rsx::pipeline_state::fragment_program_state_dirty; + } + + if (*current.antialias() != *previous.antialias()) // Antialias control has changed, update ROP parameters { RSX(ctx)->m_graphics_state |= rsx::pipeline_state::fragment_state_dirty; } diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 903a10c582..3d12440882 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -716,9 +716,9 @@ namespace rsx state_signals[NV4097_SET_POINT_SIZE] = rsx::vertex_state_dirty; state_signals[NV4097_SET_ALPHA_FUNC] = rsx::fragment_state_dirty; state_signals[NV4097_SET_ALPHA_REF] = rsx::fragment_state_dirty; - state_signals[NV4097_SET_ALPHA_TEST_ENABLE] = rsx::fragment_state_dirty; - state_signals[NV4097_SET_ANTI_ALIASING_CONTROL] = rsx::fragment_state_dirty | rsx::pipeline_config_dirty; - state_signals[NV4097_SET_SHADER_PACKER] = rsx::fragment_state_dirty; + state_signals[NV4097_SET_ALPHA_TEST_ENABLE] = rsx::fragment_program_state_dirty; + state_signals[NV4097_SET_ANTI_ALIASING_CONTROL] = rsx::fragment_program_state_dirty; + state_signals[NV4097_SET_SHADER_PACKER] = rsx::fragment_program_state_dirty; state_signals[NV4097_SET_SHADER_WINDOW] = rsx::fragment_state_dirty; state_signals[NV4097_SET_FOG_MODE] = rsx::fragment_state_dirty; state_signals[NV4097_SET_SCISSOR_HORIZONTAL] = rsx::scissor_config_state_dirty; @@ -733,7 +733,7 @@ namespace rsx state_signals[NV4097_SET_VIEWPORT_OFFSET + 0] = rsx::vertex_state_dirty; state_signals[NV4097_SET_VIEWPORT_OFFSET + 1] = rsx::vertex_state_dirty; state_signals[NV4097_SET_VIEWPORT_OFFSET + 2] = rsx::vertex_state_dirty; - state_signals[NV4097_SET_POLYGON_STIPPLE] = rsx::fragment_state_dirty; + state_signals[NV4097_SET_POLYGON_STIPPLE] = rsx::fragment_program_state_dirty; state_signals[NV4097_SET_POLYGON_STIPPLE_PATTERN + 0] = rsx::polygon_stipple_pattern_dirty; state_signals[NV4097_SET_POLYGON_STIPPLE_PATTERN + 1] = rsx::polygon_stipple_pattern_dirty; state_signals[NV4097_SET_POLYGON_STIPPLE_PATTERN + 2] = rsx::polygon_stipple_pattern_dirty; From 6e0b5a874d35edd60d918b759931b4a7642a3f77 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Dec 2025 21:40:14 +0300 Subject: [PATCH 023/630] rxs: Improve alpha-to-coverage emulation --- rpcs3/Emu/RSX/NV47/HW/nv4097.cpp | 28 +++++++++++++++++++ rpcs3/Emu/RSX/NV47/HW/nv4097.h | 2 ++ .../GLSLSnippets/RSXProg/RSXROPEpilogue.glsl | 2 +- rpcs3/Emu/RSX/rsx_methods.cpp | 2 +- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp index 8db588da60..929925bcb1 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp @@ -306,6 +306,34 @@ namespace rsx REGS(ctx)->decode(reg, REGS(ctx)->latch); } + void set_aa_control(context* ctx, u32 reg, u32 arg) + { + const auto latch = REGS(ctx)->latch; + if (arg == latch) + { + return; + } + + // Reconfigure pipeline. + RSX(ctx)->m_graphics_state |= rsx::pipeline_config_dirty; + + // If we support A2C in hardware, leave the rest upto the hardware. The pipeline config should take care of it. + const auto& backend_config = RSX(ctx)->get_backend_config(); + if (backend_config.supports_hw_a2c && + backend_config.supports_hw_a2c_1spp) + { + return; + } + + // No A2C hardware support or partial hardware support. Invalidate the current program if A2C state changed. + const auto a2c_old = REGS(ctx)->decode(latch).msaa_alpha_to_coverage(); + const auto a2c_new = REGS(ctx)->decode(arg).msaa_alpha_to_coverage(); + if (a2c_old != a2c_new) + { + RSX(ctx)->m_graphics_state |= rsx::fragment_program_state_dirty; + } + } + ///// Draw call setup (vertex, etc) void set_array_element16(context* ctx, u32, u32 arg) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv4097.h b/rpcs3/Emu/RSX/NV47/HW/nv4097.h index db736396b9..a5a434e47d 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv4097.h +++ b/rpcs3/Emu/RSX/NV47/HW/nv4097.h @@ -87,6 +87,8 @@ namespace rsx void set_transform_constant_load(context* ctx, u32 reg, u32 arg); + void set_aa_control(context* ctx, u32 reg, u32 arg); + #define RSX(ctx) ctx->rsxthr #define REGS(ctx) (&rsx::method_registers) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl index 283371d0ed..240186cd29 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPEpilogue.glsl @@ -32,7 +32,7 @@ R"( #endif #ifdef _ENABLE_ALPHA_TO_COVERAGE_TEST - if (!_test_bit(rop_control, MSAA_WRITE_ENABLE_BIT) || !coverage_test_passes(col0)) + if (!coverage_test_passes(col0)) { discard; } diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 3d12440882..03bbd1e52a 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -717,7 +717,6 @@ namespace rsx state_signals[NV4097_SET_ALPHA_FUNC] = rsx::fragment_state_dirty; state_signals[NV4097_SET_ALPHA_REF] = rsx::fragment_state_dirty; state_signals[NV4097_SET_ALPHA_TEST_ENABLE] = rsx::fragment_program_state_dirty; - state_signals[NV4097_SET_ANTI_ALIASING_CONTROL] = rsx::fragment_program_state_dirty; state_signals[NV4097_SET_SHADER_PACKER] = rsx::fragment_program_state_dirty; state_signals[NV4097_SET_SHADER_WINDOW] = rsx::fragment_state_dirty; state_signals[NV4097_SET_FOG_MODE] = rsx::fragment_state_dirty; @@ -1714,6 +1713,7 @@ namespace rsx bind(NV4097_SET_BLEND_EQUATION, nv4097::set_blend_equation); bind(NV4097_SET_BLEND_FUNC_SFACTOR, nv4097::set_blend_factor); bind(NV4097_SET_BLEND_FUNC_DFACTOR, nv4097::set_blend_factor); + bind(NV4097_SET_ANTI_ALIASING_CONTROL, nv4097::set_aa_control); //NV308A (0xa400..0xbffc!) bind_array(NV308A_COLOR, 1, 256 * 7, nv308a::color::impl); From 0e9c877b83ed3930d1586e8467a8f4a01e0db79a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Dec 2025 21:40:46 +0300 Subject: [PATCH 024/630] rsx: Drop pointless ROP control bit check --- .../GLSLSnippets/RSXProg/RSXROPPrologue.glsl | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPPrologue.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPPrologue.glsl index 5b0798e43e..f24a1ca201 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPPrologue.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXROPPrologue.glsl @@ -1,24 +1,21 @@ R"( #ifdef _ENABLE_POLYGON_STIPPLE - if (_test_bit(rop_control, POLYGON_STIPPLE_ENABLE_BIT)) - { - // Convert x,y to linear address - const uvec2 stipple_coord = uvec2(gl_FragCoord.xy) % uvec2(32, 32); - const uint address = stipple_coord.y * 32u + stipple_coord.x; - const uint bit_offset = (address & 31u); - #ifdef VULKAN - // In vulkan we have a unified array with a dynamic offset - const uint word_index = _get_bits(address, 7, 3) + _fs_stipple_pattern_array_offset; - #else - const uint word_index = _get_bits(address, 7, 3); - #endif - const uint sub_index = _get_bits(address, 5, 2); + // Convert x,y to linear address + const uvec2 stipple_coord = uvec2(gl_FragCoord.xy) % uvec2(32, 32); + const uint address = stipple_coord.y * 32u + stipple_coord.x; + const uint bit_offset = (address & 31u); +#ifdef VULKAN + // In vulkan we have a unified array with a dynamic offset + const uint word_index = _get_bits(address, 7, 3) + _fs_stipple_pattern_array_offset; +#else + const uint word_index = _get_bits(address, 7, 3); +#endif + const uint sub_index = _get_bits(address, 5, 2); - if (!_test_bit(stipple_pattern[word_index][sub_index], int(bit_offset))) - { - _kill(); - } + if (!_test_bit(stipple_pattern[word_index][sub_index], int(bit_offset))) + { + _kill(); } #endif From 307dac479c9611f99ea7d7ec9849cceea86860bb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 14 Dec 2025 22:50:35 +0300 Subject: [PATCH 025/630] rsx: Fix texcoord clamp regression --- rpcs3/Emu/RSX/RSXThread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 638814fda1..80ae166467 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2125,7 +2125,7 @@ namespace rsx std::memcpy( current_fragment_program.texture_params[i].scale, sampler_descriptors[i]->texcoord_xform.scale, - sizeof(sampler_descriptors[i]->texcoord_xform.scale)); + sizeof(sampler_descriptors[i]->texcoord_xform.scale) * 2); // Copy scale and bias together current_fragment_program.texture_params[i].remap = tex.remap(); @@ -2139,7 +2139,7 @@ namespace rsx std::memcpy( current_fragment_program.texture_params[i].clamp_min, sampler_descriptors[i]->texcoord_xform.clamp_min, - sizeof(sampler_descriptors[i]->texcoord_xform.clamp_min)); + sizeof(sampler_descriptors[i]->texcoord_xform.clamp_min) * 2); // Copy clamp_min and clamp_max together texture_control |= (1 << rsx::texture_control_bits::CLAMP_TEXCOORDS_BIT); } From bd1a25698c30052164e3f06a56e7359a02fe26e6 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 15 Dec 2025 00:43:26 +0300 Subject: [PATCH 026/630] rsx: Fix alpha testing - We no longer reload fragment state when toggling alpha-test. Instead, a different shader variant is picked. --- rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp b/rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp index ed2447ab24..53f6ce31e7 100644 --- a/rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp +++ b/rpcs3/Emu/RSX/Core/RSXDrawCommands.cpp @@ -680,12 +680,9 @@ namespace rsx ROP_control_t rop_control{}; alignas(16) fragment_context_t payload{}; - if (REGS(m_ctx)->alpha_test_enabled()) - { - const u32 alpha_func = static_cast(REGS(m_ctx)->alpha_func()); - rop_control.set_alpha_test_func(alpha_func); - rop_control.enable_alpha_test(); - } + // Always encode the alpha function. Toggling alpha-test is not guaranteed to trigger context param reload anymore. + const u32 alpha_func = static_cast(REGS(m_ctx)->alpha_func()); + rop_control.set_alpha_test_func(alpha_func); // Generate wpos coefficients // wpos equation is now as follows (ignoring pixel center offset): From 5baf8aeb22d28749b23e79051e4197d60c845b5a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 16 Dec 2025 01:59:47 +0300 Subject: [PATCH 027/630] vk/fp: Only emit alpha-testing variables when required --- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index ab06fbdade..93e074248e 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -460,10 +460,12 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) OS << "void main()\n"; OS << "{\n"; - // FIXME: Workaround - OS << - " const uint rop_control = fs_contexts[_fs_context_offset].rop_control;\n" - " const float alpha_ref = fs_contexts[_fs_context_offset].alpha_ref;\n\n"; + if (m_prog.ctrl & RSX_SHADER_CONTROL_ALPHA_TEST) + { + OS << + " const uint rop_control = fs_contexts[_fs_context_offset].rop_control;\n" + " const float alpha_ref = fs_contexts[_fs_context_offset].alpha_ref;\n\n"; + } ::glsl::insert_rop_init(OS); From 441e7e04857710a122a2eb8050222776a519ec37 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 16 Dec 2025 14:07:58 +0300 Subject: [PATCH 028/630] rsx: Disable early-Z optimizations if a loopback on the depth texture is active - The optimizations worked a bit too well and allowed early-Z to kick in. - Early Z inverts the logic making reads happen after writes and breaking loopback sampling. --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 19 +++++++++++++++---- rpcs3/Emu/RSX/RSXThread.cpp | 6 ++++++ rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 11 +++++++++++ rpcs3/Emu/RSX/gcm_enums.h | 5 +++++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 047b362bae..66f062c323 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -335,20 +335,31 @@ void GLFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) OS << "\n" << " fs_main();\n\n"; + if ((m_ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) && + !(m_ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && + g_cfg.video.shader_precision != gpu_preset_level::low) + { + // This is effectively unreachable code, but good enough to trick the GPU to skip early Z + OS << + "// Insert NOP sequence to disable early-Z\n" + "if (isnan(gl_FragCoord.z))\n" + " discard;\n\n"; + } + glsl::insert_rop(OS, m_shader_props); if (m_ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) { if (m_parr.HasParam(PF_PARAM_NONE, "vec4", "r1")) { - //Depth writes are always from a fp32 register. See issues section on nvidia's NV_fragment_program spec - //https://www.khronos.org/registry/OpenGL/extensions/NV/NV_fragment_program.txt + // Depth writes are always from a fp32 register. See issues section on nvidia's NV_fragment_program spec + // https://www.khronos.org/registry/OpenGL/extensions/NV/NV_fragment_program.txt OS << " gl_FragDepth = r1.z;\n"; } else { - //Input not declared. Leave commented to assist in debugging the shader - OS << " //gl_FragDepth = r1.z;\n"; + // Input not declared. Leave commented to assist in debugging the shader + OS << " // gl_FragDepth = r1.z;\n"; } } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 80ae166467..1b58bf787f 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2240,6 +2240,12 @@ namespace rsx default: rsx_log.error("Depth texture bound to pipeline with unexpected format 0x%X", format); } + + if (sampler_descriptors[i]->is_cyclic_reference && + g_cfg.video.shader_precision != gpu_preset_level::low) + { + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_DISABLE_EARLY_Z; + } } else if (!backend_config.supports_hw_renormalization /* && tex.min_filter() == rsx::texture_minify_filter::nearest && diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 93e074248e..0e8e318464 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -471,6 +471,17 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) OS << "\n" << " fs_main();\n\n"; + if ((m_ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) && + !(m_ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && + g_cfg.video.shader_precision != gpu_preset_level::low) + { + // This is effectively unreachable code, but good enough to trick the GPU to skip early Z + OS << + "// Insert NOP sequence to disable early-Z\n" + "if (isnan(gl_FragCoord.z))\n" + " discard;\n\n"; + } + glsl::insert_rop(OS, m_shader_props); if (m_ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index 7fd9437f66..539796a531 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -465,6 +465,11 @@ namespace gcm RSX_SHADER_CONTROL_ALPHA_TEST = 0x0400000, // Uses alpha test on the outputs RSX_SHADER_CONTROL_POLYGON_STIPPLE = 0x0800000, // Uses polygon stipple for dithered rendering RSX_SHADER_CONTROL_ALPHA_TO_COVERAGE = 0x1000000, // Alpha to coverage + + RSX_SHADER_CONTROL_DISABLE_EARLY_Z = 0x2000000, // Do not allow early-Z optimizations on this shader + + // Meta + RSX_SHADER_CONTROL_META_USES_DISCARD = (RSX_SHADER_CONTROL_USES_KIL | RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL | RSX_SHADER_CONTROL_ALPHA_TEST | RSX_SHADER_CONTROL_POLYGON_STIPPLE | RSX_SHADER_CONTROL_ALPHA_TO_COVERAGE) }; // GCM Reports From 5a809c5f724514baa377a03089a50f917f73669b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 17 Dec 2025 09:29:44 +0300 Subject: [PATCH 029/630] rsx/fp: Stop using m_ctrl and use the correct object from m_prog --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 20 +++++++-------- .../RSX/Program/FragmentProgramDecompiler.cpp | 5 ++-- .../RSX/Program/FragmentProgramDecompiler.h | 1 - rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 25 ++++++++++--------- 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 66f062c323..6ef26db1e0 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -93,13 +93,13 @@ void GLFragmentDecompilerThread::insertOutputs(std::stringstream & OS) { const std::pair table[] = { - { "ocol0", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r0" : "h0" }, - { "ocol1", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r2" : "h4" }, - { "ocol2", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r3" : "h6" }, - { "ocol3", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r4" : "h8" }, + { "ocol0", m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r0" : "h0" }, + { "ocol1", m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r2" : "h4" }, + { "ocol2", m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r3" : "h6" }, + { "ocol3", m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r4" : "h8" }, }; - const bool float_type = (m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) || !device_props.has_native_half_support; + const bool float_type = (m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) || !device_props.has_native_half_support; const auto reg_type = float_type ? "vec4" : getHalfTypeName(4); for (uint i = 0; i < std::size(table); ++i) { @@ -244,7 +244,7 @@ void GLFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS) { std::set output_registers; - if (m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) + if (m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) { output_registers = { "r0", "r2", "r3", "r4" }; } @@ -253,7 +253,7 @@ void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS) output_registers = { "h0", "h4", "h6", "h8" }; } - if (m_ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) + if (m_prog.ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) { output_registers.insert("r1"); } @@ -335,8 +335,8 @@ void GLFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) OS << "\n" << " fs_main();\n\n"; - if ((m_ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) && - !(m_ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && + if ((m_prog.ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) && + !(m_prog.ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && g_cfg.video.shader_precision != gpu_preset_level::low) { // This is effectively unreachable code, but good enough to trick the GPU to skip early Z @@ -348,7 +348,7 @@ void GLFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) glsl::insert_rop(OS, m_shader_props); - if (m_ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) + if (m_prog.ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) { if (m_parr.HasParam(PF_PARAM_NONE, "vec4", "r1")) { diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index 1ba30e45b3..8c5c163f06 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -84,7 +84,6 @@ std::vector get_fragment_program_output_set(u32 ctrl, u32 mrt_count FragmentProgramDecompiler::FragmentProgramDecompiler(const RSXFragmentProgram &prog, u32& size) : m_size(size) , m_prog(prog) - , m_ctrl(prog.ctrl) { m_size = 0; } @@ -805,7 +804,7 @@ std::string FragmentProgramDecompiler::BuildCode() // Shader validation // Shader must at least write to one output for the body to be considered valid - const bool fp16_out = !(m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS); + const bool fp16_out = !(m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS); const std::string float4_type = (fp16_out && device_props.has_native_half_support)? getHalfTypeName(4) : getFloatTypeName(4); const std::string init_value = float4_type + "(0.)"; std::array output_register_names; @@ -814,7 +813,7 @@ std::string FragmentProgramDecompiler::BuildCode() std::stringstream main_epilogue; // Check depth export - if (m_ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) + if (m_prog.ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) { // Hw tests show that the depth export register is default-initialized to 0 and not wpos.z!! m_parr.AddParam(PF_PARAM_NONE, getFloatTypeName(4), "r1", init_value); diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.h b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.h index 09a02804c3..8e22a21a93 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.h +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.h @@ -99,7 +99,6 @@ class FragmentProgramDecompiler protected: const RSXFragmentProgram &m_prog; - u32 m_ctrl = 0; /** returns the type name of float vectors. */ diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 0e8e318464..8ecc427f73 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -144,15 +144,15 @@ void VKFragmentDecompilerThread::insertOutputs(std::stringstream & OS) { const std::pair table[] = { - { "ocol0", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r0" : "h0" }, - { "ocol1", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r2" : "h4" }, - { "ocol2", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r3" : "h6" }, - { "ocol3", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r4" : "h8" }, + { "ocol0", m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r0" : "h0" }, + { "ocol1", m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r2" : "h4" }, + { "ocol2", m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r3" : "h6" }, + { "ocol3", m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r4" : "h8" }, }; // NOTE: We do not skip outputs, the only possible combinations are a(0), b(0), ab(0,1), abc(0,1,2), abcd(0,1,2,3) u8 output_index = 0; - const bool float_type = (m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) || !device_props.has_native_half_support; + const bool float_type = (m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) || !device_props.has_native_half_support; const auto reg_type = float_type ? "vec4" : getHalfTypeName(4); for (uint i = 0; i < std::size(table); ++i) { @@ -363,7 +363,7 @@ void VKFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) void VKFragmentDecompilerThread::insertMainStart(std::stringstream & OS) { std::set output_registers; - if (m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) + if (m_prog.ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) { output_registers = { "r0", "r2", "r3", "r4" }; } @@ -372,7 +372,7 @@ void VKFragmentDecompilerThread::insertMainStart(std::stringstream & OS) output_registers = { "h0", "h4", "h6", "h8" }; } - if (m_ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) + if (m_prog.ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) { output_registers.insert("r1"); } @@ -471,20 +471,21 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) OS << "\n" << " fs_main();\n\n"; - if ((m_ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) && - !(m_ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && + if ((m_prog.ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) && + !(m_prog.ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && g_cfg.video.shader_precision != gpu_preset_level::low) { // This is effectively unreachable code, but good enough to trick the GPU to skip early Z OS << "// Insert NOP sequence to disable early-Z\n" - "if (isnan(gl_FragCoord.z))\n" - " discard;\n\n"; + " const uint rop_control = fs_contexts[_fs_context_offset].rop_control;\n" + " if (_test_bit(rop_control, 0))\n" + " discard;\n\n"; } glsl::insert_rop(OS, m_shader_props); - if (m_ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) + if (m_prog.ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) { if (m_parr.HasParam(PF_PARAM_NONE, "vec4", "r1")) { From fd3ecea21e271f1d5f2487ae0d2f825d4303d2b3 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 17 Dec 2025 11:11:46 +0300 Subject: [PATCH 030/630] rsx: Improve early-Z disablement mechanism --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 11 ++++------- rpcs3/Emu/RSX/RSXThread.cpp | 2 ++ rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 11 ++++------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 6ef26db1e0..f8cc046569 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -335,15 +335,12 @@ void GLFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) OS << "\n" << " fs_main();\n\n"; - if ((m_prog.ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) && - !(m_prog.ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && - g_cfg.video.shader_precision != gpu_preset_level::low) + if (m_prog.ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) { - // This is effectively unreachable code, but good enough to trick the GPU to skip early Z + // This is effectively pointless code, but good enough to trick the GPU to skip early Z OS << - "// Insert NOP sequence to disable early-Z\n" - "if (isnan(gl_FragCoord.z))\n" - " discard;\n\n"; + " // Insert pseudo-barrier sequence to disable early-Z\n" + " gl_FragDepth = gl_FragCoord.z;\n\n"; } glsl::insert_rop(OS, m_shader_props); diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 1b58bf787f..a353c34d94 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2242,6 +2242,8 @@ namespace rsx } if (sampler_descriptors[i]->is_cyclic_reference && + !(current_fragment_program.ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && + !g_cfg.video.strict_rendering_mode && g_cfg.video.shader_precision != gpu_preset_level::low) { current_fragment_program.ctrl |= RSX_SHADER_CONTROL_DISABLE_EARLY_Z; diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 8ecc427f73..af2e60ec93 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -471,16 +471,13 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) OS << "\n" << " fs_main();\n\n"; - if ((m_prog.ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) && - !(m_prog.ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && - g_cfg.video.shader_precision != gpu_preset_level::low) + if (m_prog.ctrl & RSX_SHADER_CONTROL_DISABLE_EARLY_Z) { // This is effectively unreachable code, but good enough to trick the GPU to skip early Z + // For vulkan, depth export has stronger semantics than discard. OS << - "// Insert NOP sequence to disable early-Z\n" - " const uint rop_control = fs_contexts[_fs_context_offset].rop_control;\n" - " if (_test_bit(rop_control, 0))\n" - " discard;\n\n"; + " // Insert pseudo-barrier sequence to disable early-Z\n" + " gl_FragDepth = gl_FragCoord.z;\n\n"; } glsl::insert_rop(OS, m_shader_props); From ba673d1407851086f2bb960a8c4a4b494eabbcb9 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 26 Dec 2025 15:23:54 +0300 Subject: [PATCH 031/630] rsx/vk: Add post-cyclic-z barriers allowing us to keep early Z optimizations --- rpcs3/Emu/RSX/Core/RSXDriverState.h | 3 +++ rpcs3/Emu/RSX/RSXThread.cpp | 40 +++++++++++++++++++++++++---- rpcs3/Emu/RSX/VK/VKDraw.cpp | 10 ++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/Core/RSXDriverState.h b/rpcs3/Emu/RSX/Core/RSXDriverState.h index 16dd08c78d..9e7bc2cd68 100644 --- a/rpcs3/Emu/RSX/Core/RSXDriverState.h +++ b/rpcs3/Emu/RSX/Core/RSXDriverState.h @@ -40,6 +40,9 @@ namespace rsx xform_instancing_state_dirty = (1 << 25), // Transform instancing state has changed + zeta_address_is_cyclic = (1 << 26), // The currently bound Z buffer is active for R/W in a cyclic manner + zeta_address_cyclic_barrier = (1 << 27), // A memory barrier is required to "end" the Z buffer cyclic state + // TODO - Should signal that we simply need to do a FP compare before the next draw call and invalidate the ucode if the content has changed. // Marking as dirty to invalidate hot cache also works, it's not like there's tons of barriers per frame anyway. fragment_program_needs_rehash = fragment_program_ucode_dirty, diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index a353c34d94..c6038e2f50 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -1681,10 +1681,24 @@ namespace rsx return; } + auto set_zeta_write_enabled = [&](bool state) + { + if (state == m_framebuffer_layout.zeta_write_enabled) + { + return; + } + + if (m_graphics_state & rsx::zeta_address_is_cyclic) + { + m_graphics_state |= rsx::fragment_program_state_dirty; + } + m_framebuffer_layout.zeta_write_enabled = state; + }; + auto evaluate_depth_buffer_state = [&]() { - m_framebuffer_layout.zeta_write_enabled = - (rsx::method_registers.depth_test_enabled() && rsx::method_registers.depth_write_enabled()); + const bool zeta_write_en = (rsx::method_registers.depth_test_enabled() && rsx::method_registers.depth_write_enabled()); + set_zeta_write_enabled(zeta_write_en); }; auto evaluate_stencil_buffer_state = [&]() @@ -1707,7 +1721,7 @@ namespace rsx rsx::method_registers.back_stencil_op_zfail() != rsx::stencil_op::keep); } - m_framebuffer_layout.zeta_write_enabled = (mask && active_write_op); + set_zeta_write_enabled(mask && active_write_op); } }; @@ -2110,6 +2124,9 @@ namespace rsx break; } + const bool zeta_was_cyclic = m_graphics_state & rsx::zeta_address_is_cyclic; + m_graphics_state.clear(rsx::zeta_address_is_cyclic); + for (u32 textures_ref = current_fp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) continue; @@ -2242,11 +2259,17 @@ namespace rsx } if (sampler_descriptors[i]->is_cyclic_reference && - !(current_fragment_program.ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && + m_framebuffer_layout.zeta_address != 0 && !g_cfg.video.strict_rendering_mode && g_cfg.video.shader_precision != gpu_preset_level::low) { - current_fragment_program.ctrl |= RSX_SHADER_CONTROL_DISABLE_EARLY_Z; + m_graphics_state |= rsx::zeta_address_is_cyclic; + + if (!(current_fragment_program.ctrl & (CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT | RSX_SHADER_CONTROL_META_USES_DISCARD)) && + m_framebuffer_layout.zeta_write_enabled) + { + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_DISABLE_EARLY_Z; + } } } else if (!backend_config.supports_hw_renormalization /* && @@ -2340,6 +2363,13 @@ namespace rsx } m_program_cache_hint.invalidate_fragment_program(current_fragment_program); + + if (zeta_was_cyclic && zeta_was_cyclic != m_graphics_state.test(rsx::zeta_address_is_cyclic)) + { + // Forced "fall-out" barrier. This is a special case for Z buffers because they can be cyclic without writes. + // That condition can cause early-Z in a later call to introduce data hazard in previous cyclic draws. + m_graphics_state |= rsx::zeta_address_cyclic_barrier; + } } bool thread::invalidate_fragment_program(u32 dst_dma, u32 dst_offset, u32 size) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 6101aeb9de..a088a6ead6 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -1044,6 +1044,14 @@ void VKGSRender::end() if (auto ds = std::get<1>(m_rtts.m_bound_depth_stencil)) { ds->write_barrier(*m_current_command_buffer); + + if (m_graphics_state.test(rsx::zeta_address_cyclic_barrier) && + ds->current_layout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) + { + // We actually need to end the subpass as a minimum. Without this, early-Z optimiazations in following draws will clobber reads from previous draws and cause flickering. + // Since we're ending the subpass, might as well restore DCC/HiZ for extra performance + ds->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); + } } for (auto &rtt : m_rtts.m_bound_render_targets) @@ -1054,6 +1062,8 @@ void VKGSRender::end() } } + m_graphics_state.clear(rsx::zeta_address_cyclic_barrier); + m_frame_stats.setup_time += m_profiler.duration(); // Now bind the shader resources. It is important that this takes place after the barriers so that we don't end up with stale descriptors From e58698684512f0f3dea70b0e84da4d35657a066e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 26 Dec 2025 16:04:18 +0300 Subject: [PATCH 032/630] rsx/gl: Clear cyclic Z barrier flag - OpenGL doesn't care about this but we clear it anyway to indicate it is no longer pending. --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index 51bf257aef..e8ea4bc714 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -715,7 +715,10 @@ void GLGSRender::end() m_frame_stats.textures_upload_time += m_profiler.duration(); gl::command_context cmd{ gl_state }; - if (auto ds = std::get<1>(m_rtts.m_bound_depth_stencil)) ds->write_barrier(cmd); + if (auto ds = std::get<1>(m_rtts.m_bound_depth_stencil)) + { + ds->write_barrier(cmd); + } for (auto &rtt : m_rtts.m_bound_render_targets) { @@ -725,6 +728,8 @@ void GLGSRender::end() } } + m_graphics_state.clear(rsx::zeta_address_cyclic_barrier); + update_draw_state(); if (g_cfg.video.debug_output) From 316aa44d3e7f27c2505717221dc234bc08794f4d Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 27 Dec 2025 00:07:22 +0300 Subject: [PATCH 033/630] vk: Fix crash when shuffling between cyclic and non-cyclic Z-buffer in one logical pass --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 66 ++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index a088a6ead6..b73b4a66a8 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -65,38 +65,51 @@ namespace vk case VK_IMAGE_LAYOUT_GENERAL: case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT: ensure(sampler_state->upload_context == rsx::texture_upload_context::framebuffer_storage); - if (!sampler_state->is_cyclic_reference) + if (sampler_state->is_cyclic_reference) [[ unlikely ]] { - // This was used in a cyclic ref before, but is missing a barrier - // No need for a full stall, use a custom barrier instead - VkPipelineStageFlags src_stage; - VkAccessFlags src_access; - if (raw->aspect() == VK_IMAGE_ASPECT_COLOR_BIT) - { - src_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - src_access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - } - else - { - src_stage = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - src_access = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - } - - vk::insert_image_memory_barrier( - cmd, - raw->value, - raw->current_layout, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - src_stage, dst_stage, - src_access, VK_ACCESS_SHADER_READ_BIT, - { raw->aspect(), 0, 1, 0, 1 }); - - raw->current_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + // Nothing to do + break; } + + // This was used in a cyclic ref before, but is missing a barrier + // No need for a full stall, use a custom barrier instead + VkPipelineStageFlags src_stage; + VkAccessFlags src_access; + if (raw->aspect() == VK_IMAGE_ASPECT_COLOR_BIT) + { + src_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + src_access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + } + else + { + src_stage = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + src_access = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + } + + vk::insert_image_memory_barrier( + cmd, + raw->value, + raw->current_layout, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + src_stage, dst_stage, + src_access, VK_ACCESS_SHADER_READ_BIT, + { raw->aspect(), 0, 1, 0, 1 }); + + raw->current_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; break; case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: ensure(sampler_state->upload_context == rsx::texture_upload_context::framebuffer_storage); - raw->change_layout(cmd, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + if (!sampler_state->is_cyclic_reference) [[ likely ]] + { + // Standard pre-read barrier. + raw->change_layout(cmd, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + break; + } + + // Normally this shouldn't happen. But that is only guaranteed if the attachment state never changes outside of RTT rebind interrupts. + // If the shader changes between binds to "disable" the cyclic nature, we could end up here. + // Draw 1 (cyllic) -> texture_barrier -> Draw 2 (no textures) -> attachment_optimal -> Draw 3 (cylic again, no new data) -> incorrect layout. + vk::as_rtt(raw)->texture_barrier(cmd); break; } } @@ -1051,6 +1064,7 @@ void VKGSRender::end() // We actually need to end the subpass as a minimum. Without this, early-Z optimiazations in following draws will clobber reads from previous draws and cause flickering. // Since we're ending the subpass, might as well restore DCC/HiZ for extra performance ds->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); + ds->reset_surface_counters(); } } From f5be489d9f34d04f59ea9fc21f217aa989696a0d Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 27 Dec 2025 02:29:55 +0300 Subject: [PATCH 034/630] rsx: Improve framebuffer layout change detection --- rpcs3/Emu/RSX/GL/GLRenderTargets.cpp | 1 + rpcs3/Emu/RSX/RSXThread.cpp | 25 +++++++++++++++++-------- rpcs3/Emu/RSX/RSXThread.h | 4 ++++ rpcs3/Emu/RSX/VK/VKGSRender.cpp | 5 +++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index c222262699..4e5e61dcba 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -301,6 +301,7 @@ void GLGSRender::init_buffers(rsx::framebuffer_creation_context context, bool /* } m_graphics_state.set(rsx::rtt_config_valid); + on_framebuffer_layout_updated(); check_zcull_status(true); set_viewport(); diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index c6038e2f50..cc7b9fff17 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -1740,14 +1740,7 @@ namespace rsx } } - if (::size32(mrt_buffers) != current_fragment_program.mrt_buffers_count && - !m_graphics_state.test(rsx::pipeline_state::fragment_program_dirty) && - !is_current_program_interpreted()) - { - // Notify that we should recompile the FS - m_graphics_state |= rsx::pipeline_state::fragment_program_state_dirty; - } - + on_framebuffer_layout_updated(); return any_found; }; @@ -1845,6 +1838,22 @@ namespace rsx } } + void thread::on_framebuffer_layout_updated() + { + if (m_graphics_state.test(rsx::fragment_program_state_dirty)) + { + return; + } + + const auto target = m_ctx->register_state->surface_color_target(); + if (rsx::utility::get_mrt_buffers_count(target) == current_fragment_program.mrt_buffers_count) + { + return; + } + + m_graphics_state |= rsx::fragment_program_state_dirty; + } + bool thread::get_scissor(areau& region, bool clip_viewport) { if (!m_graphics_state.test(rsx::pipeline_state::scissor_config_state_dirty)) diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 9e09c17d78..4f965dee80 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -257,6 +257,10 @@ namespace rsx void get_framebuffer_layout(rsx::framebuffer_creation_context context, framebuffer_layout &layout); bool get_scissor(areau& region, bool clip_viewport); + // Notify framebuffer layout has been committed. + // FIXME: This should not be here + void on_framebuffer_layout_updated(); + RSXVertexProgram current_vertex_program = {}; RSXFragmentProgram current_fragment_program = {}; diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 3bc240b768..4a0e6c19ce 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2469,7 +2469,7 @@ void VKGSRender::prepare_rtts(rsx::framebuffer_creation_context context) m_surface_info[i].samples = samples; } - //Process depth surface as well + // Process depth surface as well { if (m_depth_surface_info.pitch && g_cfg.video.write_depth_buffer) { @@ -2486,7 +2486,7 @@ void VKGSRender::prepare_rtts(rsx::framebuffer_creation_context context) m_depth_surface_info.samples = samples; } - //Bind created rtts as current fbo... + // Bind created rtts as current fbo... const auto draw_buffers = rsx::utility::get_rtt_indexes(m_framebuffer_layout.target); m_draw_buffers.clear(); m_fbo_images.clear(); @@ -2637,6 +2637,7 @@ void VKGSRender::prepare_rtts(rsx::framebuffer_creation_context context) set_viewport(); set_scissor(clipped_scissor); + on_framebuffer_layout_updated(); check_zcull_status(true); } From 92f56215d0b6c0fcc6889475deb8274fba6f0629 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 4 Dec 2025 00:23:53 +0100 Subject: [PATCH 035/630] Qt: Allow user to precompile caches on demand when installing packages or adding disc games --- rpcs3/rpcs3qt/main_window.cpp | 53 ++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 168d08a344..d4e52b8025 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -1180,7 +1180,7 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo { m_game_list_frame->AddRefreshedSlot([this, paths = std::move(bootable_paths_installed)](std::set& claimed_paths) mutable { - // Try to claim operaions on ID + // Try to claim operations on ID for (auto it = paths.begin(); it != paths.end();) { std::string resolved_path = Emu.GetCallbacks().resolve_path(it->first); @@ -1196,13 +1196,7 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo } } - // Executes after PrecompileCachesFromInstalledPackages - m_notify_batch_game_action_cb = [this, paths]() mutable - { - ShowOptionalGamePreparations(tr("Success!"), tr("Successfully installed software from package(s)!"), std::move(paths)); - }; - - PrecompileCachesFromInstalledPackages(paths); + ShowOptionalGamePreparations(tr("Success!"), tr("Successfully installed software from package(s)!"), std::move(paths)); }); } @@ -2402,6 +2396,8 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri QVBoxLayout* vlayout = new QVBoxLayout(dlg); + QCheckBox* precompile_check = new QCheckBox(tr("Precompile caches")); + precompile_check->setChecked(true); QCheckBox* desk_check = new QCheckBox(tr("Add desktop shortcut(s)")); #ifdef _WIN32 QCheckBox* quick_check = new QCheckBox(tr("Add Start menu shortcut(s)")); @@ -2410,10 +2406,12 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri #else QCheckBox* quick_check = new QCheckBox(tr("Add launcher shortcut(s)")); #endif - QLabel* label = new QLabel(tr("%1\nWould you like to install shortcuts to the installed software? (%2 new software detected)\n\n").arg(message).arg(bootable_paths.size()), dlg); + QLabel* label = new QLabel(tr("%1\nWould you like to precompile caches and install shortcuts to the installed software? (%2 new software detected)\n\n").arg(message).arg(bootable_paths.size()), dlg); vlayout->addWidget(label); vlayout->addStretch(10); + vlayout->addWidget(precompile_check); + vlayout->addStretch(3); vlayout->addWidget(desk_check); vlayout->addStretch(3); vlayout->addWidget(quick_check); @@ -2426,6 +2424,7 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri connect(btn_box, &QDialogButtonBox::accepted, this, [=, this, paths = std::move(bootable_paths)]() { + const bool precompile_caches = precompile_check->isChecked(); const bool create_desktop_shortcuts = desk_check->isChecked(); const bool create_app_shortcut = quick_check->isChecked(); @@ -2447,35 +2446,38 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri locations.insert(gui::utils::shortcut_location::applications); } - if (locations.empty()) + if (!locations.empty()) { - return; - } + std::vector game_data_shortcuts; - std::vector game_data_shortcuts; - - for (const auto& [boot_path, title_id] : paths) - { - for (const game_info& gameinfo : m_game_list_frame->GetGameInfo()) + for (const auto& [boot_path, title_id] : paths) { - if (gameinfo && gameinfo->info.serial == title_id.toStdString()) + for (const game_info& gameinfo : m_game_list_frame->GetGameInfo()) { - if (Emu.IsPathInsideDir(boot_path, gameinfo->info.path)) + if (gameinfo && gameinfo->info.serial == title_id.toStdString()) { - if (!locations.empty()) + if (Emu.IsPathInsideDir(boot_path, gameinfo->info.path)) { - game_data_shortcuts.push_back(gameinfo); + if (!locations.empty()) + { + game_data_shortcuts.push_back(gameinfo); + } } - } - break; + break; + } } } + + if (!game_data_shortcuts.empty() && !locations.empty()) + { + m_game_list_frame->CreateShortcuts(game_data_shortcuts, locations); + } } - if (!game_data_shortcuts.empty() && !locations.empty()) + if (precompile_caches) { - m_game_list_frame->CreateShortcuts(game_data_shortcuts, locations); + PrecompileCachesFromInstalledPackages(paths); } }); @@ -2483,7 +2485,6 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri dlg->open(); } - void main_window::PrecompileCachesFromInstalledPackages(const std::map& bootable_paths) { std::vector game_data; From bba1cf4b6e7237227e65b9eb1740ced639882603 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 7 Dec 2025 12:17:07 +0100 Subject: [PATCH 036/630] Qt: ask user for install options before starting the installation --- rpcs3/rpcs3qt/main_window.cpp | 220 +++++++++------------------ rpcs3/rpcs3qt/main_window.h | 1 + rpcs3/rpcs3qt/pkg_install_dialog.cpp | 90 +++++++---- rpcs3/rpcs3qt/pkg_install_dialog.h | 12 +- 4 files changed, 142 insertions(+), 181 deletions(-) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index d4e52b8025..3ba64487e6 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -801,7 +801,7 @@ bool main_window::InstallPackages(QStringList file_paths, bool from_boot) if (file_paths.count() == 1) { - const QString file_path = file_paths.front(); + const QString& file_path = file_paths.front(); const QFileInfo file_info(file_path); if (file_info.isDir()) @@ -819,92 +819,6 @@ bool main_window::InstallPackages(QStringList file_paths, bool from_boot) return InstallPackages(dir_file_paths, from_boot); } - - if (file_info.suffix().compare("pkg", Qt::CaseInsensitive) == 0) - { - compat::package_info info = game_compatibility::GetPkgInfo(file_path, m_game_list_frame ? m_game_list_frame->GetGameCompatibility() : nullptr); - - if (!info.is_valid) - { - QMessageBox::warning(this, tr("Invalid package!"), tr("The selected package is invalid!\n\nPath:\n%0").arg(file_path)); - return false; - } - - if (info.type != compat::package_type::other) - { - if (info.type == compat::package_type::dlc) - { - info.local_cat = tr("\nDLC", "Block for package type (DLC)"); - } - else - { - info.local_cat = tr("\nUpdate", "Block for package type (Update)"); - } - } - else if (!info.local_cat.isEmpty()) - { - info.local_cat = tr("\n%0", "Block for package type").arg(info.local_cat); - } - - if (!info.title_id.isEmpty()) - { - info.title_id = tr("\n%0", "Block for Title ID").arg(info.title_id); - } - - if (!info.version.isEmpty()) - { - info.version = tr("\nVersion %0", "Block for Version").arg(info.version); - } - - if (!info.changelog.isEmpty()) - { - info.changelog = tr("Changelog:\n%0", "Block for Changelog").arg(info.changelog); - } - - u64 free_space = 0; - - // Retrieve disk space info on data path's drive - if (fs::device_stat stat{}; fs::statfs(rpcs3::utils::get_hdd0_dir(), stat)) - { - free_space = stat.avail_free; - } - - const QString installation_info = - tr("Installation path: %0\nAvailable disk space: %1%2\nRequired disk space: %3") - .arg(QString::fromStdString(rpcs3::utils::get_hdd0_game_dir())) - .arg(gui::utils::format_byte_size(free_space)) - .arg(info.data_size <= free_space ? QString() : tr(" - NOT ENOUGH SPACE")) - .arg(gui::utils::format_byte_size(info.data_size)); - - const QString info_string = QStringLiteral("%0\n\n%1%2%3%4").arg(file_info.fileName()).arg(info.title).arg(info.local_cat).arg(info.title_id).arg(info.version); - QString message = tr("Do you want to install this package?\n\n%0\n\n%1").arg(info_string).arg(installation_info); - - QMessageBox mb(QMessageBox::Icon::Question, tr("PKG Decrypter / Installer"), gui::utils::make_paragraph(message), QMessageBox::Yes | QMessageBox::No, this); - mb.setDefaultButton(QMessageBox::No); - mb.setTextFormat(Qt::RichText); // Support HTML tags - mb.button(QMessageBox::Yes)->setEnabled(info.data_size <= free_space); - - if (!info.changelog.isEmpty()) - { - mb.setInformativeText(tr("To see the changelog, please click \"Show Details\".")); - mb.setDetailedText(info.changelog); - - // Smartass hack to make the unresizeable message box wide enough for the changelog - const int log_width = QLabel(info.changelog).sizeHint().width(); - while (QLabel(message).sizeHint().width() < log_width) - { - message += " "; - } - - mb.setText(message); - } - - if (mb.exec() != QMessageBox::Yes) - { - gui_log.notice("PKG: Cancelled installation from drop.\n%s\n%s", info_string, info.changelog); - return true; - } - } } // Install rap files if available @@ -983,28 +897,22 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo } std::vector packages; + bool precompile_caches = false; + bool create_desktop_shortcuts = false; + bool create_app_shortcut = false; game_compatibility* compat = m_game_list_frame ? m_game_list_frame->GetGameCompatibility() : nullptr; - if (file_paths.size() > 1) + // Let the user choose the packages to install and select the order in which they shall be installed. + pkg_install_dialog dlg(file_paths, compat, this); + connect(&dlg, &QDialog::accepted, this, [&]() { - // Let the user choose the packages to install and select the order in which they shall be installed. - pkg_install_dialog dlg(file_paths, compat, this); - connect(&dlg, &QDialog::accepted, this, [&packages, &dlg]() - { - packages = dlg.GetPathsToInstall(); - }); - dlg.exec(); - } - else - { - packages.push_back(game_compatibility::GetPkgInfo(file_paths.front(), compat)); - } - - if (packages.empty()) - { - return true; - } + packages = dlg.get_paths_to_install(); + precompile_caches = dlg.precompile_caches(); + create_desktop_shortcuts = dlg.create_desktop_shortcuts(); + create_app_shortcut = dlg.create_app_shortcut(); + }); + dlg.exec(); if (!from_boot) { @@ -1178,7 +1086,7 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo if (!bootable_paths_installed.empty()) { - m_game_list_frame->AddRefreshedSlot([this, paths = std::move(bootable_paths_installed)](std::set& claimed_paths) mutable + m_game_list_frame->AddRefreshedSlot([this, create_desktop_shortcuts, precompile_caches, create_app_shortcut, paths = std::move(bootable_paths_installed)](std::set& claimed_paths) mutable { // Try to claim operations on ID for (auto it = paths.begin(); it != paths.end();) @@ -1196,7 +1104,12 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo } } - ShowOptionalGamePreparations(tr("Success!"), tr("Successfully installed software from package(s)!"), std::move(paths)); + CreateShortCuts(paths, create_desktop_shortcuts, create_app_shortcut); + + if (precompile_caches) + { + PrecompileCachesFromInstalledPackages(paths); + } }); } @@ -2431,49 +2344,7 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri dlg->hide(); dlg->accept(); - std::set locations; - -#ifdef _WIN32 - locations.insert(gui::utils::shortcut_location::rpcs3_shortcuts); -#endif - if (create_desktop_shortcuts) - { - locations.insert(gui::utils::shortcut_location::desktop); - } - - if (create_app_shortcut) - { - locations.insert(gui::utils::shortcut_location::applications); - } - - if (!locations.empty()) - { - std::vector game_data_shortcuts; - - for (const auto& [boot_path, title_id] : paths) - { - for (const game_info& gameinfo : m_game_list_frame->GetGameInfo()) - { - if (gameinfo && gameinfo->info.serial == title_id.toStdString()) - { - if (Emu.IsPathInsideDir(boot_path, gameinfo->info.path)) - { - if (!locations.empty()) - { - game_data_shortcuts.push_back(gameinfo); - } - } - - break; - } - } - } - - if (!game_data_shortcuts.empty() && !locations.empty()) - { - m_game_list_frame->CreateShortcuts(game_data_shortcuts, locations); - } - } + CreateShortCuts(paths, create_desktop_shortcuts, create_app_shortcut); if (precompile_caches) { @@ -2485,6 +2356,55 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri dlg->open(); } +void main_window::CreateShortCuts(const std::map& paths, bool create_desktop_shortcuts, bool create_app_shortcut) +{ + if (paths.empty()) return; + + std::set locations; + +#ifdef _WIN32 + locations.insert(gui::utils::shortcut_location::rpcs3_shortcuts); +#endif + if (create_desktop_shortcuts) + { + locations.insert(gui::utils::shortcut_location::desktop); + } + + if (create_app_shortcut) + { + locations.insert(gui::utils::shortcut_location::applications); + } + + if (!locations.empty()) + { + std::vector game_data_shortcuts; + + for (const auto& [boot_path, title_id] : paths) + { + for (const game_info& gameinfo : m_game_list_frame->GetGameInfo()) + { + if (gameinfo && gameinfo->info.serial == title_id.toStdString()) + { + if (Emu.IsPathInsideDir(boot_path, gameinfo->info.path)) + { + if (!locations.empty()) + { + game_data_shortcuts.push_back(gameinfo); + } + } + + break; + } + } + } + + if (!game_data_shortcuts.empty() && !locations.empty()) + { + m_game_list_frame->CreateShortcuts(game_data_shortcuts, locations); + } + } +} + void main_window::PrecompileCachesFromInstalledPackages(const std::map& bootable_paths) { std::vector game_data; diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index 960a70c722..40d874e11c 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -149,6 +149,7 @@ private: static bool InstallFileInExData(const std::string& extension, const QString& path, const std::string& filename); bool HandlePackageInstallation(QStringList file_paths, bool from_boot); + void CreateShortCuts(const std::map& paths, bool create_desktop_shortcuts, bool create_app_shortcut); void HandlePupInstallation(const QString& file_path, const QString& dir_path = ""); void ExtractPup(); diff --git a/rpcs3/rpcs3qt/pkg_install_dialog.cpp b/rpcs3/rpcs3qt/pkg_install_dialog.cpp index 370f4d053c..9b0f926484 100644 --- a/rpcs3/rpcs3qt/pkg_install_dialog.cpp +++ b/rpcs3/rpcs3qt/pkg_install_dialog.cpp @@ -7,12 +7,11 @@ #include "Emu/system_utils.hpp" #include "Utilities/File.h" -#include #include #include #include -#include #include +#include enum Roles { @@ -105,8 +104,6 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil item->setData(Roles::VersionRole, info.version); item->setData(Roles::DataSizeRole, static_cast(info.data_size)); item->setToolTip(tooltip); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(Qt::Checked); } m_dir_list->sortItems(); @@ -134,42 +131,79 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil } }); - connect(m_dir_list, &QListWidget::itemChanged, this, [this, installation_info, buttons](QListWidgetItem*) + QHBoxLayout* hbox = nullptr; + if (m_dir_list->count() > 1) { - UpdateInfo(installation_info, buttons); - }); + for (int i = 0; i < m_dir_list->count(); i++) + { + if (QListWidgetItem* item = m_dir_list->item(i)) + { + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(Qt::Checked); + } + } + + connect(m_dir_list, &QListWidget::itemChanged, this, [this, installation_info, buttons](QListWidgetItem*) + { + update_info(installation_info, buttons); + }); - QToolButton* move_up = new QToolButton; - move_up->setArrowType(Qt::UpArrow); - move_up->setToolTip(tr("Move selected item up")); - connect(move_up, &QToolButton::clicked, this, [this]() { MoveItem(-1); }); + QToolButton* move_up = new QToolButton; + move_up->setArrowType(Qt::UpArrow); + move_up->setToolTip(tr("Move selected item up")); + connect(move_up, &QToolButton::clicked, this, [this]() { move_item(-1); }); - QToolButton* move_down = new QToolButton; - move_down->setArrowType(Qt::DownArrow); - move_down->setToolTip(tr("Move selected item down")); - connect(move_down, &QToolButton::clicked, this, [this]() { MoveItem(1); }); + QToolButton* move_down = new QToolButton; + move_down->setArrowType(Qt::DownArrow); + move_down->setToolTip(tr("Move selected item down")); + connect(move_down, &QToolButton::clicked, this, [this]() { move_item(1); }); - QHBoxLayout* hbox = new QHBoxLayout; - hbox->addStretch(); - hbox->addWidget(move_up); - hbox->addWidget(move_down); + hbox = new QHBoxLayout; + hbox->addStretch(); + hbox->addWidget(move_up); + hbox->addWidget(move_down); + } - QLabel* description = new QLabel(tr("You are about to install multiple packages.\nReorder and/or exclude them if needed, then click \"Install\" to proceed.")); + QLabel* description = new QLabel(m_dir_list->count() == 1 + ? tr("Do you want to install this package?") + : tr("You are about to install multiple packages.\nReorder and/or exclude them if needed, then click \"Install\" to proceed.") + ); + QLabel* label = new QLabel(tr("Would you like to precompile caches and install shortcuts to the installed software?")); + + QCheckBox* precompile_check = new QCheckBox(tr("Precompile caches")); + connect(precompile_check, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state){ m_precompile_caches = state != Qt::CheckState::Unchecked; }); + precompile_check->setChecked(true); + + QCheckBox* desk_check = new QCheckBox(tr("Add desktop shortcut(s)")); + connect(desk_check, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state){ m_create_desktop_shortcuts = state != Qt::CheckState::Unchecked; }); + +#ifdef _WIN32 + QCheckBox* quick_check = new QCheckBox(tr("Add Start menu shortcut(s)")); +#elif defined(__APPLE__) + QCheckBox* quick_check = new QCheckBox(tr("Add dock shortcut(s)")); +#else + QCheckBox* quick_check = new QCheckBox(tr("Add launcher shortcut(s)")); +#endif + connect(quick_check, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state){ m_create_app_shortcut = state != Qt::CheckState::Unchecked; }); QVBoxLayout* vbox = new QVBoxLayout; vbox->addWidget(description); - vbox->addLayout(hbox); + if (hbox) vbox->addLayout(hbox); vbox->addWidget(m_dir_list); + vbox->addWidget(label); + vbox->addWidget(precompile_check); + vbox->addWidget(desk_check); + vbox->addWidget(quick_check); vbox->addWidget(installation_info); vbox->addWidget(buttons); setLayout(vbox); - setWindowTitle(tr("Batch PKG Installation")); + setWindowTitle(tr("PKG Installation")); setObjectName("pkg_install_dialog"); - UpdateInfo(installation_info, buttons); // Just to show and check available and required size + update_info(installation_info, buttons); // Just to show and check available and required size } -void pkg_install_dialog::UpdateInfo(QLabel* installation_info, QDialogButtonBox* buttons) const +void pkg_install_dialog::update_info(QLabel* installation_info, QDialogButtonBox* buttons) const { u64 data_size = 0; u64 free_space = 0; @@ -182,7 +216,7 @@ void pkg_install_dialog::UpdateInfo(QLabel* installation_info, QDialogButtonBox* for (int i = 0; i < m_dir_list->count(); i++) { - if (m_dir_list->item(i)->checkState() == Qt::Checked) + if (m_dir_list->count() == 1 || m_dir_list->item(i)->checkState() == Qt::Checked) { data_size += m_dir_list->item(i)->data(Roles::DataSizeRole).toULongLong(); } @@ -197,7 +231,7 @@ void pkg_install_dialog::UpdateInfo(QLabel* installation_info, QDialogButtonBox* buttons->button(QDialogButtonBox::Ok)->setEnabled(data_size && (data_size <= free_space)); } -void pkg_install_dialog::MoveItem(int offset) const +void pkg_install_dialog::move_item(int offset) const { const int src_index = m_dir_list->currentRow(); const int dest_index = src_index + offset; @@ -211,14 +245,14 @@ void pkg_install_dialog::MoveItem(int offset) const } } -std::vector pkg_install_dialog::GetPathsToInstall() const +std::vector pkg_install_dialog::get_paths_to_install() const { std::vector result; for (int i = 0; i < m_dir_list->count(); i++) { const QListWidgetItem* item = m_dir_list->item(i); - if (item && item->checkState() == Qt::Checked) + if (item && (m_dir_list->count() == 1 || item->checkState() == Qt::Checked)) { compat::package_info info; info.path = item->data(Roles::FullPathRole).toString(); diff --git a/rpcs3/rpcs3qt/pkg_install_dialog.h b/rpcs3/rpcs3qt/pkg_install_dialog.h index 2122259a1d..82593ab6b5 100644 --- a/rpcs3/rpcs3qt/pkg_install_dialog.h +++ b/rpcs3/rpcs3qt/pkg_install_dialog.h @@ -18,11 +18,17 @@ class pkg_install_dialog : public QDialog public: explicit pkg_install_dialog(const QStringList& paths, game_compatibility* compat, QWidget* parent = nullptr); - std::vector GetPathsToInstall() const; + std::vector get_paths_to_install() const; + bool precompile_caches() const { return m_precompile_caches; } + bool create_desktop_shortcuts() const { return m_create_desktop_shortcuts; } + bool create_app_shortcut() const { return m_create_app_shortcut; } private: - void UpdateInfo(QLabel* installation_info, QDialogButtonBox* buttons) const; - void MoveItem(int offset) const; + void update_info(QLabel* installation_info, QDialogButtonBox* buttons) const; + void move_item(int offset) const; QListWidget* m_dir_list; + bool m_precompile_caches = false; + bool m_create_desktop_shortcuts = false; + bool m_create_app_shortcut = false; }; From 01fe12483f2c0c7b4b32ce427e9eb7d31c265565 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 7 Dec 2025 13:05:15 +0100 Subject: [PATCH 037/630] Qt: remove unused NotifyBatchedGameActionFinished signal --- rpcs3/rpcs3qt/game_list_frame.cpp | 3 --- rpcs3/rpcs3qt/game_list_frame.h | 1 - rpcs3/rpcs3qt/main_window.cpp | 9 --------- rpcs3/rpcs3qt/main_window.h | 1 - rpcs3/rpcs3qt/pkg_install_dialog.h | 2 +- 5 files changed, 1 insertion(+), 15 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index f68bc44896..677b61a44c 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -2501,13 +2501,11 @@ void game_list_frame::BatchCreateCPUCaches(const std::vector& game_da if (total == 0) { QMessageBox::information(this, tr("LLVM Cache Batch Creation"), tr("No titles found"), QMessageBox::Ok); - Q_EMIT NotifyBatchedGameActionFinished(); return; } if (!m_gui_settings->GetBootConfirmation(this)) { - Q_EMIT NotifyBatchedGameActionFinished(); return; } @@ -2531,7 +2529,6 @@ void game_list_frame::BatchCreateCPUCaches(const std::vector& game_da { if (serial.empty()) { - Q_EMIT NotifyBatchedGameActionFinished(); return false; } diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index c31e6aa66a..bcdd643ca2 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -96,7 +96,6 @@ Q_SIGNALS: void FocusToSearchBar(); void Refreshed(); void RequestSaveStateManager(const game_info& game); - void NotifyBatchedGameActionFinished(); public: template diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 3ba64487e6..36b2891f63 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -3392,15 +3392,6 @@ void main_window::CreateConnects() connect(ui->mw_searchbar, &QLineEdit::textChanged, m_game_list_frame, &game_list_frame::SetSearchText); connect(ui->mw_searchbar, &QLineEdit::returnPressed, m_game_list_frame, &game_list_frame::FocusAndSelectFirstEntryIfNoneIs); connect(m_game_list_frame, &game_list_frame::FocusToSearchBar, this, [this]() { ui->mw_searchbar->setFocus(); }); - - connect(m_game_list_frame, &game_list_frame::NotifyBatchedGameActionFinished, this, [this]() mutable - { - if (m_notify_batch_game_action_cb) - { - m_notify_batch_game_action_cb(); - m_notify_batch_game_action_cb = {}; - } - }); } void main_window::CreateDockWindows() diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index 40d874e11c..8a82c125ce 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -49,7 +49,6 @@ class main_window : public QMainWindow bool m_save_slider_pos = false; bool m_requested_show_logs_on_exit = false; int m_other_slider_pos = 0; - std::function m_notify_batch_game_action_cb; QIcon m_app_icon; QIcon m_icon_play; diff --git a/rpcs3/rpcs3qt/pkg_install_dialog.h b/rpcs3/rpcs3qt/pkg_install_dialog.h index 82593ab6b5..f1a623009d 100644 --- a/rpcs3/rpcs3qt/pkg_install_dialog.h +++ b/rpcs3/rpcs3qt/pkg_install_dialog.h @@ -27,7 +27,7 @@ private: void update_info(QLabel* installation_info, QDialogButtonBox* buttons) const; void move_item(int offset) const; - QListWidget* m_dir_list; + QListWidget* m_dir_list = nullptr; bool m_precompile_caches = false; bool m_create_desktop_shortcuts = false; bool m_create_app_shortcut = false; From 2579ddf99603a9d60a76b7d7a545272e6cb008aa Mon Sep 17 00:00:00 2001 From: Ninetime Date: Mon, 29 Dec 2025 00:12:21 -0500 Subject: [PATCH 038/630] RPCN menu changes (#17936) - Adds a shortcut for RPCN to the toolbar - Adds a link for the Network tab to the Configuration menu --- rpcs3/Icons/rpcn.png | Bin 0 -> 15262 bytes rpcs3/resources.qrc | 1 + rpcs3/rpcs3qt/main_window.cpp | 9 +++++++-- rpcs3/rpcs3qt/main_window.ui | 22 ++++++++++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 rpcs3/Icons/rpcn.png diff --git a/rpcs3/Icons/rpcn.png b/rpcs3/Icons/rpcn.png new file mode 100644 index 0000000000000000000000000000000000000000..1470fa79999dd1e65761d4345832cbd616540c9b GIT binary patch literal 15262 zcmeIZ`8(8K_&@%fr@^Lolp?!qqex^=q%2d3EZGZL zlU>LlJD)SW-tX`A{R2L~eY&o$am}1_p7(w3{c+#VC^HjXdRi`82!iPK^|Z_(2nK(` z5Q++XtOoXOfe#ulJsTegvezO1N3bSno`WDXq_1`ELLg#c*gaaP&#!;^{VDkmIYJK= z#Gg7EoD_f7VbgfBrdRY)W;TzcrI85ASR(SWVAk<3rx_`NK8_ye#yODb`>7bG_`bfHzUkoBe@nH=E)#4vPD^i=cb4xg&yzxL?z}Hl2|p#7X}VaO zB%f&^Rkfe6&!i|c_ODU4`bLGi`+oI}s_l|%16RVAha7%7jXX|Ho|G}kY@PqzH{o|C z?xw?ZtGlC9pI^oCu<-Mh>vW`Ng?TF{gQPlYM`A|)h5I^sc)EnI+MQgg7@|_C{#coQ zUl40ImU1^h!=qlP%6KrFnFnsB{bMkpE?ISL(qCr4viC?j1IAdr6q->VQ(PZp zQ!E*1xfiZ3&YvF5O7&d;htYuTQd`%)X%zSTzKj@>-DsI! zS(E?rXUF0z`w4;0I^u*v*5K3U@f$N9-kR(S)6vXKu0m*)y`3IXuE4s2#Jxl&4B;9a zj2Yug)Jfef=U0Z*1}9uil3|l4|H7Enc4aQUqC+4VP_EQt8+fZ|)oco^5YyeK3DERr zyaC5Y0jvf_1@TgcVg^d-mq7{eBh)&YfC`~{8B6_aagQMPoY;$0;$!MtFY3$pKP%n2 zarUtegr9_OJKgwj~zei&)HkSj6a9cQWqwoi0Ddrt^o|u$g}nw zw>29A`G;mE#IW~KHtkK5p;Q-1&%Jbu(^OEj$F{k^YmH8@gnUOt4}Ih2}R} z;LsY`$v;dga1^a?xB-p<^W2X15;e=1eT1AXEudi%{%uO*`!56G3ng8><&d36kd>}EklDC3xLtCh3@9#*)Fh!2?w_aV3lwejuk&P;6)>stb&4#ZCUOF|?2 zH;)Q@Q((sDP~Kk1JBH8;{(#<~g8%GrkCjQlC|?o6(#3OiF+$cI&*ix!Gzjk@mHoM^ zg@Dgnl&fhJc51>HYP5$&er*WCe{VR=LJ&q(h<5%APqTm)gzv>2p&MGe6LZ}+@5lo^ zR}>nDIfnl+(qucYpAhxTg)vf!*cCB>G*bhc1Ug&#sCp2t!W^v5_Lz{ijIi35x9C0r zQwT>Xj6|G~A@Dt^c-{mk3rV+scArS3m<7k>N#;PX2bCjewi%CzhH~QV1*Bz(?e#TmhQL~6kp)?#9E#3I4LyCNE(b}D0)Y&c9wT*JxX#xHUFdSQnTL<; z+I284^W!kC`0hSf4rWwlOBhXrH1{3!Esnw{Yj&~SVNqX5D(`833$5I$ljXxnMhq4O zn2;>nusi6*e7^~=h zx6&LNpRsQs$c};Vm*}K+?y~aWE_rh5SB+HfEaz}z{*nb6h}d<+RgW^h^KwOp8uj8Z zml31ykhBE;FP5FZR%)`5N4qxE1e;wj1x6rGM`1B zo@OUK+ZshlRugmLj6bJzPA8Y*(yXWXckc{AlsbG?z+dAuOANs=|iubBA`NuUO z#0uPAR4cCjBD{#I1%=!6Wg?)w7PG#A3ubgZhw4w+FZEeaDUWsu%lEM-G>;;XX-+fCUQJa6&))-+8&bH2M9nQ3+N{1 zt#&UuJYvB3sr;C+C0?uYbr4=7>sKwCmwVOq!5L`v^ye_Qlst;gJl}41Bx9t+m~O~Y z4>SX58B-)CGh(Nm;3#b}JLPb=?=LEcBnFJliKIuuUhaht^Em(kGcRy_4)1M$u6Za! zVQn7uKYiWnpJ}?231ESj@+hzZN0DXL#NoGrygmn1xzUCKpJ}XQIj=)h3aChX_KJLs zoC)C0?-&F;eC)URl=ZX7Rd9#Ia@>vxaUmMAZf7iu!hN8nI=EPWO43`wrRNl##p1bd zWyUxWuEPm169zj2%Zvt!^5C*PDW?XP&a^$y!;ux*4VI~Y#(;6t=XR{|h3+T&*hWL} zFUlv~2vm#_y)iP~&a+&3UV!W&+SvLD6mos{IKH6*O%N%~lz6Z|2DzimgX7J8lV^Mh zNyv-JwE>aWlo(R4LygWdMyApMVS?yQyj)w1teI9$EH2EaMj)vK$HJ0U zrj%2BMF-7vpg3b5ydVxoUfKVR{wW)5PhqC#6$9w55G6K2gKu(jFt9HKe>9hZQAezC zrideoo6QOt?ogaQ8~z|K$aII8TYi{nx*)NyQuBrZBjz{@h~H2ALp84BWH^1PlAthI z)#U;GZMeUzKrle`dvsqvvgJWrSyK~sUr`v6cn$&>qzQ3F8#CptfdS+L8hrVQ90^Fo;8^v)t;e|tZpe)Lmr1i=80a2a7fs%_s zhF+#Fsp|Z{c;t@m0M2n#qE1! z4)M0whwC`GaJ|E|W-;NN2RnHp5;N+@+2&^|g(vl<69DB@;sjlap`R!FNA*1^hvH68 z(uX9c)4QknZEmf^t;7x{dX(F>7iG8%x_J&3{FLtzlH>2p#Vzin{$x^=`I7FD_bM@0 zPZ!m%dkWW2m z`MKz}JH!Q-E5kIXhS2yYHUV(HzOok2`G-nnH&68f=foKMok>mx`^&gn<49vqf_-3c zaNg@4{Z=pM0F9(CSHpQDQl=~vHlSluuj^^7x3@)-*L<$uG&USea*V*}5*pc^#iLGr zx|WDQmG->QS?MB|TZ7IY3d-(z(GsY*UZb)0#BpxlbB#}J`JYbJe!to3 zX8-by5jD{_7{!2Zfqw*)29Kn~P+OY3j$$kHwEOW}{%ON3dghd|```ZOkY4{!|j*mvVkjS@eJOR>Rz@ISHE~9%(a`N}*NuO|74Jic~J7POF}h z9*b!44Yazwy^;7p)s~#2O7KrLv5)DMg;JSshlo^7`f!IdCsa!7APhXDqoIVm&L@yJ z=!7=!h>PA#V;&i@`LDJ544fx?Ki^=E_i%aI_aw3R~>!{fLl%Z|`Q-razfhMC6_6a^Bx`;O3UOw>1mp#0ooWVXH9(p55C;-UFsmp1eMS zwB!XGT~et9vyf1{1gwqCCNGGms#f8sj6POIX+B&D*zWiKU*3mYRqJwpHEZLlWF2s+ zC;n%F+y5@e2~K!f*mo_wA?@ujy%ga5W_{L6=)zf2OSf7yNFOiJ41cOReW{;*qC8iN(wnUBA6B1)f9KgSTVaof7|bdhCS zJtrh`+gsrL$MDRPtc-{#1$o#E8 zYXj@5mGXq1|DJk&l9N#oqKenhLtSA1`y%a1#^uDmM^&FJYYOtKpW#f!t%4^y+Uu{} zo;}p)Lb|Vch_g4;8e5l@*83-$RQ1lG6HSQm;#k|LrxuXq$#cgaAvr}Hh2;0wSodD8 zi5bgwI~y1hw<^E*U%VAkp4s{E+ofe*T2L@&UYL*Qo2Upjp)dSp()t!kdeApeEa4%X z4!=S*j-!Oo*v-eC-ZyA+PG605j455adaIjmKShGpTHX9r|8e%EY)B<~OaJY^bz_F(}l%CzVgh?gRjMO?F`|ESKtpegM3LF|>L3HP^*DhAz1(tYG^*I(IR%yr{fI_!#T zDj+}N7d>!SG&vI0jF+<*A{`>UY0~IZ7>I?a4yKtb+#>FBtxfsL(&)bn6=G9;3v>V4 zMD-sU_0|B%u{`V&THH)IDZRPpji=RW)pKaOX*}FZ{7M9Ix8!&DWFGZ&epcZT1QS zTa9176URGDljKP?y9+Ikb&n~|WqtDa%`XVu6f@V+Lkwrj-D6V}|FT~^9NH<|GR4sOr&?{XH6@IQ{OT3#hg@zZXkb9 z&Op|OWl4q&e4DQm_V*HK=Letp(gy7Frd(}Ip7?j9-Yp^Fs;Bs zpy+Iid3(52&m5c+cU{o+FhW10IkH;?c`()4txb{MhNRm?=uZ78j&rJbZ{VmBrxf5D zn&mQ2dcn#~Qn}_%vgd29?WkQRDaM;5sPc8J{LJQ3&uWX$D<9d*nQ!S?R^Gzy*w@X3 z@2@ql=<_5`x87+E4Qlu=yD@|{XQAUPB`lKHXYNU z0xgOwb?@;uw|r}MxsN-f870=)#6X;IRgce5C&M%3T%?U<#*i8->9eVx)EL^o-Sv2d ztHu5BC$yI~dXj;dl-{!+bZk61pYM4fVwC?1@1oK-KMqEtM4 ziT6m>e|ZhsOc$eG@|V*i|Hk^=9+rV3mt1I}(R5W^*@5?;cw{a>Dj!(b3}eb67h?Mk@v z>GMNQF<2e+Rcc(!+Bcy)d4~`26=r-*L73h=Hn$|v+I#0fjfl~hXa|vvxl@yp?n7r*lBf9M9qH!ID#)$hW_kazLKnb_%v&Dr#9HM4~IJbr&dXr zud;CW>z#qkrWUESgUSG1s)g=F5ykUYHsXR)50gU(W}?*ah59#jjl?b<>Zh3wVSxb} zU9{54a5>0S0VLAtPmS~0d&*+4cF0Nslj|D_fIdVkwjN3xiy;&-Kq?Uw%|ggSs#|C) zx&YNqmT3ScAgi{VKh=O$YEh1I54vY0y7&%`N%PAUf-=%2M5WsJ1_d%*pF@Nqx9&io; zsC3E?TAkSs{6?~-CqII~2Org!_ee_P-Aq>6>a*l%^=SR=5Qc9qCf4L+#(4qk@7uAb z6Voq6vyjImIKWmctXo8!Tc3NZJ z`ei%uh{!0Ey!b&bqBap;NQKdFD+u~votWm0K|((YyC41jiAm)g1J%MUaIM~_e&@5`uj9PqsL zDk3T_!nxV#DkWqQpn0gwskjIB^=sIeKscz48 zu%lJF?8R<1v7{|5k>d_s;fJ?^F&njXA0?l|2eeASi*MViWm`^pcU&9U*R`>T`L|vA zIZGRh#9HROn4WK+OtZf|@bvU|vKqE$1la6dog$sNLcRYUS0kdbVKw=vzm7kvaf^?% zLs?xbrV<_&hH~_U1YB(X?axOn>L!n{<%buL4QWeEZdcen?1t0eO)f3dyqgvGCl@9G z4$BPc9I|<`;MY&vr25U%MXOU;NBI3Xv`E5J5Vmwe{jB^$e4)9YWxNM#xj_{CX;yfi ziU-H#T6mkR<(EgW)j8KAZXRyV+RKpz<5EVN5=MFTD4Y``^x_RO~Ep|bsWgV)R*S~)7y)flayfDX= zG7MOZyq#-(aQ*jS@6{zgBu+dD=feStcd5`hZ3uss?yop*a$vG$fAZ|d>6W92x;7NX z>#D?o?@M6@{`(%&GJh5v8EN_*oK5TmC^vVDq9AlX?wlC;E% zH&a?%YwN$ga5>;{htn%X?jCRrYh@tYoa4nxNKm zWn{d#GXya(du{)M$Dnt-{`#&_EnBQ9;;$N1`%Q)(pp!@gn$kSkFTGXw6e&BaqPuy? zazh|3X%*|JvAIkKNN5;y?4|Ja3sXZ%*AsX*eO5>F{#d#_`p_VbGr&p#bPXjWisl>j zsh8Le9@v~0+79*K-e%R@a|&kw>2K^A=qG?>$UWowqycDqi5!uR z8I`R%8olJOw=2`SxH>W_qPzYR!D$-qn;-a94M4X$uB)ecaJgD-WHWh=+PUBRzW&YV z=(1A?npS;WVGqHWd4Y{{p>|h<2Up-GMGm0~9GyH{esmuD1wqRRIHEV=nDmwa4{lPY zjZEGg%8OL{glpbc{IB_l%gx^Z$q7V|?SQhU)VB|m7elbXCr@aY7YolOq_-U0Bx9s3 zz$_!PkOKd$kjIBEe4V#F#)E7BnvXgRh#LSSu77^M6Re~A-*t$r%@Q{kUr1RnPvB50 z<8;8cIdzN8Kn)#~Oo#EdGZnWUqVoSc4j{3zuB@Rf*bV!gu>A42%?sc2o3@_qMe5%A zaE?!9+9Q^4W229hLW6gK^IWDbdv7;Ryd1P#w&uOMlse@5L4r5J;F=sijyOi?cmYvI zjUMv%GJiNy>{K(DSmN4WSbx_2pE2jn1j3+xb^z)53Ju!?+ybr2K zmK{DnA8BBx67kq5hE&nUQ+-cG5DIpC5o5EweHkXFx{zHf62k6Koy3I)RO`@91ng}T%+p@dw6Ae z=d17%mAz-v&abUbziku`D)f_IGsgrpp4ACgn(S>|h|=Nr!i-%F@;7nHrtl)>cE`u+ zy12lh|NP?F#-M?VPn($pIlPKAPM(bzyc)W9KJ6A08)%TS zzN=a3TU&c|=MmJZKW7C~*+LMv7I_w+DObaB)=B2!7sIDbUrzs+=2YFPH)^EJOBN5r zVOn4l|Gn^#_msZS%Tr0}l{+F1S|*}|SiR|RU5zke;JX`EjVxM$s07CTB$pf(FPG;O zUSFIC1Szbp%F->7YNUfId^V3AHD}bzzMTKW7dG#I1|ZKb@PiTecU0IDKd!WI?7YWI zzOkYzpgTS@oM?OJo-^(7tvk`j+8(}_cHA!)xN=nxN7TYD*5Mh5EeoIbdt0=PqzThO zDa?%hCg{dlM$^`q$n=bGd=n_|qKO^f9$kpRaQ;ja^_hH|@T6N|j(YN6Z{pveD;Lmj z7YvRKR7QIk-MvSo#aAz#0f^T{Lz3&(K(4X#)lkH){-}azWs$;)PVZ;-ew*G#?Y)WON{{b>WJS4DE(ywAz*DoIN@pMnq)Kh4 zs_)*ZuL>-lRoWx=sXb%xOZixv>Gme9u`JN23hgYxuRjAFz>o#c^}@ ziU7}5LbE?K@j&bBnYM&3H)I@(_4}2+ADsy6^qvG2$jNC)YKoIluZkkpB^{P4MKHmz zB+?-4Mlu7@`3qQ3BIUvEa|G3ikc&lXU;(+`&x22yDIxfyRPj3Hwye z5MtvQCB_*UQm=; zKLiiro>E{5d@(S0P>Hv(iPf(3y`6>HP93k`_&07dHC@vediOKK-=BBWA}l_Yu_(h~ z9R0=J7-i^UMYl~718%|I;hIWKZdcfLcQx?3cxyPfcqfbD2?Mc0CxW*JQJT>TSc!)E zM=B#d-W~inl}#a6)RonA=3kz8?F||poa4(x9sbT*;`(08wI4Y@5}mf>WdXLZa-loo zF%vYXWK>P@7kAV4xh7T-I83#5r~O|s(Q}n43>XKc!TGQ@|G+yjG6M{_9nQ`G`m-Sr z8mmRzu6>YpSA!ahADP;Xcvlv*-$OTL8!?bk%KMA>+pv;iYtH^jGbXB~Gq zE2xsPZFT06umGLVTLfrauNEo%MLwK7}{}8~~L;lNJ)nCSC{03jtS1_G{-Acq_TQ*lM*ap9hgVzo* z3Q5*E8}z9X>Z|_gd~2@{T`ZJsu5?k;Y+~lx`j1 zKaG6PG&2!~bBE@HEdpxFItI&EN|IIP-M_TI_UJ3ST$(93u8GdUh^j=~#921*g}k}o zpH!GH*F3Hqf4O|@{Kh+9iL(M7sf>z3=)oqw=6}m~+g?>T=wBn1d{tg= zJ{{DPtr3JkAeBMgR2$>nt3Ir!4E1oS{)cSD;(SN4;@h`Bn}=4s*qeRXg-H1^b^;`Y zAbXXjdl&j!TmAh;U#>Na%HH#!0|#-49Jo4R*58PT%D@V#?6=7&7sxRSL7`Gwmq6~U zq2&}20p`yNIW|+(w)zshXfbRlhq;a`8qKkxCd;w0>maTXu%~YXGUKNrw-0KSQZWKw zYvQ{nt?f?rM@3RI>TOTL1ls>lB~XDReTo11tK)PG6V8U|zm8q09>_ATB=M?>0&g^R z;{RJN#nGQM(7d#om-h9btA9wgqFAY*X~?aHh*BGy%Cp;W$KltUuW&nc_e0Lty{#5Zpe#?FuTfl{7_bxkTcNTTe%kwvp^#{5D7APZ6MPk>z1Z-e~9XQZ$bD6q!Jrjc zC3?U!jPf3g9jXUP5JQcQmdrgwu&}l`2HgK+^8bP)e;DiPdf7}3$)~Pou|Mn+sj|xB zop@n=R2p!*9{IXzi?$__|gzww) zqe=fMa3`2h$?Wvx@`c}b1k9wnJ(_6<$m+Xz%Kz#5#S?OT_*|eFNhDw8H?Pke@n;{- zeft`$`RX1JByC}lTrJCTv=!~82ZkDs3q+ALl0DgNlNt2oDOtRN>2;Hpz9+@@U^jEH z$SrZ8QQ?l4Yi`Y-qLLY`my@o;)CJ|Pqi$|S24INb-E6Re$J+0orlTO^YfQWN zMr$TdvXIj)&-;Uo54n|bA5HKCqa_W^6^jask1f_d*$%L?cekbex^iv)Ez7lA8yWWP zhBg5uHnWWWea>zMCg9LO@$JBxg6Y1{bzQ!mGtvtwaz*T&KD)tNjpOYR``kiSRd``A zC^iNM=ManR?pQQdRgbHl9Q^WY!MQ1L@!?zB>0F>UMR5X~`6Z>U7l+ah;5N?6q zSE~*){;{}rTJUD*z@+=W{?F=*hAk}y6kij6-Rx?y#2iOSv33e_g~?x=GZ_=kp9>ql z$dMzmKurJI_hc{nVBR%(ge52G39X;IZrwz>%BlChduMVC)V$C3o&SF6^{qu8l3|?s z@k(X`Cp2NH$OuJt6`f(hnQ;>Pw(H-iif#?@d%1I~%hapB6X&^YH{oyG$>q+vNP6r! z2~L!FojLqrqi7$!9{lmew?`Xp6`t)95xS1s-;_#L%maa+`SmzII~%ya`?yn{#ix;8a<;`q$PA&+i%V@m4;82W(qVOpllIPwJ49T4t6D>3v@ixA$um`pw51?B}+<9Tb1K z3&~9^6f+%{3=jn^C>8gjs5AFGYV#kvhdSS+*ePm?%Nyw?gKY{ICF$m3rC4AGni&*C zhVtdCa12EIB&_TrQZn^6lcJQ@{IBFd@<3ES2e_Keq_I^C$OsJAc)4>Vno)xxMxft> zm6}bK3@iP66l`8GM=E|P0PQmXE?5lTOA^>h-DIt&DRrTGNGCHk^x#h4IRM1Rl7qEk z{$*D5lkHeHwWQ51V@`KRztaRDvQZqn=#xsKao_1%q_;JK$!Bs|bbaR12j}lL2 zl&<{QOA77xw+I%6P3orl=R1_;{baoy3wmWgIBS4VAP6mYuV|5*y3=s^?`zYeE600O zkz61uxf)r2fOrsNsG`$+k}~XGrZSmL=?ut!%CGK7FuF>C!lUu-W4bX(O>P!*Vgk-z zV$F&nb)07B-i6)v!0#6F@FbEGAvVqGoo~TUm-pu*P3cNZrgu{w^n4lzwUAkU!Rmj^ zg!1khkNIr4-s9XNVA@7tr0LtvPx~|r#7#Gb5-I<^tKN%_@sH#@SMIQVEmug~5M6*WB}V+_F^=z_x|*^-zuq{*{wYG^{%+Vt&u3Zc`Pf5jp0AoN2v z;G--d?UbSn=qxWM;%v5rsP1m)5B2PHCJA^71mzUNW<~UqKR2enXk6IJXDVK;ijC4f z@$S#~bDNqcIAL&pQu!@8_Vxwd)iIl-*>)%OQ=iD_qypIxQse>=_8g4qicz!`nqS-1 zqb@9~LHapSXnAGm`VFKn-2K(!m6+djM`?tZLyI<+0I2EKSLL978UMOcVAyxFk4siN%z4DF4(_jtGKl+P6IKl4X&R2m+K26I(Kj87#?M^+!vVDN<;%gRz>jRR9<)Ut+;zDyp1))}4$~BM;;8HJK zpljIf8ZK{qGPK%D?D4*Q0mI0gF68NX4bkucT5QnN~ksMM{AX2C_LGVH~!s1RH7`6i=>nSYEc?{4}BuK zUNl_y;SZi~J?9DtopCUA`|_xhw=lb*)tLGFY?jSfAg?2WgM-~h3#c3PFRHKF=8udo z-Z~Q>#{l0tCJ6D!S!nwJiG8EDkhr9KJCUb*BQhbwd^=S|MEk7bskV|4qdP1B6{bpF zQQ)r0yxOldY=jNfdM_{YnGA*P=cWZ!?_bFeye@JV2O& zjp;kR&t!D({{D4o@zzFtxqQf6<{Qf7+H*EATG6@@ejYTXym9xj0NLjM}$9Hi%jWwDNq&G2SjKZ$9_d7SB$A-Zmfm-J_eebfW{)R6UiJlpCy=*XgY6u|IjH;#BWMfsT_9p*+H=`hj5)|HvM@#bh z6He3Y+4b@X$%wTvJ1sYZ}q_@)_@}Jm} z!-ONb?U4~7YcV*g^H>E6SJ;Z*JN-0?TsM5AtYfU9lE4sL@Z+q+q=XMW-UH;?8+AmR z5Gc!I5OV$6QRK@rw#5`P=QOUvV2V`6%ic|OIH>4CBt{e8>O}d+esA->OBuOkCMSkS z_N)=3zdEh{s&GB840JR{V$Kd^UF~8fmpwJO(5FAuQBHKHK(T_|VkMr)AJ3KhZbmL= zIt>wLxB6Nu7+#!D)`fDaNlffbP1g6H2H1j$b9%~jyAbV%V`^`*1z$I@fOe}MYi3M& zLo4MeAY%>K`{!ze2&+uCfR`RP7S}$M!0kjI8X3hwW?mB>B(*eamXKgL3f1NhDg3eU z?umH|z;eK)6no10UUlI0DKypyJH?7g8eY+i8FiP^`E(AHQH3;K6Q0t74Hh=o^GB0B zsS1snX#tmLMBUCcO!K0<1&1G0Q5!0cb$Vm+0muN4i9SA67&GLkIO0xu>k&?bbH+^DiN&;%{oR3@ls&v$Al6?e-_0bD-z zA}*u;dmE#bAikUj+U$QFk#pX-klZH95hVuguX^h=2vfEMK>yUYJ{_e@yz6oTsG&VJ zqSr$GU(;QTEalvho6BWHM-N&BS_JYcnI8t?5n9u2K{FR5!PPIrM6*n0om^_du>D#V zCJt4WjTz2R%A$2ebp)J@?7kbE*=8t~peK6?YO!sGGlOo2a%ju7lS;RH? z<^u5;&5V@G1rWvY$e+RLM_75k2y_->(zsPKaQ;4;pc&ekfk|7sH>_=Jj8b594SA8r z(uqD+2^IfV`6-G5Mqn3F&UrYBs!U*HdxYaXo2G_Bd zz;r&Eac);u!{QY)XxN6u4f_(2=b39qi_dLtRF zg}nNX?kcP7Yb(~A6~lK%pwekMd#AK6Gs(#^ZmD&sLI?pf)LkxwSWBP!>AI8eI>*4g zjx#ODv+_-cr;zWr?u<3vY0J&TfeC$#)so*Gjoh;9ba#0XV!o@-pk0ay_tSJti{M=^ zIs^~?%Jk?x1wSFt&WqFpT$d^JUmCo|9iV9_!7@IOgeIqc zp%X?H(l!J;y_q{_4`Ny5=7Ue7$f=iiIlzh8n6~w|_p{$9!^1SbVYJxyE?c?j-FYssBytx2<{4XCQLS190xsMxrr=n zH)^05_nis);H(AGD+fAO-QD!1CELucVCh%`YK*SLYNd35Xh;SV7jTC6h)+~IUxe3v zD`EV_i)W`aSE7_FX$G(GMVvdkw-UB;mBa-)sv=`UeJ8WR&Yfl0X=PU8*=^|7eK$)3 z0REI8Bi=ImqNGn@BQYN7nIA8ME}G;R>GA%QE=R<9fl!cx{LwMEf?72t$nxN3+m6SJ zicUP9%$w93Kdb(JHFGuc)luEq&7C@(Z;8z7AN6E$}L6MjOtgg z&5VEbFu&&oK3f&{B=H6y?WEWF2l=Vr0vI*3;fA1 zII6j;#~m}j{&^a|KQTJee_?U`cW0jq>BVl}d;9+YnONis literal 0 HcmV?d00001 diff --git a/rpcs3/resources.qrc b/rpcs3/resources.qrc index ebace85372..006c71fc8c 100644 --- a/rpcs3/resources.qrc +++ b/rpcs3/resources.qrc @@ -17,5 +17,6 @@ Icons/combo_config_bordered.png rpcs3.svg Icons/DualShock_3.svg + Icons/rpcn.png diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 36b2891f63..9278e7e6b3 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -1777,6 +1777,7 @@ void main_window::RepaintToolBarIcons() ui->toolbar_grid ->setIcon(icon(":/Icons/grid.png")); ui->toolbar_list ->setIcon(icon(":/Icons/list.png")); ui->toolbar_refresh ->setIcon(icon(":/Icons/refresh.png")); + ui->toolbar_rpcn ->setIcon(icon(":/Icons/rpcn.png")); ui->toolbar_stop ->setIcon(icon(":/Icons/stop.png")); ui->sysStopAct->setIcon(icon(":/Icons/stop.png")); @@ -2792,6 +2793,7 @@ void main_window::CreateConnects() connect(ui->confAudioAct, &QAction::triggered, this, [open_settings]() { open_settings(2); }); connect(ui->confIOAct, &QAction::triggered, this, [open_settings]() { open_settings(3); }); connect(ui->confSystemAct, &QAction::triggered, this, [open_settings]() { open_settings(4); }); + connect(ui->confNetwrkAct, &QAction::triggered, this, [open_settings]() { open_settings(5); }); connect(ui->confAdvAct, &QAction::triggered, this, [open_settings]() { open_settings(6); }); connect(ui->confEmuAct, &QAction::triggered, this, [open_settings]() { open_settings(7); }); connect(ui->confGuiAct, &QAction::triggered, this, [open_settings]() { open_settings(8); }); @@ -2907,11 +2909,13 @@ void main_window::CreateConnects() dlg.exec(); }); - connect(ui->confRPCNAct, &QAction::triggered, this, [this]() + const auto open_rpcn_settings = [this] { rpcn_settings_dialog dlg(this); dlg.exec(); - }); + }; + + connect(ui->confRPCNAct, &QAction::triggered, this, open_rpcn_settings); connect(ui->confClansAct, &QAction::triggered, this, [this]() { @@ -3373,6 +3377,7 @@ void main_window::CreateConnects() connect(ui->toolbar_config, &QAction::triggered, this, [=]() { open_settings(0); }); connect(ui->toolbar_list, &QAction::triggered, this, [this]() { ui->setlistModeListAct->trigger(); }); connect(ui->toolbar_grid, &QAction::triggered, this, [this]() { ui->setlistModeGridAct->trigger(); }); + connect(ui->toolbar_rpcn, &QAction::triggered, this, open_rpcn_settings); connect(ui->sizeSlider, &QSlider::valueChanged, this, &main_window::ResizeIcons); connect(ui->sizeSlider, &QSlider::sliderReleased, this, [this] diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index b62e26492e..96ae6b397d 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -277,6 +277,7 @@ + @@ -486,6 +487,7 @@ + @@ -614,6 +616,14 @@ Configure system + + + Network + + + Configure Network settings + + Advanced @@ -1026,6 +1036,18 @@ Configure the emulator + + + + :/Icons/rpcn.png:/Icons/rpcn.png + + + RPCN + + + Configure RPCN settings + + From 65273dde7621592205fa8251209c7e03f9294a0c Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 27 Dec 2025 16:12:37 +0100 Subject: [PATCH 039/630] Remove call to glxewInit --- rpcs3/Emu/RSX/GL/OpenGL.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/OpenGL.cpp b/rpcs3/Emu/RSX/GL/OpenGL.cpp index 78241f557a..7381eb990d 100644 --- a/rpcs3/Emu/RSX/GL/OpenGL.cpp +++ b/rpcs3/Emu/RSX/GL/OpenGL.cpp @@ -38,9 +38,6 @@ void gl::init() #ifdef __unix__ glewExperimental = true; glewInit(); -#ifdef HAVE_X11 - glxewInit(); -#endif #endif } From 9810d24ebb07e936315abea10170dc85c4f78664 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 6 Dec 2025 21:30:42 +0100 Subject: [PATCH 040/630] cellScreenshot: update filenames --- rpcs3/Emu/Cell/Modules/cellScreenshot.cpp | 20 ++++++++------------ rpcs3/Emu/Cell/Modules/cellScreenshot.h | 2 +- rpcs3/rpcs3qt/gs_frame.cpp | 4 +++- rpcs3/rpcs3qt/qt_utils.cpp | 2 +- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp b/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp index b899155dde..5d8e2f2a18 100644 --- a/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp +++ b/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp @@ -33,18 +33,12 @@ std::string screenshot_info::get_overlay_path() const std::string screenshot_info::get_photo_title() const { - std::string photo = photo_title; - if (photo.empty()) - photo = Emu.GetTitle(); - return photo; + return photo_title.empty() ? Emu.GetTitle() : photo_title; } std::string screenshot_info::get_game_title() const { - std::string game = game_title; - if (game.empty()) - game = Emu.GetTitle(); - return game; + return game_title.empty() ? Emu.GetTitle() : game_title; } std::string screenshot_info::get_game_comment() const @@ -52,15 +46,17 @@ std::string screenshot_info::get_game_comment() const return game_comment; } -std::string screenshot_info::get_screenshot_path(const std::string& date_path) const +std::string screenshot_info::get_screenshot_path(s32 year, s32 month, s32 day, s32 hour, s32 minute, s32 second) const { u32 counter = 0; - std::string path = vfs::get("/dev_hdd0/photo/" + date_path + "/" + get_photo_title()); - std::string suffix = ".png"; + const std::string path = vfs::get(fmt::format("/dev_hdd0/photo/%04d/%02d/%02d/%s %02d-%02d-%04d %02d-%02d-%02d", + year, month, day, get_photo_title(), day, month, year, hour, minute, second)); + constexpr std::string_view extension = ".png"; + std::string suffix = std::string(extension); while (!Emu.IsStopped() && fs::is_file(path + suffix)) { - suffix = fmt::format("_%d.png", ++counter); + suffix = fmt::format(" %d%s", ++counter, extension); } return path + suffix; diff --git a/rpcs3/Emu/Cell/Modules/cellScreenshot.h b/rpcs3/Emu/Cell/Modules/cellScreenshot.h index 20a8d41cc5..de84257c7b 100644 --- a/rpcs3/Emu/Cell/Modules/cellScreenshot.h +++ b/rpcs3/Emu/Cell/Modules/cellScreenshot.h @@ -44,7 +44,7 @@ struct screenshot_info std::string get_photo_title() const; std::string get_game_title() const; std::string get_game_comment() const; - std::string get_screenshot_path(const std::string& date_path) const; + std::string get_screenshot_path(s32 year, s32 month, s32 day, s32 hour, s32 minute, s32 second) const; }; struct screenshot_manager : public screenshot_info diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index df6aac317a..a2f122ecbb 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -1040,7 +1040,9 @@ void gs_frame::take_screenshot(std::vector&& data, u32 sshot_width, u32 ssho } } - const std::string cell_sshot_filename = manager.get_screenshot_path(date_time.toString("yyyy/MM/dd").toStdString()); + const QDate date = date_time.date(); + const QTime time = date_time.time(); + const std::string cell_sshot_filename = manager.get_screenshot_path(date.year(), date.month(), date.day(), time.hour(), time.minute(), time.second()); const std::string cell_sshot_dir = fs::get_parent_dir(cell_sshot_filename); screenshot_log.notice("Saving cell screenshot to %s", cell_sshot_filename); diff --git a/rpcs3/rpcs3qt/qt_utils.cpp b/rpcs3/rpcs3qt/qt_utils.cpp index fa5e3c250e..fc53dc542a 100644 --- a/rpcs3/rpcs3qt/qt_utils.cpp +++ b/rpcs3/rpcs3qt/qt_utils.cpp @@ -641,7 +641,7 @@ namespace gui usz byte_unit = 0; usz divisor = 1; #if defined(__APPLE__) - constexpr usz multiplier = 1000; + constexpr usz multiplier = 1000; static const QString s_units[]{"B", "kB", "MB", "GB", "TB", "PB"}; #else constexpr usz multiplier = 1024; From d85b9d0cd10468a60507f738a8fda008ef6022d0 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 7 Dec 2025 10:36:55 +0100 Subject: [PATCH 041/630] cellScreenshot: escape photo_title in path --- rpcs3/Emu/Cell/Modules/cellScreenshot.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp b/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp index 5d8e2f2a18..baf9ee380d 100644 --- a/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp +++ b/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp @@ -50,7 +50,7 @@ std::string screenshot_info::get_screenshot_path(s32 year, s32 month, s32 day, s { u32 counter = 0; const std::string path = vfs::get(fmt::format("/dev_hdd0/photo/%04d/%02d/%02d/%s %02d-%02d-%04d %02d-%02d-%02d", - year, month, day, get_photo_title(), day, month, year, hour, minute, second)); + year, month, day, vfs::escape(get_photo_title(), true), day, month, year, hour, minute, second)); constexpr std::string_view extension = ".png"; std::string suffix = std::string(extension); From 953f9f7e01793a1c40969c5300be67d4fd2f7462 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 27 Dec 2025 17:41:29 +0100 Subject: [PATCH 042/630] cellPhotoExport: Use roughly same path as cellScreenShot --- rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp | 27 +++++-------------- rpcs3/Emu/Cell/Modules/cellScreenshot.cpp | 16 ------------ rpcs3/Emu/Cell/Modules/cellScreenshot.h | 1 - rpcs3/Emu/System.h | 1 + rpcs3/main_application.cpp | 30 ++++++++++++++++++++++ rpcs3/rpcs3qt/gs_frame.cpp | 4 +-- 6 files changed, 39 insertions(+), 40 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp b/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp index 8a264bc721..473bd435e7 100644 --- a/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/VFS.h" #include "cellSysutil.h" @@ -107,30 +108,16 @@ bool check_photo_path(const std::string& file_path) return true; } -std::string get_available_photo_path(const std::string& filename) +std::string get_available_photo_path(std::string_view filename) { - const std::string photo_dir = "/dev_hdd0/photo/"; - std::string dst_path = vfs::get(photo_dir + filename); - - // Do not overwrite existing files. Add a suffix instead. - for (u32 i = 0; fs::exists(dst_path); i++) + std::string_view extension = ".png"; + if (const auto extension_start = filename.find_last_of('.'); + extension_start != umax) { - const std::string suffix = fmt::format("_%d", i); - std::string new_filename = filename; - - if (const usz pos = new_filename.find_last_of('.'); pos != std::string::npos) - { - new_filename.insert(pos, suffix); - } - else - { - new_filename.append(suffix); - } - - dst_path = vfs::get(photo_dir + new_filename); + extension = filename.substr(extension_start); } - return dst_path; + return Emu.GetCallbacks().get_photo_path(fmt::format("%s%s", Emu.GetTitle(), extension)); } diff --git a/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp b/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp index baf9ee380d..060683bdea 100644 --- a/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp +++ b/rpcs3/Emu/Cell/Modules/cellScreenshot.cpp @@ -46,22 +46,6 @@ std::string screenshot_info::get_game_comment() const return game_comment; } -std::string screenshot_info::get_screenshot_path(s32 year, s32 month, s32 day, s32 hour, s32 minute, s32 second) const -{ - u32 counter = 0; - const std::string path = vfs::get(fmt::format("/dev_hdd0/photo/%04d/%02d/%02d/%s %02d-%02d-%04d %02d-%02d-%02d", - year, month, day, vfs::escape(get_photo_title(), true), day, month, year, hour, minute, second)); - constexpr std::string_view extension = ".png"; - std::string suffix = std::string(extension); - - while (!Emu.IsStopped() && fs::is_file(path + suffix)) - { - suffix = fmt::format(" %d%s", ++counter, extension); - } - - return path + suffix; -} - error_code cellScreenShotSetParameter(vm::cptr param) { diff --git a/rpcs3/Emu/Cell/Modules/cellScreenshot.h b/rpcs3/Emu/Cell/Modules/cellScreenshot.h index de84257c7b..e581400dcd 100644 --- a/rpcs3/Emu/Cell/Modules/cellScreenshot.h +++ b/rpcs3/Emu/Cell/Modules/cellScreenshot.h @@ -44,7 +44,6 @@ struct screenshot_info std::string get_photo_title() const; std::string get_game_title() const; std::string get_game_comment() const; - std::string get_screenshot_path(s32 year, s32 month, s32 day, s32 hour, s32 minute, s32 second) const; }; struct screenshot_manager : public screenshot_info diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 088fc70ef5..5288d72a1e 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -101,6 +101,7 @@ struct EmuCallbacks std::function get_localized_string; std::function get_localized_u32string; std::function get_localized_setting; + std::function get_photo_path; std::function)> play_sound; std::function get_image_info; // (filename, sub_type, width, height, CellSearchOrientation) std::function get_scaled_image; // (filename, target_width, target_height, width, height, dst, force_fit) diff --git a/rpcs3/main_application.cpp b/rpcs3/main_application.cpp index a1bc443cd0..ff3b70f952 100644 --- a/rpcs3/main_application.cpp +++ b/rpcs3/main_application.cpp @@ -18,6 +18,7 @@ #include "Emu/Io/Null/NullMouseHandler.h" #include "Emu/Io/KeyboardHandler.h" #include "Emu/Io/MouseHandler.h" +#include "Emu/VFS.h" #include "Input/basic_keyboard_handler.h" #include "Input/basic_mouse_handler.h" #include "Input/raw_mouse_handler.h" @@ -36,6 +37,7 @@ #include "Emu/Audio/FAudio/faudio_enumerator.h" #endif +#include #include // This shouldn't be outside rpcs3qt... #include // This shouldn't be outside rpcs3qt... #include // This shouldn't be outside rpcs3qt... @@ -377,5 +379,33 @@ EmuCallbacks main_application::CreateCallbacks() callbacks.enable_gamemode = [](bool enabled){ enable_gamemode(enabled); }; + callbacks.get_photo_path = [](std::string_view title) + { + const QDateTime date_time = QDateTime::currentDateTime(); + const QDate date = date_time.date(); + const QTime time = date_time.time(); + + std::string_view extension = ".png"; + if (const auto extension_start = title.find_last_of('.'); + extension_start != umax) + { + extension = title.substr(extension_start); + title = title.substr(0, extension_start); + } + + std::string suffix = std::string(extension); + const std::string path = vfs::get(fmt::format("/dev_hdd0/photo/%04d/%02d/%02d/%s %02d-%02d-%04d %02d-%02d-%02d", + date.year(), date.month(), date.day(), vfs::escape(title, true), + date.day(), date.month(), date.year(), time.hour(), time.minute(), time.second())); + + u32 counter = 0; + while (!Emu.IsStopped() && fs::is_file(path + suffix)) + { + suffix = fmt::format(" %d%s", ++counter, extension); + } + + return path + suffix; + }; + return callbacks; } diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index a2f122ecbb..483f5affdc 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -1040,9 +1040,7 @@ void gs_frame::take_screenshot(std::vector&& data, u32 sshot_width, u32 ssho } } - const QDate date = date_time.date(); - const QTime time = date_time.time(); - const std::string cell_sshot_filename = manager.get_screenshot_path(date.year(), date.month(), date.day(), time.hour(), time.minute(), time.second()); + const std::string cell_sshot_filename = Emu.GetCallbacks().get_photo_path(manager.get_photo_title() + ".png"); const std::string cell_sshot_dir = fs::get_parent_dir(cell_sshot_filename); screenshot_log.notice("Saving cell screenshot to %s", cell_sshot_filename); From 953e31cbe89bedb0fc55099435eff3eda7eda216 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 30 Dec 2025 09:10:20 +0100 Subject: [PATCH 043/630] Adjust media list dialog for larger folder depth Use shared_ptr to fix crashes when navigating deeper folders --- rpcs3/Emu/Cell/Modules/cellMusic.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp | 2 +- .../Overlays/overlay_media_list_dialog.cpp | 74 ++++++++++++------- .../RSX/Overlays/overlay_media_list_dialog.h | 10 +-- 5 files changed, 56 insertions(+), 34 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellMusic.cpp b/rpcs3/Emu/Cell/Modules/cellMusic.cpp index 83937f7d16..c23bf274b0 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusic.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusic.cpp @@ -215,7 +215,7 @@ error_code cell_music_select_contents() const std::string vfs_dir_path = vfs::get("/dev_hdd0/music"); const std::string title = get_localized_string(localized_string_id::RSX_OVERLAYS_MEDIA_DIALOG_TITLE); - error_code error = rsx::overlays::show_media_list_dialog(rsx::overlays::media_list_dialog::media_type::audio, vfs_dir_path, title, + error_code error = rsx::overlays::show_media_list_dialog(rsx::overlays::media_list_dialog::media_type::audio, music_selection_context::max_depth, vfs_dir_path, title, [&music](s32 status, utils::media_info info) { sysutil_register_cb([&music, info = std::move(info), status](ppu_thread& ppu) -> s32 diff --git a/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp b/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp index c938f723b1..b7f21b90ad 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp @@ -134,7 +134,7 @@ error_code cell_music_decode_select_contents() const std::string vfs_dir_path = vfs::get("/dev_hdd0/music"); const std::string title = get_localized_string(localized_string_id::RSX_OVERLAYS_MEDIA_DIALOG_TITLE); - error_code error = rsx::overlays::show_media_list_dialog(rsx::overlays::media_list_dialog::media_type::audio, vfs_dir_path, title, + error_code error = rsx::overlays::show_media_list_dialog(rsx::overlays::media_list_dialog::media_type::audio, music_selection_context::max_depth, vfs_dir_path, title, [&dec](s32 status, utils::media_info info) { sysutil_register_cb([&dec, info = std::move(info), status](ppu_thread& ppu) -> s32 diff --git a/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp b/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp index d56db1f060..fbb287d311 100644 --- a/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp @@ -142,7 +142,7 @@ error_code select_photo(std::string dst_dir) const std::string vfs_dir_path = vfs::get("/dev_hdd0/photo"); const std::string title = get_localized_string(localized_string_id::RSX_OVERLAYS_MEDIA_DIALOG_TITLE_PHOTO_IMPORT); - error_code error = rsx::overlays::show_media_list_dialog(rsx::overlays::media_list_dialog::media_type::photo, vfs_dir_path, title, + error_code error = rsx::overlays::show_media_list_dialog(rsx::overlays::media_list_dialog::media_type::photo, umax, vfs_dir_path, title, [&pi_manager, dst_dir](s32 status, utils::media_info info) { sysutil_register_cb([&pi_manager, dst_dir, info, status](ppu_thread& ppu) -> s32 diff --git a/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.cpp index cc7affc983..bedbf652c7 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.cpp @@ -8,6 +8,24 @@ #include "Utilities/StrUtil.h" #include "Utilities/Thread.h" +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](rsx::overlays::media_list_dialog::media_type arg) + { + switch (arg) + { + case rsx::overlays::media_list_dialog::media_type::invalid: return "invalid"; + case rsx::overlays::media_list_dialog::media_type::directory: return "directory"; + case rsx::overlays::media_list_dialog::media_type::audio: return "audio"; + case rsx::overlays::media_list_dialog::media_type::video: return "video"; + case rsx::overlays::media_list_dialog::media_type::photo: return "photo"; + } + + return unknown; + }); +} + namespace rsx { namespace overlays @@ -203,7 +221,7 @@ namespace rsx return result; } - s32 media_list_dialog::show(media_entry* root, media_entry& result, const std::string& title, u32 focused, bool enable_overlay) + s32 media_list_dialog::show(std::shared_ptr root, media_entry& result, const std::string& title, u32 focused, bool enable_overlay) { auto ref = g_fxo->get().get(uid); @@ -237,7 +255,7 @@ namespace rsx { focused = 0; ensure(static_cast(return_code) < m_media->children.size()); - m_media = &m_media->children[return_code]; + m_media = m_media->children[return_code]; rsx_log.notice("Media dialog: selected entry: %d ('%s')", return_code, m_media->path); continue; } @@ -287,9 +305,10 @@ namespace rsx m_list = std::make_unique(virtual_width - 2 * 20, 540); m_list->set_pos(20, 85); - for (const media_entry& child : m_media->children) + for (const auto& child : m_media->children) { - std::unique_ptr entry = std::make_unique(child); + ensure(!!child); + std::unique_ptr entry = std::make_unique(*child); m_list->add_entry(entry); } @@ -321,9 +340,11 @@ namespace rsx static constexpr auto thread_name = "MediaList Thread"sv; }; - void parse_media_recursive(u32 depth, const std::string& media_path, const std::string& name, media_list_dialog::media_type type, media_list_dialog::media_entry& current_entry) + void parse_media_recursive(u32 depth, u32 max_depth, const std::string& media_path, const std::string& name, media_list_dialog::media_type type, std::shared_ptr current_entry) { - if (depth++ > music_selection_context::max_depth) + ensure(!!current_entry); + + if (depth++ > max_depth && max_depth != umax) { return; } @@ -339,26 +360,27 @@ namespace rsx const std::string unescaped_name = vfs::unescape(dir_entry.name); - media_list_dialog::media_entry new_entry{}; - parse_media_recursive(depth, media_path + "/" + dir_entry.name, unescaped_name, type, new_entry); - if (new_entry.type != media_list_dialog::media_type::invalid) + auto new_entry = std::make_shared(); + parse_media_recursive(depth, max_depth, media_path + "/" + dir_entry.name, unescaped_name, type, new_entry); + if (new_entry->type != media_list_dialog::media_type::invalid) { - new_entry.parent = ¤t_entry; - new_entry.index = ::narrow(current_entry.children.size()); - current_entry.children.emplace_back(std::move(new_entry)); + rsx_log.notice("parse_media_recursive: found '%s' (type=%s)", dir_entry.name, new_entry->type); + new_entry->parent = current_entry; + new_entry->index = ::narrow(current_entry->children.size()); + current_entry->children.emplace_back(std::move(new_entry)); } } // Only keep directories that contain valid entries - if (current_entry.children.empty()) + if (current_entry->children.empty()) { rsx_log.notice("parse_media_recursive: No matches in directory '%s'", media_path); } else { - rsx_log.notice("parse_media_recursive: Found %d matches in directory '%s'", current_entry.children.size(), media_path); - current_entry.type = media_list_dialog::media_type::directory; - current_entry.info.path = media_path; + rsx_log.notice("parse_media_recursive: Found %d matches in directory '%s'", current_entry->children.size(), media_path); + current_entry->type = media_list_dialog::media_type::directory; + current_entry->info.path = media_path; } } else @@ -370,20 +392,20 @@ namespace rsx auto [success, info] = utils::get_media_info(media_path, av_media_type); if (success) { - current_entry.type = type; - current_entry.info = std::move(info); + current_entry->type = type; + current_entry->info = std::move(info); rsx_log.notice("parse_media_recursive: Found media '%s'", media_path); } } - if (current_entry.type != media_list_dialog::media_type::invalid) + if (current_entry->type != media_list_dialog::media_type::invalid) { - current_entry.path = media_path; - current_entry.name = name; + current_entry->path = media_path; + current_entry->name = name; } } - error_code show_media_list_dialog(media_list_dialog::media_type type, const std::string& path, const std::string& title, std::function on_finished) + error_code show_media_list_dialog(media_list_dialog::media_type type, u32 max_depth, const std::string& path, const std::string& title, std::function on_finished) { rsx_log.todo("show_media_list_dialog(type=%d, path='%s', title='%s', on_finished=%d)", static_cast(type), path, title, !!on_finished); @@ -394,12 +416,12 @@ namespace rsx g_fxo->get>()([=]() { - media_list_dialog::media_entry root_media_entry{}; - root_media_entry.type = media_list_dialog::media_type::directory; + auto root_media_entry = std::make_shared(); + root_media_entry->type = media_list_dialog::media_type::directory; if (fs::is_dir(path)) { - parse_media_recursive(0, path, title, type, root_media_entry); + parse_media_recursive(0, max_depth, path, title, type, root_media_entry); } else { @@ -412,7 +434,7 @@ namespace rsx if (auto manager = g_fxo->try_get()) { - result = manager->create()->show(&root_media_entry, media, title, focused, true); + result = manager->create()->show(root_media_entry, media, title, focused, true); } else { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.h b/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.h index 6a5d39b3fa..e2656d728f 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_media_list_dialog.h @@ -29,8 +29,8 @@ namespace rsx utils::media_info info; u32 index = 0; - media_entry* parent = nullptr; - std::vector children; + std::shared_ptr parent; + std::vector> children; }; media_list_dialog(); @@ -39,7 +39,7 @@ namespace rsx compiled_resource get_compiled() override; - s32 show(media_entry* root, media_entry& result, const std::string& title, u32 focused, bool enable_overlay); + s32 show(std::shared_ptr root, media_entry& result, const std::string& title, u32 focused, bool enable_overlay); private: void reload(const std::string& title, u32 focused); @@ -53,7 +53,7 @@ namespace rsx std::unique_ptr icon_data; }; - media_entry* m_media = nullptr; + std::shared_ptr m_media; std::unique_ptr m_dim_background; std::unique_ptr m_list; @@ -61,6 +61,6 @@ namespace rsx std::unique_ptr - Exit And Save Log + Exit and Save Log Exit RPCS3, move the log file to a custom location @@ -818,12 +827,12 @@ true - Show Game Compatibility in Grid Mode + Show Game Compatibility - Game List Refresh + Refresh Game List @@ -841,7 +850,7 @@ - View The Welcome Dialog + View Welcome Dialog @@ -897,7 +906,7 @@ Large - + true @@ -905,15 +914,15 @@ true - List View + List Mode - + true - Grid View + Grid Mode diff --git a/rpcs3/rpcs3qt/ps_move_tracker_dialog.ui b/rpcs3/rpcs3qt/ps_move_tracker_dialog.ui index 2272c989dc..3afa78b531 100644 --- a/rpcs3/rpcs3qt/ps_move_tracker_dialog.ui +++ b/rpcs3/rpcs3qt/ps_move_tracker_dialog.ui @@ -17,7 +17,7 @@ - Dialog + PS Move Tracker Settings From f535c82a3f577c243344de5f215237c21356c15e Mon Sep 17 00:00:00 2001 From: Antonino Di Guardo <64427768+digant73@users.noreply.github.com> Date: Wed, 31 Dec 2025 16:44:11 +0100 Subject: [PATCH 046/630] Improve Utilities and Log menus (#17944) --- rpcs3/rpcs3qt/log_frame.cpp | 9 +++++---- rpcs3/rpcs3qt/log_viewer.cpp | 13 ++++--------- rpcs3/rpcs3qt/main_window.ui | 15 +++++++-------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index a155cf215d..1d2739608d 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -293,7 +293,7 @@ void log_frame::CreateAndConnectActions() }); }); - m_perform_goto_on_debugger = new QAction(tr("Go-To On The Debugger"), this); + m_perform_goto_on_debugger = new QAction(tr("Go-To on Debugger"), this); connect(m_perform_goto_on_debugger, &QAction::triggered, [this]() { QPlainTextEdit* pte = (m_tabWidget->currentIndex() == 1 ? m_tty : m_log); @@ -315,7 +315,7 @@ void log_frame::CreateAndConnectActions() memory_viewer_panel::ShowAtPC(static_cast(pc)); }); - m_perform_goto_thread_on_debugger = new QAction(tr("Show Thread On The Debugger"), this); + m_perform_goto_thread_on_debugger = new QAction(tr("Show Thread on Debugger"), this); connect(m_perform_goto_thread_on_debugger, &QAction::triggered, [this]() { QPlainTextEdit* pte = (m_tabWidget->currentIndex() == 1 ? m_tty : m_log); @@ -433,12 +433,13 @@ void log_frame::CreateAndConnectActions() m_perform_goto_thread_on_debugger->setToolTip(tr("Show the thread that corresponds to the thread ID from the log text on the debugger.")); m_perform_show_in_mem_viewer->setToolTip(tr("Jump to the selected hexadecimal address from the log text on the memory viewer.")); - menu->addSeparator(); - menu->addActions(m_log_level_acts->actions()); menu->addSeparator(); menu->addAction(m_stack_act_log); menu->addAction(m_stack_act_err); menu->addAction(m_show_prefix_act); + menu->addSeparator(); + menu->addActions(m_log_level_acts->actions()); + menu->exec(m_log->viewport()->mapToGlobal(pos)); }); diff --git a/rpcs3/rpcs3qt/log_viewer.cpp b/rpcs3/rpcs3qt/log_viewer.cpp index ef45025b58..99961809c9 100644 --- a/rpcs3/rpcs3qt/log_viewer.cpp +++ b/rpcs3/rpcs3qt/log_viewer.cpp @@ -114,24 +114,19 @@ void log_viewer::show_context_menu(const QPoint& pos) init_action(trace_act, logs::level::trace); menu.addAction(copy); + menu.addAction(clear); + menu.addSeparator(); menu.addAction(open); - menu.addSeparator(); + menu.addAction(config); + menu.addAction(filter); menu.addAction(save); menu.addSeparator(); - menu.addAction(config); - menu.addSeparator(); - menu.addAction(filter); - menu.addSeparator(); menu.addAction(timestamps); - menu.addSeparator(); menu.addAction(threads); - menu.addSeparator(); menu.addAction(last_actions_only); menu.addSeparator(); menu.addActions(log_level_acts->actions()); - menu.addSeparator(); - menu.addAction(clear); connect(copy, &QAction::triggered, this, [this]() { diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index bcd5f50791..39a3c014bb 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -335,24 +335,23 @@ - - - - - - + + - - + + + + + From 2f94891c236bdc7d24854654e3ff3aa8f02c06ae Mon Sep 17 00:00:00 2001 From: Niram7777 Date: Fri, 19 Dec 2025 23:36:16 +0100 Subject: [PATCH 047/630] Build Freebsd update LLVM dev (22) Fix the CI by using the correct compiler version https://wiki.freebsd.org/HardcodedCCVersions --- .github/workflows/rpcs3.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 1edd6aa9b8..bd0e206308 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -413,7 +413,11 @@ jobs: env: CCACHE_DIR: ${{ github.workspace }}/ccache QT_VER_MAIN: '6' - LLVM_COMPILER_VER: '19' + LLVM_COMPILER_VER: '-devel' + CC: 'clang-devel' + CXX: 'clang++-devel' + LLVM_CONFIG: 'llvm-config-devel' + steps: - name: Checkout repository uses: actions/checkout@main @@ -432,7 +436,7 @@ jobs: id: root uses: vmactions/freebsd-vm@v1 with: - envs: 'QT_VER_MAIN LLVM_COMPILER_VER CCACHE_DIR' + envs: 'QT_VER_MAIN LLVM_COMPILER_VER CCACHE_DIR CC CXX LLVM_CONFIG' usesh: true run: .ci/install-freebsd.sh && .ci/build-freebsd.sh From 51fd4b2f7683d4204ca11580100b50ad10a73417 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Fri, 26 Dec 2025 22:46:21 +0200 Subject: [PATCH 048/630] USB: Added support for G27 compatibility modes - Driving Force EX - Driving Force Pro - Driving Force GT - G25 --- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 21 + rpcs3/Emu/Cell/lv2/sys_usbd.h | 1 + rpcs3/Emu/Io/LogitechG27.cpp | 773 +++++++++++++----- rpcs3/Emu/Io/LogitechG27.h | 23 +- rpcs3/Emu/Io/LogitechG27Config.h | 6 +- rpcs3/Emu/Io/TopShotElite.cpp | 4 +- rpcs3/Emu/Io/TopShotFearmaster.cpp | 4 +- .../emulated_logitech_g27_settings_dialog.cpp | 41 +- .../emulated_logitech_g27_settings_dialog.h | 2 + 9 files changed, 674 insertions(+), 201 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index cf6339081e..463ec7a68d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -1054,6 +1054,27 @@ void connect_usb_controller(u8 index, input::product_type type) } } +void reconnect_usb(u32 assigned_number) +{ + auto usbh = g_fxo->try_get>(); + if (!usbh) + { + return; + } + + std::lock_guard lock(usbh->mutex); + for (auto& [nr, pair] : usbh->handled_devices) + { + auto& [internal_dev, dev] = pair; + if (nr == assigned_number) + { + usbh->disconnect_usb_device(dev, false); + usbh->connect_usb_device(dev, false); + break; + } + } +} + void handle_hotplug_event(bool connected) { if (auto usbh = g_fxo->try_get>()) diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.h b/rpcs3/Emu/Cell/lv2/sys_usbd.h index a2fd911e35..76f5f0b061 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.h +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.h @@ -89,4 +89,5 @@ error_code sys_usbd_register_extra_ldd(ppu_thread& ppu, u32 handle, vm::cptr s_product, u16 slen_product); void connect_usb_controller(u8 index, input::product_type); +void reconnect_usb(u32 assigned_number); void handle_hotplug_event(bool connected); diff --git a/rpcs3/Emu/Io/LogitechG27.cpp b/rpcs3/Emu/Io/LogitechG27.cpp index 5503c606fc..c8aa453592 100644 --- a/rpcs3/Emu/Io/LogitechG27.cpp +++ b/rpcs3/Emu/Io/LogitechG27.cpp @@ -17,7 +17,254 @@ #include "Input/pad_thread.h" #include "Input/sdl_instance.h" -LOG_CHANNEL(logitech_g27_log, "LOGIG27"); +LOG_CHANNEL(logitech_g27_log, "logitech_g27"); + +#pragma pack(push, 1) +struct DFEX_data +{ + u8 square : 1; + u8 cross : 1; + u8 circle : 1; + u8 triangle : 1; + u8 l1 : 1; // Left_paddle + u8 r1 : 1; // Right_paddle + u8 l2 : 1; + u8 r2 : 1; + + u8 select : 1; // Share + u8 start : 1; // Options + u8 l3 : 1; + u8 r3 : 1; + u8 ps : 1; + u8 : 3; + + u8 dpad; // 00=N, 01=NE, 02=E, 03=SW, 04=S, 05=SW, 06=W, 07=NW, 08=IDLE + u8 steering; // 00=Left, ff=Right + u8 brake_throttle; // 00=ThrottlePressed, 7f=BothReleased/BothPressed, ff=BrakePressed + u8 const1; + u8 const2; + u32 : 32; + u32 : 32; + u16 : 16; + u8 brake; // 00=Released, ff=Pressed + u8 throttle; // 00=Released, ff=Pressed + u32 : 32; + u32 : 32; +}; + +struct DFP_data +{ + u16 steering : 14; // 0000=Left, 1fff=Mid, 3fff=Right + u16 cross: 1; + u16 square : 1; + + u8 circle : 1; + u8 triangle : 1; + u8 r1 : 1; // Right_paddle + u8 l1 : 1; // Left_paddle + u8 r2 : 1; + u8 l2 : 1; + u8 select : 1; // Share + u8 start : 1; // Options + + u8 r3 : 1; + u8 l3 : 1; + u8 r3_2 : 1; + u8 l3_2 : 1; + u8 dpad : 4; // 0=N, 1=NE, 2=E, 3=SW, 4=S, 5=SW, 6=W, 7=NW, 8=IDLE + + u8 brake_throttle; // 00=ThrottlePressed, 7f=BothReleased/BothPressed, ff=BrakePressed + u8 throttle; // 00=Pressed, ff=Released + u8 brake; // 00=Pressed, ff=Released + + u8 pedals_attached : 1; + u8 powered : 1; + u8 : 1; + u8 self_check_done : 1; + u8 set1 : 1; // always set + u8 : 3; +}; + +struct DFGT_data +{ + u8 dpad : 4; // 0=N, 1=NE, 2=E, 3=SW, 4=S, 5=SW, 6=W, 7=NW, 8=IDLE + u8 cross: 1; + u8 square : 1; + u8 circle : 1; + u8 triangle : 1; + + u8 r1 : 1; // Right_paddle + u8 l1 : 1; // Left_paddle + u8 r2 : 1; + u8 l2 : 1; + u8 select : 1; // Share + u8 start : 1; // Options + u8 r3 : 1; + u8 l3 : 1; + + u8 : 2; + u8 dial_center : 1; + u8 plus : 1; + u8 dial_cw : 1; + u8 dial_ccw : 1; + u8 minus : 1; + u8 : 1; + + u8 ps : 1; + u8 pedals_attached : 1; + u8 powered : 1; + u8 self_check_done : 1; + u8 set1 : 1; + u8 : 1; + u8 set2 : 1; + u8 : 1; + + u16 steering : 14; // 0000=Left, 1fff=Mid, 3fff=Right + u16 : 2; + u8 throttle; // 00=Pressed, ff=Released + u8 brake; // 00=Pressed, ff=Released +}; + +struct G25_data +{ + u8 dpad : 4; // 0=N, 1=NE, 2=E, 3=SW, 4=S, 5=SW, 6=W, 7=NW, 8=IDLE + u8 cross: 1; + u8 square : 1; + u8 circle : 1; + u8 triangle : 1; + + u8 r1 : 1; // Right_paddle + u8 l1 : 1; // Left_paddle + u8 r2 : 1; // + dial_center + u8 l2 : 1; + u8 select : 1; // Share + u8 start : 1; // Options + u8 r3 : 1; // + dial_cw + plus + u8 l3 : 1; // + dial_ccw + minus + + u8 gear1 : 1; + u8 gear2 : 1; + u8 gear3 : 1; + u8 gear4 : 1; + u8 gear5 : 1; + u8 gear6 : 1; + u8 gearR : 1; + u8 : 1; + + u16 pedals_detached : 1; + u16 powered : 1; + u16 steering : 14; // 0000=Left, 1fff=Mid, 3fff=Right + + u8 throttle; // 00=Pressed, ff=Released + u8 brake; // 00=Pressed, ff=Released + u8 clutch; // 00=Pressed, ff=Released + + u8 shifter_x; // 30=left(1,2), 7a=middle(3,4), b2=right(5,6) + u8 shifter_y; // 32=bottom(2,4,6), b7=top(1,3,5) + + u8 shifter_attached : 1; + u8 set1 : 1; + u8 : 1; + u8 shifter_pressed : 1; + u8 : 4; +}; + +struct G27_data +{ + u8 dpad : 4; // 0=N, 1=NE, 2=E, 3=SW, 4=S, 5=SW, 6=W, 7=NW, 8=IDLE + u8 cross: 1; + u8 square : 1; + u8 circle : 1; + u8 triangle : 1; + + u8 r1 : 1; // Right_paddle + u8 l1 : 1; // Left_paddle + u8 r2 : 1; + u8 l2 : 1; + u8 select : 1; // Share + u8 start : 1; // Options + u8 r3 : 1; // + dial_center + u8 l3 : 1; + + u8 gear1 : 1; + u8 gear2 : 1; + u8 gear3 : 1; + u8 gear4 : 1; + u8 gear5 : 1; + u8 gear6 : 1; + u8 dial_cw : 1; + u8 dial_ccw : 1; + + u16 plus : 1; + u16 minus : 1; + u16 steering : 14; // 0000=Left, 1fff=Mid, 3fff=Right + + u8 throttle; // 00=Pressed, ff=Released + u8 brake; // 00=Pressed, ff=Released + u8 clutch; // 00=Pressed, ff=Released + + u8 shifter_x; // 30=left(1,2), 7a=middle(3,4), b2=right(5,6) + u8 shifter_y; // 32=bottom(2,4,6), b7=top(1,3,5) + + u8 gearR : 1; + u8 pedals_detached : 1; + u8 powered : 1; + u8 shifter_attached : 1; + u8 set1 : 1; + u8 : 1; + u8 shifter_pressed : 1; + u8 range : 1; +}; +#pragma pack(pop) + +static const std::map>> s_logitech_personality = { +{ + logitech_personality::driving_force_ex, + { + UsbDeviceDescriptor{0x0200, 0x00, 0x00, 0x00, 0x10, 0x046D, 0xC294, 0x1350, 0x01, 0x02, 0x00, 0x01}, + {0x09, 0x02, 0x29, 0x00, 0x01, 0x01, 0x04, 0x80, 0x31, 0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, + 0x00, 0x00, 0x09, 0x21, 0x00, 0x01, 0x21, 0x01, 0x22, 0x9D, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, + 0x00, 0x0A, 0x07, 0x05, 0x01, 0x03, 0x10, 0x00, 0x0A} + } +}, +{ + logitech_personality::driving_force_pro, + { + UsbDeviceDescriptor{0x0200, 0x00, 0x00, 0x00, 0x10, 0x046D, 0xC298, 0x1350, 0x01, 0x02, 0x00, 0x01}, + {0x09, 0x02, 0x29, 0x00, 0x01, 0x01, 0x04, 0x80, 0x31, 0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, + 0x00, 0x00, 0x09, 0x21, 0x00, 0x01, 0x21, 0x01, 0x22, 0x61, 0x00, 0x07, 0x05, 0x81, 0x03, 0x08, + 0x00, 0x0A, 0x07, 0x05, 0x01, 0x03, 0x08, 0x00, 0x0A} + } +}, +{ + logitech_personality::g25, + { + UsbDeviceDescriptor{0x0200, 0x00, 0x00, 0x00, 0x10, 0x046D, 0xC299, 0x1350, 0x01, 0x02, 0x00, 0x01}, + {0x09, 0x02, 0x29, 0x00, 0x01, 0x01, 0x04, 0x80, 0x31, 0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, + 0x00, 0x00, 0x09, 0x21, 0x11, 0x01, 0x21, 0x01, 0x22, 0x6F, 0x00, 0x07, 0x05, 0x81, 0x03, 0x10, + 0x00, 0x02, 0x07, 0x05, 0x01, 0x03, 0x10, 0x00, 0x02} + } +}, +{ + logitech_personality::driving_force_gt, + { + UsbDeviceDescriptor{0x0200, 0x00, 0x00, 0x00, 0x10, 0x046D, 0xC29A, 0x1350, 0x00, 0x02, 0x00, 0x01}, + {0x09, 0x02, 0x29, 0x00, 0x01, 0x01, 0x00, 0x80, 0x31, 0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, + 0x00, 0xFE, 0x09, 0x21, 0x11, 0x01, 0x21, 0x01, 0x22, 0x73, 0x00, 0x07, 0x05, 0x81, 0x03, 0x10, + 0x00, 0x02, 0x07, 0x05, 0x01, 0x03, 0x10, 0x00, 0x02} + } +}, +{ + logitech_personality::g27, + { + UsbDeviceDescriptor{0x0200, 0x00, 0x00, 0x00, 0x10, 0x046D, 0xC29B, 0x1350, 0x01, 0x02, 0x00, 0x01}, + {0x09, 0x02, 0x29, 0x00, 0x01, 0x01, 0x04, 0x80, 0x31, 0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, + 0x00, 0x00, 0x09, 0x21, 0x11, 0x01, 0x21, 0x01, 0x22, 0x85, 0x00, 0x07, 0x05, 0x81, 0x03, 0x10, + 0x00, 0x02, 0x07, 0x05, 0x01, 0x03, 0x10, 0x00, 0x02} + } +} +}; // ref: https://github.com/libsdl-org/SDL/issues/7941, need to use SDL_HAPTIC_STEERING_AXIS for some windows drivers static const SDL_HapticDirection STEERING_DIRECTION = @@ -26,20 +273,31 @@ static const SDL_HapticDirection STEERING_DIRECTION = .dir = {0, 0, 0} }; -usb_device_logitech_g27::usb_device_logitech_g27(u32 controller_index, const std::array& location) - : usb_device_emulated(location), m_controller_index(controller_index) +void usb_device_logitech_g27::set_personality(logitech_personality personality, bool reconnect) { - device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, UsbDeviceDescriptor{0x0200, 0, 0, 0, 16, 0x046d, 0xc29b, 0x1350, 1, 2, 0, 1}); + m_personality = personality; + device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, ::at32(s_logitech_personality, personality).first); // parse the raw response like with passthrough device - static constexpr u8 raw_config[] = {0x9, 0x2, 0x29, 0x0, 0x1, 0x1, 0x4, 0x80, 0x31, 0x9, 0x4, 0x0, 0x0, 0x2, 0x3, 0x0, 0x0, 0x0, 0x9, 0x21, 0x11, 0x1, 0x21, 0x1, 0x22, 0x85, 0x0, 0x7, 0x5, 0x81, 0x3, 0x10, 0x0, 0x2, 0x7, 0x5, 0x1, 0x3, 0x10, 0x0, 0x2}; + const u8* raw_config = ::at32(s_logitech_personality, personality).second.data(); auto& conf = device.add_node(UsbDescriptorNode(raw_config[0], raw_config[1], &raw_config[2])); - for (unsigned int index = raw_config[0]; index < sizeof(raw_config);) + for (unsigned int index = raw_config[0]; index < raw_config[2];) { conf.add_node(UsbDescriptorNode(raw_config[index], raw_config[index + 1], &raw_config[index + 2])); index += raw_config[index]; } + if (reconnect) + { + reconnect_usb(assigned_number); + } +} + +usb_device_logitech_g27::usb_device_logitech_g27(u32 controller_index, const std::array& location) + : usb_device_emulated(location), m_controller_index(controller_index) +{ + set_personality(logitech_personality::driving_force_ex); + m_default_spring_effect.type = SDL_HAPTIC_SPRING; m_default_spring_effect.condition.direction = STEERING_DIRECTION; m_default_spring_effect.condition.length = SDL_HAPTIC_INFINITY; @@ -63,7 +321,14 @@ usb_device_logitech_g27::usb_device_logitech_g27(u32 controller_index, const std while (thread_ctrl::state() != thread_state::aborting) { sdl_refresh(); - thread_ctrl::wait_for(5'000'000); + thread_ctrl::wait_for(1'000'000); + + std::unique_lock lock(g_cfg_logitech_g27.m_mutex); + if (logitech_personality::invalid != m_next_personality && m_personality != m_next_personality) + { + set_personality(m_next_personality, true); + m_next_personality = logitech_personality::invalid; + } } }); } @@ -115,7 +380,7 @@ u16 usb_device_logitech_g27::get_num_emu_devices() void usb_device_logitech_g27::control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) { - logitech_g27_log.todo("control transfer bmRequestType %02x, bRequest %02x, wValue %04x, wIndex %04x, wLength %04x, %s", bmRequestType, bRequest, wValue, wIndex, wLength, fmt::buf_to_hexstring(buf, buf_size)); + logitech_g27_log.notice("control transfer bmRequestType %02x, bRequest %02x, wValue %04x, wIndex %04x, wLength %04x, %s", bmRequestType, bRequest, wValue, wIndex, wLength, fmt::buf_to_hexstring(buf, buf_size)); usb_device_emulated::control_transfer(bmRequestType, bRequest, wValue, wIndex, wLength, buf_size, buf, transfer); } @@ -194,9 +459,11 @@ static inline logitech_g27_sdl_mapping get_runtime_mapping() convert_mapping(cfg.dial_clockwise, mapping.dial_clockwise); convert_mapping(cfg.dial_anticlockwise, mapping.dial_anticlockwise); + convert_mapping(cfg.dial_center, mapping.dial_center); convert_mapping(cfg.select, mapping.select); - convert_mapping(cfg.pause, mapping.pause); + convert_mapping(cfg.start, mapping.start); + convert_mapping(cfg.ps, mapping.ps); convert_mapping(cfg.shifter_1, mapping.shifter_1); convert_mapping(cfg.shifter_2, mapping.shifter_2); @@ -205,7 +472,6 @@ static inline logitech_g27_sdl_mapping get_runtime_mapping() convert_mapping(cfg.shifter_5, mapping.shifter_5); convert_mapping(cfg.shifter_6, mapping.shifter_6); convert_mapping(cfg.shifter_r, mapping.shifter_r); - convert_mapping(cfg.shifter_press, mapping.shifter_press); return mapping; } @@ -467,6 +733,50 @@ static u8 hat_components_to_logitech_g27_hat(bool up, bool down, bool left, bool return sdl_hat_to_logitech_g27_hat(sdl_hat); } +static std::pair shifter_to_coord_xy(bool shifter_1, bool shifter_2, bool shifter_3, bool shifter_4, + bool shifter_5, bool shifter_6, bool shifter_r) +{ + // rough analog values recorded in https://github.com/RPCS3/rpcs3/pull/17199#issuecomment-2883934412 + constexpr u8 coord_center = 0x80; + constexpr u8 coord_top = 0xb7; + constexpr u8 coord_bottom = 0x32; + constexpr u8 coord_left = 0x30; + constexpr u8 coord_right = 0xb3; + constexpr u8 coord_right_reverse = 0xaa; + if (shifter_1) + { + return {coord_left, coord_top}; + } + else if (shifter_2) + { + return {coord_left, coord_bottom}; + } + else if (shifter_3) + { + return {coord_center, coord_top}; + } + else if (shifter_4) + { + return {coord_center, coord_bottom}; + } + else if (shifter_5) + { + return {coord_right, coord_top}; + } + else if (shifter_6) + { + return {coord_right, coord_bottom}; + } + else if (shifter_r) + { + return {coord_right_reverse, coord_bottom}; + } + else + { + return {coord_center, coord_center}; + } +} + static bool fetch_sdl_as_button(SDL_Joystick* joystick, const sdl_mapping& mapping) { switch (mapping.type) @@ -646,6 +956,220 @@ static inline void set_bit(u8* buf, int bit_num, bool set) buf[byte_num] = buf[byte_num] & (~mask); } +void usb_device_logitech_g27::transfer_dfex(u32 buf_size, u8* buf, UsbTransfer* transfer) +{ + DFEX_data data{}; + ensure(buf_size >= sizeof(data)); + transfer->expected_count = sizeof(data); + + const std::lock_guard lock(m_sdl_handles_mutex); + data.square = sdl_to_logitech_g27_button(m_joysticks, m_mapping.square); + data.cross = sdl_to_logitech_g27_button(m_joysticks, m_mapping.cross); + data.circle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.circle); + data.triangle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.triangle); + data.l1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_down); + data.r1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_up); + data.l2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l2); + data.r2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r2); + data.select = sdl_to_logitech_g27_button(m_joysticks, m_mapping.select); + data.start = sdl_to_logitech_g27_button(m_joysticks, m_mapping.start); + data.l3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l3); + data.r3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r3); + data.dpad = hat_components_to_logitech_g27_hat( + sdl_to_logitech_g27_button(m_joysticks, m_mapping.up), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.down), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.left), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.right) + ); + data.steering = sdl_to_logitech_g27_steering(m_joysticks, m_mapping.steering) >> 6; + data.brake_throttle = 0x7f; + data.const1 = 0x7f; + data.const2 = 0x7f; + data.brake = 0xff - sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.brake); + data.throttle = 0xff - sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.throttle); + std::memcpy(buf, &data, sizeof(data)); +} + +void usb_device_logitech_g27::transfer_dfp(u32 buf_size, u8* buf, UsbTransfer* transfer) +{ + DFP_data data{}; + ensure(buf_size >= sizeof(data)); + transfer->expected_count = sizeof(data); + + const std::lock_guard lock(m_sdl_handles_mutex); + data.steering = sdl_to_logitech_g27_steering(m_joysticks, m_mapping.steering); + data.cross = sdl_to_logitech_g27_button(m_joysticks, m_mapping.cross); + data.square = sdl_to_logitech_g27_button(m_joysticks, m_mapping.square); + data.circle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.circle); + data.triangle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.triangle); + data.r1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_up); + data.l1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_down); + data.r2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r2); + data.l2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l2); + data.select = sdl_to_logitech_g27_button(m_joysticks, m_mapping.select); + data.start = sdl_to_logitech_g27_button(m_joysticks, m_mapping.start); + data.r3 = data.r3_2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r3); + data.l3 = data.l3_2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l3); + data.dpad = hat_components_to_logitech_g27_hat( + sdl_to_logitech_g27_button(m_joysticks, m_mapping.up), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.down), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.left), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.right) + ); + data.brake_throttle = 0x7f; + data.throttle = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.throttle); + data.brake = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.brake); + data.pedals_attached = 1; + data.powered = 1; + data.self_check_done = 1; + data.set1 = 1; + std::memcpy(buf, &data, sizeof(data)); +} + +void usb_device_logitech_g27::transfer_dfgt(u32 buf_size, u8* buf, UsbTransfer* transfer) +{ + DFGT_data data{}; + ensure(buf_size >= sizeof(data)); + transfer->expected_count = sizeof(data); + + const std::lock_guard lock(m_sdl_handles_mutex); + data.dpad = hat_components_to_logitech_g27_hat( + sdl_to_logitech_g27_button(m_joysticks, m_mapping.up), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.down), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.left), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.right) + ); + data.cross = sdl_to_logitech_g27_button(m_joysticks, m_mapping.cross); + data.square = sdl_to_logitech_g27_button(m_joysticks, m_mapping.square); + data.circle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.circle); + data.triangle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.triangle); + data.r1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_up); + data.l1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_down); + data.r2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r2); + data.l2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l2); + data.select = sdl_to_logitech_g27_button(m_joysticks, m_mapping.select); + data.start = sdl_to_logitech_g27_button(m_joysticks, m_mapping.start); + data.r3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r3); + data.l3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l3); + data.dial_center = sdl_to_logitech_g27_button(m_joysticks, m_mapping.dial_center); + data.plus = sdl_to_logitech_g27_button(m_joysticks, m_mapping.plus); + data.dial_cw = sdl_to_logitech_g27_button(m_joysticks, m_mapping.dial_clockwise); + data.dial_ccw = sdl_to_logitech_g27_button(m_joysticks, m_mapping.dial_anticlockwise); + data.minus = sdl_to_logitech_g27_button(m_joysticks, m_mapping.minus); + data.ps = sdl_to_logitech_g27_button(m_joysticks, m_mapping.ps); + data.pedals_attached = 1; + data.powered = 1; + data.self_check_done = 1; + data.set1 = 1; + data.set2 = 1; + data.steering = sdl_to_logitech_g27_steering(m_joysticks, m_mapping.steering); + data.throttle = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.throttle); + data.brake = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.brake); + std::memcpy(buf, &data, sizeof(data)); +} + +void usb_device_logitech_g27::transfer_g25(u32 buf_size, u8* buf, UsbTransfer* transfer) +{ + G25_data data{}; + ensure(buf_size >= sizeof(data)); + transfer->expected_count = sizeof(data); + + const std::lock_guard lock(m_sdl_handles_mutex); + data.dpad = hat_components_to_logitech_g27_hat( + sdl_to_logitech_g27_button(m_joysticks, m_mapping.up), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.down), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.left), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.right) + ); + data.cross = sdl_to_logitech_g27_button(m_joysticks, m_mapping.cross); + data.square = sdl_to_logitech_g27_button(m_joysticks, m_mapping.square); + data.circle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.circle); + data.triangle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.triangle); + data.r1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_up); + data.l1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_down); + data.r2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r2); + data.l2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l2); + data.select = sdl_to_logitech_g27_button(m_joysticks, m_mapping.select); + data.start = sdl_to_logitech_g27_button(m_joysticks, m_mapping.start); + data.r3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r3); + data.l3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l3); + data.gear1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_1); + data.gear2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_2); + data.gear3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_3); + data.gear4 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_4); + data.gear5 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_5); + data.gear6 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_6); + data.gearR = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_r); + data.pedals_detached = 0; + data.powered = 1; + data.steering = sdl_to_logitech_g27_steering(m_joysticks, m_mapping.steering); + data.throttle = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.throttle); + data.brake = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.brake); + data.clutch = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.clutch); + auto [shifter_x, shifter_y] = shifter_to_coord_xy(data.gear1, data.gear2, + data.gear3, data.gear4, data.gear5, data.gear6, data.gearR); + data.shifter_x = shifter_x; + data.shifter_y = shifter_y; + data.shifter_attached = 1; + data.set1 = 1; + data.shifter_pressed = data.gearR; + std::memcpy(buf, &data, sizeof(data)); +} + +void usb_device_logitech_g27::transfer_g27(u32 buf_size, u8* buf, UsbTransfer* transfer) +{ + G27_data data{}; + ensure(buf_size >= sizeof(data)); + transfer->expected_count = sizeof(data); + + const std::lock_guard lock(m_sdl_handles_mutex); + data.dpad = hat_components_to_logitech_g27_hat( + sdl_to_logitech_g27_button(m_joysticks, m_mapping.up), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.down), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.left), + sdl_to_logitech_g27_button(m_joysticks, m_mapping.right) + ); + data.cross = sdl_to_logitech_g27_button(m_joysticks, m_mapping.cross); + data.square = sdl_to_logitech_g27_button(m_joysticks, m_mapping.square); + data.circle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.circle); + data.triangle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.triangle); + data.r1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_up); + data.l1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_down); + data.r2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r2); + data.l2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l2); + data.select = sdl_to_logitech_g27_button(m_joysticks, m_mapping.select); + data.start = sdl_to_logitech_g27_button(m_joysticks, m_mapping.start); + data.r3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r3); + data.l3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l3); + data.gear1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_1); + data.gear2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_2); + data.gear3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_3); + data.gear4 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_4); + data.gear5 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_5); + data.gear6 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_6); + const bool shifter_r = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_r); + data.dial_cw = sdl_to_logitech_g27_button(m_joysticks, m_mapping.dial_clockwise); + data.dial_ccw = sdl_to_logitech_g27_button(m_joysticks, m_mapping.dial_anticlockwise); + data.plus = sdl_to_logitech_g27_button(m_joysticks, m_mapping.plus); + data.minus = sdl_to_logitech_g27_button(m_joysticks, m_mapping.minus); + data.steering = sdl_to_logitech_g27_steering(m_joysticks, m_mapping.steering); + data.throttle = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.throttle); + data.brake = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.brake); + data.clutch = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.clutch); + auto [shifter_x, shifter_y] = shifter_to_coord_xy(data.gear1, data.gear2, + data.gear3, data.gear4, data.gear5, data.gear6, shifter_r); + data.shifter_x = shifter_x; + data.shifter_y = shifter_y; + data.gearR = shifter_r; + data.pedals_detached = 0; + data.powered = 1; + data.shifter_attached = 1; + data.set1 = 1; + data.shifter_pressed = shifter_r; + data.range = (m_wheel_range > 360); + std::memcpy(buf, &data, sizeof(data)); +} + void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endpoint, UsbTransfer* transfer) { transfer->fake = true; @@ -655,168 +1179,31 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp if (endpoint & (1 << 7)) { - if (buf_size < 11) - { - logitech_g27_log.error("Not populating input buffer with a buffer of the size of %u", buf_size); - return; - } - - ensure(buf_size >= 11); memset(buf, 0, buf_size); - - transfer->expected_count = 11; - sdl_instance::get_instance().pump_events(); - // Fetch input states from SDL - m_sdl_handles_mutex.lock(); - const u16 steering = sdl_to_logitech_g27_steering(m_joysticks, m_mapping.steering); - const u8 throttle = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.throttle); - const u8 brake = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.brake); - const u8 clutch = sdl_to_logitech_g27_pedal(m_joysticks, m_mapping.clutch); - const bool shift_up = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_up); - const bool shift_down = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shift_down); - - const bool up = sdl_to_logitech_g27_button(m_joysticks, m_mapping.up); - const bool down = sdl_to_logitech_g27_button(m_joysticks, m_mapping.down); - const bool left = sdl_to_logitech_g27_button(m_joysticks, m_mapping.left); - const bool right = sdl_to_logitech_g27_button(m_joysticks, m_mapping.right); - - const bool triangle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.triangle); - const bool cross = sdl_to_logitech_g27_button(m_joysticks, m_mapping.cross); - const bool square = sdl_to_logitech_g27_button(m_joysticks, m_mapping.square); - const bool circle = sdl_to_logitech_g27_button(m_joysticks, m_mapping.circle); - - const bool l2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l2); - const bool l3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.l3); - const bool r2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r2); - const bool r3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.r3); - - const bool plus = sdl_to_logitech_g27_button(m_joysticks, m_mapping.plus); - const bool minus = sdl_to_logitech_g27_button(m_joysticks, m_mapping.minus); - - const bool dial_clockwise = sdl_to_logitech_g27_button(m_joysticks, m_mapping.dial_clockwise); - const bool dial_anticlockwise = sdl_to_logitech_g27_button(m_joysticks, m_mapping.dial_anticlockwise); - - const bool select = sdl_to_logitech_g27_button(m_joysticks, m_mapping.select); - const bool pause = sdl_to_logitech_g27_button(m_joysticks, m_mapping.pause); - - const bool shifter_1 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_1); - const bool shifter_2 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_2); - const bool shifter_3 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_3); - const bool shifter_4 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_4); - const bool shifter_5 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_5); - const bool shifter_6 = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_6); - const bool shifter_r = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_r); - const bool shifter_press = sdl_to_logitech_g27_button(m_joysticks, m_mapping.shifter_press); - m_sdl_handles_mutex.unlock(); - - // populate buffer - buf[0] = hat_components_to_logitech_g27_hat(up, down, left, right); - set_bit(buf, 8, shift_up); - set_bit(buf, 9, shift_down); - - set_bit(buf, 7, triangle); - set_bit(buf, 4, cross); - set_bit(buf, 5, square); - set_bit(buf, 6, circle); - - set_bit(buf, 11, l2); - set_bit(buf, 15, l3); - set_bit(buf, 10, r2); - set_bit(buf, 14, r3); - - set_bit(buf, 22, dial_clockwise); - set_bit(buf, 23, dial_anticlockwise); - - set_bit(buf, 24, plus); - set_bit(buf, 25, minus); - - set_bit(buf, 12, select); - set_bit(buf, 13, pause); - - set_bit(buf, 16, shifter_1); - set_bit(buf, 17, shifter_2); - set_bit(buf, 18, shifter_3); - set_bit(buf, 19, shifter_4); - set_bit(buf, 20, shifter_5); - set_bit(buf, 21, shifter_6); - set_bit(buf, 80, shifter_r); - - // calibrated, unsure - set_bit(buf, 82, true); - // shifter connected - set_bit(buf, 83, true); - /* - * shifter pressed/down bit - * mechanical references: - * - G29 shifter mechanical explanation https://youtu.be/d7qCn3o8K98?t=1124 - * - same mechanism on the G27 https://youtu.be/rdjejtIfkVA?t=760 - * - same mechanism on the G25 https://youtu.be/eCyt_4luwF0?t=130 - * on healthy G29/G27/G25 shifters, shifter is mechnically kept pressed in reverse, the bit should be set - * the shifter_press mapping alone captures instead a shifter press without going into reverse, ie. neutral press, just in case there are games using it for input - */ - set_bit(buf, 86, shifter_press | shifter_r); - - buf[3] = (steering << 2) | buf[3]; - buf[4] = steering >> 6; - buf[5] = throttle; - buf[6] = brake; - buf[7] = clutch; - - // rough analog values recorded in https://github.com/RPCS3/rpcs3/pull/17199#issuecomment-2883934412 - // buf[8] shifter x - // buf[9] shifter y - constexpr u8 shifter_coord_center = 0x80; - constexpr u8 shifter_coord_top = 0xb7; - constexpr u8 shifter_coord_bottom = 0x32; - constexpr u8 shifter_coord_left = 0x30; - constexpr u8 shifter_coord_right = 0xb3; - constexpr u8 shifter_coord_right_reverse = 0xaa; - if (shifter_1) + switch (m_personality) { - buf[8] = shifter_coord_left; - buf[9] = shifter_coord_top; - } - else if (shifter_2) - { - buf[8] = shifter_coord_left; - buf[9] = shifter_coord_bottom; - } - else if (shifter_3) - { - buf[8] = shifter_coord_center; - buf[9] = shifter_coord_top; - } - else if (shifter_4) - { - buf[8] = shifter_coord_center; - buf[9] = shifter_coord_bottom; - } - else if (shifter_5) - { - buf[8] = shifter_coord_right; - buf[9] = shifter_coord_top; - } - else if (shifter_6) - { - buf[8] = shifter_coord_right; - buf[9] = shifter_coord_bottom; - } - else if (shifter_r) - { - buf[8] = shifter_coord_right_reverse; - buf[9] = shifter_coord_bottom; - } - else - { - buf[8] = shifter_coord_center; - buf[9] = shifter_coord_center; + case logitech_personality::driving_force_ex: + transfer_dfex(buf_size, buf, transfer); + break; + case logitech_personality::driving_force_pro: + transfer_dfp(buf_size, buf, transfer); + break; + case logitech_personality::g25: + transfer_g25(buf_size, buf, transfer); + break; + case logitech_personality::driving_force_gt: + transfer_dfgt(buf_size, buf, transfer); + break; + case logitech_personality::g27: + transfer_g27(buf_size, buf, transfer); + break; + case logitech_personality::invalid: + fmt::throw_exception("unreachable"); } - buf[10] = buf[10] | (m_wheel_range > 360 ? 0x90 : 0x10); - - // logitech_g27_log.error("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]); + // logitech_g27_log.error("dev=%d, ep in : %s", static_cast(m_personality), fmt::buf_to_hexstring(buf, buf_size)); return; } @@ -831,8 +1218,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp transfer->expected_count = buf_size; - // logitech_g27_log.error("%02x %02x %02x %02x %02x %02x %02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); - // printf("%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); + // logitech_g27_log.error("ep out : %s", fmt::buf_to_hexstring(buf, buf_size)); // TODO maybe force clipping from cfg @@ -843,9 +1229,44 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp switch (buf[1]) { case 0x01: + case 0x09: + case 0x10: { - // Change to DFP - logitech_g27_log.error("Drive Force Pro mode switch command ignored"); + // Change device mode + u8 cmd = buf[1]; + u8 arg = buf[2]; + if (buf[8] == 0xf8) // we have 2 commands back to back + { + cmd = buf[9]; + arg = buf[10]; + } + + m_next_personality = logitech_personality::invalid; + if (cmd == 0x09 && arg == 0x04) + m_next_personality = logitech_personality::g27; + else if (cmd == 0x09 && arg == 0x03) + m_next_personality = logitech_personality::driving_force_gt; + else if ((cmd == 0x09 && arg == 0x02) || cmd == 0x10) + m_next_personality = logitech_personality::g25; + else if ((cmd == 0x09 && arg == 0x01) || cmd == 0x01) + m_next_personality = logitech_personality::driving_force_pro; + else if (cmd == 0x09 && arg == 0x00) + m_next_personality = logitech_personality::driving_force_ex; + + if (logitech_personality limit = static_cast(g_cfg_logitech_g27.compatibility_limit.get()); + limit < m_next_personality) + { + m_next_personality = limit; + } + + logitech_g27_log.success("Change device mode : buf=[%s], cmd=0x%x, arg=0x%x, lim=%d -> pers=%d(%s)", + fmt::buf_to_hexstring(buf, buf_size), cmd, arg, g_cfg_logitech_g27.compatibility_limit.get(), + static_cast(m_next_personality), + m_next_personality == logitech_personality::g27 ? "G27" + : m_next_personality == logitech_personality::driving_force_gt ? "Driving Force GT" + : m_next_personality == logitech_personality::g25 ? "G25" + : m_next_personality == logitech_personality::driving_force_pro ? "Driving Force Pro" + : m_next_personality == logitech_personality::driving_force_ex ? "Driving Force EX" : "Invalid"); break; } case 0x02: @@ -862,24 +1283,12 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp m_wheel_range = 900; break; } - case 0x09: - { - // Change device mode - logitech_g27_log.error("Change device mode to %d %s detaching command ignored", buf[2], buf[3] ? "with" : "without"); - break; - } case 0x0a: { // Revert indentity logitech_g27_log.error("Revert device identity after reset %s command ignored", buf[2] ? "enable" : "disable"); break; } - case 0x10: - { - // Switch to G25 with detach - logitech_g27_log.error("Switch to G25 with detach command ignored"); - break; - } case 0x11: { // Switch to G25 without detach diff --git a/rpcs3/Emu/Io/LogitechG27.h b/rpcs3/Emu/Io/LogitechG27.h index 52735a253d..4ec0d35c0b 100644 --- a/rpcs3/Emu/Io/LogitechG27.h +++ b/rpcs3/Emu/Io/LogitechG27.h @@ -16,6 +16,16 @@ #include #include +enum class logitech_personality +{ + driving_force_ex, + driving_force_pro, + g25, + driving_force_gt, + g27, + invalid, +}; + enum class logitech_g27_ffb_state { inactive, @@ -83,9 +93,11 @@ struct logitech_g27_sdl_mapping sdl_mapping dial_clockwise {}; sdl_mapping dial_anticlockwise {}; + sdl_mapping dial_center {}; sdl_mapping select {}; - sdl_mapping pause {}; + sdl_mapping start {}; + sdl_mapping ps {}; sdl_mapping shifter_1 {}; sdl_mapping shifter_2 {}; @@ -94,7 +106,6 @@ struct logitech_g27_sdl_mapping sdl_mapping shifter_5 {}; sdl_mapping shifter_6 {}; sdl_mapping shifter_r {}; - sdl_mapping shifter_press {}; }; class usb_device_logitech_g27 : public usb_device_emulated @@ -112,9 +123,17 @@ public: private: void sdl_refresh(); + void set_personality(logitech_personality personality, bool reconnect = false); + void transfer_dfex(u32 buf_size, u8* buf, UsbTransfer* transfer); + void transfer_dfp(u32 buf_size, u8* buf, UsbTransfer* transfer); + void transfer_dfgt(u32 buf_size, u8* buf, UsbTransfer* transfer); + void transfer_g25(u32 buf_size, u8* buf, UsbTransfer* transfer); + void transfer_g27(u32 buf_size, u8* buf, UsbTransfer* transfer); u32 m_controller_index = 0; + logitech_personality m_personality = logitech_personality::invalid; + logitech_personality m_next_personality = logitech_personality::invalid; logitech_g27_sdl_mapping m_mapping {}; bool m_reverse_effects = false; diff --git a/rpcs3/Emu/Io/LogitechG27Config.h b/rpcs3/Emu/Io/LogitechG27Config.h index 82a2e89dea..1a46a0fcc2 100644 --- a/rpcs3/Emu/Io/LogitechG27Config.h +++ b/rpcs3/Emu/Io/LogitechG27Config.h @@ -96,9 +96,11 @@ public: emulated_logitech_g27_mapping dial_clockwise{this, "dial_clockwise", 0, sdl_mapping_type::button, 21, hat_component::none, false}; emulated_logitech_g27_mapping dial_anticlockwise{this, "dial_anticlockwise", 0, sdl_mapping_type::button, 22, hat_component::none, false}; + emulated_logitech_g27_mapping dial_center{this, "dial_center", 0, sdl_mapping_type::button, 23, hat_component::none, false}; emulated_logitech_g27_mapping select{this, "select", 0, sdl_mapping_type::button, 8, hat_component::none, false}; - emulated_logitech_g27_mapping pause{this, "pause", 0, sdl_mapping_type::button, 9, hat_component::none, false}; + emulated_logitech_g27_mapping start{this, "pause", 0, sdl_mapping_type::button, 9, hat_component::none, false}; + emulated_logitech_g27_mapping ps{this, "ps", 0, sdl_mapping_type::button, 24, hat_component::none, false}; emulated_logitech_g27_mapping shifter_1{this, "shifter_1", 0, sdl_mapping_type::button, 3, hat_component::none, false}; emulated_logitech_g27_mapping shifter_2{this, "shifter_2", 0, sdl_mapping_type::button, 0, hat_component::none, false}; @@ -107,9 +109,9 @@ public: emulated_logitech_g27_mapping shifter_5{this, "shifter_5", 0, sdl_mapping_type::hat, 0, hat_component::up, false}; emulated_logitech_g27_mapping shifter_6{this, "shifter_6", 0, sdl_mapping_type::hat, 0, hat_component::down, false}; emulated_logitech_g27_mapping shifter_r{this, "shifter_r", 0, sdl_mapping_type::hat, 0, hat_component::left, false}; - emulated_logitech_g27_mapping shifter_press{this, "shifter_press", 0, sdl_mapping_type::hat, 0, hat_component::right, false}; cfg::_bool reverse_effects{this, "reverse_effects", false}; + cfg::uint<0, 4> compatibility_limit{this, "compatibility_limit", 4}; cfg::uint<0, 0xFFFFFFFFFFFFFFFF> ffb_device_type_id{this, "ffb_device_type_id", 0}; cfg::uint<0, 0xFFFFFFFFFFFFFFFF> led_device_type_id{this, "led_device_type_id", 0}; diff --git a/rpcs3/Emu/Io/TopShotElite.cpp b/rpcs3/Emu/Io/TopShotElite.cpp index 0cbbd5287c..ed4042fdaa 100644 --- a/rpcs3/Emu/Io/TopShotElite.cpp +++ b/rpcs3/Emu/Io/TopShotElite.cpp @@ -219,7 +219,7 @@ void usb_device_topshotelite::control_transfer(u8 bmRequestType, u8 bRequest, u1 extern bool is_input_allowed(); -static void set_sensor_pos(struct TopShotElite_data* ts, s32 led_lx, s32 led_ly, s32 led_rx, s32 led_ry, s32 detect_l, s32 detect_r) +static void set_sensor_pos(TopShotElite_data* ts, s32 led_lx, s32 led_ly, s32 led_rx, s32 led_ry, s32 detect_l, s32 detect_r) { ts->led_lx_hi = led_lx >> 2; ts->led_lx_lo = led_lx & 0x3; @@ -250,7 +250,7 @@ void usb_device_topshotelite::interrupt_transfer(u32 buf_size, u8* buf, u32 /*en transfer->expected_result = HC_CC_NOERR; transfer->expected_time = get_timestamp() + 4000; - struct TopShotElite_data ts{}; + TopShotElite_data ts{}; ts.dpad = Dpad_None; ts.stick_lx = ts.stick_ly = ts.stick_rx = ts.stick_ry = 0x7f; if (m_mode) diff --git a/rpcs3/Emu/Io/TopShotFearmaster.cpp b/rpcs3/Emu/Io/TopShotFearmaster.cpp index eed7ade977..12d56b921c 100644 --- a/rpcs3/Emu/Io/TopShotFearmaster.cpp +++ b/rpcs3/Emu/Io/TopShotFearmaster.cpp @@ -247,7 +247,7 @@ static int get_heartrate_sensor_value(u8 heartrate) return sensor_data[heartrate - 30]; } -static void set_sensor_pos(struct TopShotFearmaster_data* ts, s32 led_lx, s32 led_ly, s32 led_rx, s32 led_ry, s32 detect_l, s32 detect_r) +static void set_sensor_pos(TopShotFearmaster_data* ts, s32 led_lx, s32 led_ly, s32 led_rx, s32 led_ry, s32 detect_l, s32 detect_r) { ts->led_lx_hi = led_lx >> 2; ts->led_lx_lo = led_lx & 0x3; @@ -278,7 +278,7 @@ void usb_device_topshotfearmaster::interrupt_transfer(u32 buf_size, u8* buf, u32 transfer->expected_result = HC_CC_NOERR; transfer->expected_time = get_timestamp() + 4000; - struct TopShotFearmaster_data ts{}; + TopShotFearmaster_data ts{}; ts.dpad = Dpad_None; ts.stick_lx = ts.stick_ly = ts.stick_rx = ts.stick_ry = 0x7f; if (m_mode) diff --git a/rpcs3/rpcs3qt/emulated_logitech_g27_settings_dialog.cpp b/rpcs3/rpcs3qt/emulated_logitech_g27_settings_dialog.cpp index a65f62648b..5955e91b72 100644 --- a/rpcs3/rpcs3qt/emulated_logitech_g27_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/emulated_logitech_g27_settings_dialog.cpp @@ -18,7 +18,7 @@ #include #include -LOG_CHANNEL(logitech_g27_cfg_log, "LOGIG27"); +LOG_CHANNEL(logitech_g27_cfg_log, "logitech_g27"); static const QString DEFAULT_STATUS = " "; @@ -57,9 +57,11 @@ enum class mapping_device DIAL_CLOCKWISE, DIAL_ANTICLOCKWISE, + DIAL_CENTER, SELECT, - PAUSE, + START, + PS, SHIFTER_1, SHIFTER_2, @@ -68,7 +70,6 @@ enum class mapping_device SHIFTER_5, SHIFTER_6, SHIFTER_R, - SHIFTER_PRESS, // Enum count COUNT @@ -97,12 +98,14 @@ QString device_name(mapping_device dev) case mapping_device::L3: return QObject::tr("L3"); case mapping_device::R2: return QObject::tr("R2"); case mapping_device::R3: return QObject::tr("R3"); - case mapping_device::PLUS: return QObject::tr("L4"); - case mapping_device::MINUS: return QObject::tr("L5"); - case mapping_device::DIAL_CLOCKWISE: return QObject::tr("R4"); - case mapping_device::DIAL_ANTICLOCKWISE: return QObject::tr("R5"); + case mapping_device::PLUS: return QObject::tr("L4\nPlus"); + case mapping_device::MINUS: return QObject::tr("L5\nMinus"); + case mapping_device::DIAL_CLOCKWISE: return QObject::tr("R4\nDial CW"); + case mapping_device::DIAL_ANTICLOCKWISE: return QObject::tr("R5\nDial CCW"); + case mapping_device::DIAL_CENTER: return QObject::tr("Dial Center"); case mapping_device::SELECT: return QObject::tr("Select"); - case mapping_device::PAUSE: return QObject::tr("Pause"); + case mapping_device::START: return QObject::tr("Start"); + case mapping_device::PS: return QObject::tr("PS"); case mapping_device::SHIFTER_1: return QObject::tr("Gear 1"); case mapping_device::SHIFTER_2: return QObject::tr("Gear 2"); case mapping_device::SHIFTER_3: return QObject::tr("Gear 3"); @@ -110,7 +113,6 @@ QString device_name(mapping_device dev) case mapping_device::SHIFTER_5: return QObject::tr("Gear 5"); case mapping_device::SHIFTER_6: return QObject::tr("Gear 6"); case mapping_device::SHIFTER_R: return QObject::tr("Gear R"); - case mapping_device::SHIFTER_PRESS: return QObject::tr("Shifter press"); case mapping_device::COUNT: return ""; } return ""; @@ -144,8 +146,10 @@ emulated_logitech_g27_mapping& device_cfg(mapping_device dev) case mapping_device::MINUS: return cfg.minus; case mapping_device::DIAL_CLOCKWISE: return cfg.dial_clockwise; case mapping_device::DIAL_ANTICLOCKWISE: return cfg.dial_anticlockwise; + case mapping_device::DIAL_CENTER: return cfg.dial_center; case mapping_device::SELECT: return cfg.select; - case mapping_device::PAUSE: return cfg.pause; + case mapping_device::START: return cfg.start; + case mapping_device::PS: return cfg.ps; case mapping_device::SHIFTER_1: return cfg.shifter_1; case mapping_device::SHIFTER_2: return cfg.shifter_2; case mapping_device::SHIFTER_3: return cfg.shifter_3; @@ -153,7 +157,6 @@ emulated_logitech_g27_mapping& device_cfg(mapping_device dev) case mapping_device::SHIFTER_5: return cfg.shifter_5; case mapping_device::SHIFTER_6: return cfg.shifter_6; case mapping_device::SHIFTER_R: return cfg.shifter_r; - case mapping_device::SHIFTER_PRESS: return cfg.shifter_press; default: fmt::throw_exception("Unexpected mapping_device %d", static_cast(dev)); } } @@ -165,6 +168,7 @@ public: : QWidget(parent) { auto layout = new QHBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); setLayout(layout); QLabel* label = new QLabel(this); @@ -245,6 +249,7 @@ public: QWidget* horizontal_container = new QWidget(this); QHBoxLayout* horizontal_layout = new QHBoxLayout(horizontal_container); + horizontal_layout->setContentsMargins(0, 0, 0, 0); horizontal_container->setLayout(horizontal_layout); layout->addWidget(horizontal_container); @@ -542,6 +547,7 @@ void emulated_logitech_g27_settings_dialog::save_ui_state_to_config() g_cfg_logitech_g27.enabled.set(m_enabled->isChecked()); g_cfg_logitech_g27.reverse_effects.set(m_reverse_effects->isChecked()); + g_cfg_logitech_g27.compatibility_limit.set(m_compatibility_limit->currentData().toInt()); if (m_ffb_device->get_device_choice() == mapping_device::NONE) { @@ -591,6 +597,7 @@ void emulated_logitech_g27_settings_dialog::load_ui_state_from_config() m_enabled->setChecked(g_cfg_logitech_g27.enabled.get()); m_reverse_effects->setChecked(g_cfg_logitech_g27.reverse_effects.get()); + m_compatibility_limit->setCurrentIndex(4 - g_cfg_logitech_g27.compatibility_limit.get()); } emulated_logitech_g27_settings_dialog::emulated_logitech_g27_settings_dialog(QWidget* parent) @@ -651,6 +658,18 @@ emulated_logitech_g27_settings_dialog::emulated_logitech_g27_settings_dialog(QWi m_reverse_effects = new QCheckBox(tr("Reverse force feedback effects"), this); v_layout->addWidget(m_reverse_effects); + QHBoxLayout* compat_layout = new QHBoxLayout(this); + compat_layout->setContentsMargins(0, 0, 0, 0); + QLabel* compatibility_label = new QLabel(tr("Compatibility limit:"), this); + compat_layout->addWidget(compatibility_label); + m_compatibility_limit = new QComboBox(this); + m_compatibility_limit->addItem(tr("G27 (Default)"), static_cast(logitech_personality::g27)); + m_compatibility_limit->addItem(tr("Driving Force GT"), static_cast(logitech_personality::driving_force_gt)); + m_compatibility_limit->addItem(tr("G25"), static_cast(logitech_personality::g25)); + m_compatibility_limit->addItem(tr("Driving Force Pro"), static_cast(logitech_personality::driving_force_pro)); + compat_layout->addWidget(m_compatibility_limit); + v_layout->addLayout(compat_layout); + m_state_text = new QLabel(DEFAULT_STATUS, this); v_layout->addWidget(m_state_text); diff --git a/rpcs3/rpcs3qt/emulated_logitech_g27_settings_dialog.h b/rpcs3/rpcs3qt/emulated_logitech_g27_settings_dialog.h index f06f1308c1..efd5cb589d 100644 --- a/rpcs3/rpcs3qt/emulated_logitech_g27_settings_dialog.h +++ b/rpcs3/rpcs3qt/emulated_logitech_g27_settings_dialog.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #ifndef _MSC_VER @@ -57,6 +58,7 @@ private: QCheckBox* m_enabled = nullptr; QCheckBox* m_reverse_effects = nullptr; + QComboBox* m_compatibility_limit = nullptr; std::map m_mappings; From c5511200d5a8997b5413b37cb3a4860ab3189a63 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Wed, 31 Dec 2025 18:33:56 +0000 Subject: [PATCH 049/630] rpcs3_version: Bump to 0.0.39 --- rpcs3/rpcs3_version.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3_version.cpp b/rpcs3/rpcs3_version.cpp index ab18b56caf..e7666e7b81 100644 --- a/rpcs3/rpcs3_version.cpp +++ b/rpcs3/rpcs3_version.cpp @@ -28,7 +28,7 @@ namespace rpcs3 // Currently accessible by Windows and Linux build scripts, see implementations when doing MACOSX const utils::version& get_version() { - static constexpr utils::version version{ 0, 0, 38, utils::version_type::alpha, 1, RPCS3_GIT_VERSION }; + static constexpr utils::version version{ 0, 0, 39, utils::version_type::alpha, 1, RPCS3_GIT_VERSION }; return version; } From f50b9cd5c4f55e8d72c290c0fb8e85828c7d6838 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 8 Dec 2025 05:11:45 +0100 Subject: [PATCH 050/630] Update libpng to 1.6.53 --- 3rdparty/libpng/libpng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libpng/libpng b/3rdparty/libpng/libpng index 49363adcfa..4e3f57d50f 160000 --- a/3rdparty/libpng/libpng +++ b/3rdparty/libpng/libpng @@ -1 +1 @@ -Subproject commit 49363adcfaf098748d7a4c8c624ad8c45a8c3a86 +Subproject commit 4e3f57d50f552841550a36eabbb3fbcecacb7750 From 05ae739a221de41baad3072f555bd06312d9c3c5 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 27 Dec 2025 16:58:27 +0100 Subject: [PATCH 051/630] Update OpenAl to 1.25.0 --- 3rdparty/OpenAL/openal-soft | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/OpenAL/openal-soft b/3rdparty/OpenAL/openal-soft index 0e5e98e4ac..75c0059630 160000 --- a/3rdparty/OpenAL/openal-soft +++ b/3rdparty/OpenAL/openal-soft @@ -1 +1 @@ -Subproject commit 0e5e98e4ac8adae92e4f7653dd6eee17aa9c8791 +Subproject commit 75c00596307bf05ba7bbc8c7022836bf52f17477 From cfbc4165215528a063ac3f3128d924caacd93027 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 1 Jan 2026 05:48:38 +0100 Subject: [PATCH 052/630] Update SDL to 3.4.0 --- 3rdparty/libsdl-org/SDL | 2 +- 3rdparty/libsdl-org/SDL.vcxproj | 36 ++++-- 3rdparty/libsdl-org/SDL.vcxproj.filters | 147 +++++++++++++++++++----- 3 files changed, 147 insertions(+), 38 deletions(-) diff --git a/3rdparty/libsdl-org/SDL b/3rdparty/libsdl-org/SDL index 7f3ae3d574..a962f40bbb 160000 --- a/3rdparty/libsdl-org/SDL +++ b/3rdparty/libsdl-org/SDL @@ -1 +1 @@ -Subproject commit 7f3ae3d57459e59943a4ecfefc8f6277ec6bf540 +Subproject commit a962f40bbba175e9716557a25d5d7965f134a3d3 diff --git a/3rdparty/libsdl-org/SDL.vcxproj b/3rdparty/libsdl-org/SDL.vcxproj index f0b38ca09f..fd2bcf2f03 100644 --- a/3rdparty/libsdl-org/SDL.vcxproj +++ b/3rdparty/libsdl-org/SDL.vcxproj @@ -23,6 +23,7 @@ + @@ -102,6 +103,7 @@ + @@ -130,6 +132,8 @@ + + @@ -140,7 +144,11 @@ + + + + @@ -156,6 +164,7 @@ + @@ -175,7 +184,6 @@ - @@ -184,20 +192,35 @@ + + + + + + + + + + + + + + + @@ -241,6 +264,7 @@ + @@ -256,13 +280,14 @@ + + - @@ -303,7 +328,6 @@ - @@ -333,7 +357,6 @@ - @@ -393,7 +416,6 @@ - @@ -464,6 +486,7 @@ + @@ -471,12 +494,11 @@ - + - diff --git a/3rdparty/libsdl-org/SDL.vcxproj.filters b/3rdparty/libsdl-org/SDL.vcxproj.filters index 5839899c0d..8b7f293ef3 100644 --- a/3rdparty/libsdl-org/SDL.vcxproj.filters +++ b/3rdparty/libsdl-org/SDL.vcxproj.filters @@ -214,6 +214,9 @@ {000028b2ea36d7190d13777a4dc70000} + + {695ffc61-5497-4227-b415-15e9bdd5b6bf} + @@ -699,9 +702,6 @@ video\yuv2rgb - - video\windows - video\windows @@ -831,9 +831,6 @@ render\software - - render\software - render\software @@ -911,12 +908,6 @@ - - - - - - render\vulkan @@ -950,6 +941,60 @@ + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video + + + video + + + video + + + misc + + + haptic\hidapi + + + haptic\hidapi + + + core + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + API Headers + @@ -1037,9 +1082,6 @@ core - - core\windows - core\windows @@ -1166,9 +1208,6 @@ joystick\dummy - - joystick\gdk - joystick\hidapi @@ -1328,9 +1367,6 @@ video\dummy - - video\windows - video\windows @@ -1343,9 +1379,6 @@ video\windows - - video\windows - video\windows @@ -1508,9 +1541,6 @@ render\software - - render\software - render\software @@ -1535,9 +1565,6 @@ - - - render\vulkan @@ -1579,6 +1606,66 @@ + + video\windows + + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video + + + misc + + + haptic\hidapi + + + haptic\hidapi + + + core\windows + + + core\windows + + + joystick\gdk + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + From ae72de38816c961c9529bde4ec0592cc357fe6fe Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 1 Jan 2026 07:42:25 +0100 Subject: [PATCH 053/630] Refactor camera code to support different camera handlers I split this off the sdl camera PR due to rebase conflicts. It can also be seen as a partial integration test. --- rpcs3/Emu/Io/camera_config.cpp | 33 +-- rpcs3/Emu/Io/camera_config.h | 10 +- rpcs3/Input/camera_video_sink.cpp | 245 ++++++++++++++++++++++ rpcs3/Input/camera_video_sink.h | 43 ++++ rpcs3/rpcs3.vcxproj | 2 + rpcs3/rpcs3.vcxproj.filters | 6 + rpcs3/rpcs3qt/CMakeLists.txt | 1 + rpcs3/rpcs3qt/camera_settings_dialog.cpp | 173 ++++++++++++---- rpcs3/rpcs3qt/camera_settings_dialog.h | 10 + rpcs3/rpcs3qt/camera_settings_dialog.ui | 22 +- rpcs3/rpcs3qt/main_window.cpp | 4 +- rpcs3/rpcs3qt/movie_item_base.cpp | 4 +- rpcs3/rpcs3qt/qt_camera_handler.cpp | 4 +- rpcs3/rpcs3qt/qt_camera_video_sink.cpp | 253 +---------------------- rpcs3/rpcs3qt/qt_camera_video_sink.h | 41 +--- 15 files changed, 496 insertions(+), 355 deletions(-) create mode 100644 rpcs3/Input/camera_video_sink.cpp create mode 100644 rpcs3/Input/camera_video_sink.h diff --git a/rpcs3/Emu/Io/camera_config.cpp b/rpcs3/Emu/Io/camera_config.cpp index f498de72b1..4016447321 100644 --- a/rpcs3/Emu/Io/camera_config.cpp +++ b/rpcs3/Emu/Io/camera_config.cpp @@ -36,32 +36,38 @@ void cfg_camera::save() const } } -cfg_camera::camera_setting cfg_camera::get_camera_setting(std::string_view camera, bool& success) +cfg_camera::camera_setting cfg_camera::get_camera_setting(std::string_view handler, std::string_view camera, bool& success) { - camera_setting setting; - const std::string value = cameras.get_value(camera); + camera_setting setting {}; + const std::string value = cameras.get_value(fmt::format("%s-%s", handler, camera)); success = !value.empty(); if (success) { - setting.from_string(cameras.get_value(camera)); + setting.from_string(value); } return setting; } -void cfg_camera::set_camera_setting(const std::string& camera, const camera_setting& setting) +void cfg_camera::set_camera_setting(std::string_view handler, std::string_view camera, const camera_setting& setting) { + if (handler.empty()) + { + camera_log.error("String '%s' cannot be used as handler key.", handler); + return; + } + if (camera.empty()) { camera_log.error("String '%s' cannot be used as camera key.", camera); return; } - cameras.set_value(camera, setting.to_string()); + cameras.set_value(fmt::format("%s-%s", handler, camera), setting.to_string()); } std::string cfg_camera::camera_setting::to_string() const { - return fmt::format("%d,%d,%f,%f,%d", width, height, min_fps, max_fps, format); + return fmt::format("%d,%d,%f,%f,%d,%d", width, height, min_fps, max_fps, format, colorspace); } void cfg_camera::camera_setting::from_string(std::string_view text) @@ -102,16 +108,19 @@ void cfg_camera::camera_setting::from_string(std::string_view text) return true; }; - if (!to_integer(::at32(list, 0), width) || - !to_integer(::at32(list, 1), height) || - !to_double(::at32(list, 2), min_fps) || - !to_double(::at32(list, 3), max_fps) || - !to_integer(::at32(list, 4), format)) + usz pos = 0; + if (!to_integer(::at32(list, pos++), width) || + !to_integer(::at32(list, pos++), height) || + !to_double(::at32(list, pos++), min_fps) || + !to_double(::at32(list, pos++), max_fps) || + !to_integer(::at32(list, pos++), format) || + !to_integer(::at32(list, pos++), colorspace)) { width = 0; height = 0; min_fps = 0; max_fps = 0; format = 0; + colorspace = 0; } } diff --git a/rpcs3/Emu/Io/camera_config.h b/rpcs3/Emu/Io/camera_config.h index 1c576e32c1..862d87dd63 100644 --- a/rpcs3/Emu/Io/camera_config.h +++ b/rpcs3/Emu/Io/camera_config.h @@ -15,18 +15,20 @@ struct cfg_camera final : cfg::node double min_fps = 0; double max_fps = 0; int format = 0; + int colorspace = 0; - static constexpr u32 member_count = 5; + static constexpr u32 member_count = 6; std::string to_string() const; void from_string(std::string_view text); }; - camera_setting get_camera_setting(std::string_view camera, bool& success); - void set_camera_setting(const std::string& camera, const camera_setting& setting); + + camera_setting get_camera_setting(std::string_view handler, std::string_view camera, bool& success); + void set_camera_setting(std::string_view handler, std::string_view camera, const camera_setting& setting); const std::string path; - cfg::map_entry cameras{ this, "Cameras" }; // : ,,,, + cfg::map_entry cameras{ this, "Cameras" }; // : ,,,,, }; extern cfg_camera g_cfg_camera; diff --git a/rpcs3/Input/camera_video_sink.cpp b/rpcs3/Input/camera_video_sink.cpp new file mode 100644 index 0000000000..7eb04472e1 --- /dev/null +++ b/rpcs3/Input/camera_video_sink.cpp @@ -0,0 +1,245 @@ +#include "stdafx.h" +#include "camera_video_sink.h" + +#include "Emu/Cell/Modules/cellCamera.h" +#include "Emu/system_config.h" + +LOG_CHANNEL(camera_log, "Camera"); + +camera_video_sink::camera_video_sink(bool front_facing) + : m_front_facing(front_facing) +{ +} + +camera_video_sink::~camera_video_sink() +{ +} + +bool camera_video_sink::present(u32 src_width, u32 src_height, u32 src_pitch, u32 src_bytes_per_pixel, std::function src_line_ptr) +{ + ensure(!!src_line_ptr); + + const u64 new_size = m_bytesize; + image_buffer& image_buffer = m_image_buffer[m_write_index]; + + // Reset buffer if necessary + if (image_buffer.data.size() != new_size) + { + image_buffer.data.clear(); + } + + // Create buffer if necessary + if (image_buffer.data.empty() && new_size > 0) + { + image_buffer.data.resize(new_size); + image_buffer.width = m_width; + image_buffer.height = m_height; + } + + if (!image_buffer.data.empty() && src_width && src_height) + { + // Convert image to proper layout + // TODO: check if pixel format and bytes per pixel match and convert if necessary + // TODO: implement or improve more conversions + + const u32 width = std::min(image_buffer.width, src_width); + const u32 height = std::min(image_buffer.height, src_height); + + switch (m_format) + { + case CELL_CAMERA_RAW8: // The game seems to expect BGGR + { + // Let's use a very simple algorithm to convert the image to raw BGGR + u8* dst = image_buffer.data.data(); + + for (u32 y = 0; y < height; y++) + { + const u8* src = src_line_ptr(y); + const u8* srcu = src_line_ptr(std::max(0, y - 1)); + const u8* srcd = src_line_ptr(std::min(height - 1, y + 1)); + const bool is_top_pixel = (y % 2) == 0; + + // We apply gaussian blur to get better demosaicing results later when debayering again + const auto blurred = [&](s32 x, s32 c) + { + const s32 i = x * 4 + c; + const s32 il = std::max(0, x - 1) * 4 + c; + const s32 ir = std::min(width - 1, x + 1) * 4 + c; + const s32 sum = + srcu[i] + + src[il] + 4 * src[i] + src[ir] + + srcd[i]; + return static_cast(std::clamp((sum + 4) / 8, 0, 255)); + }; + + // Split loops (roughly twice the performance by removing one condition) + if (is_top_pixel) + { + for (u32 x = 0; x < width; x++, dst++) + { + const bool is_left_pixel = (x % 2) == 0; + + if (is_left_pixel) + { + *dst = blurred(x, 2); // Blue + } + else + { + *dst = blurred(x, 1); // Green + } + } + } + else + { + for (u32 x = 0; x < width; x++, dst++) + { + const bool is_left_pixel = (x % 2) == 0; + + if (is_left_pixel) + { + *dst = blurred(x, 1); // Green + } + else + { + *dst = blurred(x, 0); // Red + } + } + } + } + break; + } + //case CELL_CAMERA_YUV422: + case CELL_CAMERA_Y0_U_Y1_V: + case CELL_CAMERA_V_Y1_U_Y0: + { + // Simple RGB to Y0_U_Y1_V conversion from stackoverflow. + constexpr s32 yuv_bytes_per_pixel = 2; + const s32 yuv_pitch = image_buffer.width * yuv_bytes_per_pixel; + + const s32 y0_offset = (m_format == CELL_CAMERA_Y0_U_Y1_V) ? 0 : 3; + const s32 u_offset = (m_format == CELL_CAMERA_Y0_U_Y1_V) ? 1 : 2; + const s32 y1_offset = (m_format == CELL_CAMERA_Y0_U_Y1_V) ? 2 : 1; + const s32 v_offset = (m_format == CELL_CAMERA_Y0_U_Y1_V) ? 3 : 0; + + for (u32 y = 0; y < height; y++) + { + const u8* src = src_line_ptr(y); + u8* yuv_row_ptr = &image_buffer.data[y * yuv_pitch]; + + for (u32 x = 0; x < width - 1; x += 2, src += 8) + { + const f32 r1 = src[0]; + const f32 g1 = src[1]; + const f32 b1 = src[2]; + const f32 r2 = src[4]; + const f32 g2 = src[5]; + const f32 b2 = src[6]; + + const f32 y0 = (0.257f * r1) + (0.504f * g1) + (0.098f * b1) + 16.0f; + const f32 u = -(0.148f * r1) - (0.291f * g1) + (0.439f * b1) + 128.0f; + const f32 v = (0.439f * r1) - (0.368f * g1) - (0.071f * b1) + 128.0f; + const f32 y1 = (0.257f * r2) + (0.504f * g2) + (0.098f * b2) + 16.0f; + + const s32 yuv_index = x * yuv_bytes_per_pixel; + yuv_row_ptr[yuv_index + y0_offset] = static_cast(std::clamp(y0, 0.0f, 255.0f)); + yuv_row_ptr[yuv_index + u_offset] = static_cast(std::clamp( u, 0.0f, 255.0f)); + yuv_row_ptr[yuv_index + y1_offset] = static_cast(std::clamp(y1, 0.0f, 255.0f)); + yuv_row_ptr[yuv_index + v_offset] = static_cast(std::clamp( v, 0.0f, 255.0f)); + } + } + break; + } + case CELL_CAMERA_JPG: + case CELL_CAMERA_RGBA: + case CELL_CAMERA_RAW10: + case CELL_CAMERA_YUV420: + case CELL_CAMERA_FORMAT_UNKNOWN: + default: + const u32 bytes_per_line = src_bytes_per_pixel * src_width; + if (src_pitch == bytes_per_line) + { + std::memcpy(image_buffer.data.data(), src_line_ptr(0), std::min(image_buffer.data.size(), src_height * bytes_per_line)); + } + else + { + for (u32 y = 0, pos = 0; y < src_height && pos < image_buffer.data.size(); y++, pos += bytes_per_line) + { + std::memcpy(&image_buffer.data[pos], src_line_ptr(y), std::min(image_buffer.data.size() - pos, bytes_per_line)); + } + } + break; + } + } + + camera_log.trace("Wrote image to video surface. index=%d, m_frame_number=%d, width=%d, height=%d, bytesize=%d", + m_write_index, m_frame_number.load(), m_width, m_height, m_bytesize); + + // Toggle write/read index + std::lock_guard lock(m_mutex); + image_buffer.frame_number = m_frame_number++; + m_write_index = read_index(); + + return true; +} + +void camera_video_sink::set_format(s32 format, u32 bytesize) +{ + camera_log.notice("Setting format: format=%d, bytesize=%d", format, bytesize); + + m_format = format; + m_bytesize = bytesize; +} + +void camera_video_sink::set_resolution(u32 width, u32 height) +{ + camera_log.notice("Setting resolution: width=%d, height=%d", width, height); + + m_width = width; + m_height = height; +} + +void camera_video_sink::set_mirrored(bool mirrored) +{ + camera_log.notice("Setting mirrored: mirrored=%d", mirrored); + + m_mirrored = mirrored; +} + +u64 camera_video_sink::frame_number() const +{ + return m_frame_number.load(); +} + +void camera_video_sink::get_image(u8* buf, u64 size, u32& width, u32& height, u64& frame_number, u64& bytes_read) +{ + // Lock read buffer + std::lock_guard lock(m_mutex); + const image_buffer& image_buffer = m_image_buffer[read_index()]; + + width = image_buffer.width; + height = image_buffer.height; + frame_number = image_buffer.frame_number; + + // Copy to out buffer + if (buf && !image_buffer.data.empty()) + { + bytes_read = std::min(image_buffer.data.size(), size); + std::memcpy(buf, image_buffer.data.data(), bytes_read); + + if (image_buffer.data.size() != size) + { + camera_log.error("Buffer size mismatch: in=%d, out=%d. Cropping to incoming size. Please contact a developer.", size, image_buffer.data.size()); + } + } + else + { + bytes_read = 0; + } +} + +u32 camera_video_sink::read_index() const +{ + // The read buffer index cannot be the same as the write index + return (m_write_index + 1u) % ::narrow(m_image_buffer.size()); +} + diff --git a/rpcs3/Input/camera_video_sink.h b/rpcs3/Input/camera_video_sink.h new file mode 100644 index 0000000000..b2a3311199 --- /dev/null +++ b/rpcs3/Input/camera_video_sink.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +class camera_video_sink +{ +public: + camera_video_sink(bool front_facing); + virtual ~camera_video_sink(); + + void set_format(s32 format, u32 bytesize); + void set_resolution(u32 width, u32 height); + void set_mirrored(bool mirrored); + + u64 frame_number() const; + + bool present(u32 src_width, u32 src_height, u32 src_pitch, u32 src_bytes_per_pixel, std::function src_line_ptr); + + void get_image(u8* buf, u64 size, u32& width, u32& height, u64& frame_number, u64& bytes_read); + +protected: + u32 read_index() const; + + bool m_front_facing = false; + bool m_mirrored = false; // Set by cellCamera + s32 m_format = 2; // CELL_CAMERA_RAW8, set by cellCamera + u32 m_bytesize = 0; + u32 m_width = 640; + u32 m_height = 480; + + std::mutex m_mutex; + atomic_t m_frame_number{0}; + u32 m_write_index{0}; + + struct image_buffer + { + u64 frame_number = 0; + u32 width = 0; + u32 height = 0; + std::vector data; + }; + std::array m_image_buffer; +}; diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index a824f65267..b38aa78567 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -190,6 +190,7 @@ + @@ -944,6 +945,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 470ab36812..fbe4fa4132 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1245,6 +1245,9 @@ Gui\rpcn + + Io\camera + @@ -1475,6 +1478,9 @@ Gui\widgets + + Io\camera + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index 98be856a25..ba6d95806a 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -146,6 +146,7 @@ add_library(rpcs3_ui STATIC ../Input/basic_keyboard_handler.cpp ../Input/basic_mouse_handler.cpp + ../Input/camera_video_sink.cpp ../Input/ds3_pad_handler.cpp ../Input/ds4_pad_handler.cpp ../Input/dualsense_pad_handler.cpp diff --git a/rpcs3/rpcs3qt/camera_settings_dialog.cpp b/rpcs3/rpcs3qt/camera_settings_dialog.cpp index da3576183a..fca7432370 100644 --- a/rpcs3/rpcs3qt/camera_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/camera_settings_dialog.cpp @@ -3,11 +3,14 @@ #include "ui_camera_settings_dialog.h" #include "permissions.h" #include "Emu/Io/camera_config.h" +#include "Emu/System.h" +#include "Emu/system_config.h" #include #include #include #include +#include LOG_CHANNEL(camera_log, "Camera"); @@ -61,15 +64,13 @@ camera_settings_dialog::camera_settings_dialog(QWidget* parent) { ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + load_config(); - for (const QCameraDevice& camera_info : QMediaDevices::videoInputs()) - { - if (camera_info.isNull()) continue; - ui->combo_camera->addItem(camera_info.description(), QVariant::fromValue(camera_info)); - camera_log.notice("Found camera: '%s'", camera_info.description()); - } + ui->combo_handlers->addItem("Qt", QVariant::fromValue(static_cast(camera_handler::qt))); + connect(ui->combo_handlers, &QComboBox::currentIndexChanged, this, &camera_settings_dialog::handle_handler_change); connect(ui->combo_camera, &QComboBox::currentIndexChanged, this, &camera_settings_dialog::handle_camera_change); connect(ui->combo_settings, &QComboBox::currentIndexChanged, this, &camera_settings_dialog::handle_settings_change); connect(ui->buttonBox, &QDialogButtonBox::clicked, [this](QAbstractButton* button) @@ -85,33 +86,132 @@ camera_settings_dialog::camera_settings_dialog(QWidget* parent) } }); - if (ui->combo_camera->count() == 0) - { - ui->combo_camera->setEnabled(false); - ui->combo_settings->setEnabled(false); - ui->buttonBox->button(QDialogButtonBox::Save)->setEnabled(false); - ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); - } - else + const int handler_index = ui->combo_handlers->findData(static_cast(g_cfg.io.camera.get())); + ui->combo_handlers->setCurrentIndex(std::max(0, handler_index)); +} + +camera_settings_dialog::~camera_settings_dialog() +{ + reset_cameras(); +} + +void camera_settings_dialog::enable_combos() +{ + const bool is_enabled = ui->combo_camera->count() > 0; + + ui->combo_camera->setEnabled(is_enabled); + ui->combo_settings->setEnabled(is_enabled); + ui->buttonBox->button(QDialogButtonBox::Save)->setEnabled(is_enabled); + ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(is_enabled); + + if (is_enabled) { // TODO: show camera ID somewhere ui->combo_camera->setCurrentIndex(0); } } -camera_settings_dialog::~camera_settings_dialog() +void camera_settings_dialog::reset_cameras() { + m_media_capture_session.reset(); + m_camera.reset(); +} + +void camera_settings_dialog::handle_handler_change(int index) +{ + reset_cameras(); + + if (index < 0 || !ui->combo_handlers->itemData(index).canConvert()) + { + ui->combo_settings->clear(); + ui->combo_camera->clear(); + enable_combos(); + return; + } + + m_handler = static_cast(ui->combo_handlers->itemData(index).value()); + + ui->combo_settings->blockSignals(true); + ui->combo_camera->blockSignals(true); + + ui->combo_settings->clear(); + ui->combo_camera->clear(); + + switch (m_handler) + { + case camera_handler::qt: + { + for (const QCameraDevice& camera_info : QMediaDevices::videoInputs()) + { + if (camera_info.isNull()) continue; + ui->combo_camera->addItem(camera_info.description(), QVariant::fromValue(camera_info)); + camera_log.notice("Found camera: '%s'", camera_info.description()); + } + break; + } + default: + fmt::throw_exception("Unexpected camera handler %d", static_cast(m_handler)); + } + + ui->combo_settings->blockSignals(false); + ui->combo_camera->blockSignals(false); + + enable_combos(); } void camera_settings_dialog::handle_camera_change(int index) { - if (index < 0 || !ui->combo_camera->itemData(index).canConvert()) + if (index < 0) { ui->combo_settings->clear(); return; } - const QCameraDevice camera_info = ui->combo_camera->itemData(index).value(); + reset_cameras(); + + switch (m_handler) + { + case camera_handler::qt: + handle_qt_camera_change(ui->combo_camera->itemData(index)); + break; + default: + fmt::throw_exception("Unexpected camera handler %d", static_cast(m_handler)); + } +} + +void camera_settings_dialog::handle_settings_change(int index) +{ + if (index < 0) + { + return; + } + + if (!gui::utils::check_camera_permission(this, + [this, index](){ handle_settings_change(index); }, + [this](){ QMessageBox::warning(this, tr("Camera permissions denied!"), tr("RPCS3 has no permissions to access cameras on this device.")); })) + { + return; + } + + switch (m_handler) + { + case camera_handler::qt: + handle_qt_settings_change(ui->combo_settings->itemData(index)); + break; + default: + fmt::throw_exception("Unexpected camera handler %d", static_cast(m_handler)); + } +} + +void camera_settings_dialog::handle_qt_camera_change(const QVariant& item_data) +{ + if (!item_data.canConvert()) + { + ui->combo_settings->clear(); + return; + } + + const QCameraDevice camera_info = item_data.value(); if (camera_info.isNull()) { @@ -119,10 +219,10 @@ void camera_settings_dialog::handle_camera_change(int index) return; } - m_camera.reset(new QCamera(camera_info)); - m_media_capture_session.reset(new QMediaCaptureSession(nullptr)); + m_camera = std::make_unique(camera_info); + m_media_capture_session = std::make_unique(nullptr); m_media_capture_session->setCamera(m_camera.get()); - m_media_capture_session->setVideoSink(ui->videoWidget->videoSink()); + m_media_capture_session->setVideoOutput(ui->videoWidget); if (!m_camera->isAvailable()) { @@ -173,14 +273,14 @@ void camera_settings_dialog::handle_camera_change(int index) int index = 0; bool success = false; const std::string key = camera_info.id().toStdString(); - cfg_camera::camera_setting cfg_setting = g_cfg_camera.get_camera_setting(key, success); + cfg_camera::camera_setting cfg_setting = g_cfg_camera.get_camera_setting(fmt::format("%s", camera_handler::qt), key, success); if (success) { camera_log.notice("Found config entry for camera \"%s\"", key); - // Select matching drowdown entry - const double epsilon = 0.001; + // Select matching dropdown entry + constexpr double epsilon = 0.001; for (int i = 0; i < ui->combo_settings->count(); i++) { @@ -202,19 +302,10 @@ void camera_settings_dialog::handle_camera_change(int index) ui->combo_settings->setCurrentIndex(std::max(0, index)); ui->combo_settings->setEnabled(true); - - // Update config to match user interface outcome - const QCameraFormat setting = ui->combo_settings->currentData().value(); - cfg_setting.width = setting.resolution().width(); - cfg_setting.height = setting.resolution().height(); - cfg_setting.min_fps = setting.minFrameRate(); - cfg_setting.max_fps = setting.maxFrameRate(); - cfg_setting.format = static_cast(setting.pixelFormat()); - g_cfg_camera.set_camera_setting(key, cfg_setting); } } -void camera_settings_dialog::handle_settings_change(int index) +void camera_settings_dialog::handle_qt_settings_change(const QVariant& item_data) { if (!m_camera) { @@ -227,28 +318,22 @@ void camera_settings_dialog::handle_settings_change(int index) return; } - if (!gui::utils::check_camera_permission(this, - [this, index](){ handle_settings_change(index); }, - [this](){ QMessageBox::warning(this, tr("Camera permissions denied!"), tr("RPCS3 has no permissions to access cameras on this device.")); })) + if (item_data.canConvert() && ui->combo_camera->currentData().canConvert()) { - return; - } - - if (index >= 0 && ui->combo_settings->itemData(index).canConvert() && ui->combo_camera->currentData().canConvert()) - { - const QCameraFormat setting = ui->combo_settings->itemData(index).value(); + const QCameraFormat setting = item_data.value(); if (!setting.isNull()) { m_camera->setCameraFormat(setting); } - cfg_camera::camera_setting cfg_setting; + cfg_camera::camera_setting cfg_setting {}; cfg_setting.width = setting.resolution().width(); cfg_setting.height = setting.resolution().height(); cfg_setting.min_fps = setting.minFrameRate(); cfg_setting.max_fps = setting.maxFrameRate(); cfg_setting.format = static_cast(setting.pixelFormat()); - g_cfg_camera.set_camera_setting(ui->combo_camera->currentData().value().id().toStdString(), cfg_setting); + cfg_setting.colorspace = 0; + g_cfg_camera.set_camera_setting(fmt::format("%s", camera_handler::qt), ui->combo_camera->currentData().value().id().toStdString(), cfg_setting); } m_camera->start(); diff --git a/rpcs3/rpcs3qt/camera_settings_dialog.h b/rpcs3/rpcs3qt/camera_settings_dialog.h index da18f64cca..b7c0750c2c 100644 --- a/rpcs3/rpcs3qt/camera_settings_dialog.h +++ b/rpcs3/rpcs3qt/camera_settings_dialog.h @@ -1,5 +1,7 @@ #pragma once +#include "Emu/system_config_types.h" + #include #include #include @@ -18,14 +20,22 @@ public: virtual ~camera_settings_dialog(); private Q_SLOTS: + void handle_handler_change(int index); void handle_camera_change(int index); void handle_settings_change(int index); private: + void enable_combos(); + void reset_cameras(); + void load_config(); void save_config(); + void handle_qt_camera_change(const QVariant& item_data); + void handle_qt_settings_change(const QVariant& item_data); + std::unique_ptr ui; std::unique_ptr m_camera; std::unique_ptr m_media_capture_session; + camera_handler m_handler = camera_handler::qt; }; diff --git a/rpcs3/rpcs3qt/camera_settings_dialog.ui b/rpcs3/rpcs3qt/camera_settings_dialog.ui index 8afe262f22..dfdf6beed2 100644 --- a/rpcs3/rpcs3qt/camera_settings_dialog.ui +++ b/rpcs3/rpcs3qt/camera_settings_dialog.ui @@ -15,7 +15,23 @@ - + + + + + Handler + + + + + + No handlers found + + + + + + @@ -75,10 +91,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Save + QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Save diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 58b7ef7e4c..fea8dc8ca4 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -2905,8 +2905,8 @@ void main_window::CreateConnects() connect(ui->confCamerasAct, &QAction::triggered, this, [this]() { - camera_settings_dialog dlg(this); - dlg.exec(); + camera_settings_dialog* dlg = new camera_settings_dialog(this); + dlg->open(); }); const auto open_rpcn_settings = [this] diff --git a/rpcs3/rpcs3qt/movie_item_base.cpp b/rpcs3/rpcs3qt/movie_item_base.cpp index fdf820ae5f..669aec515d 100644 --- a/rpcs3/rpcs3qt/movie_item_base.cpp +++ b/rpcs3/rpcs3qt/movie_item_base.cpp @@ -16,8 +16,8 @@ movie_item_base::~movie_item_base() void movie_item_base::init_pointers() { - m_icon_loading_aborted.reset(new atomic_t(false)); - m_size_on_disk_loading_aborted.reset(new atomic_t(false)); + m_icon_loading_aborted = std::make_shared>(false); + m_size_on_disk_loading_aborted = std::make_shared>(false); } void movie_item_base::call_icon_load_func(int index) diff --git a/rpcs3/rpcs3qt/qt_camera_handler.cpp b/rpcs3/rpcs3qt/qt_camera_handler.cpp index 5b0caeb642..91f0f1b05c 100644 --- a/rpcs3/rpcs3qt/qt_camera_handler.cpp +++ b/rpcs3/rpcs3qt/qt_camera_handler.cpp @@ -341,14 +341,14 @@ void qt_camera_handler::update_camera_settings() // Load selected settings from config file bool success = false; - cfg_camera::camera_setting cfg_setting = g_cfg_camera.get_camera_setting(camera_id, success); + cfg_camera::camera_setting cfg_setting = g_cfg_camera.get_camera_setting(fmt::format("%s", camera_handler::qt), camera_id, success); if (success) { camera_log.notice("Found config entry for camera \"%s\" (m_camera_id='%s')", camera_id, m_camera_id); // List all available settings and choose the proper value if possible. - const double epsilon = 0.001; + constexpr double epsilon = 0.001; success = false; for (const QCameraFormat& supported_setting : m_camera->cameraDevice().videoFormats()) { diff --git a/rpcs3/rpcs3qt/qt_camera_video_sink.cpp b/rpcs3/rpcs3qt/qt_camera_video_sink.cpp index d4736f01e2..315d32d6e0 100644 --- a/rpcs3/rpcs3qt/qt_camera_video_sink.cpp +++ b/rpcs3/rpcs3qt/qt_camera_video_sink.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "qt_camera_video_sink.h" -#include "Emu/Cell/Modules/cellCamera.h" #include "Emu/system_config.h" #include @@ -9,7 +8,7 @@ LOG_CHANNEL(camera_log, "Camera"); qt_camera_video_sink::qt_camera_video_sink(bool front_facing, QObject *parent) - : QVideoSink(parent), m_front_facing(front_facing) + : camera_video_sink(front_facing), QVideoSink(parent) { connect(this, &QVideoSink::videoFrameChanged, this, &qt_camera_video_sink::present); } @@ -36,6 +35,8 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame) // Get image. This usually also converts the image to ARGB32. QImage image = frame.toImage(); + const u32 width = image.isNull() ? 0 : static_cast(image.width()); + const u32 height = image.isNull() ? 0 : static_cast(image.height()); if (image.isNull()) { @@ -44,7 +45,7 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame) else { // Scale image if necessary - if (m_width > 0 && m_height > 0 && m_width != static_cast(image.width()) && m_height != static_cast(image.height())) + if (m_width > 0 && m_height > 0 && m_width != width && m_height != height) { image = image.scaled(m_width, m_height, Qt::AspectRatioMode::IgnoreAspectRatio, Qt::SmoothTransformation); } @@ -87,254 +88,10 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame) } } - const u64 new_size = m_bytesize; - image_buffer& image_buffer = m_image_buffer[m_write_index]; - - // Reset buffer if necessary - if (image_buffer.data.size() != new_size) - { - image_buffer.data.clear(); - } - - // Create buffer if necessary - if (image_buffer.data.empty() && new_size > 0) - { - image_buffer.data.resize(new_size); - image_buffer.width = m_width; - image_buffer.height = m_height; - } - - if (!image_buffer.data.empty() && !image.isNull()) - { - // Convert image to proper layout - // TODO: check if pixel format and bytes per pixel match and convert if necessary - // TODO: implement or improve more conversions - - const u32 width = std::min(image_buffer.width, image.width()); - const u32 height = std::min(image_buffer.height, image.height()); - - switch (m_format) - { - case CELL_CAMERA_RAW8: // The game seems to expect BGGR - { - // Let's use a very simple algorithm to convert the image to raw BGGR - const auto convert_to_bggr = [this, &image_buffer, &image, width, height](u32 y_begin, u32 y_end) - { - u8* dst = &image_buffer.data[image_buffer.width * y_begin]; - - for (u32 y = y_begin; y < height && y < y_end; y++) - { - const u8* src = image.constScanLine(y); - const u8* srcu = image.constScanLine(std::max(0, y - 1)); - const u8* srcd = image.constScanLine(std::min(height - 1, y + 1)); - const bool is_top_pixel = (y % 2) == 0; - - // We apply gaussian blur to get better demosaicing results later when debayering again - const auto blurred = [&](s32 x, s32 c) - { - const s32 i = x * 4 + c; - const s32 il = std::max(0, x - 1) * 4 + c; - const s32 ir = std::min(width - 1, x + 1) * 4 + c; - const s32 sum = - srcu[i] + - src[il] + 4 * src[i] + src[ir] + - srcd[i]; - return static_cast(std::clamp((sum + 4) / 8, 0, 255)); - }; - - // Split loops (roughly twice the performance by removing one condition) - if (is_top_pixel) - { - for (u32 x = 0; x < width; x++, dst++) - { - const bool is_left_pixel = (x % 2) == 0; - - if (is_left_pixel) - { - *dst = blurred(x, 2); // Blue - } - else - { - *dst = blurred(x, 1); // Green - } - } - } - else - { - for (u32 x = 0; x < width; x++, dst++) - { - const bool is_left_pixel = (x % 2) == 0; - - if (is_left_pixel) - { - *dst = blurred(x, 1); // Green - } - else - { - *dst = blurred(x, 0); // Red - } - } - } - } - }; - - // Use a multithreaded workload. The faster we get this done, the better. - constexpr u32 thread_count = 4; - const u32 lines_per_thread = std::ceil(image_buffer.height / static_cast(thread_count)); - u32 y_begin = 0; - u32 y_end = lines_per_thread; - - QFutureSynchronizer synchronizer; - for (u32 i = 0; i < thread_count; i++) - { - synchronizer.addFuture(QtConcurrent::run(convert_to_bggr, y_begin, y_end)); - y_begin = y_end; - y_end += lines_per_thread; - } - synchronizer.waitForFinished(); - break; - } - //case CELL_CAMERA_YUV422: - case CELL_CAMERA_Y0_U_Y1_V: - case CELL_CAMERA_V_Y1_U_Y0: - { - // Simple RGB to Y0_U_Y1_V conversion from stackoverflow. - const auto convert_to_yuv422 = [&image_buffer, &image, width, height, format = m_format](u32 y_begin, u32 y_end) - { - constexpr s32 yuv_bytes_per_pixel = 2; - const s32 yuv_pitch = image_buffer.width * yuv_bytes_per_pixel; - - const s32 y0_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 0 : 3; - const s32 u_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 1 : 2; - const s32 y1_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 2 : 1; - const s32 v_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 3 : 0; - - for (u32 y = y_begin; y < height && y < y_end; y++) - { - const u8* src = image.constScanLine(y); - u8* yuv_row_ptr = &image_buffer.data[y * yuv_pitch]; - - for (u32 x = 0; x < width - 1; x += 2, src += 8) - { - const f32 r1 = src[0]; - const f32 g1 = src[1]; - const f32 b1 = src[2]; - const f32 r2 = src[4]; - const f32 g2 = src[5]; - const f32 b2 = src[6]; - - const s32 y0 = (0.257f * r1) + (0.504f * g1) + (0.098f * b1) + 16.0f; - const s32 u = -(0.148f * r1) - (0.291f * g1) + (0.439f * b1) + 128.0f; - const s32 v = (0.439f * r1) - (0.368f * g1) - (0.071f * b1) + 128.0f; - const s32 y1 = (0.257f * r2) + (0.504f * g2) + (0.098f * b2) + 16.0f; - - const s32 yuv_index = x * yuv_bytes_per_pixel; - yuv_row_ptr[yuv_index + y0_offset] = static_cast(std::clamp(y0, 0, 255)); - yuv_row_ptr[yuv_index + u_offset] = static_cast(std::clamp( u, 0, 255)); - yuv_row_ptr[yuv_index + y1_offset] = static_cast(std::clamp(y1, 0, 255)); - yuv_row_ptr[yuv_index + v_offset] = static_cast(std::clamp( v, 0, 255)); - } - } - }; - - // Use a multithreaded workload. The faster we get this done, the better. - constexpr u32 thread_count = 4; - const u32 lines_per_thread = std::ceil(image_buffer.height / static_cast(thread_count)); - u32 y_begin = 0; - u32 y_end = lines_per_thread; - - QFutureSynchronizer synchronizer; - for (u32 i = 0; i < thread_count; i++) - { - synchronizer.addFuture(QtConcurrent::run(convert_to_yuv422, y_begin, y_end)); - y_begin = y_end; - y_end += lines_per_thread; - } - synchronizer.waitForFinished(); - break; - } - case CELL_CAMERA_JPG: - case CELL_CAMERA_RGBA: - case CELL_CAMERA_RAW10: - case CELL_CAMERA_YUV420: - case CELL_CAMERA_FORMAT_UNKNOWN: - default: - std::memcpy(image_buffer.data.data(), image.constBits(), std::min(image_buffer.data.size(), image.height() * image.bytesPerLine())); - break; - } - } + camera_video_sink::present(width, height, image.bytesPerLine(), 4, [&image](u32 y){ return image.constScanLine(y); }); // Unmap frame memory tmp.unmap(); - camera_log.trace("Wrote image to video surface. index=%d, m_frame_number=%d, width=%d, height=%d, bytesize=%d", - m_write_index, m_frame_number.load(), m_width, m_height, m_bytesize); - - // Toggle write/read index - std::lock_guard lock(m_mutex); - image_buffer.frame_number = m_frame_number++; - m_write_index = read_index(); - return true; } - -void qt_camera_video_sink::set_format(s32 format, u32 bytesize) -{ - camera_log.notice("Setting format: format=%d, bytesize=%d", format, bytesize); - - m_format = format; - m_bytesize = bytesize; -} - -void qt_camera_video_sink::set_resolution(u32 width, u32 height) -{ - camera_log.notice("Setting resolution: width=%d, height=%d", width, height); - - m_width = width; - m_height = height; -} - -void qt_camera_video_sink::set_mirrored(bool mirrored) -{ - camera_log.notice("Setting mirrored: mirrored=%d", mirrored); - - m_mirrored = mirrored; -} - -u64 qt_camera_video_sink::frame_number() const -{ - return m_frame_number.load(); -} - -void qt_camera_video_sink::get_image(u8* buf, u64 size, u32& width, u32& height, u64& frame_number, u64& bytes_read) -{ - // Lock read buffer - std::lock_guard lock(m_mutex); - const image_buffer& image_buffer = m_image_buffer[read_index()]; - - width = image_buffer.width; - height = image_buffer.height; - frame_number = image_buffer.frame_number; - - // Copy to out buffer - if (buf && !image_buffer.data.empty()) - { - bytes_read = std::min(image_buffer.data.size(), size); - std::memcpy(buf, image_buffer.data.data(), bytes_read); - - if (image_buffer.data.size() != size) - { - camera_log.error("Buffer size mismatch: in=%d, out=%d. Cropping to incoming size. Please contact a developer.", size, image_buffer.data.size()); - } - } - else - { - bytes_read = 0; - } -} - -u32 qt_camera_video_sink::read_index() const -{ - // The read buffer index cannot be the same as the write index - return (m_write_index + 1u) % ::narrow(m_image_buffer.size()); -} diff --git a/rpcs3/rpcs3qt/qt_camera_video_sink.h b/rpcs3/rpcs3qt/qt_camera_video_sink.h index e3f405b55c..8f228bb94f 100644 --- a/rpcs3/rpcs3qt/qt_camera_video_sink.h +++ b/rpcs3/rpcs3qt/qt_camera_video_sink.h @@ -1,50 +1,15 @@ #pragma once -#include "util/atomic.hpp" -#include "util/types.hpp" +#include "Input/camera_video_sink.h" + #include #include -#include -#include -#include - -class qt_camera_video_sink final : public QVideoSink +class qt_camera_video_sink final : public camera_video_sink, public QVideoSink { public: qt_camera_video_sink(bool front_facing, QObject *parent = nullptr); virtual ~qt_camera_video_sink(); bool present(const QVideoFrame& frame); - - void set_format(s32 format, u32 bytesize); - void set_resolution(u32 width, u32 height); - void set_mirrored(bool mirrored); - - u64 frame_number() const; - - void get_image(u8* buf, u64 size, u32& width, u32& height, u64& frame_number, u64& bytes_read); - -private: - u32 read_index() const; - - bool m_front_facing = false; - bool m_mirrored = false; // Set by cellCamera - s32 m_format = 2; // CELL_CAMERA_RAW8, set by cellCamera - u32 m_bytesize = 0; - u32 m_width = 640; - u32 m_height = 480; - - std::mutex m_mutex; - atomic_t m_frame_number{0}; - u32 m_write_index{0}; - - struct image_buffer - { - u64 frame_number = 0; - u32 width = 0; - u32 height = 0; - std::vector data; - }; - std::array m_image_buffer; }; From 8d7484df894cc9652aadda6675c9908697650862 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Wed, 31 Dec 2025 17:57:54 -0800 Subject: [PATCH 054/630] [BSD] Use FreeBSD 14.3 vm Fixes runner stopping when running out of disk space. --- .github/workflows/rpcs3.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index bd0e206308..a4a99fd015 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -438,6 +438,8 @@ jobs: with: envs: 'QT_VER_MAIN LLVM_COMPILER_VER CCACHE_DIR CC CXX LLVM_CONFIG' usesh: true + copyback: false + release: "14.3" run: .ci/install-freebsd.sh && .ci/build-freebsd.sh - name: Save Build Ccache From ee06dccdea91814bf7d76b3037371a6477458722 Mon Sep 17 00:00:00 2001 From: kd-11 <15904127+kd-11@users.noreply.github.com> Date: Thu, 1 Jan 2026 14:36:31 +0300 Subject: [PATCH 055/630] vk: Disable VK_EXT_attachment_feedback_loop_layout support for adrenalin driver --- rpcs3/Emu/RSX/NV47/HW/nv308a.cpp | 80 ++++++++++++++--------------- rpcs3/Emu/RSX/VK/vkutils/device.cpp | 2 +- 2 files changed, 40 insertions(+), 42 deletions(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv308a.cpp b/rpcs3/Emu/RSX/NV47/HW/nv308a.cpp index 163ddb9a4c..ab811eb2b9 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv308a.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv308a.cpp @@ -89,27 +89,25 @@ namespace rsx rsx::reservation_lock rsx_lock(dst_address, data_length); if (RSX(ctx)->fifo_ctrl->last_cmd() & RSX_METHOD_NON_INCREMENT_CMD_MASK) [[unlikely]] - { - // Move last 32 bits - reinterpret_cast(dst)[0] = reinterpret_cast(src)[count - 1]; - RSX(ctx)->invalidate_fragment_program(dst_dma, dst_offset, 4); - } - else { - if (dst_dma & CELL_GCM_LOCATION_MAIN) - { - // May overlap - std::memmove(dst, src, data_length); - } - else - { - // Never overlaps - std::memcpy(dst, src, data_length); - } - - RSX(ctx)->invalidate_fragment_program(dst_dma, dst_offset, count * 4); + // Move last 32 bits + reinterpret_cast(dst)[0] = reinterpret_cast(src)[count - 1]; + RSX(ctx)->invalidate_fragment_program(dst_dma, dst_offset, 4); + return; } + if (dst_dma & CELL_GCM_LOCATION_MAIN) + { + // May overlap + std::memmove(dst, src, data_length); + } + else + { + // Never overlaps + std::memcpy(dst, src, data_length); + } + + RSX(ctx)->invalidate_fragment_program(dst_dma, dst_offset, count * 4); break; } case blit_engine::transfer_destination_format::r5g6b5: @@ -129,33 +127,33 @@ namespace rsx rsx::reservation_lock rsx_lock(dst_address, data_length); auto convert = [](u32 input) -> u16 - { - // Input is considered to be ARGB8 - u32 r = (input >> 16) & 0xFF; - u32 g = (input >> 8) & 0xFF; - u32 b = input & 0xFF; + { + // Input is considered to be ARGB8 + u32 r = (input >> 16) & 0xFF; + u32 g = (input >> 8) & 0xFF; + u32 b = input & 0xFF; - r = (r * 32) / 255; - g = (g * 64) / 255; - b = (b * 32) / 255; - return static_cast((r << 11) | (g << 5) | b); - }; + r = (r * 32) / 255; + g = (g * 64) / 255; + b = (b * 32) / 255; + return static_cast((r << 11) | (g << 5) | b); + }; if (RSX(ctx)->fifo_ctrl->last_cmd() & RSX_METHOD_NON_INCREMENT_CMD_MASK) [[unlikely]] - { - // Move last 16 bits - dst[0] = convert(src[count - 1]); - RSX(ctx)->invalidate_fragment_program(dst_dma, dst_offset, 2); - break; - } - - for (u32 i = 0; i < count; i++) - { - dst[i] = convert(src[i]); - } - - RSX(ctx)->invalidate_fragment_program(dst_dma, dst_offset, count * 2); + { + // Move last 16 bits + dst[0] = convert(src[count - 1]); + RSX(ctx)->invalidate_fragment_program(dst_dma, dst_offset, 2); break; + } + + for (u32 i = 0; i < count; i++) + { + dst[i] = convert(src[i]); + } + + RSX(ctx)->invalidate_fragment_program(dst_dma, dst_offset, count * 2); + break; } default: { diff --git a/rpcs3/Emu/RSX/VK/vkutils/device.cpp b/rpcs3/Emu/RSX/VK/vkutils/device.cpp index f7b7ffb19c..14752f160c 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/device.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/device.cpp @@ -102,7 +102,7 @@ namespace vk multidraw_support.max_batch_size = 65536; optional_features_support.barycentric_coords = !!shader_barycentric_info.fragmentShaderBarycentric; - optional_features_support.framebuffer_loops = !!fbo_loops_info.attachmentFeedbackLoopLayout; + optional_features_support.framebuffer_loops = !!fbo_loops_info.attachmentFeedbackLoopLayout && get_driver_vendor() != driver_vendor::AMD; optional_features_support.extended_device_fault = !!device_fault_info.deviceFault; features = features2.features; From 8d55db334e0416f77188134bf1db128ec440a545 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 27 Dec 2025 16:46:27 +0100 Subject: [PATCH 056/630] Qt: deploy and apply Qt translations --- .ci/deploy-windows-clang.sh | 2 +- .ci/setup-windows.sh | 2 + rpcs3/rpcs3.vcxproj | 4 +- rpcs3/rpcs3qt/gui_application.cpp | 69 +++++++++++++++++++++++++++---- rpcs3/rpcs3qt/gui_application.h | 3 +- 5 files changed, 67 insertions(+), 13 deletions(-) diff --git a/.ci/deploy-windows-clang.sh b/.ci/deploy-windows-clang.sh index c95f82e7b8..0bf731e7c8 100644 --- a/.ci/deploy-windows-clang.sh +++ b/.ci/deploy-windows-clang.sh @@ -38,7 +38,7 @@ else echo "Failed to download translations.zip. Continuing without translations." exit 0 } - unzip -o translations.zip -d "./bin/share/qt6/translations" >/dev/null 2>&1 || \ + 7z x translations.zip -o"./bin/share/qt6/translations" >/dev/null 2>&1 || \ echo "Failed to extract translations.zip. Continuing without translations." rm -f translations.zip fi diff --git a/.ci/setup-windows.sh b/.ci/setup-windows.sh index f637cec9ad..d874c7a7f0 100755 --- a/.ci/setup-windows.sh +++ b/.ci/setup-windows.sh @@ -14,6 +14,7 @@ QT_DECL_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qtdeclarative${QT_SUFFIX}" QT_TOOL_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qttools${QT_SUFFIX}" QT_MM_URL="${QT_HOST}${QT_PREFIX}addons.qtmultimedia.${QT_PREFIX_2}qtmultimedia${QT_SUFFIX}" QT_SVG_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qtsvg${QT_SUFFIX}" +QT_TRANSLATIONS_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qttranslations${QT_SUFFIX}" LLVMLIBS_URL="https://github.com/RPCS3/llvm-mirror/releases/download/custom-build-win-${LLVM_VER}/llvmlibs_mt.7z" VULKAN_SDK_URL="https://www.dropbox.com/scl/fi/sjjh0fc4ld281pjbl2xzu/VulkanSDK-${VULKAN_VER}-Installer.exe?rlkey=f6wzc0lvms5vwkt2z3qabfv9d&dl=1" CCACHE_URL="https://github.com/ccache/ccache/releases/download/v4.11.2/ccache-4.11.2-windows-x86_64.zip" @@ -24,6 +25,7 @@ DEP_URLS=" \ $QT_TOOL_URL \ $QT_MM_URL \ $QT_SVG_URL \ + $QT_TRANSLATIONS_URL \ $LLVMLIBS_URL \ $VULKAN_SDK_URL\ $CCACHE_URL" diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index b38aa78567..83de843746 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -110,7 +110,7 @@ - $(QTDIR)\bin\windeployqt6 --no-compiler-runtime --no-opengl-sw --no-patchqt --no-translations --no-quick --no-system-d3d-compiler --no-system-dxc-compiler --no-quick-import --plugindir "$(TargetDir)qt6\plugins" --release "$(TargetPath)" + $(QTDIR)\bin\windeployqt6 --no-compiler-runtime --no-opengl-sw --no-patchqt --no-quick --no-system-d3d-compiler --no-system-dxc-compiler --no-quick-import --plugindir "$(TargetDir)qt6\plugins" --translationdir "$(TargetDir)qt6\translations" --release "$(TargetPath)" xcopy /y /d "$(SolutionDir)3rdparty\opencv\opencv\opencv412\build\x64\bin\opencv_world4120.dll" "$(OutDir)" @@ -169,7 +169,7 @@ - $(QTDIR)\bin\windeployqt6 --no-compiler-runtime --no-opengl-sw --no-patchqt --no-translations --no-quick --no-system-d3d-compiler --no-system-dxc-compiler --no-quick-import --plugindir "$(TargetDir)qt6\plugins" --debug "$(TargetPath)" + $(QTDIR)\bin\windeployqt6 --no-compiler-runtime --no-opengl-sw --no-patchqt --no-quick --no-system-d3d-compiler --no-system-dxc-compiler --no-quick-import --plugindir "$(TargetDir)qt6\plugins" --translationdir "$(TargetDir)qt6\translations" --debug "$(TargetPath)" xcopy /y /d "$(SolutionDir)3rdparty\opencv\opencv\opencv412\build\x64\bin\opencv_world4120.dll" "$(OutDir)" diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index e028aaefa8..443dcb4e0c 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -216,29 +216,74 @@ bool gui_application::Init() return true; } -void gui_application::SwitchTranslator(QTranslator& translator, const QString& filename, const QString& language_code) +void gui_application::SwitchTranslator(const QString& language_code) { // remove the old translator - removeTranslator(&translator); + removeTranslator(&m_translator); + for (QTranslator* qt_translator : m_qt_translators) + { + removeTranslator(qt_translator); + qt_translator->deleteLater(); + } + m_qt_translators.clear(); + const QString default_code = QLocale(QLocale::English).bcp47Name(); const QString lang_path = QLibraryInfo::path(QLibraryInfo::TranslationsPath) + QStringLiteral("/"); - const QString file_path = lang_path + filename; + // Load qt translation files + const QDir dir(lang_path); + if (dir.exists()) + { + QStringList qm_files = dir.entryList(QStringList() << QStringLiteral("qt*_%1.qm").arg(language_code), QDir::Files | QDir::Readable); + if (qm_files.empty()) + { + qm_files = dir.entryList(QStringList() << QStringLiteral("qt*_%1.qm").arg(QLocale::languageToCode(QLocale(language_code).language())), QDir::Files | QDir::Readable); + } + + for (const QString& qm_file : qm_files) + { + const QString file_path = lang_path + qm_file; + QTranslator* qt_translator = new QTranslator(this); + + if (qt_translator->load(file_path)) + { + gui_log.notice("Installing translation: '%s'", file_path); + installTranslator(qt_translator); + m_qt_translators.push_back(std::move(qt_translator)); + } + else + { + gui_log.error("Failed to load translation: '%s'", file_path); + qt_translator->deleteLater(); + } + } + } + else + { + gui_log.error("Qt translation dir '%s' does not exist", lang_path); + } + + const QString file_path = lang_path + QStringLiteral("rpcs3_%1.qm").arg(language_code); if (QFileInfo(file_path).isFile()) { // load the new translator - if (translator.load(file_path)) + if (m_translator.load(file_path)) { - installTranslator(&translator); + gui_log.notice("Installing translation: '%s'", file_path); + installTranslator(&m_translator); + } + else + { + gui_log.error("Failed to load translation: '%s'", file_path); } } - else if (QString default_code = QLocale(QLocale::English).bcp47Name(); language_code != default_code) + else if (language_code != default_code) { // show error, but ignore default case "en", since it is handled in source code - gui_log.error("No translation file found in: %s", file_path); + gui_log.error("No translation file found in: '%s'", file_path); // reset current language to default "en" - set_language_code(std::move(default_code)); + set_language_code(default_code); } } @@ -260,7 +305,7 @@ void gui_application::LoadLanguage(const QString& language_code) // As per QT recommendations to avoid conflicts for POSIX functions std::setlocale(LC_NUMERIC, "C"); - SwitchTranslator(m_translator, QStringLiteral("rpcs3_%1.qm").arg(language_code), language_code); + SwitchTranslator(language_code); if (m_main_window) { @@ -285,6 +330,7 @@ QStringList gui_application::GetAvailableLanguageCodes() QStringList language_codes; const QString language_path = QLibraryInfo::path(QLibraryInfo::TranslationsPath); + gui_log.notice("Checking languages in '%s'", language_path); if (QFileInfo(language_path).isDir()) { @@ -303,10 +349,15 @@ QStringList gui_application::GetAvailableLanguageCodes() } else { + gui_log.notice("Found language '%s' (%s)", language_code, filename); language_codes << language_code; } } } + else + { + gui_log.error("Language dir not found: '%s'", language_path); + } return language_codes; } diff --git a/rpcs3/rpcs3qt/gui_application.h b/rpcs3/rpcs3qt/gui_application.h index bec8424da4..948965ef47 100644 --- a/rpcs3/rpcs3qt/gui_application.h +++ b/rpcs3/rpcs3qt/gui_application.h @@ -81,7 +81,7 @@ private: return thread(); } - void SwitchTranslator(QTranslator& translator, const QString& filename, const QString& language_code); + void SwitchTranslator(const QString& language_code); void LoadLanguage(const QString& language_code); static QStringList GetAvailableLanguageCodes(); @@ -101,6 +101,7 @@ private: } m_native_event_filter; + std::vector m_qt_translators; QTranslator m_translator; QString m_language_code; static s32 m_language_id; From 050d2d3b2f34d80c1a395ae63c7a85c45ec40656 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 2 Jan 2026 20:10:15 +0100 Subject: [PATCH 057/630] macOs: Deploy Qt translations --- .ci/deploy-mac-arm64.sh | 4 ++++ .ci/deploy-mac.sh | 4 ++++ rpcs3/CMakeLists.txt | 3 ++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.ci/deploy-mac-arm64.sh b/.ci/deploy-mac-arm64.sh index 8a27d04676..a4661dc0dd 100755 --- a/.ci/deploy-mac-arm64.sh +++ b/.ci/deploy-mac-arm64.sh @@ -57,6 +57,10 @@ else rm -f translations.zip fi +# Copy Qt translations manually +QT_TRANS="$WORKDIR/qt-downloader/$QT_VER/clang_64/translations" +cp $QT_TRANS/qt*.qm rpcs3.app/Contents/translations + # Hack install_name_tool -delete_rpath /opt/homebrew/lib RPCS3.app/Contents/MacOS/rpcs3 || echo "Hack for deleting rpath /opt/homebrew/lib not needed" install_name_tool -delete_rpath /opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/lib RPCS3.app/Contents/MacOS/rpcs3 || echo "Hack for deleting rpath /opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/lib not needed" diff --git a/.ci/deploy-mac.sh b/.ci/deploy-mac.sh index ec71fe0262..b0bfb4b455 100755 --- a/.ci/deploy-mac.sh +++ b/.ci/deploy-mac.sh @@ -58,6 +58,10 @@ else rm -f translations.zip fi +# Copy Qt translations manually +QT_TRANS="$WORKDIR/qt-downloader/$QT_VER/clang_64/translations" +cp $QT_TRANS/qt*.qm rpcs3.app/Contents/translations + # Need to do this rename hack due to case insensitive filesystem mv rpcs3.app RPCS3_.app mv RPCS3_.app RPCS3.app diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 02a6bfeed4..e32597f792 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -148,8 +148,9 @@ if (NOT ANDROID) COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/bin/GuiConfigs $/GuiConfigs COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/bin/test $/test COMMAND "${WINDEPLOYQT_EXECUTABLE}" --no-compiler-runtime --no-opengl-sw --no-patchqt - --no-translations --no-system-d3d-compiler --no-system-dxc-compiler --no-quick-import + --no-system-d3d-compiler --no-system-dxc-compiler --no-quick-import --plugindir "$,$/plugins,$/share/qt6/plugins>" + --translationdir "$,$/translations,$/share/qt6/translations>" --verbose 0 "$") endif() From ea6bb77d57357908706f4fdf7081e2d924c08f1f Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 3 Jan 2026 01:54:44 +0100 Subject: [PATCH 058/630] Qt: Fix image dimensions passed to camera_video_sink::present --- rpcs3/rpcs3qt/camera_settings_dialog.cpp | 2 +- rpcs3/rpcs3qt/qt_camera_video_sink.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/rpcs3/rpcs3qt/camera_settings_dialog.cpp b/rpcs3/rpcs3qt/camera_settings_dialog.cpp index fca7432370..e680dd0436 100644 --- a/rpcs3/rpcs3qt/camera_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/camera_settings_dialog.cpp @@ -273,7 +273,7 @@ void camera_settings_dialog::handle_qt_camera_change(const QVariant& item_data) int index = 0; bool success = false; const std::string key = camera_info.id().toStdString(); - cfg_camera::camera_setting cfg_setting = g_cfg_camera.get_camera_setting(fmt::format("%s", camera_handler::qt), key, success); + const cfg_camera::camera_setting cfg_setting = g_cfg_camera.get_camera_setting(fmt::format("%s", camera_handler::qt), key, success); if (success) { diff --git a/rpcs3/rpcs3qt/qt_camera_video_sink.cpp b/rpcs3/rpcs3qt/qt_camera_video_sink.cpp index 315d32d6e0..3dee6fa6e3 100644 --- a/rpcs3/rpcs3qt/qt_camera_video_sink.cpp +++ b/rpcs3/rpcs3qt/qt_camera_video_sink.cpp @@ -34,13 +34,13 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame) } // Get image. This usually also converts the image to ARGB32. - QImage image = frame.toImage(); - const u32 width = image.isNull() ? 0 : static_cast(image.width()); - const u32 height = image.isNull() ? 0 : static_cast(image.height()); + QImage image = tmp.toImage(); + u32 width = image.isNull() ? 0 : static_cast(image.width()); + u32 height = image.isNull() ? 0 : static_cast(image.height()); if (image.isNull()) { - camera_log.warning("Image is invalid: pixel_format=%s, format=%d", tmp.pixelFormat(), static_cast(QVideoFrameFormat::imageFormatFromPixelFormat(tmp.pixelFormat()))); + camera_log.warning("Image is invalid: pixel_format=%s, format=%d", tmp.pixelFormat(), static_cast(QVideoFrameFormat::imageFormatFromPixelFormat(tmp.pixelFormat()))); } else { @@ -48,6 +48,8 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame) if (m_width > 0 && m_height > 0 && m_width != width && m_height != height) { image = image.scaled(m_width, m_height, Qt::AspectRatioMode::IgnoreAspectRatio, Qt::SmoothTransformation); + width = static_cast(image.width()); + height = static_cast(image.height()); } // Determine image flip From 643d1102ccedd56f9915b86c53ae9d7251e4c736 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 27 Jan 2025 20:32:29 +0100 Subject: [PATCH 059/630] Add SDL camera handler --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 9 +- .../HomeMenu/overlay_home_menu_settings.cpp | 10 +- rpcs3/Emu/system_config.h | 1 + rpcs3/Emu/system_config_types.cpp | 3 + rpcs3/Emu/system_config_types.h | 5 +- rpcs3/Input/sdl_camera_handler.cpp | 490 ++++++++++++++++++ rpcs3/Input/sdl_camera_handler.h | 49 ++ rpcs3/Input/sdl_camera_video_sink.cpp | 168 ++++++ rpcs3/Input/sdl_camera_video_sink.h | 34 ++ rpcs3/Input/sdl_instance.cpp | 2 +- rpcs3/headless_application.cpp | 3 + rpcs3/rpcs3.vcxproj | 4 + rpcs3/rpcs3.vcxproj.filters | 12 + rpcs3/rpcs3qt/CMakeLists.txt | 4 +- rpcs3/rpcs3qt/camera_settings_dialog.cpp | 358 +++++++++++++ rpcs3/rpcs3qt/camera_settings_dialog.h | 32 ++ rpcs3/rpcs3qt/emu_settings.cpp | 3 + rpcs3/rpcs3qt/gui_application.cpp | 10 + 18 files changed, 1192 insertions(+), 5 deletions(-) create mode 100644 rpcs3/Input/sdl_camera_handler.cpp create mode 100644 rpcs3/Input/sdl_camera_handler.h create mode 100644 rpcs3/Input/sdl_camera_video_sink.cpp create mode 100644 rpcs3/Input/sdl_camera_video_sink.h diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 2de2d2cd3c..3c7b299af7 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -1501,8 +1501,15 @@ void gem_config_data::operator()() vc = vc_attribute; } - if (g_cfg.io.camera != camera_handler::qt) + switch (g_cfg.io.camera) { +#ifdef HAVE_SDL3 + case camera_handler::sdl: +#endif + case camera_handler::qt: + break; + case camera_handler::fake: + case camera_handler::null: video_conversion_in_progress = false; done(); continue; diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp index 4ff3bd7eae..c0e3a72b6f 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp @@ -80,9 +80,17 @@ namespace rsx add_checkbox(&g_cfg.io.keep_pads_connected, localized_string_id::HOME_MENU_SETTINGS_INPUT_KEEP_PADS_CONNECTED); add_checkbox(&g_cfg.io.show_move_cursor, localized_string_id::HOME_MENU_SETTINGS_INPUT_SHOW_PS_MOVE_CURSOR); - if (g_cfg.io.camera == camera_handler::qt) + switch (g_cfg.io.camera) { + #ifdef HAVE_SDL3 + case camera_handler::sdl: + #endif + case camera_handler::qt: add_dropdown(&g_cfg.io.camera_flip_option, localized_string_id::HOME_MENU_SETTINGS_INPUT_CAMERA_FLIP); + break; + case camera_handler::fake: + case camera_handler::null: + break; } add_dropdown(&g_cfg.io.pad_mode, localized_string_id::HOME_MENU_SETTINGS_INPUT_PAD_MODE); diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 7c7b89fcf9..518e6eeb6e 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -267,6 +267,7 @@ struct cfg_root : cfg::node cfg::_enum camera_type{ this, "Camera type", fake_camera_type::unknown }; cfg::_enum camera_flip_option{ this, "Camera flip", camera_flip::none, true }; cfg::string camera_id{ this, "Camera ID", "Default", true }; + cfg::string sdl_camera_id{ this, "SDL Camera ID", "Default", true }; cfg::_enum move{ this, "Move", move_handler::null, true }; cfg::_enum buzz{ this, "Buzz emulated controller", buzz_handler::null }; cfg::_enum turntable{this, "Turntable emulated controller", turntable_handler::null}; diff --git a/rpcs3/Emu/system_config_types.cpp b/rpcs3/Emu/system_config_types.cpp index 52564c7d06..7c9c5ef592 100644 --- a/rpcs3/Emu/system_config_types.cpp +++ b/rpcs3/Emu/system_config_types.cpp @@ -358,6 +358,9 @@ void fmt_class_string::format(std::string& out, u64 arg) case camera_handler::null: return "Null"; case camera_handler::fake: return "Fake"; case camera_handler::qt: return "Qt"; +#ifdef HAVE_SDL3 + case camera_handler::sdl: return "SDL"; +#endif } return unknown; diff --git a/rpcs3/Emu/system_config_types.h b/rpcs3/Emu/system_config_types.h index c88555efaa..d58e8664fa 100644 --- a/rpcs3/Emu/system_config_types.h +++ b/rpcs3/Emu/system_config_types.h @@ -116,7 +116,10 @@ enum class camera_handler { null, fake, - qt + qt, +#ifdef HAVE_SDL3 + sdl, +#endif }; enum class camera_flip diff --git a/rpcs3/Input/sdl_camera_handler.cpp b/rpcs3/Input/sdl_camera_handler.cpp new file mode 100644 index 0000000000..4faf4eaf75 --- /dev/null +++ b/rpcs3/Input/sdl_camera_handler.cpp @@ -0,0 +1,490 @@ +#ifdef HAVE_SDL3 + +#include "stdafx.h" +#include "sdl_camera_handler.h" +#include "sdl_camera_video_sink.h" +#include "sdl_instance.h" +#include "Emu/system_config.h" +#include "Emu/System.h" +#include "Emu/Io/camera_config.h" + +LOG_CHANNEL(camera_log, "Camera"); + +#if !(SDL_VERSION_ATLEAST(3, 4, 0)) +namespace SDL_CameraPermissionState +{ + constexpr int SDL_CAMERA_PERMISSION_STATE_DENIED = -1; + constexpr int SDL_CAMERA_PERMISSION_STATE_PENDING = 0; + constexpr int SDL_CAMERA_PERMISSION_STATE_APPROVED = 1; +} +#endif + +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + const SDL_CameraSpec& spec = get_object(arg); + out += fmt::format("format=0x%x, colorspace=0x%x, width=%d, height=%d, framerate_numerator=%d, framerate_denominator=%d, fps=%f", + static_cast(spec.format), static_cast(spec.colorspace), spec.width, spec.height, + spec.framerate_numerator, spec.framerate_denominator, spec.framerate_numerator / static_cast(spec.framerate_denominator)); +} + +std::vector sdl_camera_handler::get_drivers() +{ + std::vector drivers; + + if (const int num_drivers = SDL_GetNumCameraDrivers(); num_drivers > 0) + { + for (int i = 0; i < num_drivers; i++) + { + if (const char* driver = SDL_GetCameraDriver(i)) + { + camera_log.notice("Found driver: %s", driver); + drivers.push_back(driver); + continue; + } + + camera_log.error("Failed to get driver %d. SDL Error: %s", i, SDL_GetError()); + } + } + else + { + camera_log.error("No SDL camera drivers found"); + } + + return drivers; +} + +std::map sdl_camera_handler::get_cameras() +{ + int camera_count = 0; + if (SDL_CameraID* cameras = SDL_GetCameras(&camera_count)) + { + std::map camera_map; + + for (int i = 0; i < camera_count && cameras[i]; i++) + { + if (const char* name = SDL_GetCameraName(cameras[i])) + { + camera_log.notice("Found camera: name=%s", name); + camera_map[cameras[i]] = name; + continue; + } + + camera_log.error("Found camera (Failed to get name. SDL Error: %s", SDL_GetError()); + } + + SDL_free(cameras); + + if (camera_map.empty()) + { + camera_log.notice("No SDL cameras found"); + } + + return camera_map; + } + + camera_log.error("Could not get cameras! SDL Error: %s", SDL_GetError()); + return {}; +} + +sdl_camera_handler::sdl_camera_handler() : camera_handler_base() +{ + if (!g_cfg_camera.load()) + { + camera_log.notice("Could not load camera config. Using defaults."); + } + + if (!sdl_instance::get_instance().initialize()) + { + camera_log.error("Could not initialize SDL"); + return; + } + + // List available camera drivers + sdl_camera_handler::get_drivers(); + + // List available cameras + sdl_camera_handler::get_cameras(); +} + +sdl_camera_handler::~sdl_camera_handler() +{ + Emu.BlockingCallFromMainThread([&]() + { + close_camera(); + }); +} + +void sdl_camera_handler::reset() +{ + m_video_sink.reset(); + + if (m_camera) + { + SDL_CloseCamera(m_camera); + m_camera = nullptr; + } +} + +void sdl_camera_handler::open_camera() +{ + camera_log.notice("Loading camera"); + + if (const std::string camera_id = g_cfg.io.sdl_camera_id.to_string(); + m_camera_id != camera_id) + { + camera_log.notice("Switching camera from %s to %s", m_camera_id, camera_id); + camera_log.notice("Stopping old camera..."); + if (m_camera) + { + set_expected_state(camera_handler_state::open); + reset(); + } + m_camera_id = camera_id; + } + + // List available cameras + int camera_count = 0; + SDL_CameraID* cameras = SDL_GetCameras(&camera_count); + + if (!cameras) + { + camera_log.error("Could not get cameras! SDL Error: %s", SDL_GetError()); + set_state(camera_handler_state::closed); + return; + } + + if (camera_count <= 0) + { + camera_log.error("No cameras found"); + set_state(camera_handler_state::closed); + SDL_free(cameras); + return; + } + + m_sdl_camera_id = 0; + + if (m_camera_id == g_cfg.io.sdl_camera_id.def) + { + m_sdl_camera_id = cameras[0]; + } + else if (!m_camera_id.empty()) + { + for (int i = 0; i < camera_count && cameras[i]; i++) + { + if (const char* name = SDL_GetCameraName(cameras[i])) + { + if (m_camera_id == name) + { + m_sdl_camera_id = cameras[i]; + break; + } + } + } + } + + SDL_free(cameras); + + if (!m_sdl_camera_id) + { + camera_log.error("Camera %s not found", m_camera_id); + set_state(camera_handler_state::closed); + return; + } + + std::string camera_id; + + if (const char* name = SDL_GetCameraName(m_sdl_camera_id)) + { + camera_log.notice("Using camera: name=%s", name); + camera_id = name; + } + + SDL_CameraSpec used_spec + { + .format = SDL_PixelFormat::SDL_PIXELFORMAT_RGBA32, + .colorspace = SDL_Colorspace::SDL_COLORSPACE_RGB_DEFAULT, + .width = static_cast(m_width), + .height = static_cast(m_height), + .framerate_numerator = 30, + .framerate_denominator = 1 + }; + + int num_formats = 0; + if (SDL_CameraSpec** specs = SDL_GetCameraSupportedFormats(m_sdl_camera_id, &num_formats)) + { + if (num_formats <= 0) + { + camera_log.error("No SDL camera specs found"); + } + else + { + // Load selected settings from config file + bool success = false; + cfg_camera::camera_setting cfg_setting = g_cfg_camera.get_camera_setting(fmt::format("%s", camera_handler::sdl), camera_id, success); + + if (success) + { + camera_log.notice("Found config entry for camera \"%s\" (m_camera_id='%s')", camera_id, m_camera_id); + + // List all available settings and choose the proper value if possible. + constexpr double epsilon = 0.001; + success = false; + + for (int i = 0; i < num_formats; i++) + { + if (!specs[i]) continue; + + const SDL_CameraSpec& spec = *specs[i]; + const f64 fps = spec.framerate_numerator / static_cast(spec.framerate_denominator); + + if (spec.width == cfg_setting.width && + spec.height == cfg_setting.height && + fps >= (cfg_setting.min_fps - epsilon) && + fps <= (cfg_setting.min_fps + epsilon) && + fps >= (cfg_setting.max_fps - epsilon) && + fps <= (cfg_setting.max_fps + epsilon) && + spec.format == static_cast(cfg_setting.format) && + spec.colorspace == static_cast(cfg_setting.colorspace)) + { + // Apply settings. + camera_log.notice("Setting camera spec: %s", spec); + + // TODO: SDL converts the image for us. We would have to do this manually if we want to use other formats. + //used_spec = spec; + used_spec.width = spec.width; + used_spec.height = spec.height; + used_spec.framerate_numerator = spec.framerate_numerator; + used_spec.framerate_denominator = spec.framerate_denominator; + success = true; + break; + } + } + + if (!success) + { + camera_log.warning("No matching camera setting available for the camera config: max_fps=%f, width=%d, height=%d, format=%d, colorspace=%d", + cfg_setting.max_fps, cfg_setting.width, cfg_setting.height, cfg_setting.format, cfg_setting.colorspace); + } + } + + if (!success) + { + camera_log.notice("Using default camera spec: %s", used_spec); + } + } + SDL_free(specs); + } + else + { + camera_log.error("No SDL camera specs found. SDL Error: %s", SDL_GetError()); + } + + reset(); + + camera_log.notice("Requesting camera spec: %s", used_spec); + + m_camera = SDL_OpenCamera(m_sdl_camera_id, &used_spec); + + if (!m_camera) + { + if (!m_camera_id.empty()) camera_log.notice("Camera disabled"); + else camera_log.error("No camera found"); + set_state(camera_handler_state::closed); + return; + } + + if (const char* driver = SDL_GetCurrentCameraDriver()) + { + camera_log.notice("Using driver: %s", driver); + } + + if (SDL_CameraSpec spec {}; SDL_GetCameraFormat(m_camera, &spec)) + { + camera_log.notice("Using camera spec: %s", spec); + } + else + { + camera_log.error("Could not get camera spec. SDL Error: %s", SDL_GetError()); + } + + const SDL_CameraPosition position = SDL_GetCameraPosition(m_sdl_camera_id); + const bool front_facing = position == SDL_CameraPosition::SDL_CAMERA_POSITION_FRONT_FACING; + + if (const SDL_PropertiesID property_id = SDL_GetCameraProperties(m_camera); property_id != 0) + { + if (!SDL_EnumerateProperties(property_id, [](void* /*userdata*/, SDL_PropertiesID /*props*/, const char* name) + { + if (name) camera_log.notice("SDL camera property available: %s", name); + }, nullptr)) + { + camera_log.warning("SDL_EnumerateProperties failed. SDL Error: %s", SDL_GetError()); + } + } + else + { + camera_log.warning("SDL_GetCameraProperties failed. SDL Error: %s", SDL_GetError()); + } + + m_video_sink = std::make_unique(front_facing, m_camera); + m_video_sink->set_resolution(m_width, m_height); + m_video_sink->set_format(m_format, m_bytesize); + m_video_sink->set_mirrored(m_mirrored); + + set_state(camera_handler_state::open); +} + +void sdl_camera_handler::close_camera() +{ + camera_log.notice("Unloading camera"); + + if (!m_camera) + { + if (m_camera_id.empty()) camera_log.notice("Camera disabled"); + else camera_log.error("No camera found"); + set_state(camera_handler_state::closed); + return; + } + + // Unload/close camera + reset(); + + set_state(camera_handler_state::closed); +} + +void sdl_camera_handler::start_camera() +{ + camera_log.notice("Starting camera"); + + if (!m_camera) + { + if (m_camera_id.empty()) camera_log.notice("Camera disabled"); + else camera_log.error("No camera found"); + set_state(camera_handler_state::closed); + return; + } + + const auto camera_permission = SDL_GetCameraPermissionState(m_camera); + switch (camera_permission) + { + case SDL_CameraPermissionState::SDL_CAMERA_PERMISSION_STATE_DENIED: + camera_log.error("Camera permission denied"); + set_state(camera_handler_state::closed); + reset(); + return; + case SDL_CameraPermissionState::SDL_CAMERA_PERMISSION_STATE_PENDING: + // TODO: try to get permission + break; + case SDL_CameraPermissionState::SDL_CAMERA_PERMISSION_STATE_APPROVED: + break; + default: + fmt::throw_exception("Unknown SDL_CameraPermissionState %d", static_cast(camera_permission)); + } + + // Start camera. We will start receiving frames now. + set_state(camera_handler_state::running); +} + +void sdl_camera_handler::stop_camera() +{ + camera_log.notice("Stopping camera"); + + if (!m_camera) + { + if (m_camera_id.empty()) camera_log.notice("Camera disabled"); + else camera_log.error("No camera found"); + set_state(camera_handler_state::closed); + return; + } + + // Stop camera. The camera will still be drawing power. + set_expected_state(camera_handler_state::open); +} + +void sdl_camera_handler::set_format(s32 format, u32 bytesize) +{ + m_format = format; + m_bytesize = bytesize; + + if (m_video_sink) + { + m_video_sink->set_format(m_format, m_bytesize); + } +} + +void sdl_camera_handler::set_frame_rate(u32 frame_rate) +{ + m_frame_rate = frame_rate; +} + +void sdl_camera_handler::set_resolution(u32 width, u32 height) +{ + m_width = width; + m_height = height; + + if (m_video_sink) + { + m_video_sink->set_resolution(m_width, m_height); + } +} + +void sdl_camera_handler::set_mirrored(bool mirrored) +{ + m_mirrored = mirrored; + + if (m_video_sink) + { + m_video_sink->set_mirrored(m_mirrored); + } +} + +u64 sdl_camera_handler::frame_number() const +{ + return m_video_sink ? m_video_sink->frame_number() : 0; +} + +camera_handler_base::camera_handler_state sdl_camera_handler::get_image(u8* buf, u64 size, u32& width, u32& height, u64& frame_number, u64& bytes_read) +{ + width = 0; + height = 0; + frame_number = 0; + bytes_read = 0; + + if (const std::string camera_id = g_cfg.io.sdl_camera_id.to_string(); + m_camera_id != camera_id) + { + camera_log.notice("Switching cameras"); + set_state(camera_handler_state::closed); + return camera_handler_state::closed; + } + + if (m_camera_id.empty()) + { + camera_log.notice("Camera disabled"); + set_state(camera_handler_state::closed); + return camera_handler_state::closed; + } + + if (!m_camera || !m_video_sink) + { + camera_log.fatal("Error: camera invalid"); + set_state(camera_handler_state::closed); + return camera_handler_state::closed; + } + + // Backup current state. State may change through events. + const camera_handler_state current_state = get_state(); + + if (current_state == camera_handler_state::running) + { + m_video_sink->get_image(buf, size, width, height, frame_number, bytes_read); + } + else + { + camera_log.error("Camera not running (m_state=%d)", static_cast(current_state)); + } + + return current_state; +} + +#endif diff --git a/rpcs3/Input/sdl_camera_handler.h b/rpcs3/Input/sdl_camera_handler.h new file mode 100644 index 0000000000..1e177ff32e --- /dev/null +++ b/rpcs3/Input/sdl_camera_handler.h @@ -0,0 +1,49 @@ +#pragma once + +#ifdef HAVE_SDL3 + +#include "Emu/Io/camera_handler_base.h" + +#ifndef _MSC_VER +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" +#endif +#include "SDL3/SDL.h" +#ifndef _MSC_VER +#pragma GCC diagnostic pop +#endif + +#include + +class sdl_camera_video_sink; + +class sdl_camera_handler : public camera_handler_base +{ +public: + sdl_camera_handler(); + virtual ~sdl_camera_handler(); + + void open_camera() override; + void close_camera() override; + void start_camera() override; + void stop_camera() override; + void set_format(s32 format, u32 bytesize) override; + void set_frame_rate(u32 frame_rate) override; + void set_resolution(u32 width, u32 height) override; + void set_mirrored(bool mirrored) override; + u64 frame_number() const override; + camera_handler_state get_image(u8* buf, u64 size, u32& width, u32& height, u64& frame_number, u64& bytes_read) override; + + static std::vector get_drivers(); + static std::map get_cameras(); + +private: + void reset(); + + std::string m_camera_id; + SDL_CameraID m_sdl_camera_id = 0; + SDL_Camera* m_camera = nullptr; + std::unique_ptr m_video_sink; +}; + +#endif diff --git a/rpcs3/Input/sdl_camera_video_sink.cpp b/rpcs3/Input/sdl_camera_video_sink.cpp new file mode 100644 index 0000000000..346e0a6874 --- /dev/null +++ b/rpcs3/Input/sdl_camera_video_sink.cpp @@ -0,0 +1,168 @@ +#ifdef HAVE_SDL3 + +#include "stdafx.h" +#include "sdl_camera_video_sink.h" +#include "Utilities/Thread.h" +#include "Emu/system_config.h" + +LOG_CHANNEL(camera_log, "Camera"); + +sdl_camera_video_sink::sdl_camera_video_sink(bool front_facing, SDL_Camera* camera) + : camera_video_sink(front_facing), m_camera(camera) +{ + ensure(m_camera); + + m_thread = std::make_unique(&sdl_camera_video_sink::run, this); +} + +sdl_camera_video_sink::~sdl_camera_video_sink() +{ + m_terminate = true; + + if (m_thread && m_thread->joinable()) + { + m_thread->join(); + m_thread.reset(); + } +} + +void sdl_camera_video_sink::present(SDL_Surface* frame) +{ + const int bytes_per_pixel = SDL_BYTESPERPIXEL(frame->format); + const u32 src_width_in_bytes = std::max(0, frame->w * bytes_per_pixel); + const u32 dst_width_in_bytes = std::max(0, m_width * bytes_per_pixel); + const u8* pixels = reinterpret_cast(frame->pixels); + + bool use_buffer = false; + + // Scale image if necessary + const bool scale_image = m_width > 0 && m_height > 0 && m_width != static_cast(frame->w) && m_height != static_cast(frame->h); + + // Determine image flip + const camera_flip flip_setting = g_cfg.io.camera_flip_option; + + bool flip_horizontally = m_front_facing; // Front facing cameras are flipped already + if (flip_setting == camera_flip::horizontal || flip_setting == camera_flip::both) + { + flip_horizontally = !flip_horizontally; + } + if (m_mirrored) // Set by the game + { + flip_horizontally = !flip_horizontally; + } + + bool flip_vertically = false; + if (flip_setting == camera_flip::vertical || flip_setting == camera_flip::both) + { + flip_vertically = !flip_vertically; + } + + // Flip image if necessary + if (flip_horizontally || flip_vertically || scale_image) + { + m_buffer.resize(m_height * dst_width_in_bytes); + use_buffer = true; + + if (m_width > 0 && m_height > 0 && frame->w > 0 && frame->h > 0) + { + const f32 scale_x = frame->w / static_cast(m_width); + const f32 scale_y = frame->h / static_cast(m_height); + + if (flip_horizontally && flip_vertically) + { + for (u32 y = 0; y < m_height; y++) + { + const u32 src_y = frame->h - static_cast(scale_y * y) - 1; + const u8* src = pixels + src_y * src_width_in_bytes; + u8* dst = &m_buffer[y * dst_width_in_bytes]; + + for (u32 x = 0; x < m_width; x++) + { + const u32 src_x = frame->w - static_cast(scale_x * x) - 1; + std::memcpy(dst + x * bytes_per_pixel, src + src_x * bytes_per_pixel, bytes_per_pixel); + } + } + } + else if (flip_horizontally) + { + for (u32 y = 0; y < m_height; y++) + { + const u32 src_y = static_cast(scale_y * y); + const u8* src = pixels + src_y * src_width_in_bytes; + u8* dst = &m_buffer[y * dst_width_in_bytes]; + + for (u32 x = 0; x < m_width; x++) + { + const u32 src_x = frame->w - static_cast(scale_x * x) - 1; + std::memcpy(dst + x * bytes_per_pixel, src + src_x * bytes_per_pixel, bytes_per_pixel); + } + } + } + else if (flip_vertically) + { + for (u32 y = 0; y < m_height; y++) + { + const u32 src_y = frame->h - static_cast(scale_y * y) - 1; + const u8* src = pixels + src_y * src_width_in_bytes; + u8* dst = &m_buffer[y * dst_width_in_bytes]; + + for (u32 x = 0; x < m_width; x++) + { + const u32 src_x = static_cast(scale_x * x); + std::memcpy(dst + x * bytes_per_pixel, src + src_x * bytes_per_pixel, bytes_per_pixel); + } + } + } + else + { + for (u32 y = 0; y < m_height; y++) + { + const u32 src_y = static_cast(scale_y * y); + const u8* src = pixels + src_y * src_width_in_bytes; + u8* dst = &m_buffer[y * dst_width_in_bytes]; + + for (u32 x = 0; x < m_width; x++) + { + const u32 src_x = static_cast(scale_x * x); + std::memcpy(dst + x * bytes_per_pixel, src + src_x * bytes_per_pixel, bytes_per_pixel); + } + } + } + } + } + + if (use_buffer) + { + camera_video_sink::present(m_width, m_height, dst_width_in_bytes, bytes_per_pixel, [src = m_buffer.data(), dst_width_in_bytes](u32 y){ return src + y * dst_width_in_bytes; }); + } + else + { + camera_video_sink::present(frame->w, frame->h, frame->pitch, bytes_per_pixel, [pixels, pitch = frame->pitch](u32 y){ return pixels + y * pitch; }); + } +} + +void sdl_camera_video_sink::run() +{ + thread_base::set_name("SDL Capture Thread"); + + camera_log.notice("SDL Capture Thread started"); + + while (!m_terminate) + { + // Copy latest image into out buffer. + u64 timestamp_ns = 0; + SDL_Surface* frame = SDL_AcquireCameraFrame(m_camera, ×tamp_ns); + if (!frame) + { + // No new frame + std::this_thread::sleep_for(100us); + continue; + } + + present(frame); + + SDL_ReleaseCameraFrame(m_camera, frame); + } +} + +#endif diff --git a/rpcs3/Input/sdl_camera_video_sink.h b/rpcs3/Input/sdl_camera_video_sink.h new file mode 100644 index 0000000000..010834ff58 --- /dev/null +++ b/rpcs3/Input/sdl_camera_video_sink.h @@ -0,0 +1,34 @@ +#pragma once + +#ifdef HAVE_SDL3 + +#include "Input/camera_video_sink.h" + +#ifndef _MSC_VER +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" +#endif +#include "SDL3/SDL.h" +#ifndef _MSC_VER +#pragma GCC diagnostic pop +#endif + +#include + +class sdl_camera_video_sink final : public camera_video_sink +{ +public: + sdl_camera_video_sink(bool front_facing, SDL_Camera* camera); + virtual ~sdl_camera_video_sink(); + +private: + void present(SDL_Surface* frame); + void run(); + + std::vector m_buffer; + atomic_t m_terminate = false; + SDL_Camera* m_camera = nullptr; + std::unique_ptr m_thread; +}; + +#endif diff --git a/rpcs3/Input/sdl_instance.cpp b/rpcs3/Input/sdl_instance.cpp index 7310cf5f8c..9850974492 100644 --- a/rpcs3/Input/sdl_instance.cpp +++ b/rpcs3/Input/sdl_instance.cpp @@ -102,7 +102,7 @@ bool sdl_instance::initialize_impl() set_hint(SDL_HINT_JOYSTICK_HIDAPI_PS3, "1"); #endif - if (!SDL_Init(SDL_INIT_GAMEPAD | SDL_INIT_HAPTIC)) + if (!SDL_Init(SDL_INIT_GAMEPAD | SDL_INIT_HAPTIC | SDL_INIT_CAMERA)) { sdl_log.error("Could not initialize! SDL Error: %s", SDL_GetError()); return false; diff --git a/rpcs3/headless_application.cpp b/rpcs3/headless_application.cpp index 58047671a6..135a61c491 100644 --- a/rpcs3/headless_application.cpp +++ b/rpcs3/headless_application.cpp @@ -102,6 +102,9 @@ void headless_application::InitializeCallbacks() return std::make_shared(); } case camera_handler::qt: +#ifdef HAVE_SDL3 + case camera_handler::sdl: +#endif { fmt::throw_exception("Headless mode can not be used with this camera handler. Current handler: %s", g_cfg.io.camera.get()); } diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 83de843746..9bef8696fe 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -201,6 +201,8 @@ + + @@ -1070,6 +1072,8 @@ + + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index fbe4fa4132..5d9f844e63 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1248,6 +1248,12 @@ Io\camera + + Io\camera + + + Io\camera + @@ -1481,6 +1487,12 @@ Io\camera + + Io\camera + + + Io\camera + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index ba6d95806a..9352f58823 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -163,8 +163,10 @@ add_library(rpcs3_ui STATIC ../Input/ps_move_tracker.cpp ../Input/raw_mouse_config.cpp ../Input/raw_mouse_handler.cpp - ../Input/sdl_pad_handler.cpp + ../Input/sdl_camera_handler.cpp + ../Input/sdl_camera_video_sink.cpp ../Input/sdl_instance.cpp + ../Input/sdl_pad_handler.cpp ../Input/skateboard_pad_handler.cpp ../Input/xinput_pad_handler.cpp diff --git a/rpcs3/rpcs3qt/camera_settings_dialog.cpp b/rpcs3/rpcs3qt/camera_settings_dialog.cpp index e680dd0436..9bbac21ea4 100644 --- a/rpcs3/rpcs3qt/camera_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/camera_settings_dialog.cpp @@ -12,6 +12,11 @@ #include #include +#ifdef HAVE_SDL3 +#include "Input/sdl_instance.h" +#include "Input/sdl_camera_handler.h" +#endif + LOG_CHANNEL(camera_log, "Camera"); template <> @@ -56,6 +61,81 @@ void fmt_class_string::format(std::string& out, }); } +#ifdef HAVE_SDL3 +static QString sdl_pixelformat_to_string(SDL_PixelFormat format) +{ + switch (format) + { + case SDL_PixelFormat::SDL_PIXELFORMAT_UNKNOWN: return "UNKNOWN"; + case SDL_PixelFormat::SDL_PIXELFORMAT_INDEX1LSB: return "INDEX1LSB"; + case SDL_PixelFormat::SDL_PIXELFORMAT_INDEX1MSB: return "INDEX1MSB"; + case SDL_PixelFormat::SDL_PIXELFORMAT_INDEX2LSB: return "INDEX2LSB"; + case SDL_PixelFormat::SDL_PIXELFORMAT_INDEX2MSB: return "INDEX2MSB"; + case SDL_PixelFormat::SDL_PIXELFORMAT_INDEX4LSB: return "INDEX4LSB"; + case SDL_PixelFormat::SDL_PIXELFORMAT_INDEX4MSB: return "INDEX4MSB"; + case SDL_PixelFormat::SDL_PIXELFORMAT_INDEX8: return "INDEX8"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGB332: return "RGB332"; + case SDL_PixelFormat::SDL_PIXELFORMAT_XRGB4444: return "XRGB4444"; + case SDL_PixelFormat::SDL_PIXELFORMAT_XBGR4444: return "XBGR4444"; + case SDL_PixelFormat::SDL_PIXELFORMAT_XRGB1555: return "XRGB1555"; + case SDL_PixelFormat::SDL_PIXELFORMAT_XBGR1555: return "XBGR1555"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ARGB4444: return "ARGB4444"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGBA4444: return "RGBA4444"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ABGR4444: return "ABGR4444"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGRA4444: return "BGRA4444"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ARGB1555: return "ARGB1555"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGBA5551: return "RGBA5551"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ABGR1555: return "ABGR1555"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGRA5551: return "BGRA5551"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGB565: return "RGB565"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGR565: return "BGR565"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGB24: return "RGB24"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGR24: return "BGR24"; + case SDL_PixelFormat::SDL_PIXELFORMAT_XRGB8888: return "XRGB8888"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGBX8888: return "RGBX8888"; + case SDL_PixelFormat::SDL_PIXELFORMAT_XBGR8888: return "XBGR8888"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGRX8888: return "BGRX8888"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ARGB8888: return "ARGB8888"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGBA8888: return "RGBA8888"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ABGR8888: return "ABGR8888"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGRA8888: return "BGRA8888"; + case SDL_PixelFormat::SDL_PIXELFORMAT_XRGB2101010: return "XRGB2101010"; + case SDL_PixelFormat::SDL_PIXELFORMAT_XBGR2101010: return "XBGR2101010"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ARGB2101010: return "ARGB2101010"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ABGR2101010: return "ABGR2101010"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGB48: return "RGB48"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGR48: return "BGR48"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGBA64: return "RGBA64"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ARGB64: return "ARGB64"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGRA64: return "BGRA64"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ABGR64: return "ABGR64"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGB48_FLOAT: return "RGB48_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGR48_FLOAT: return "BGR48_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGBA64_FLOAT: return "RGBA64_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ARGB64_FLOAT: return "ARGB64_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGRA64_FLOAT: return "BGRA64_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ABGR64_FLOAT: return "ABGR64_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGB96_FLOAT: return "RGB96_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGR96_FLOAT: return "BGR96_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_RGBA128_FLOAT: return "RGBA128_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ARGB128_FLOAT: return "ARGB128_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_BGRA128_FLOAT: return "BGRA128_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_ABGR128_FLOAT: return "ABGR128_FLOAT"; + case SDL_PixelFormat::SDL_PIXELFORMAT_YV12: return "YV12"; + case SDL_PixelFormat::SDL_PIXELFORMAT_IYUV: return "IYUV"; + case SDL_PixelFormat::SDL_PIXELFORMAT_YUY2: return "YUY2"; + case SDL_PixelFormat::SDL_PIXELFORMAT_UYVY: return "UYVY"; + case SDL_PixelFormat::SDL_PIXELFORMAT_YVYU: return "YVYU"; + case SDL_PixelFormat::SDL_PIXELFORMAT_NV12: return "NV12"; + case SDL_PixelFormat::SDL_PIXELFORMAT_NV21: return "NV21"; + case SDL_PixelFormat::SDL_PIXELFORMAT_P010: return "P010"; + case SDL_PixelFormat::SDL_PIXELFORMAT_EXTERNAL_OES: return "EXTERNAL_OES"; + case SDL_PixelFormat::SDL_PIXELFORMAT_MJPG: return "MJPG"; + default: return QObject::tr("Unknown: %0").arg(static_cast(format)); + } +} +#endif + Q_DECLARE_METATYPE(QCameraDevice); camera_settings_dialog::camera_settings_dialog(QWidget* parent) @@ -69,6 +149,9 @@ camera_settings_dialog::camera_settings_dialog(QWidget* parent) load_config(); ui->combo_handlers->addItem("Qt", QVariant::fromValue(static_cast(camera_handler::qt))); +#ifdef HAVE_SDL3 + ui->combo_handlers->addItem("SDL", QVariant::fromValue(static_cast(camera_handler::sdl))); +#endif connect(ui->combo_handlers, &QComboBox::currentIndexChanged, this, &camera_settings_dialog::handle_handler_change); connect(ui->combo_camera, &QComboBox::currentIndexChanged, this, &camera_settings_dialog::handle_camera_change); @@ -115,6 +198,24 @@ void camera_settings_dialog::reset_cameras() { m_media_capture_session.reset(); m_camera.reset(); + +#ifdef HAVE_SDL3 + m_video_frame_input.reset(); + + if (m_sdl_thread) + { + auto& thread = *m_sdl_thread; + thread = thread_state::aborting; + thread(); + m_sdl_thread.reset(); + } + + if (m_sdl_camera) + { + SDL_CloseCamera(m_sdl_camera); + m_sdl_camera = nullptr; + } +#endif } void camera_settings_dialog::handle_handler_change(int index) @@ -149,6 +250,29 @@ void camera_settings_dialog::handle_handler_change(int index) } break; } +#ifdef HAVE_SDL3 + case camera_handler::sdl: + { + if (!sdl_instance::get_instance().initialize()) + { + camera_log.error("Could not initialize SDL"); + break; + } + + // Log camera drivers + sdl_camera_handler::get_drivers(); + + // Get cameras + const std::map cameras = sdl_camera_handler::get_cameras(); + + // Add cameras + for (const auto& [camera_id, name] : cameras) + { + ui->combo_camera->addItem(QString::fromStdString(name), QVariant::fromValue(static_cast(camera_id))); + } + break; + } +#endif default: fmt::throw_exception("Unexpected camera handler %d", static_cast(m_handler)); } @@ -174,6 +298,11 @@ void camera_settings_dialog::handle_camera_change(int index) case camera_handler::qt: handle_qt_camera_change(ui->combo_camera->itemData(index)); break; +#ifdef HAVE_SDL3 + case camera_handler::sdl: + handle_sdl_camera_change(ui->combo_camera->itemText(index), ui->combo_camera->itemData(index)); + break; +#endif default: fmt::throw_exception("Unexpected camera handler %d", static_cast(m_handler)); } @@ -198,6 +327,11 @@ void camera_settings_dialog::handle_settings_change(int index) case camera_handler::qt: handle_qt_settings_change(ui->combo_settings->itemData(index)); break; +#ifdef HAVE_SDL3 + case camera_handler::sdl: + handle_sdl_settings_change(ui->combo_settings->itemData(index)); + break; +#endif default: fmt::throw_exception("Unexpected camera handler %d", static_cast(m_handler)); } @@ -339,6 +473,230 @@ void camera_settings_dialog::handle_qt_settings_change(const QVariant& item_data m_camera->start(); } +#ifdef HAVE_SDL3 +void camera_settings_dialog::handle_sdl_camera_change(const QString& name, const QVariant& item_data) +{ + if (!item_data.canConvert()) + { + ui->combo_settings->clear(); + return; + } + + const u32 camera_id = item_data.value(); + + if (!camera_id) + { + ui->combo_settings->clear(); + return; + } + + ui->combo_settings->blockSignals(true); + ui->combo_settings->clear(); + + std::vector settings; + + int num_formats = 0; + if (SDL_CameraSpec** specs = SDL_GetCameraSupportedFormats(camera_id, &num_formats)) + { + if (num_formats <= 0) + { + camera_log.error("No SDL camera specs found"); + } + else + { + for (int i = 0; i < num_formats; i++) + { + if (!specs[i]) continue; + settings.push_back(*specs[i]); + } + } + SDL_free(specs); + } + else + { + camera_log.error("No SDL camera specs found. SDL Error: %s", SDL_GetError()); + } + + std::sort(settings.begin(), settings.end(), [](const SDL_CameraSpec& l, const SDL_CameraSpec& r) -> bool + { + const f32 l_fps = l.framerate_numerator / static_cast(l.framerate_denominator); + const f32 r_fps = r.framerate_numerator / static_cast(r.framerate_denominator); + + if (l.width > r.width) return true; + if (l.width < r.width) return false; + if (l.height > r.height) return true; + if (l.height < r.height) return false; + if (l_fps > r_fps) return true; + if (l_fps < r_fps) return false; + if (l.format > r.format) return true; + if (l.format < r.format) return false; + if (l.colorspace > r.colorspace) return true; + if (l.colorspace < r.colorspace) return false; + return false; + }); + + for (const SDL_CameraSpec& setting : settings) + { + const f32 fps = setting.framerate_numerator / static_cast(setting.framerate_denominator); + const QString description = tr("%0x%1, %2 FPS, Format=%3") + .arg(setting.width) + .arg(setting.height) + .arg(fps) + .arg(sdl_pixelformat_to_string(setting.format)); + ui->combo_settings->addItem(description, QVariant::fromValue(setting)); + } + ui->combo_settings->blockSignals(false); + + if (ui->combo_settings->count() == 0) + { + ui->combo_settings->setEnabled(false); + return; + } + + // Load selected settings from config file + int index = 0; + bool success = false; + cfg_camera::camera_setting cfg_setting = g_cfg_camera.get_camera_setting(fmt::format("%s", camera_handler::sdl), name.toStdString(), success); + + if (success) + { + camera_log.notice("Found config entry for camera \"%s\"", name); + + // Select matching dropdown entry + constexpr double epsilon = 0.001; + + for (int i = 0; i < ui->combo_settings->count(); i++) + { + const QVariant var = ui->combo_settings->itemData(i); + if (!var.canConvert()) + { + camera_log.error("Failed to convert itemData to SDL_CameraSpec"); + continue; + } + + const SDL_CameraSpec tmp = var.value(); + const f32 fps = tmp.framerate_numerator / static_cast(tmp.framerate_denominator); + + if (tmp.width == cfg_setting.width && + tmp.height == cfg_setting.height && + fps >= (cfg_setting.min_fps - epsilon) && + fps <= (cfg_setting.min_fps + epsilon) && + fps >= (cfg_setting.max_fps - epsilon) && + fps <= (cfg_setting.max_fps + epsilon) && + tmp.format == static_cast(cfg_setting.format) && + tmp.colorspace == static_cast(cfg_setting.colorspace)) + { + index = i; + break; + } + } + } + + m_sdl_camera_id = camera_id; + + ui->combo_settings->setCurrentIndex(std::max(0, index)); + ui->combo_settings->setEnabled(true); +} + +void camera_settings_dialog::handle_sdl_settings_change(const QVariant& item_data) +{ + reset_cameras(); + + if (item_data.canConvert()) + { + // TODO: SDL converts the image for us. We would have to do this manually if we want to use other formats. + const SDL_CameraSpec setting = item_data.value(); + const SDL_CameraSpec used_spec + { + .format = SDL_PixelFormat::SDL_PIXELFORMAT_RGBA32, + .colorspace = SDL_Colorspace::SDL_COLORSPACE_RGB_DEFAULT, + .width = setting.width, + .height = setting.height, + .framerate_numerator = setting.framerate_numerator, + .framerate_denominator = setting.framerate_denominator + }; + + m_sdl_camera = SDL_OpenCamera(m_sdl_camera_id, &used_spec); + + m_video_frame_input = std::make_unique(); + + m_media_capture_session = std::make_unique(nullptr); + m_media_capture_session->setVideoFrameInput(m_video_frame_input.get()); + m_media_capture_session->setVideoOutput(ui->videoWidget); + + connect(this, &camera_settings_dialog::sdl_frame_ready, m_video_frame_input.get(), [this]() + { + // It was observed that connecting sendVideoFrame directly can soft-lock the software. + // So let's just create the video frame here and call it manually. + std::unique_lock lock(m_sdl_image_mutex, std::defer_lock); + if (lock.try_lock() && m_video_frame_input && !m_sdl_image.isNull()) + { + const QVideoFrame video_frame(m_sdl_image); + if (video_frame.isValid()) + { + m_video_frame_input->sendVideoFrame(video_frame); + } + } + }); + + const f32 fps = setting.framerate_numerator / static_cast(setting.framerate_denominator); + + cfg_camera::camera_setting cfg_setting {}; + cfg_setting.width = setting.width; + cfg_setting.height = setting.height; + cfg_setting.min_fps = fps; + cfg_setting.max_fps = fps; + cfg_setting.format = static_cast(setting.format); + cfg_setting.colorspace = static_cast(setting.colorspace); + g_cfg_camera.set_camera_setting(fmt::format("%s", camera_handler::sdl), ui->combo_camera->currentText().toStdString(), cfg_setting); + } + + if (!m_sdl_camera) + { + camera_log.error("Failed to open SDL camera %d. SDL Error: %s", m_sdl_camera_id, SDL_GetError()); + QMessageBox::warning(this, tr("Camera not available"), tr("The selected camera is not available.\nIt might be blocked by another application.")); + return; + } + + m_sdl_thread = std::make_unique>>("GUI SDL Capture Thread", [this](){ run_sdl(); }); +} + +void camera_settings_dialog::run_sdl() +{ + camera_log.notice("GUI SDL Capture Thread started"); + + while (thread_ctrl::state() != thread_state::aborting) + { + // Copy latest image into out buffer. + u64 timestamp_ns = 0; + SDL_Surface* frame = SDL_AcquireCameraFrame(m_sdl_camera, ×tamp_ns); + if (!frame) + { + // No new frame + thread_ctrl::wait_for(1000); + continue; + } + + { + // Map image + const QImage::Format format = SDL_ISPIXELFORMAT_ALPHA(frame->format) ? QImage::Format_RGBA8888 : QImage::Format_RGB888; + const QImage image = QImage(reinterpret_cast(frame->pixels), frame->w, frame->h, format); + + // Copy image to prevent memory access violations + { + std::lock_guard lock(m_sdl_image_mutex); + m_sdl_image = image.copy(); + } + + // Notify UI + Q_EMIT sdl_frame_ready(); + } + + SDL_ReleaseCameraFrame(m_sdl_camera, frame); + } +} +#endif + void camera_settings_dialog::load_config() { if (!g_cfg_camera.load()) diff --git a/rpcs3/rpcs3qt/camera_settings_dialog.h b/rpcs3/rpcs3qt/camera_settings_dialog.h index b7c0750c2c..879686722f 100644 --- a/rpcs3/rpcs3qt/camera_settings_dialog.h +++ b/rpcs3/rpcs3qt/camera_settings_dialog.h @@ -1,10 +1,25 @@ #pragma once #include "Emu/system_config_types.h" +#include "Utilities/Thread.h" #include #include #include +#include + +#include + +#ifdef HAVE_SDL3 +#ifndef _MSC_VER +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" +#endif +#include "SDL3/SDL.h" +#ifndef _MSC_VER +#pragma GCC diagnostic pop +#endif +#endif namespace Ui { @@ -19,6 +34,9 @@ public: camera_settings_dialog(QWidget* parent = nullptr); virtual ~camera_settings_dialog(); +Q_SIGNALS: + void sdl_frame_ready(); + private Q_SLOTS: void handle_handler_change(int index); void handle_camera_change(int index); @@ -34,6 +52,20 @@ private: void handle_qt_camera_change(const QVariant& item_data); void handle_qt_settings_change(const QVariant& item_data); +#ifdef HAVE_SDL3 + void handle_sdl_camera_change(const QString& name, const QVariant& item_data); + void handle_sdl_settings_change(const QVariant& item_data); + + void run_sdl(); + + SDL_Camera* m_sdl_camera = nullptr; + SDL_CameraID m_sdl_camera_id = 0; + QImage m_sdl_image; + std::mutex m_sdl_image_mutex; + std::unique_ptr>> m_sdl_thread; + std::unique_ptr m_video_frame_input; +#endif + std::unique_ptr ui; std::unique_ptr m_camera; std::unique_ptr m_media_capture_session; diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index 935bfd2cc8..20bb58ba93 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -1119,6 +1119,9 @@ QString emu_settings::GetLocalizedSetting(const QString& original, emu_settings_ case camera_handler::null: return tr("Null", "Camera handler"); case camera_handler::fake: return tr("Fake", "Camera handler"); case camera_handler::qt: return tr("Qt", "Camera handler"); +#ifdef HAVE_SDL3 + case camera_handler::sdl: return tr("SDL", "Camera handler"); +#endif } break; case emu_settings_type::MusicHandler: diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index 443dcb4e0c..113f5a6ebb 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -20,6 +20,10 @@ #include "_discord_utils.h" #endif +#ifdef HAVE_SDL3 +#include "Input/sdl_camera_handler.h" +#endif + #include "Emu/Audio/audio_utils.h" #include "Emu/Cell/Modules/cellSysutil.h" #include "Emu/Io/Null/null_camera_handler.h" @@ -696,6 +700,12 @@ void gui_application::InitializeCallbacks() { return std::make_shared(); } +#ifdef HAVE_SDL3 + case camera_handler::sdl: + { + return std::make_shared(); + } +#endif } return nullptr; }; From e65755d68de345d14f8a4c0e8a71cfc63248fe7e Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Sat, 3 Jan 2026 00:53:39 +0000 Subject: [PATCH 060/630] Unify & optimise Mac build script --- .ci/build-mac-arm64.sh | 121 ----------------------------------------- .ci/build-mac.sh | 116 ++++++++++++++++++++------------------- 2 files changed, 59 insertions(+), 178 deletions(-) delete mode 100755 .ci/build-mac-arm64.sh diff --git a/.ci/build-mac-arm64.sh b/.ci/build-mac-arm64.sh deleted file mode 100755 index 043e421d80..0000000000 --- a/.ci/build-mac-arm64.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/bin/sh -ex - -# shellcheck disable=SC2086 -export HOMEBREW_NO_AUTO_UPDATE=1 -export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 -export HOMEBREW_NO_ENV_HINTS=1 -export HOMEBREW_NO_INSTALL_CLEANUP=1 - -brew install -f --overwrite --quiet googletest opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader -brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative - -brew link -f --quiet "llvm@$LLVM_COMPILER_VER" ffmpeg@5 - -# moltenvk based on commit for 1.4.0 release -export HOMEBREW_DEVELOPER=1 # Prevents blocking of local formulae -wget https://raw.githubusercontent.com/Homebrew/homebrew-core/ea2bec5f1f4384e188d7fc0702ab21a20a2ced08/Formula/m/molten-vk.rb -/opt/homebrew/bin/brew install -f --overwrite --formula --quiet ./molten-vk.rb -export HOMEBREW_DEVELOPER=0 - -export CXX=clang++ -export CC=clang - -export BREW_PATH; -BREW_PATH="$(brew --prefix)" -export BREW_BIN="/opt/homebrew/bin" -export BREW_SBIN="/opt/homebrew/sbin" -export CMAKE_EXTRA_OPTS='-DLLVM_TARGETS_TO_BUILD=arm64' - -export WORKDIR; -WORKDIR="$(pwd)" - -# Setup ccache -if [ ! -d "$CCACHE_DIR" ]; then - mkdir -p "$CCACHE_DIR" -fi - -# Get Qt -if [ ! -d "/tmp/Qt/$QT_VER" ]; then - mkdir -p "/tmp/Qt" - git clone https://github.com/engnr/qt-downloader.git - cd qt-downloader - git checkout f52efee0f18668c6d6de2dec0234b8c4bc54c597 - sed -i '' "s/'qt{0}_{0}{1}{2}'.format(major, minor, patch)]))/'qt{0}_{0}{1}{2}'.format(major, minor, patch), 'qt{0}_{0}{1}{2}'.format(major, minor, patch)]))/g" qt-downloader - sed -i '' "s/'{}\/{}\/qt{}_{}\/'/'{0}\/{1}\/qt{2}_{3}\/qt{2}_{3}\/'/g" qt-downloader - cd "/tmp/Qt" - pip3 install py7zr requests semantic_version lxml --no-cache --break-system-packages - mkdir -p "$QT_VER/macos" ; ln -s "macos" "$QT_VER/clang_64" - sed -i '' 's/args\.version \/ derive_toolchain_dir(args) \/ //g' "$WORKDIR/qt-downloader/qt-downloader" - python3 "$WORKDIR/qt-downloader/qt-downloader" macos desktop "$QT_VER" clang_64 --opensource --addons qtmultimedia qtimageformats -o "$QT_VER/clang_64" -fi - -cd "$WORKDIR" -ditto "/tmp/Qt/$QT_VER" "qt-downloader/$QT_VER" - -export Qt6_DIR="$WORKDIR/qt-downloader/$QT_VER/clang_64/lib/cmake/Qt$QT_VER_MAIN" -export SDL3_DIR="$BREW_PATH/opt/sdl3/lib/cmake/SDL3" - -export PATH="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/bin:$WORKDIR/qt-downloader/$QT_VER/clang_64/bin:$BREW_BIN:$BREW_SBIN:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin:$PATH" -export LDFLAGS="-L$BREW_PATH/lib $BREW_PATH/opt/ffmpeg@5/lib/libavcodec.dylib $BREW_PATH/opt/ffmpeg@5/lib/libavformat.dylib $BREW_PATH/opt/ffmpeg@5/lib/libavutil.dylib $BREW_PATH/opt/ffmpeg@5/lib/libswscale.dylib $BREW_PATH/opt/ffmpeg@5/lib/libswresample.dylib $BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/c++/libc++.1.dylib $BREW_PATH/lib/libSDL3.dylib $BREW_PATH/lib/libGLEW.dylib $BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/unwind/libunwind.1.dylib -Wl,-rpath,$BREW_PATH/lib" -export CPPFLAGS="-I$BREW_PATH/include -D__MAC_OS_X_VERSION_MIN_REQUIRED=144000" -export CFLAGS="-D__MAC_OS_X_VERSION_MIN_REQUIRED=144000" -export LIBRARY_PATH="$BREW_PATH/lib" -export LD_LIBRARY_PATH="$BREW_PATH/lib" - -export VULKAN_SDK -VULKAN_SDK="$BREW_PATH/opt/molten-vk" -ln -s "$BREW_PATH/opt/vulkan-loader/lib/libvulkan.dylib" "$VULKAN_SDK/lib/libvulkan.dylib" || true - -export LLVM_DIR -LLVM_DIR="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER" -# exclude ffmpeg, LLVM, opencv, and sdl from submodule update -# shellcheck disable=SC2046 -git submodule -q update --init --depth=1 --jobs=8 $(awk '/path/ && !/ffmpeg/ && !/llvm/ && !/opencv/ && !/SDL/ && !/feralinteractive/ { print $3 }' .gitmodules) - -mkdir build && cd build || exit 1 - -export MACOSX_DEPLOYMENT_TARGET=14.4 - -"$BREW_PATH/bin/cmake" .. \ - -DBUILD_RPCS3_TESTS="${RUN_UNIT_TESTS}" \ - -DRUN_RPCS3_TESTS="${RUN_UNIT_TESTS}" \ - -DUSE_SDL=ON \ - -DUSE_DISCORD_RPC=ON \ - -DUSE_VULKAN=ON \ - -DUSE_ALSA=OFF \ - -DUSE_PULSE=OFF \ - -DUSE_AUDIOUNIT=ON \ - -DUSE_SYSTEM_FFMPEG=ON \ - -DLLVM_CCACHE_BUILD=OFF \ - -DLLVM_BUILD_RUNTIME=OFF \ - -DLLVM_BUILD_TOOLS=OFF \ - -DLLVM_INCLUDE_DOCS=OFF \ - -DLLVM_INCLUDE_EXAMPLES=OFF \ - -DLLVM_INCLUDE_TESTS=OFF \ - -DLLVM_INCLUDE_TOOLS=OFF \ - -DLLVM_INCLUDE_UTILS=OFF \ - -DLLVM_USE_PERF=OFF \ - -DLLVM_ENABLE_Z3_SOLVER=OFF \ - -DUSE_NATIVE_INSTRUCTIONS=OFF \ - -DUSE_SYSTEM_MVK=ON \ - -DUSE_SYSTEM_FAUDIO=OFF \ - -DUSE_SYSTEM_SDL=ON \ - -DUSE_SYSTEM_OPENCV=ON \ - "$CMAKE_EXTRA_OPTS" \ - -DLLVM_TARGET_ARCH=arm64 \ - -DCMAKE_OSX_ARCHITECTURES=arm64 \ - -DCMAKE_IGNORE_PATH="$BREW_PATH/lib" \ - -DCMAKE_IGNORE_PREFIX_PATH=/opt/homebrew/opt \ - -DCMAKE_CXX_FLAGS="-D__MAC_OS_X_VERSION_MIN_REQUIRED=144000" \ - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ - -DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \ - -G Ninja - -"$BREW_PATH/bin/ninja"; build_status=$?; - -cd .. - -# If it compiled succesfully let's deploy. -if [ "$build_status" -eq 0 ]; then - .ci/deploy-mac-arm64.sh -fi diff --git a/.ci/build-mac.sh b/.ci/build-mac.sh index e391e3e575..7c62fdc631 100755 --- a/.ci/build-mac.sh +++ b/.ci/build-mac.sh @@ -1,36 +1,43 @@ #!/bin/sh -ex -# shellcheck disable=SC2086 export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 export HOMEBREW_NO_ENV_HINTS=1 export HOMEBREW_NO_INSTALL_CLEANUP=1 - brew install -f --overwrite --quiet ccache "llvm@$LLVM_COMPILER_VER" brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" -# shellcheck disable=SC3009 -arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader -arch -x86_64 /usr/local/bin/brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative -arch -x86_64 /usr/local/bin/brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" ffmpeg@5 +if [ "$AARCH64" -eq 1 ]; then + brew install -f --overwrite --quiet googletest opencv@4 sdl3 vulkan-headers vulkan-loader molten-vk + brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative +else + arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader molten-vk + arch -x86_64 /usr/local/bin/brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative + arch -x86_64 /usr/local/bin/brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" +fi -# moltenvk based on commit for 1.4.0 release -export HOMEBREW_DEVELOPER=1 # Prevents blocking of local formulae -wget https://raw.githubusercontent.com/Homebrew/homebrew-core/ea2bec5f1f4384e188d7fc0702ab21a20a2ced08/Formula/m/molten-vk.rb -arch -x86_64 /usr/local/bin/brew install -f --overwrite --formula --quiet ./molten-vk.rb -export HOMEBREW_DEVELOPER=0 export CXX=clang++ export CC=clang -export BREW_X64_PATH; -BREW_X64_PATH="$("/usr/local/bin/brew" --prefix)" -export BREW_BIN="/usr/local/bin" -export BREW_SBIN="/usr/local/sbin" -export CMAKE_EXTRA_OPTS='-DLLVM_TARGETS_TO_BUILD=X86' +export BREW_PATH; +if [ "$AARCH64" -eq 1 ]; then + BREW_PATH="$(brew --prefix)" + export BREW_BIN="/opt/homebrew/bin" + export BREW_SBIN="/opt/homebrew/sbin" +else + BREW_PATH="$("/usr/local/bin/brew" --prefix)" + export BREW_BIN="/usr/local/bin" + export BREW_SBIN="/usr/local/sbin" +fi export WORKDIR; WORKDIR="$(pwd)" +# Setup ccache +if [ ! -d "$CCACHE_DIR" ]; then + mkdir -p "$CCACHE_DIR" +fi + # Get Qt if [ ! -d "/tmp/Qt/$QT_VER" ]; then mkdir -p "/tmp/Qt" @@ -50,68 +57,63 @@ cd "$WORKDIR" ditto "/tmp/Qt/$QT_VER" "qt-downloader/$QT_VER" export Qt6_DIR="$WORKDIR/qt-downloader/$QT_VER/clang_64/lib/cmake/Qt$QT_VER_MAIN" -export SDL3_DIR="$BREW_X64_PATH/opt/sdl3/lib/cmake/SDL3" +export SDL3_DIR="$BREW_PATH/opt/sdl3/lib/cmake/SDL3" -export PATH="/opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/bin:$WORKDIR/qt-downloader/$QT_VER/clang_64/bin:$BREW_BIN:$BREW_SBIN:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin:$PATH" -# shellcheck disable=SC2155 -export LDFLAGS="-L$BREW_X64_PATH/lib -Wl,-rpath,$BREW_X64_PATH/lib,-L$(brew --prefix llvm)/lib/c++" -export CPPFLAGS="-I$BREW_X64_PATH/include -msse -msse2 -mcx16 -D__MAC_OS_X_VERSION_MIN_REQUIRED=144000" -export CFLAGS="-D__MAC_OS_X_VERSION_MIN_REQUIRED=144000" -export LIBRARY_PATH="$BREW_X64_PATH/opt/llvm@$LLVM_COMPILER_VER/lib:$BREW_X64_PATH/lib" -export LD_LIBRARY_PATH="$BREW_X64_PATH/opt/llvm@$LLVM_COMPILER_VER/lib:$BREW_X64_PATH/lib" +export PATH="/opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/bin:$PATH" +export LDFLAGS="-L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/c++ -L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/unwind -lunwind" export VULKAN_SDK -VULKAN_SDK="$BREW_X64_PATH/opt/molten-vk" -ln -s "$BREW_X64_PATH/opt/vulkan-loader/lib/libvulkan.dylib" "$VULKAN_SDK/lib/libvulkan.dylib" +VULKAN_SDK="$BREW_PATH/opt/molten-vk" +ln -s "$BREW_PATH/opt/vulkan-loader/lib/libvulkan.dylib" "$VULKAN_SDK/lib/libvulkan.dylib" export LLVM_DIR -LLVM_DIR="$BREW_X64_PATH/opt/llvm@$LLVM_COMPILER_VER" -# exclude ffmpeg, LLVM, opencv, and sdl from submodule update +LLVM_DIR="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER" +# Pull all the submodules except some # shellcheck disable=SC2046 -git submodule -q update --init --depth=1 --jobs=8 $(awk '/path/ && !/ffmpeg/ && !/llvm/ && !/opencv/ && !/SDL/ && !/feralinteractive/ { print $3 }' .gitmodules) +git submodule -q update --init --depth=1 --jobs=8 $(awk '/path/ && !/llvm/ && !/opencv/ && !/SDL/ && !/feralinteractive/ { print $3 }' .gitmodules) mkdir build && cd build || exit 1 -export MACOSX_DEPLOYMENT_TARGET=14.4 - -"/opt/homebrew/bin/cmake" .. \ - -DBUILD_RPCS3_TESTS=OFF \ - -DRUN_RPCS3_TESTS=OFF \ +if [ "$AARCH64" -eq 1 ]; then +cmake .. \ + -DBUILD_RPCS3_TESTS="${RUN_UNIT_TESTS}" \ + -DRUN_RPCS3_TESTS="${RUN_UNIT_TESTS}" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \ + -DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \ + -DSTATIC_LINK_LLVM=ON \ -DUSE_SDL=ON \ -DUSE_DISCORD_RPC=ON \ - -DUSE_VULKAN=ON \ - -DUSE_ALSA=OFF \ - -DUSE_PULSE=OFF \ -DUSE_AUDIOUNIT=ON \ - -DUSE_SYSTEM_FFMPEG=ON \ - -DLLVM_CCACHE_BUILD=OFF \ - -DLLVM_BUILD_RUNTIME=OFF \ - -DLLVM_BUILD_TOOLS=OFF \ - -DLLVM_INCLUDE_DOCS=OFF \ - -DLLVM_INCLUDE_EXAMPLES=OFF \ - -DLLVM_INCLUDE_TESTS=OFF \ - -DLLVM_INCLUDE_TOOLS=OFF \ - -DLLVM_INCLUDE_UTILS=OFF \ - -DLLVM_USE_PERF=OFF \ - -DLLVM_ENABLE_Z3_SOLVER=OFF \ + -DUSE_SYSTEM_FFMPEG=OFF \ -DUSE_NATIVE_INSTRUCTIONS=OFF \ + -DUSE_PRECOMPILED_HEADERS=OFF \ -DUSE_SYSTEM_MVK=ON \ - -DUSE_SYSTEM_FAUDIO=OFF \ -DUSE_SYSTEM_SDL=ON \ -DUSE_SYSTEM_OPENCV=ON \ - "$CMAKE_EXTRA_OPTS" \ - -DLLVM_TARGET_ARCH=X86_64 \ + -G Ninja +else +cmake .. \ + -DBUILD_RPCS3_TESTS=OFF \ + -DRUN_RPCS3_TESTS=OFF \ -DCMAKE_OSX_ARCHITECTURES=x86_64 \ -DCMAKE_SYSTEM_PROCESSOR=x86_64 \ -DCMAKE_TOOLCHAIN_FILE=buildfiles/cmake/TCDarwinX86_64.cmake \ - -DCMAKE_IGNORE_PATH="$BREW_X64_PATH/lib" \ - -DCMAKE_IGNORE_PREFIX_PATH=/usr/local/opt \ - -DCMAKE_CXX_FLAGS="-D__MAC_OS_X_VERSION_MIN_REQUIRED=144000" \ - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \ -DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \ + -DSTATIC_LINK_LLVM=ON \ + -DUSE_SDL=ON \ + -DUSE_DISCORD_RPC=ON \ + -DUSE_AUDIOUNIT=ON \ + -DUSE_SYSTEM_FFMPEG=OFF \ + -DUSE_NATIVE_INSTRUCTIONS=OFF \ + -DUSE_PRECOMPILED_HEADERS=OFF \ + -DUSE_SYSTEM_MVK=ON \ + -DUSE_SYSTEM_SDL=ON \ + -DUSE_SYSTEM_OPENCV=ON \ -G Ninja +fi -"/opt/homebrew/bin/ninja"; build_status=$?; +ninja; build_status=$?; cd .. From c83769e79e8bfcd92538aa5b73dccb70b5f8cf9c Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Sat, 3 Jan 2026 00:53:54 +0000 Subject: [PATCH 061/630] Unify & cleanup Mac deploy script --- .ci/deploy-mac-arm64.sh | 86 ----------------------------------------- .ci/deploy-mac.sh | 14 +++---- 2 files changed, 5 insertions(+), 95 deletions(-) delete mode 100755 .ci/deploy-mac-arm64.sh diff --git a/.ci/deploy-mac-arm64.sh b/.ci/deploy-mac-arm64.sh deleted file mode 100755 index a4661dc0dd..0000000000 --- a/.ci/deploy-mac-arm64.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/sh -ex - -# shellcheck disable=SC2086 -cd build || exit 1 - -# Gather explicit version number and number of commits -COMM_TAG=$(awk '/version{.*}/ { printf("%d.%d.%d", $5, $6, $7) }' ../rpcs3/rpcs3_version.cpp) -COMM_COUNT=$(git rev-list --count HEAD) -COMM_HASH=$(git rev-parse --short=8 HEAD) - -AVVER="${COMM_TAG}-${COMM_COUNT}" - -# AVVER is used for GitHub releases, it is the version number. -echo "AVVER=$AVVER" >> ../.ci/ci-vars.env - -cd bin -mkdir "rpcs3.app/Contents/lib/" || true -mkdir -p "rpcs3.app/Contents/Resources/vulkan/icd.d" || true -wget https://github.com/KhronosGroup/MoltenVK/releases/download/v1.4.1/MoltenVK-macos-privateapi.tar -tar -xvf MoltenVK-macos-privateapi.tar -cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/libMoltenVK.dylib" "rpcs3.app/Contents/Frameworks/libMoltenVK.dylib" -cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/MoltenVK_icd.json" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json" -sed -i '' "s/.\//..\/..\/..\/Frameworks\//g" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json" - -cp "$(realpath /opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/lib/c++/libc++abi.1.0.dylib)" "rpcs3.app/Contents/Frameworks/libc++abi.1.dylib" -cp "$(realpath /opt/homebrew/opt/gcc/lib/gcc/current/libgcc_s.1.1.dylib)" "rpcs3.app/Contents/Frameworks/libgcc_s.1.1.dylib" -cp "$(realpath /opt/homebrew/lib/libsharpyuv.0.dylib)" "rpcs3.app/Contents/lib/libsharpyuv.0.dylib" -cp "$(realpath /opt/homebrew/lib/libintl.8.dylib)" "rpcs3.app/Contents/lib/libintl.8.dylib" - -rm -rf "rpcs3.app/Contents/Frameworks/QtPdf.framework" \ -"rpcs3.app/Contents/Frameworks/QtQml.framework" \ -"rpcs3.app/Contents/Frameworks/QtQmlModels.framework" \ -"rpcs3.app/Contents/Frameworks/QtQuick.framework" \ -"rpcs3.app/Contents/Frameworks/QtVirtualKeyboard.framework" \ -"rpcs3.app/Contents/Plugins/platforminputcontexts" \ -"rpcs3.app/Contents/Plugins/virtualkeyboard" \ -"rpcs3.app/Contents/Resources/git" - -../../.ci/optimize-mac.sh rpcs3.app - -# Download translations -mkdir -p "rpcs3.app/Contents/translations" -ZIP_URL=$(curl -fsSL "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \ - | grep "browser_download_url" \ - | grep "RPCS3-languages.zip" \ - | cut -d '"' -f 4) -if [ -z "$ZIP_URL" ]; then - echo "Failed to find RPCS3-languages.zip in the latest release. Continuing without translations." -else - echo "Downloading translations from: $ZIP_URL" - curl -L -o translations.zip "$ZIP_URL" || { - echo "Failed to download translations.zip. Continuing without translations." - exit 0 - } - unzip -o translations.zip -d "rpcs3.app/Contents/translations" >/dev/null 2>&1 || \ - echo "Failed to extract translations.zip. Continuing without translations." - rm -f translations.zip -fi - -# Copy Qt translations manually -QT_TRANS="$WORKDIR/qt-downloader/$QT_VER/clang_64/translations" -cp $QT_TRANS/qt*.qm rpcs3.app/Contents/translations - -# Hack -install_name_tool -delete_rpath /opt/homebrew/lib RPCS3.app/Contents/MacOS/rpcs3 || echo "Hack for deleting rpath /opt/homebrew/lib not needed" -install_name_tool -delete_rpath /opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/lib RPCS3.app/Contents/MacOS/rpcs3 || echo "Hack for deleting rpath /opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/lib not needed" - -# Need to do this rename hack due to case insensitive filesystem -mv rpcs3.app RPCS3_.app -mv RPCS3_.app RPCS3.app - -# NOTE: "--deep" is deprecated -codesign --deep -fs - RPCS3.app - -echo "[InternetShortcut]" > Quickstart.url -echo "URL=https://rpcs3.net/quickstart" >> Quickstart.url -echo "IconIndex=0" >> Quickstart.url - -ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${COMM_TAG}-${COMM_COUNT}-${COMM_HASH}_macos_arm64.7z" -"/opt/homebrew/bin/7z" a -mx9 "$ARCHIVE_FILEPATH" RPCS3.app Quickstart.url -FILESIZE=$(stat -f %z "$ARCHIVE_FILEPATH") -SHA256SUM=$(shasum -a 256 "$ARCHIVE_FILEPATH" | awk '{ print $1 }') - -cd .. -echo "${SHA256SUM};${FILESIZE}B" > "$RELEASE_MESSAGE" -cd bin diff --git a/.ci/deploy-mac.sh b/.ci/deploy-mac.sh index b0bfb4b455..b144003fb9 100755 --- a/.ci/deploy-mac.sh +++ b/.ci/deploy-mac.sh @@ -14,7 +14,6 @@ AVVER="${COMM_TAG}-${COMM_COUNT}" echo "AVVER=$AVVER" >> ../.ci/ci-vars.env cd bin -mkdir "rpcs3.app/Contents/lib/" || true mkdir -p "rpcs3.app/Contents/Resources/vulkan/icd.d" || true wget https://github.com/KhronosGroup/MoltenVK/releases/download/v1.4.1/MoltenVK-macos-privateapi.tar tar -xvf MoltenVK-macos-privateapi.tar @@ -22,11 +21,8 @@ cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/libMoltenVK.dylib" "rpcs3.app/Contents cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/MoltenVK_icd.json" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json" sed -i '' "s/.\//..\/..\/..\/Frameworks\//g" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json" -cp "$(realpath /usr/local/opt/llvm@$LLVM_COMPILER_VER/lib/c++/libc++abi.1.0.dylib)" "rpcs3.app/Contents/Frameworks/libc++abi.1.dylib" -cp "$(realpath /usr/local/opt/llvm@$LLVM_COMPILER_VER/lib/unwind/libunwind.1.dylib)" "rpcs3.app/Contents/Frameworks/libunwind.1.dylib" -cp "$(realpath /usr/local/opt/gcc/lib/gcc/current/libgcc_s.1.1.dylib)" "rpcs3.app/Contents/Frameworks/libgcc_s.1.1.dylib" -cp "$(realpath /usr/local/lib/libsharpyuv.0.dylib)" "rpcs3.app/Contents/lib/libsharpyuv.0.dylib" -cp "$(realpath /usr/local/lib/libintl.8.dylib)" "rpcs3.app/Contents/lib/libintl.8.dylib" +cp "$(realpath $BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/c++/libc++abi.1.0.dylib)" "rpcs3.app/Contents/Frameworks/libc++abi.1.dylib" +cp "$(realpath $BREW_PATH/opt/gcc/lib/gcc/current/libgcc_s.1.1.dylib)" "rpcs3.app/Contents/Frameworks/libgcc_s.1.1.dylib" rm -rf "rpcs3.app/Contents/Frameworks/QtPdf.framework" \ "rpcs3.app/Contents/Frameworks/QtQml.framework" \ @@ -67,8 +63,8 @@ mv rpcs3.app RPCS3_.app mv RPCS3_.app RPCS3.app # Hack -install_name_tool -delete_rpath /usr/local/lib RPCS3.app/Contents/MacOS/rpcs3 -#-delete_rpath /usr/local/Cellar/sdl3/3.2.8/lib +install_name_tool -delete_rpath /opt/homebrew/lib RPCS3.app/Contents/MacOS/rpcs3 || true +install_name_tool -delete_rpath /usr/local/lib RPCS3.app/Contents/MacOS/rpcs3 || true # NOTE: "--deep" is deprecated codesign --deep -fs - RPCS3.app @@ -78,7 +74,7 @@ echo "URL=https://rpcs3.net/quickstart" >> Quickstart.url echo "IconIndex=0" >> Quickstart.url ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${COMM_TAG}-${COMM_COUNT}-${COMM_HASH}_macos.7z" -"/opt/homebrew/bin/7z" a -mx9 "$ARCHIVE_FILEPATH" RPCS3.app Quickstart.url +7z a -mx9 "$ARCHIVE_FILEPATH" RPCS3.app Quickstart.url FILESIZE=$(stat -f %z "$ARCHIVE_FILEPATH") SHA256SUM=$(shasum -a 256 "$ARCHIVE_FILEPATH" | awk '{ print $1 }') From 44bd0568e78acba2a691ed8f33073aee944cd931 Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Sat, 3 Jan 2026 00:53:59 +0000 Subject: [PATCH 062/630] Unify Mac CI action --- .github/workflows/rpcs3.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index a4a99fd015..77cbf0f7d9 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -123,11 +123,11 @@ jobs: matrix: include: - name: Intel - build_sh: .ci/build-mac.sh + AARCH64: 0 UPLOAD_COMMIT_HASH: 51ae32f468089a8169aaf1567de355ff4a3e0842 UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac - name: Apple Silicon - build_sh: .ci/build-mac-arm64.sh + AARCH64: 1 UPLOAD_COMMIT_HASH: 8e21bdbc40711a3fccd18fbf17b742348b0f4281 UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac-arm64 name: RPCS3 Mac ${{ matrix.name }} @@ -140,6 +140,7 @@ jobs: RELEASE_MESSAGE: ../GitHubReleaseMessage.txt UPLOAD_COMMIT_HASH: ${{ matrix.UPLOAD_COMMIT_HASH }} UPLOAD_REPO_FULL_NAME: ${{ matrix.UPLOAD_REPO_FULL_NAME }} + AARCH64: ${{ matrix.AARCH64 }} RUN_UNIT_TESTS: github.event_name == 'pull_request' && 'ON' || 'OFF' steps: - name: Checkout repository @@ -164,7 +165,7 @@ jobs: restore-keys: ${{ runner.os }}-qt-${{ matrix.name }}-${{ env.QT_VER }} - name: Build - run: ${{ matrix.build_sh }} + run: .ci/build-mac.sh - name: Upload artifacts uses: actions/upload-artifact@main From aab40bd26948ace182ce471121e23bd0a5c9f1ce Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Sat, 3 Jan 2026 02:21:56 +0000 Subject: [PATCH 063/630] Try and cut down unnecessary Qt translations --- .ci/deploy-mac.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.ci/deploy-mac.sh b/.ci/deploy-mac.sh index b144003fb9..8b6301f8b9 100755 --- a/.ci/deploy-mac.sh +++ b/.ci/deploy-mac.sh @@ -56,7 +56,10 @@ fi # Copy Qt translations manually QT_TRANS="$WORKDIR/qt-downloader/$QT_VER/clang_64/translations" -cp $QT_TRANS/qt*.qm rpcs3.app/Contents/translations +cp $QT_TRANS/qt_*.qm rpcs3.app/Contents/translations +cp $QT_TRANS/qtbase_*.qm rpcs3.app/Contents/translations +cp $QT_TRANS/qtmultimedia_*.qm rpcs3.app/Contents/translations +rm -f rpcs3.app/Contents/translations/qt_help_*.qm # Need to do this rename hack due to case insensitive filesystem mv rpcs3.app RPCS3_.app From cc37a40f400edc048b72cb74726f5a8154dfbc04 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 4 Jan 2026 14:01:18 +0300 Subject: [PATCH 064/630] rsx/fp: Harden the FP decompiler a bit when bogus inputs are passed in. --- rpcs3/Emu/RSX/Program/Assembler/CFG.h | 2 +- rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.cpp | 42 +++++++++++++++++-- rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h | 9 ++++ .../Passes/FP/RegisterAnnotationPass.cpp | 38 +++++++++++++++-- .../Passes/FP/RegisterAnnotationPass.h | 2 +- .../Passes/FP/RegisterDependencyPass.cpp | 4 +- .../Passes/FP/RegisterDependencyPass.h | 2 +- .../RSX/Program/FragmentProgramDecompiler.cpp | 8 ++-- 8 files changed, 92 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/Assembler/CFG.h b/rpcs3/Emu/RSX/Program/Assembler/CFG.h index 818bc2a018..4f2357f2de 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/CFG.h +++ b/rpcs3/Emu/RSX/Program/Assembler/CFG.h @@ -36,7 +36,7 @@ namespace rsx::assembler struct CFGPass { - virtual void run(FlowGraph& graph) = 0; + virtual bool run(FlowGraph& graph) = 0; }; FlowGraph deconstruct_fragment_program(const RSXFragmentProgram& prog); diff --git a/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.cpp b/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.cpp index 3ab4f3d893..c195b4a75b 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.cpp +++ b/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.cpp @@ -8,6 +8,42 @@ namespace rsx::assembler::FP { + static const char* s_opcode_names[RSX_FP_OPCODE_ENUM_MAX + 1] = + { + "NOP", "MOV", "MUL", "ADD", "MAD", "DP3", "DP4", "DST", "MIN", "MAX", "SLT", "SGE", "SLE", "SGT", "SNE", "SEQ", // 0x00 - 0x0F + "FRC", "FLR", "KIL", "PK4", "UP4", "DDX", "DDY", "TEX", "TXP", "TXD", "RCP", "RSQ", "EX2", "LG2", "LIT", "LRP", // 0x10 - 0x1F + "STR", "SFL", "COS", "SIN", "PK2", "UP2", "POW", "PKB", "UPB", "PK16", "UP16", "BEM", "PKG", "UPG", "DP2A", "TXL", // 0x20 - 0x2F + "UNK_30", "TXB", "UNK_32", "TEXBEM", "TXPBEM", "BEMLUM", "REFL", "TIMESWTEX", "DP2", "NRM", "DIV", "DIVSQ", "LIF", "FENCT", "FENCB", "UNK_3F", // 0x30 - 0x3F + "BRK", "CAL", "IFE", "LOOP", "REP", "RET", // 0x40 - 0x45 (Flow control) + "OR16_LO", "OR16_HI" // Custom instructions for RPCS3 use + }; + + const char* get_opcode_name(FP_opcode opcode) + { + if (opcode > RSX_FP_OPCODE_ENUM_MAX) + { + return "invalid"; + } + return s_opcode_names[opcode]; + } + + bool is_instruction_valid(FP_opcode opcode) + { + switch (opcode) + { + case RSX_FP_OPCODE_POW: + case RSX_FP_OPCODE_BEM: + case RSX_FP_OPCODE_TEXBEM: + case RSX_FP_OPCODE_TXPBEM: + case RSX_FP_OPCODE_BEMLUM: + case RSX_FP_OPCODE_TIMESWTEX: + return false; + default: + // This isn't necessarily true + return opcode <= RSX_FP_OPCODE_ENUM_MAX; + } + } + u8 get_operand_count(FP_opcode opcode) { switch (opcode) @@ -90,6 +126,8 @@ namespace rsx::assembler::FP return 2; case RSX_FP_OPCODE_LIF: return 1; + case RSX_FP_OPCODE_REFL: + return 2; case RSX_FP_OPCODE_FENCT: case RSX_FP_OPCODE_FENCB: case RSX_FP_OPCODE_BRK: @@ -110,8 +148,6 @@ namespace rsx::assembler::FP case RSX_FP_OPCODE_TXPBEM: case RSX_FP_OPCODE_BEMLUM: fmt::throw_exception("Unimplemented BEM class instruction"); // Unused - case RSX_FP_OPCODE_REFL: - return 2; case RSX_FP_OPCODE_TIMESWTEX: fmt::throw_exception("Unimplemented TIMESWTEX instruction"); // Unused default: @@ -397,7 +433,7 @@ namespace rsx::assembler::FP // Convert vector mask to file range rsx::simple_array get_register_file_range(const RegisterRef& reg) { - if (!reg.mask) + if (!reg.mask || reg.reg.id >= 48) { return {}; } diff --git a/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h b/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h index 1de0985a35..a29b22c842 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h +++ b/rpcs3/Emu/RSX/Program/Assembler/FPOpcodes.h @@ -81,6 +81,9 @@ namespace rsx::assembler // Custom opcodes for dependency injection RSX_FP_OPCODE_OR16_LO = 0x46, // Performs a 16-bit OR, taking one register channel as input and overwriting low 16 bits of the output RSX_FP_OPCODE_OR16_HI = 0x47, // Same as the lo variant but now overwrites the high 16-bit block + + // Meta + RSX_FP_OPCODE_ENUM_MAX = RSX_FP_OPCODE_OR16_HI }; namespace FP @@ -100,6 +103,12 @@ namespace rsx::assembler using register_file_t = std::array; + // Convert opcode to human-readable string + const char* get_opcode_name(FP_opcode opcode); + + // Returns true if the instruction is implemented by RSX HW + bool is_instruction_valid(FP_opcode opcode); + // Returns number of operands consumed by an instruction u8 get_operand_count(FP_opcode opcode); diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp index 1b34f53091..622deefe7c 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp +++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp @@ -126,8 +126,9 @@ namespace rsx::assembler::FP } // Decay instructions into register references - void annotate_instructions(BasicBlock* block, const RSXFragmentProgram& prog, bool skip_delay_slots) + bool annotate_instructions(BasicBlock* block, const RSXFragmentProgram& prog, bool skip_delay_slots) { + bool result = true; for (auto& instruction : block->instructions) { if (skip_delay_slots && is_delay_slot(instruction)) @@ -135,7 +136,15 @@ namespace rsx::assembler::FP continue; } - const u32 operand_count = get_operand_count(static_cast(instruction.opcode)); + const auto opcode = static_cast(instruction.opcode); + if (!is_instruction_valid(opcode)) + { + rsx_log.error("[CFG] Annotation: Unexpected instruction '%s'", get_opcode_name(opcode)); + result = false; + continue; + } + + const u32 operand_count = get_operand_count(opcode); for (u32 i = 0; i < operand_count; i++) { RegisterRef reg = get_src_register(prog, &instruction, i); @@ -145,15 +154,29 @@ namespace rsx::assembler::FP continue; } + if (reg.reg.id >= 48) + { + rsx_log.error("[CFG] Annotation: Instruction references invalid register %s", reg.reg.to_string()); + result = false; + } + instruction.srcs.push_back(std::move(reg)); } RegisterRef dst = get_dst_register(&instruction); if (dst) { + if (dst.reg.id >= 48) + { + rsx_log.error("[CFG] Annotation: Instruction references invalid register %s", dst.reg.to_string()); + result = false; + } + instruction.dsts.push_back(std::move(dst)); } } + + return result; } // Annotate each block with input and output lanes (read and clobber list) @@ -215,12 +238,19 @@ namespace rsx::assembler::FP block->input_list = compile_register_file(input_register_file); } - void RegisterAnnotationPass::run(FlowGraph& graph) + bool RegisterAnnotationPass::run(FlowGraph& graph) { + bool result = true; for (auto& block : graph.blocks) { - annotate_instructions(&block, m_prog, m_config.skip_delay_slots); + if (!annotate_instructions(&block, m_prog, m_config.skip_delay_slots)) + { + result = false; + } + annotate_block_io(&block); } + + return result; } } diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.h b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.h index b5cab3da85..2b1ada7f9d 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.h +++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.h @@ -25,7 +25,7 @@ namespace rsx::assembler::FP : m_prog(prog), m_config(options) {} - void run(FlowGraph& graph) override; + bool run(FlowGraph& graph) override; private: const RSXFragmentProgram& m_prog; diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.cpp b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.cpp index 27fcd488a7..de9f978f51 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.cpp +++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.cpp @@ -464,7 +464,7 @@ namespace rsx::assembler::FP } } - void RegisterDependencyPass::run(FlowGraph& graph) + bool RegisterDependencyPass::run(FlowGraph& graph) { DependencyPassContext ctx{}; @@ -480,5 +480,7 @@ namespace rsx::assembler::FP { insert_block_dependencies(ctx, &(*it)); } + + return true; } } diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.h b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.h index 48068691e1..8a46b6d65e 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.h +++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterDependencyPass.h @@ -10,6 +10,6 @@ namespace rsx::assembler::FP class RegisterDependencyPass : public CFGPass { public: - void run(FlowGraph& graph) override; + bool run(FlowGraph& graph) override; }; } diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index 8c5c163f06..ef2029c652 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -761,7 +761,7 @@ template std::string FragmentProgramDecompiler::GetSRC(T src) break; case RSX_FP_REGISTER_TYPE_UNKNOWN: // ??? Used by a few games, what is it? - rsx_log.error("Src type 3 used, opcode=0x%X, dst=0x%X s0=0x%X s1=0x%X s2=0x%X", + rsx_log.error("[FP] Invalid Src type 3 used, opcode=0x%X, dst=0x%X s0=0x%X s1=0x%X s2=0x%X", dst.opcode, dst.HEX, src0.HEX, src1.HEX, src2.HEX); // This is not some special type, it is a bug indicating memory corruption @@ -1289,6 +1289,7 @@ bool FragmentProgramDecompiler::handle_tex_srb(u32 opcode) std::string FragmentProgramDecompiler::Decompile() { auto graph = deconstruct_fragment_program(m_prog); + m_is_valid_ucode = true; if (!graph.blocks.empty()) { @@ -1315,15 +1316,14 @@ std::string FragmentProgramDecompiler::Decompile() FP::RegisterAnnotationPass annotation_pass{ m_prog, { .skip_delay_slots = true } }; FP::RegisterDependencyPass dependency_pass{}; - annotation_pass.run(graph); - dependency_pass.run(graph); + m_is_valid_ucode = m_is_valid_ucode && annotation_pass.run(graph); + m_is_valid_ucode = m_is_valid_ucode && dependency_pass.run(graph); } m_size = 0; m_location = 0; m_loop_count = 0; m_code_level = 1; - m_is_valid_ucode = true; m_constant_offsets.clear(); // For GLSL scope wind/unwind. We store the min scope depth and loop count for each block and "unwind" to it. From a0e0a6c6a6b1b51b51fe58dc356d33916f3ef3f3 Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Sun, 4 Jan 2026 15:19:28 +0000 Subject: [PATCH 065/630] [macOS Updater] Cleanup remnants of the old app bundle post-update --- rpcs3/update_helper.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpcs3/update_helper.sh b/rpcs3/update_helper.sh index bc51edebe6..380d845980 100755 --- a/rpcs3/update_helper.sh +++ b/rpcs3/update_helper.sh @@ -10,5 +10,6 @@ fi new_app="$1/" old_app="$2/" -cp -Rf -p "$new_app" "$old_app" +rm -rf "$old_app" +mv "$new_app" "$old_app" open -n -a "$2" --args --updating From c2b93317adf57fa28ff1bf25e3a33f3ca63771ed Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 5 Jan 2026 17:18:18 +0100 Subject: [PATCH 066/630] Revert "Update SDL to 3.4.0" This reverts commit cfbc4165215528a063ac3f3128d924caacd93027. --- 3rdparty/libsdl-org/SDL | 2 +- 3rdparty/libsdl-org/SDL.vcxproj | 36 ++---- 3rdparty/libsdl-org/SDL.vcxproj.filters | 147 +++++------------------- 3 files changed, 38 insertions(+), 147 deletions(-) diff --git a/3rdparty/libsdl-org/SDL b/3rdparty/libsdl-org/SDL index a962f40bbb..7f3ae3d574 160000 --- a/3rdparty/libsdl-org/SDL +++ b/3rdparty/libsdl-org/SDL @@ -1 +1 @@ -Subproject commit a962f40bbba175e9716557a25d5d7965f134a3d3 +Subproject commit 7f3ae3d57459e59943a4ecfefc8f6277ec6bf540 diff --git a/3rdparty/libsdl-org/SDL.vcxproj b/3rdparty/libsdl-org/SDL.vcxproj index fd2bcf2f03..f0b38ca09f 100644 --- a/3rdparty/libsdl-org/SDL.vcxproj +++ b/3rdparty/libsdl-org/SDL.vcxproj @@ -23,7 +23,6 @@ - @@ -103,7 +102,6 @@ - @@ -132,8 +130,6 @@ - - @@ -144,11 +140,7 @@ - - - - @@ -164,7 +156,6 @@ - @@ -184,6 +175,7 @@ + @@ -192,35 +184,20 @@ - - - - - - - - - - - - - - - @@ -264,7 +241,6 @@ - @@ -280,14 +256,13 @@ - - + @@ -328,6 +303,7 @@ + @@ -357,6 +333,7 @@ + @@ -416,6 +393,7 @@ + @@ -486,7 +464,6 @@ - @@ -494,11 +471,12 @@ + - + diff --git a/3rdparty/libsdl-org/SDL.vcxproj.filters b/3rdparty/libsdl-org/SDL.vcxproj.filters index 8b7f293ef3..5839899c0d 100644 --- a/3rdparty/libsdl-org/SDL.vcxproj.filters +++ b/3rdparty/libsdl-org/SDL.vcxproj.filters @@ -214,9 +214,6 @@ {000028b2ea36d7190d13777a4dc70000} - - {695ffc61-5497-4227-b415-15e9bdd5b6bf} - @@ -702,6 +699,9 @@ video\yuv2rgb + + video\windows + video\windows @@ -831,6 +831,9 @@ render\software + + render\software + render\software @@ -908,6 +911,12 @@ + + + + + + render\vulkan @@ -941,60 +950,6 @@ - - video\yuv2rgb - - - video\yuv2rgb - - - video\yuv2rgb - - - video\yuv2rgb - - - video\yuv2rgb - - - video\yuv2rgb - - - video - - - video - - - video - - - misc - - - haptic\hidapi - - - haptic\hidapi - - - core - - - joystick\hidapi - - - joystick\hidapi - - - joystick\hidapi - - - joystick\hidapi - - - API Headers - @@ -1082,6 +1037,9 @@ core + + core\windows + core\windows @@ -1208,6 +1166,9 @@ joystick\dummy + + joystick\gdk + joystick\hidapi @@ -1367,6 +1328,9 @@ video\dummy + + video\windows + video\windows @@ -1379,6 +1343,9 @@ video\windows + + video\windows + video\windows @@ -1541,6 +1508,9 @@ render\software + + render\software + render\software @@ -1565,6 +1535,9 @@ + + + render\vulkan @@ -1606,66 +1579,6 @@ - - video\windows - - - video\yuv2rgb - - - video\yuv2rgb - - - video\yuv2rgb - - - video - - - misc - - - haptic\hidapi - - - haptic\hidapi - - - core\windows - - - core\windows - - - joystick\gdk - - - joystick\hidapi - - - joystick\hidapi - - - joystick\hidapi - - - joystick\hidapi - - - joystick\hidapi - - - joystick\hidapi - - - joystick\hidapi - - - joystick\hidapi - - - joystick\hidapi - From 113679ead80c739a21240ea21ce303f2bbdd9aa2 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 5 Jan 2026 17:21:46 +0100 Subject: [PATCH 067/630] Update SDL to 3.2.30 --- 3rdparty/libsdl-org/SDL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libsdl-org/SDL b/3rdparty/libsdl-org/SDL index 7f3ae3d574..f5e5f65889 160000 --- a/3rdparty/libsdl-org/SDL +++ b/3rdparty/libsdl-org/SDL @@ -1 +1 @@ -Subproject commit 7f3ae3d57459e59943a4ecfefc8f6277ec6bf540 +Subproject commit f5e5f6588921eed3d7d048ce43d9eb1ff0da0ffc From 8f26c01ae50b63addf1f5f5d4363fdd7e25f0a6a Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 5 Jan 2026 19:14:07 +0100 Subject: [PATCH 068/630] Qt: try to fix drag and drop issues --- rpcs3/rpcs3qt/cg_disasm_window.cpp | 10 +++------- rpcs3/rpcs3qt/cg_disasm_window.h | 1 - rpcs3/rpcs3qt/log_viewer.cpp | 10 +++------- rpcs3/rpcs3qt/log_viewer.h | 1 - rpcs3/rpcs3qt/main_window.cpp | 26 +++++++++++++++----------- rpcs3/rpcs3qt/main_window.h | 1 - rpcs3/rpcs3qt/patch_manager_dialog.cpp | 11 ++++------- rpcs3/rpcs3qt/patch_manager_dialog.h | 1 - 8 files changed, 25 insertions(+), 36 deletions(-) diff --git a/rpcs3/rpcs3qt/cg_disasm_window.cpp b/rpcs3/rpcs3qt/cg_disasm_window.cpp index 480383b973..87aff89546 100644 --- a/rpcs3/rpcs3qt/cg_disasm_window.cpp +++ b/rpcs3/rpcs3qt/cg_disasm_window.cpp @@ -146,6 +146,7 @@ void cg_disasm_window::dropEvent(QDropEvent* ev) { if (IsValidFile(*ev->mimeData(), true)) { + ev->acceptProposedAction(); ShowDisasm(); } } @@ -154,7 +155,7 @@ void cg_disasm_window::dragEnterEvent(QDragEnterEvent* ev) { if (IsValidFile(*ev->mimeData())) { - ev->accept(); + ev->acceptProposedAction(); } } @@ -162,11 +163,6 @@ void cg_disasm_window::dragMoveEvent(QDragMoveEvent* ev) { if (IsValidFile(*ev->mimeData())) { - ev->accept(); + ev->acceptProposedAction(); } } - -void cg_disasm_window::dragLeaveEvent(QDragLeaveEvent* ev) -{ - ev->accept(); -} diff --git a/rpcs3/rpcs3qt/cg_disasm_window.h b/rpcs3/rpcs3qt/cg_disasm_window.h index dc0a963c84..97aeee54f8 100644 --- a/rpcs3/rpcs3qt/cg_disasm_window.h +++ b/rpcs3/rpcs3qt/cg_disasm_window.h @@ -36,5 +36,4 @@ protected: void dropEvent(QDropEvent* ev) override; void dragEnterEvent(QDragEnterEvent* ev) override; void dragMoveEvent(QDragMoveEvent* ev) override; - void dragLeaveEvent(QDragLeaveEvent* ev) override; }; diff --git a/rpcs3/rpcs3qt/log_viewer.cpp b/rpcs3/rpcs3qt/log_viewer.cpp index 99961809c9..3a566937a7 100644 --- a/rpcs3/rpcs3qt/log_viewer.cpp +++ b/rpcs3/rpcs3qt/log_viewer.cpp @@ -446,6 +446,7 @@ void log_viewer::dropEvent(QDropEvent* ev) { if (is_valid_file(*ev->mimeData(), true)) { + ev->acceptProposedAction(); show_log(); } } @@ -454,7 +455,7 @@ void log_viewer::dragEnterEvent(QDragEnterEvent* ev) { if (is_valid_file(*ev->mimeData())) { - ev->accept(); + ev->acceptProposedAction(); } } @@ -462,15 +463,10 @@ void log_viewer::dragMoveEvent(QDragMoveEvent* ev) { if (is_valid_file(*ev->mimeData())) { - ev->accept(); + ev->acceptProposedAction(); } } -void log_viewer::dragLeaveEvent(QDragLeaveEvent* ev) -{ - ev->accept(); -} - bool log_viewer::eventFilter(QObject* object, QEvent* event) { if (object != m_log_text) diff --git a/rpcs3/rpcs3qt/log_viewer.h b/rpcs3/rpcs3qt/log_viewer.h index 320b2b97c9..85ece2688b 100644 --- a/rpcs3/rpcs3qt/log_viewer.h +++ b/rpcs3/rpcs3qt/log_viewer.h @@ -43,6 +43,5 @@ protected: void dropEvent(QDropEvent* ev) override; void dragEnterEvent(QDragEnterEvent* ev) override; void dragMoveEvent(QDragMoveEvent* ev) override; - void dragLeaveEvent(QDragLeaveEvent* ev) override; bool eventFilter(QObject* object, QEvent* event) override; }; diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index fea8dc8ca4..2778a1d92a 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -4077,15 +4077,18 @@ main_window::drop_type main_window::IsValidFile(const QMimeData& md, QStringList void main_window::dropEvent(QDropEvent* event) { - event->accept(); - QStringList drop_paths; + const drop_type type = IsValidFile(*event->mimeData(), &drop_paths); - switch (IsValidFile(*event->mimeData(), &drop_paths)) // get valid file paths and drop type + if (type != drop_type::drop_error) + { + event->acceptProposedAction(); + } + + switch (type) // get valid file paths and drop type { case drop_type::drop_error: { - event->ignore(); break; } case drop_type::drop_rap_edat_pkg: // install the packages @@ -4167,15 +4170,16 @@ void main_window::dropEvent(QDropEvent* event) void main_window::dragEnterEvent(QDragEnterEvent* event) { - event->setAccepted(IsValidFile(*event->mimeData()) != drop_type::drop_error); + if (IsValidFile(*event->mimeData()) != drop_type::drop_error) + { + event->acceptProposedAction(); + } } void main_window::dragMoveEvent(QDragMoveEvent* event) { - event->setAccepted(IsValidFile(*event->mimeData()) != drop_type::drop_error); -} - -void main_window::dragLeaveEvent(QDragLeaveEvent* event) -{ - event->accept(); + if (IsValidFile(*event->mimeData()) != drop_type::drop_error) + { + event->acceptProposedAction(); + } } diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index 8a82c125ce..f93f17a484 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -131,7 +131,6 @@ protected: void dropEvent(QDropEvent* event) override; void dragEnterEvent(QDragEnterEvent* event) override; void dragMoveEvent(QDragMoveEvent* event) override; - void dragLeaveEvent(QDragLeaveEvent* event) override; private: void ConfigureGuiFromSettings(); diff --git a/rpcs3/rpcs3qt/patch_manager_dialog.cpp b/rpcs3/rpcs3qt/patch_manager_dialog.cpp index 04c8906e9b..227a4a3a47 100644 --- a/rpcs3/rpcs3qt/patch_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/patch_manager_dialog.cpp @@ -1020,6 +1020,8 @@ void patch_manager_dialog::dropEvent(QDropEvent* event) return; } + event->acceptProposedAction(); + QMessageBox box(QMessageBox::Icon::Question, tr("Patch Manager"), tr("What do you want to do with the patch file?"), QMessageBox::StandardButton::Cancel, this); QPushButton* button_yes = box.addButton(tr("Import"), QMessageBox::YesRole); QPushButton* button_no = box.addButton(tr("Validate"), QMessageBox::NoRole); @@ -1123,7 +1125,7 @@ void patch_manager_dialog::dragEnterEvent(QDragEnterEvent* event) { if (is_valid_file(*event->mimeData())) { - event->accept(); + event->acceptProposedAction(); } } @@ -1131,15 +1133,10 @@ void patch_manager_dialog::dragMoveEvent(QDragMoveEvent* event) { if (is_valid_file(*event->mimeData())) { - event->accept(); + event->acceptProposedAction(); } } -void patch_manager_dialog::dragLeaveEvent(QDragLeaveEvent* event) -{ - event->accept(); -} - void patch_manager_dialog::download_update(bool automatic, bool auto_accept) { patch_log.notice("Patch download triggered (automatic=%d, auto_accept=%d)", automatic, auto_accept); diff --git a/rpcs3/rpcs3qt/patch_manager_dialog.h b/rpcs3/rpcs3qt/patch_manager_dialog.h index e65bcfb7d3..a8c70c2caa 100644 --- a/rpcs3/rpcs3qt/patch_manager_dialog.h +++ b/rpcs3/rpcs3qt/patch_manager_dialog.h @@ -83,6 +83,5 @@ protected: void dropEvent(QDropEvent* event) override; void dragEnterEvent(QDragEnterEvent* event) override; void dragMoveEvent(QDragMoveEvent* event) override; - void dragLeaveEvent(QDragLeaveEvent* event) override; void closeEvent(QCloseEvent* event) override; }; From 9b256d71a9eb142654de96fdafdcbfda00cf64fe Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Mon, 5 Jan 2026 16:52:26 +0200 Subject: [PATCH 069/630] USB: Fixed G27 crash during reinitialization --- BUILDING.md | 2 +- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 38 ++++++++++++++++++++------------- rpcs3/Emu/Io/LogitechG27.cpp | 10 ++++----- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 32cdc6cc03..26295d0a16 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -51,7 +51,7 @@ These are the essentials tools to build RPCS3 on Linux. Some of them can be inst #### Debian & Ubuntu - sudo apt-get install build-essential ninja-build libasound2-dev libpulse-dev libopenal-dev libglew-dev zlib1g-dev libedit-dev libvulkan-dev libudev-dev git libevdev-dev libsdl3-3.2 libsdl3-dev libjack-dev libsndio-dev + sudo apt-get install build-essential ninja-build libasound2-dev libpulse-dev libopenal-dev libglew-dev zlib1g-dev libedit-dev libvulkan-dev libudev-dev git libevdev-dev libsdl3-dev libjack-dev libsndio-dev libcurl4-openssl-dev qt6-base-dev qt6-base-private-dev qt6-multimedia-dev qt6-svg-dev libxkbcommon-dev Ubuntu is usually horrendously out of date, and some packages need to be downloaded by hand. This part is for Qt, GCC, Vulkan, and CMake diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index 463ec7a68d..3afa2a9e06 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -137,6 +137,7 @@ public: const std::array& get_new_location(); void connect_usb_device(std::shared_ptr dev, bool update_usb_devices = false); void disconnect_usb_device(std::shared_ptr dev, bool update_usb_devices = false); + void reconnect_usb_device(u32 assigned_number); // Map of devices actively handled by the ps3(device_id, device) std::map>> handled_devices; @@ -205,19 +206,23 @@ private: {0x1BAD, 0x3430, 0x343F, "Harmonix Button Guitar - Wii", nullptr, nullptr}, {0x1BAD, 0x3530, 0x353F, "Harmonix Real Guitar - Wii", nullptr, nullptr}, - //Top Shot Elite controllers + // Top Shot Elite controllers {0x12BA, 0x04A0, 0x04A0, "Top Shot Elite", nullptr, nullptr}, {0x12BA, 0x04A1, 0x04A1, "Top Shot Fearmaster", nullptr, nullptr}, {0x12BA, 0x04B0, 0x04B0, "Rapala Fishing Rod", nullptr, nullptr}, - // GT5 Wheels&co + // Wheels #ifdef HAVE_SDL3 {0x046D, 0xC283, 0xC29B, "lgFF_c283_c29b", &usb_device_logitech_g27::get_num_emu_devices, &usb_device_logitech_g27::make_instance}, #else {0x046D, 0xC283, 0xC29B, "lgFF_c283_c29b", nullptr, nullptr}, #endif + {0x046D, 0xCA03, 0xCA03, "lgFF_ca03_ca03", nullptr, nullptr}, + {0x044F, 0xB652, 0xB652, "Thrustmaster FGT FFB old", nullptr, nullptr}, {0x044F, 0xB653, 0xB653, "Thrustmaster RGT FFB Pro", nullptr, nullptr}, + {0x044F, 0xB654, 0xB654, "Thrustmaster FGT FFB", nullptr, nullptr}, + {0x044F, 0xb655, 0xb655, "Thrustmaster FGT Rumble 3-in-1", nullptr, nullptr}, {0x044F, 0xB65A, 0xB65A, "Thrustmaster F430", nullptr, nullptr}, {0x044F, 0xB65D, 0xB65D, "Thrustmaster FFB", nullptr, nullptr}, {0x044F, 0xB65E, 0xB65E, "Thrustmaster TRS", nullptr, nullptr}, @@ -225,7 +230,6 @@ private: // GT6 {0x2833, 0x0001, 0x0001, "Oculus", nullptr, nullptr}, - {0x046D, 0xCA03, 0xCA03, "lgFF_ca03_ca03", nullptr, nullptr}, // Buzz controllers {0x054C, 0x1000, 0x1040, "buzzer0", &usb_device_buzz::get_num_emu_devices, &usb_device_buzz::make_instance}, @@ -968,6 +972,21 @@ void usb_handler_thread::disconnect_usb_device(std::shared_ptr dev, } } +void usb_handler_thread::reconnect_usb_device(u32 assigned_number) +{ + std::lock_guard lock(mutex); + ensure(assigned_number != 0); + for (const auto& dev : usb_devices) + { + if (dev->assigned_number == assigned_number) + { + disconnect_usb_device(dev, false); + connect_usb_device(dev, false); + break; + } + } +} + void connect_usb_controller(u8 index, input::product_type type) { auto usbh = g_fxo->try_get>(); @@ -1061,18 +1080,7 @@ void reconnect_usb(u32 assigned_number) { return; } - - std::lock_guard lock(usbh->mutex); - for (auto& [nr, pair] : usbh->handled_devices) - { - auto& [internal_dev, dev] = pair; - if (nr == assigned_number) - { - usbh->disconnect_usb_device(dev, false); - usbh->connect_usb_device(dev, false); - break; - } - } + usbh->reconnect_usb_device(assigned_number); } void handle_hotplug_event(bool connected) diff --git a/rpcs3/Emu/Io/LogitechG27.cpp b/rpcs3/Emu/Io/LogitechG27.cpp index c8aa453592..2eb62581bb 100644 --- a/rpcs3/Emu/Io/LogitechG27.cpp +++ b/rpcs3/Emu/Io/LogitechG27.cpp @@ -1752,7 +1752,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp { if (!SDL_RunHapticEffect(m_haptic_handle, m_effect_slots[i].effect_id, 1)) { - logitech_g27_log.error("Failed playing sdl effect %d on slot %d, %s\n", m_effect_slots[i].last_effect.type, i, SDL_GetError()); + logitech_g27_log.error("Failed playing sdl effect %d on slot %d, %s", m_effect_slots[i].last_effect.type, i, SDL_GetError()); } } else @@ -1796,14 +1796,14 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp { if (!SDL_RunHapticEffect(m_haptic_handle, m_effect_slots[i].effect_id, 1)) { - logitech_g27_log.error("Failed playing sdl effect %d on slot %d, %s\n", m_effect_slots[i].last_effect.type, i, SDL_GetError()); + logitech_g27_log.error("Failed playing sdl effect %d on slot %d, %s", m_effect_slots[i].last_effect.type, i, SDL_GetError()); } } else { if (!SDL_StopHapticEffect(m_haptic_handle, m_effect_slots[i].effect_id)) { - logitech_g27_log.error("Failed stopping sdl effect %d on slot %d, %s\n", m_effect_slots[i].last_effect.type, i, SDL_GetError()); + logitech_g27_log.error("Failed stopping sdl effect %d on slot %d, %s", m_effect_slots[i].last_effect.type, i, SDL_GetError()); } } } @@ -1824,11 +1824,11 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp { if (cmd == 0x02) { - logitech_g27_log.error("Tried to play effect slot %d but it was never uploaded\n", i); + logitech_g27_log.error("Tried to play effect slot %d but it was never uploaded", i); } else { - logitech_g27_log.error("Tried to stop effect slot %d but it was never uploaded\n", i); + logitech_g27_log.error("Tried to stop effect slot %d but it was never uploaded", i); } } } From 9fb7c8f52c81e8ed0da55cf9816890bacbf4de04 Mon Sep 17 00:00:00 2001 From: digant73 Date: Mon, 5 Jan 2026 23:16:02 +0100 Subject: [PATCH 070/630] Add multi-selection context menu fix compile errors on Mac and provide reviewed changes fix wrong resolved conflict removed duplicate cleanup after latest merged PRs minor cleanup rename and move get_existing_dir() to File.cpp apply reviewed changes --- Utilities/File.cpp | 16 + Utilities/File.h | 3 + rpcs3/Emu/system_utils.cpp | 117 ++- rpcs3/Emu/system_utils.hpp | 24 +- rpcs3/rpcs3qt/game_list_frame.cpp | 1536 +++++++++++++++++++++-------- rpcs3/rpcs3qt/game_list_frame.h | 102 +- rpcs3/rpcs3qt/game_list_table.cpp | 2 +- rpcs3/rpcs3qt/main_window.cpp | 109 +- rpcs3/rpcs3qt/main_window.h | 3 - rpcs3/rpcs3qt/main_window.ui | 2 +- 10 files changed, 1393 insertions(+), 521 deletions(-) diff --git a/Utilities/File.cpp b/Utilities/File.cpp index aafcfe3c30..30e6414675 100644 --- a/Utilities/File.cpp +++ b/Utilities/File.cpp @@ -901,6 +901,22 @@ std::string_view fs::get_parent_dir_view(std::string_view path, u32 parent_level return result; } +std::string fs::get_path_if_dir(const std::string& path) +{ + if (path.empty() || !fs::is_dir(path)) + { + return {}; + } + + // If delimiters are already present at the end of the string then nothing else to do + if (usz sz = path.find_last_of(delim); sz != umax && (sz + 1) == path.size()) + { + return path; + } + + return path + '/'; +} + bool fs::get_stat(const std::string& path, stat_t& info) { // Ensure consistent information on failure diff --git a/Utilities/File.h b/Utilities/File.h index a5a4c53d75..90453f16f0 100644 --- a/Utilities/File.h +++ b/Utilities/File.h @@ -195,6 +195,9 @@ namespace fs return std::string{get_parent_dir_view(path, parent_level)}; } + // Return "path" plus an ending delimiter (if missing) if "path" is an existing directory. Otherwise, an empty string + std::string get_path_if_dir(const std::string& path); + // Get file information bool get_stat(const std::string& path, stat_t& info); diff --git a/rpcs3/Emu/system_utils.cpp b/rpcs3/Emu/system_utils.cpp index 3cf886d06d..1d94b22987 100644 --- a/rpcs3/Emu/system_utils.cpp +++ b/rpcs3/Emu/system_utils.cpp @@ -149,11 +149,6 @@ namespace rpcs3::utils return emu_dir_.empty() ? fs::get_config_dir() : emu_dir_; } - std::string get_games_dir() - { - return g_cfg_vfs.get(g_cfg_vfs.games_dir, get_emu_dir()); - } - std::string get_hdd0_dir() { return g_cfg_vfs.get(g_cfg_vfs.dev_hdd0, get_emu_dir()); @@ -184,11 +179,31 @@ namespace rpcs3::utils return g_cfg_vfs.get(g_cfg_vfs.dev_bdvd, get_emu_dir()); } + std::string get_games_dir() + { + return g_cfg_vfs.get(g_cfg_vfs.games_dir, get_emu_dir()); + } + std::string get_hdd0_game_dir() { return get_hdd0_dir() + "game/"; } + std::string get_hdd0_locks_dir() + { + return get_hdd0_game_dir() + "$locks/"; + } + + std::string get_hdd1_cache_dir() + { + return get_hdd1_dir() + "caches/"; + } + + std::string get_games_shortcuts_dir() + { + return get_games_dir() + "shortcuts/"; + } + u64 get_cache_disk_usage() { if (const u64 data_size = fs::get_dir_size(rpcs3::utils::get_cache_dir(), 1); data_size != umax) @@ -226,6 +241,98 @@ namespace rpcs3::utils return cache_dir; } + std::string get_data_dir() + { + return fs::get_config_dir() + "data/"; + } + + std::string get_icons_dir() + { + return fs::get_config_dir() + "Icons/game_icons/"; + } + + std::string get_savestates_dir() + { + return fs::get_config_dir() + "savestates/"; + } + + std::string get_captures_dir() + { + return fs::get_config_dir() + "captures/"; + } + + std::string get_recordings_dir() + { + return fs::get_config_dir() + "recordings/"; + } + + std::string get_screenshots_dir() + { + return fs::get_config_dir() + "screenshots/"; + } + + std::string get_cache_dir_by_serial(const std::string& serial) + { + return get_cache_dir() + (serial == "vsh.self" ? "vsh" : serial); + } + + std::string get_data_dir(const std::string& serial) + { + return get_data_dir() + serial; + } + + std::string get_icons_dir(const std::string& serial) + { + return get_icons_dir() + serial; + } + + std::string get_savestates_dir(const std::string& serial) + { + return get_savestates_dir() + serial; + } + + std::string get_recordings_dir(const std::string& serial) + { + return get_recordings_dir() + serial; + } + + std::string get_screenshots_dir(const std::string& serial) + { + return get_screenshots_dir() + serial; + } + + std::set get_dir_list(const std::string& base_dir, const std::string& serial) + { + std::set dir_list; + + for (const auto& entry : fs::dir(base_dir)) + { + // Check for sub folder starting with serial (e.g. BCES01118_BCES01118) + if (entry.is_directory && entry.name.starts_with(serial)) + { + dir_list.insert(base_dir + entry.name); + } + } + + return dir_list; + } + + std::set get_file_list(const std::string& base_dir, const std::string& serial) + { + std::set file_list; + + for (const auto& entry : fs::dir(base_dir)) + { + // Check for files starting with serial (e.g. BCES01118_BCES01118) + if (!entry.is_directory && entry.name.starts_with(serial)) + { + file_list.insert(base_dir + entry.name); + } + } + + return file_list; + } + std::string get_rap_file_path(const std::string_view& rap) { const std::string home_dir = get_hdd0_dir() + "home"; diff --git a/rpcs3/Emu/system_utils.hpp b/rpcs3/Emu/system_utils.hpp index c2825abb24..d8f4f59d8a 100644 --- a/rpcs3/Emu/system_utils.hpp +++ b/rpcs3/Emu/system_utils.hpp @@ -2,6 +2,7 @@ #include "util/types.hpp" #include +#include enum class game_content_type { @@ -26,21 +27,42 @@ namespace rpcs3::utils // VFS directories and disk usage std::vector> get_vfs_disk_usage(); std::string get_emu_dir(); - std::string get_games_dir(); std::string get_hdd0_dir(); std::string get_hdd1_dir(); std::string get_flash_dir(); std::string get_flash2_dir(); std::string get_flash3_dir(); std::string get_bdvd_dir(); + std::string get_games_dir(); std::string get_hdd0_game_dir(); + std::string get_hdd0_locks_dir(); + std::string get_hdd1_cache_dir(); + std::string get_games_shortcuts_dir(); // Cache directories and disk usage u64 get_cache_disk_usage(); std::string get_cache_dir(); std::string get_cache_dir(std::string_view module_path); + std::string get_data_dir(); + std::string get_icons_dir(); + std::string get_savestates_dir(); + std::string get_captures_dir(); + std::string get_recordings_dir(); + std::string get_screenshots_dir(); + + // get_cache_dir_by_serial() named in this way to avoid conflict (wrong invocation) with get_cache_dir() + std::string get_cache_dir_by_serial(const std::string& serial); + std::string get_data_dir(const std::string& serial); + std::string get_icons_dir(const std::string& serial); + std::string get_savestates_dir(const std::string& serial); + std::string get_recordings_dir(const std::string& serial); + std::string get_screenshots_dir(const std::string& serial); + + std::set get_dir_list(const std::string& base_dir, const std::string& serial); + std::set get_file_list(const std::string& base_dir, const std::string& serial); + std::string get_rap_file_path(const std::string_view& rap); bool verify_c00_unlock_edat(const std::string_view& content_id, bool fast = false); std::string get_sfo_dir_from_game_path(const std::string& game_path, const std::string& title_id = ""); diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 677b61a44c..55703912b5 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -16,6 +16,7 @@ #include "Emu/System.h" #include "Emu/vfs_config.h" +#include "Emu/VFS.h" #include "Emu/system_utils.hpp" #include "Loader/PSF.h" #include "util/types.hpp" @@ -362,7 +363,7 @@ bool game_list_frame::RemoveContentPath(const std::string& path, const std::stri return true; } -u32 game_list_frame::RemoveContentPathList(const std::vector& path_list, const std::string& desc) +u32 game_list_frame::RemoveContentPathList(const std::set& path_list, const std::string& desc) { u32 paths_removed = 0; @@ -398,32 +399,6 @@ bool game_list_frame::RemoveContentBySerial(const std::string& base_dir, const s return success; } -std::vector game_list_frame::GetDirListBySerial(const std::string& base_dir, const std::string& serial) -{ - std::vector dir_list; - - for (const auto& entry : fs::dir(base_dir)) - { - // Check for sub folder starting with serial (e.g. BCES01118_BCES01118) - if (entry.is_directory && entry.name.starts_with(serial)) - { - dir_list.push_back(base_dir + entry.name); - } - } - - return dir_list; -} - -std::string game_list_frame::GetCacheDirBySerial(const std::string& serial) -{ - return rpcs3::utils::get_cache_dir() + (serial == "vsh.self" ? "vsh" : serial); -} - -std::string game_list_frame::GetDataDirBySerial(const std::string& serial) -{ - return fs::get_config_dir() + "data/" + serial; -} - void game_list_frame::push_path(const std::string& path, std::vector& legit_paths) { { @@ -1185,49 +1160,20 @@ void game_list_frame::CreateShortcuts(const std::vector& games, const } } -void game_list_frame::ShowContextMenu(const QPoint& pos) +void game_list_frame::ShowSingleSelectionContextMenu(const game_info& gameinfo, QPoint& global_pos) { - QPoint global_pos; - game_info gameinfo; - - if (m_is_list_layout) - { - QTableWidgetItem* item = m_game_list->item(m_game_list->indexAt(pos).row(), static_cast(gui::game_list_columns::icon)); - global_pos = m_game_list->viewport()->mapToGlobal(pos); - gameinfo = GetGameInfoFromItem(item); - } - else if (game_list_grid_item* item = static_cast(m_game_grid->selected_item())) - { - gameinfo = item->game(); - global_pos = m_game_grid->mapToGlobal(pos); - } - - if (!gameinfo) - { - return; - } - GameInfo current_game = gameinfo->info; - const QString serial = QString::fromStdString(current_game.serial); + const std::string serial = current_game.serial; const QString name = QString::fromStdString(current_game.name).simplified(); - - const std::string cache_base_dir = GetCacheDirBySerial(current_game.serial); - const std::string config_data_base_dir = GetDataDirBySerial(current_game.serial); + const bool is_current_running_game = IsGameRunning(serial); // Make Actions QMenu menu; - static const auto is_game_running = [](const std::string& serial) - { - return !Emu.IsStopped(true) && (serial == Emu.GetTitleID() || (serial == "vsh.self" && Emu.IsVsh())); - }; - - const bool is_current_running_game = is_game_running(current_game.serial); - QAction* boot = new QAction(gameinfo->has_custom_config ? (is_current_running_game - ? tr("&Reboot with global configuration") - : tr("&Boot with global configuration")) + ? tr("&Reboot with Global Configuration") + : tr("&Boot with Global Configuration")) : (is_current_running_game ? tr("&Reboot") : tr("&Boot"))); @@ -1238,8 +1184,8 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) if (gameinfo->has_custom_config) { QAction* boot_custom = menu.addAction(is_current_running_game - ? tr("&Reboot with custom configuration") - : tr("&Boot with custom configuration")); + ? tr("&Reboot with Custom Configuration") + : tr("&Boot with Custom Configuration")); boot_custom->setFont(font); connect(boot_custom, &QAction::triggered, [this, gameinfo] { @@ -1256,8 +1202,8 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) { QAction* boot_default = menu.addAction(is_current_running_game - ? tr("&Reboot with default configuration") - : tr("&Boot with default configuration")); + ? tr("&Reboot with Default Configuration") + : tr("&Boot with Default Configuration")); connect(boot_default, &QAction::triggered, [this, gameinfo] { @@ -1266,8 +1212,8 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) }); QAction* boot_manual = menu.addAction(is_current_running_game - ? tr("&Reboot with manually selected configuration") - : tr("&Boot with manually selected configuration")); + ? tr("&Reboot with Manually Selected Configuration") + : tr("&Boot with Manually Selected Configuration")); connect(boot_manual, &QAction::triggered, [this, gameinfo] { @@ -1285,9 +1231,9 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) extern bool is_savestate_compatible(const std::string& filepath); - if (const std::string sstate = get_savestate_file(current_game.serial, current_game.path, 1); is_savestate_compatible(sstate)) + if (const std::string sstate = get_savestate_file(serial, current_game.path, 1); is_savestate_compatible(sstate)) { - const bool has_ambiguity = !get_savestate_file(current_game.serial, current_game.path, 2).empty(); + const bool has_ambiguity = !get_savestate_file(serial, current_game.path, 2).empty(); QAction* boot_state = menu.addAction(is_current_running_game ? tr("&Reboot with last SaveState") @@ -1327,6 +1273,7 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) menu.addSeparator(); + // Create LLVM cache QAction* create_cpu_cache = menu.addAction(tr("&Create LLVM Cache")); // Remove menu @@ -1335,9 +1282,9 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) if (gameinfo->has_custom_config) { QAction* remove_custom_config = remove_menu->addAction(tr("&Remove Custom Configuration")); - connect(remove_custom_config, &QAction::triggered, [this, current_game, gameinfo]() + connect(remove_custom_config, &QAction::triggered, [this, serial, gameinfo]() { - if (RemoveCustomConfiguration(current_game.serial, gameinfo, true)) + if (RemoveCustomConfiguration(serial, gameinfo, true)) { ShowCustomConfigIcon(gameinfo); } @@ -1346,88 +1293,75 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) if (gameinfo->has_custom_pad_config) { QAction* remove_custom_pad_config = remove_menu->addAction(tr("&Remove Custom Gamepad Configuration")); - connect(remove_custom_pad_config, &QAction::triggered, [this, current_game, gameinfo]() + connect(remove_custom_pad_config, &QAction::triggered, [this, serial, gameinfo]() { - if (RemoveCustomPadConfiguration(current_game.serial, gameinfo, true)) + if (RemoveCustomPadConfiguration(serial, gameinfo, true)) { ShowCustomConfigIcon(gameinfo); } }); } - const bool has_cache_dir = fs::is_dir(cache_base_dir); + const std::string cache_base_dir = fs::get_path_if_dir(rpcs3::utils::get_cache_dir_by_serial(serial)); + const bool has_hdd1_cache_dir = !rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd1_cache_dir(), serial).empty(); + const std::string savestates_dir = fs::get_path_if_dir(rpcs3::utils::get_savestates_dir(serial)); - if (has_cache_dir) + if (!cache_base_dir.empty()) { remove_menu->addSeparator(); - QAction* remove_shaders_cache = remove_menu->addAction(tr("&Remove Shaders Cache")); - remove_shaders_cache->setEnabled(!is_current_running_game); - connect(remove_shaders_cache, &QAction::triggered, [this, cache_base_dir]() + QAction* remove_shader_cache = remove_menu->addAction(tr("&Remove Shader Cache")); + remove_shader_cache->setEnabled(!is_current_running_game); + connect(remove_shader_cache, &QAction::triggered, [this, serial]() { - RemoveShadersCache(cache_base_dir, true); + RemoveShaderCache(serial, true); }); + QAction* remove_ppu_cache = remove_menu->addAction(tr("&Remove PPU Cache")); remove_ppu_cache->setEnabled(!is_current_running_game); - connect(remove_ppu_cache, &QAction::triggered, [this, cache_base_dir]() + connect(remove_ppu_cache, &QAction::triggered, [this, serial]() { - RemovePPUCache(cache_base_dir, true); + RemovePPUCache(serial, true); }); + QAction* remove_spu_cache = remove_menu->addAction(tr("&Remove SPU Cache")); remove_spu_cache->setEnabled(!is_current_running_game); - connect(remove_spu_cache, &QAction::triggered, [this, cache_base_dir]() + connect(remove_spu_cache, &QAction::triggered, [this, serial]() { - RemoveSPUCache(cache_base_dir, true); + RemoveSPUCache(serial, true); }); } - const std::string hdd1_cache_base_dir = rpcs3::utils::get_hdd1_dir() + "caches/"; - const bool has_hdd1_cache_dir = !GetDirListBySerial(hdd1_cache_base_dir, current_game.serial).empty(); - if (has_hdd1_cache_dir) { QAction* remove_hdd1_cache = remove_menu->addAction(tr("&Remove HDD1 Cache")); remove_hdd1_cache->setEnabled(!is_current_running_game); - connect(remove_hdd1_cache, &QAction::triggered, [this, hdd1_cache_base_dir, serial = current_game.serial]() + connect(remove_hdd1_cache, &QAction::triggered, [this, serial]() { - RemoveHDD1Cache(hdd1_cache_base_dir, serial, true); + RemoveHDD1Cache(serial, true); }); } - if (has_cache_dir || has_hdd1_cache_dir) + if (!cache_base_dir.empty() || has_hdd1_cache_dir) { QAction* remove_all_caches = remove_menu->addAction(tr("&Remove All Caches")); remove_all_caches->setEnabled(!is_current_running_game); - connect(remove_all_caches, &QAction::triggered, [this, current_game, cache_base_dir, hdd1_cache_base_dir]() + connect(remove_all_caches, &QAction::triggered, [this, serial]() { - if (is_game_running(current_game.serial)) - return; - - if (QMessageBox::question(this, tr("Confirm Removal"), tr("Remove all caches?")) != QMessageBox::Yes) - return; - - RemoveContentPath(cache_base_dir, "cache"); - RemoveHDD1Cache(hdd1_cache_base_dir, current_game.serial); + RemoveAllCaches(serial, true); }); } - const std::string savestate_dir = fs::get_config_dir() + "savestates/" + current_game.serial; - - if (fs::is_dir(savestate_dir)) + if (!savestates_dir.empty()) { remove_menu->addSeparator(); - QAction* remove_savestate = remove_menu->addAction(tr("&Remove Savestates")); - remove_savestate->setEnabled(!is_current_running_game); - connect(remove_savestate, &QAction::triggered, [this, current_game, savestate_dir]() + QAction* remove_savestates = remove_menu->addAction(tr("&Remove Savestates")); + remove_savestates->setEnabled(!is_current_running_game); + connect(remove_savestates, &QAction::triggered, [this, serial]() { - if (is_game_running(current_game.serial)) - return; - - if (QMessageBox::question(this, tr("Confirm Removal"), tr("Remove savestates?")) != QMessageBox::Yes) - return; - - RemoveContentPath(savestate_dir, "savestate"); + SetContentList(SAVESTATES, {}); + RemoveContentList(serial, true); }); } @@ -1460,9 +1394,9 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) manage_game_menu->addSeparator(); // Hide/rename game in game list - QAction* hide_serial = manage_game_menu->addAction(tr("&Hide From Game List")); + QAction* hide_serial = manage_game_menu->addAction(tr("&Hide In Game List")); hide_serial->setCheckable(true); - hide_serial->setChecked(m_hidden_list.contains(serial)); + hide_serial->setChecked(m_hidden_list.contains(QString::fromStdString(serial))); QAction* rename_title = manage_game_menu->addAction(tr("&Rename In Game List")); // Edit tooltip notes/reset time played @@ -1475,6 +1409,13 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) QAction* remove_game = manage_game_menu->addAction(tr("&Remove %1").arg(gameinfo->localized_category)); remove_game->setEnabled(!is_current_running_game); + // Game info + QAction* game_info = manage_game_menu->addAction(tr("&Game Info")); + connect(game_info, &QAction::triggered, this, [this, gameinfo]() + { + ShowGameInfoDialog({gameinfo}); + }); + // Custom Images menu QMenu* icon_menu = menu.addMenu(tr("&Custom Images")); const std::array custom_icon_actions = @@ -1498,7 +1439,7 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) icon_menu->addAction(tr("&Remove Custom Shader Loading Background")) }; - if (const std::string custom_icon_dir_path = fs::get_config_dir() + "/Icons/game_icons/" + current_game.serial; + if (const std::string custom_icon_dir_path = rpcs3::utils::get_icons_dir(serial); fs::create_path(custom_icon_dir_path)) { enum class icon_action @@ -1543,13 +1484,13 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) switch (type) { case icon_type::game_list: - msg = tr("Remove Custom Icon of %0?").arg(serial); + msg = tr("Remove Custom Icon of %0?").arg(QString::fromStdString(serial)); break; case icon_type::hover_gif: - msg = tr("Remove Custom Hover Gif of %0?").arg(serial); + msg = tr("Remove Custom Hover Gif of %0?").arg(QString::fromStdString(serial)); break; case icon_type::shader_load: - msg = tr("Remove Custom Shader Loading Background of %0?").arg(serial); + msg = tr("Remove Custom Shader Loading Background of %0?").arg(QString::fromStdString(serial)); break; } @@ -1628,10 +1569,11 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) QMenu* open_folder_menu = menu.addMenu(tr("&Open Folder")); const bool is_disc_game = QString::fromStdString(current_game.category) == cat::cat_disc_game; - const std::string captures_dir = fs::get_config_dir() + "/captures/"; - const std::string recordings_dir = fs::get_config_dir() + "/recordings/" + current_game.serial; - const std::string screenshots_dir = fs::get_config_dir() + "/screenshots/" + current_game.serial; - std::vector data_dir_list; + const std::string data_dir = fs::get_path_if_dir(rpcs3::utils::get_data_dir(serial)); + const std::string captures_dir = fs::get_path_if_dir(rpcs3::utils::get_captures_dir()); + const std::string recordings_dir = fs::get_path_if_dir(rpcs3::utils::get_recordings_dir(serial)); + const std::string screenshots_dir = fs::get_path_if_dir(rpcs3::utils::get_screenshots_dir(serial)); + std::set data_dir_list; if (is_disc_game) { @@ -1641,14 +1583,15 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) gui::utils::open_dir(current_game.path); }); - data_dir_list = GetDirListBySerial(rpcs3::utils::get_hdd0_dir() + "game/", current_game.serial); // It could be absent for a disc game + // It could be an empty list for a disc game + data_dir_list = rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd0_game_dir(), serial); } else { - data_dir_list.push_back(current_game.path); + data_dir_list.insert(current_game.path); } - if (!data_dir_list.empty()) // "true" if data path is present (it could be absent for a disc game) + if (!data_dir_list.empty()) // "true" if a path is present (it could be an empty list for a disc game) { QAction* open_data_folder = open_folder_menu->addAction(tr("&Open %0 Folder").arg(is_disc_game ? tr("Game Data") : gameinfo->localized_category)); connect(open_data_folder, &QAction::triggered, [data_dir_list]() @@ -1662,10 +1605,10 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) if (gameinfo->has_custom_config) { - QAction* open_config_dir = open_folder_menu->addAction(tr("&Open Custom Config Folder")); - connect(open_config_dir, &QAction::triggered, [current_game]() + QAction* open_config_folder = open_folder_menu->addAction(tr("&Open Custom Config Folder")); + connect(open_config_folder, &QAction::triggered, [serial]() { - const std::string config_path = rpcs3::utils::get_custom_config_path(current_game.serial); + const std::string config_path = rpcs3::utils::get_custom_config_path(serial); if (fs::is_file(config_path)) gui::utils::open_dir(config_path); @@ -1673,7 +1616,7 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) } // This is a debug feature, let's hide it by reusing debug tab protection - if (m_gui_settings->GetValue(gui::m_showDebugTab).toBool() && has_cache_dir) + if (m_gui_settings->GetValue(gui::m_showDebugTab).toBool() && !cache_base_dir.empty()) { QAction* open_cache_folder = open_folder_menu->addAction(tr("&Open Cache Folder")); connect(open_cache_folder, &QAction::triggered, [cache_base_dir]() @@ -1682,43 +1625,46 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) }); } - if (fs::is_dir(config_data_base_dir)) + if (!data_dir.empty()) { - QAction* open_config_data_dir = open_folder_menu->addAction(tr("&Open Config Data Folder")); - connect(open_config_data_dir, &QAction::triggered, [config_data_base_dir]() + QAction* open_data_folder = open_folder_menu->addAction(tr("&Open Data Folder")); + connect(open_data_folder, &QAction::triggered, [data_dir]() { - gui::utils::open_dir(config_data_base_dir); + gui::utils::open_dir(data_dir); }); } - if (fs::is_dir(savestate_dir)) + if (!savestates_dir.empty()) { - QAction* open_savestate_dir = open_folder_menu->addAction(tr("&Open Savestate Folder")); - connect(open_savestate_dir, &QAction::triggered, [savestate_dir]() + QAction* open_savestates_folder = open_folder_menu->addAction(tr("&Open Savestates Folder")); + connect(open_savestates_folder, &QAction::triggered, [savestates_dir]() { - gui::utils::open_dir(savestate_dir); + gui::utils::open_dir(savestates_dir); }); } - QAction* open_captures_dir = open_folder_menu->addAction(tr("&Open Captures Folder")); - connect(open_captures_dir, &QAction::triggered, [captures_dir]() + if (!captures_dir.empty()) { - gui::utils::open_dir(captures_dir); - }); + QAction* open_captures_folder = open_folder_menu->addAction(tr("&Open Captures Folder")); + connect(open_captures_folder, &QAction::triggered, [captures_dir]() + { + gui::utils::open_dir(captures_dir); + }); + } - if (fs::is_dir(recordings_dir)) + if (!recordings_dir.empty()) { - QAction* open_recordings_dir = open_folder_menu->addAction(tr("&Open Recordings Folder")); - connect(open_recordings_dir, &QAction::triggered, [recordings_dir]() + QAction* open_recordings_folder = open_folder_menu->addAction(tr("&Open Recordings Folder")); + connect(open_recordings_folder, &QAction::triggered, [recordings_dir]() { gui::utils::open_dir(recordings_dir); }); } - if (fs::is_dir(screenshots_dir)) + if (!screenshots_dir.empty()) { - QAction* open_screenshots_dir = open_folder_menu->addAction(tr("&Open Screenshots Folder")); - connect(open_screenshots_dir, &QAction::triggered, [screenshots_dir]() + QAction* open_screenshots_folder = open_folder_menu->addAction(tr("&Open Screenshots Folder")); + connect(open_screenshots_folder, &QAction::triggered, [screenshots_dir]() { gui::utils::open_dir(screenshots_dir); }); @@ -1778,7 +1724,7 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) ShowCustomConfigIcon(gameinfo); } }); - connect(hide_serial, &QAction::triggered, this, [serial, this](bool checked) + connect(hide_serial, &QAction::triggered, this, [serial = QString::fromStdString(serial), this](bool checked) { if (checked) m_hidden_list.insert(serial); @@ -1795,195 +1741,16 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) CreateCPUCaches(gameinfo); } }); - connect(remove_game, &QAction::triggered, this, [this, current_game, gameinfo, cache_base_dir, hdd1_cache_base_dir, name] + connect(remove_game, &QAction::triggered, this, [this, gameinfo] { - if (is_game_running(current_game.serial)) - { - QMessageBox::critical(this, tr("Cannot Remove Game"), tr("The PS3 application is still running, it cannot be removed!")); - return; - } - - const bool is_disc_game = QString::fromStdString(current_game.category) == cat::cat_disc_game; - const bool is_in_games_dir = is_disc_game && Emu.IsPathInsideDir(current_game.path, rpcs3::utils::get_games_dir()); - std::vector data_dir_list; - - if (is_disc_game) - { - data_dir_list = GetDirListBySerial(rpcs3::utils::get_hdd0_dir() + "game/", current_game.serial); - } - else - { - data_dir_list.push_back(current_game.path); - } - - const bool has_data_dir = !data_dir_list.empty(); // "true" if data path is present (it could be absent for a disc game) - QString text = tr("%0 - %1\n").arg(QString::fromStdString(current_game.serial)).arg(name); - - if (is_disc_game) - { - text += tr("\nDisc Game Info:\nPath: %0\n").arg(QString::fromStdString(current_game.path)); - - if (current_game.size_on_disk != umax) // If size was properly detected - { - text += tr("Size: %0\n").arg(gui::utils::format_byte_size(current_game.size_on_disk)); - } - } - - if (has_data_dir) - { - u64 total_data_size = 0; - - text += tr("\n%0 Info:\n").arg(is_disc_game ? tr("Game Data") : gameinfo->localized_category); - - for (const std::string& data_dir : data_dir_list) - { - text += tr("Path: %0\n").arg(QString::fromStdString(data_dir)); - - if (const u64 data_size = fs::get_dir_size(data_dir, 1); data_size != umax) // If size was properly detected - { - total_data_size += data_size; - text += tr("Size: %0\n").arg(gui::utils::format_byte_size(data_size)); - } - } - - if (data_dir_list.size() > 1) - { - text += tr("Total size: %0\n").arg(gui::utils::format_byte_size(total_data_size)); - } - } - - if (fs::device_stat stat{}; fs::statfs(rpcs3::utils::get_hdd0_dir(), stat)) // Retrieve disk space info on data path's drive - { - text += tr("\nCurrent free disk space: %0\n").arg(gui::utils::format_byte_size(stat.avail_free)); - } - - if (has_data_dir) - { - text += tr("\nPermanently remove %0 and selected (optional) contents from drive?\n").arg(is_disc_game ? tr("Game Data") : gameinfo->localized_category); - } - else - { - text += tr("\nPermanently remove selected (optional) contents from drive?\n"); - } - - QMessageBox mb(QMessageBox::Question, tr("Confirm %0 Removal").arg(gameinfo->localized_category), text, QMessageBox::Yes | QMessageBox::No, this); - QCheckBox* disc = new QCheckBox(tr("Remove title from game list (Disc Game path is not removed!)")); - QCheckBox* caches = new QCheckBox(tr("Remove caches and custom configs")); - QCheckBox* icons = new QCheckBox(tr("Remove icons and shortcuts")); - QCheckBox* savestate = new QCheckBox(tr("Remove savestates")); - QCheckBox* captures = new QCheckBox(tr("Remove captures")); - QCheckBox* recordings = new QCheckBox(tr("Remove recordings")); - QCheckBox* screenshots = new QCheckBox(tr("Remove screenshots")); - - if (is_disc_game) - { - if (is_in_games_dir) - { - disc->setToolTip(tr("Title located under auto-detection \"games\" folder cannot be removed")); - disc->setDisabled(true); - } - else - { - disc->setChecked(true); - } - } - else - { - disc->setVisible(false); - } - - caches->setChecked(true); - icons->setChecked(true); - mb.setCheckBox(disc); - - QGridLayout* grid = qobject_cast(mb.layout()); - int row, column, rowSpan, columnSpan; - - grid->getItemPosition(grid->indexOf(disc), &row, &column, &rowSpan, &columnSpan); - grid->addWidget(caches, row + 3, column, rowSpan, columnSpan); - grid->addWidget(icons, row + 4, column, rowSpan, columnSpan); - grid->addWidget(savestate, row + 5, column, rowSpan, columnSpan); - grid->addWidget(captures, row + 6, column, rowSpan, columnSpan); - grid->addWidget(recordings, row + 7, column, rowSpan, columnSpan); - grid->addWidget(screenshots, row + 8, column, rowSpan, columnSpan); - - if (mb.exec() == QMessageBox::Yes) - { - const bool remove_caches = caches->isChecked(); - - // Remove data path in "dev_hdd0/game" folder (if any) - if (has_data_dir && RemoveContentPathList(data_dir_list, gameinfo->localized_category.toStdString()) != data_dir_list.size()) - { - QMessageBox::critical(this, tr("Failure!"), remove_caches - ? tr("Failed to remove %0 from drive!\nPath: %1\nCaches and custom configs have been left intact.").arg(name).arg(QString::fromStdString(data_dir_list[0])) - : tr("Failed to remove %0 from drive!\nPath: %1").arg(name).arg(QString::fromStdString(data_dir_list[0]))); - - return; - } - - // Remove lock file in "dev_hdd0/game/$locks" folder (if any) - RemoveContentBySerial(rpcs3::utils::get_hdd0_dir() + "game/$locks/", current_game.serial, "lock"); - - // Remove caches in "cache" and "dev_hdd1/caches" folders (if any) and custom configs in "config/custom_config" folder (if any) - if (remove_caches) - { - RemoveContentPath(cache_base_dir, "cache"); - RemoveHDD1Cache(hdd1_cache_base_dir, current_game.serial); - - RemoveCustomConfiguration(current_game.serial); - RemoveCustomPadConfiguration(current_game.serial); - } - - // Remove icons in "Icons/game_icons" folder, shortcuts in "games/shortcuts" folder and from desktop/start menu - if (icons->isChecked()) - { - RemoveContentBySerial(fs::get_config_dir() + "Icons/game_icons/", current_game.serial, "icons"); - RemoveContentBySerial(fs::get_config_dir() + "games/shortcuts/", name.toStdString() + ".lnk", "link"); - // TODO: Remove shortcuts from desktop/start menu - } - - if (savestate->isChecked()) - { - RemoveContentBySerial(fs::get_config_dir() + "savestates/", current_game.serial, "savestate"); - } - - if (captures->isChecked()) - { - RemoveContentBySerial(fs::get_config_dir() + "captures/", current_game.serial, "captures"); - } - - if (recordings->isChecked()) - { - RemoveContentBySerial(fs::get_config_dir() + "recordings/", current_game.serial, "recordings"); - } - - if (screenshots->isChecked()) - { - RemoveContentBySerial(fs::get_config_dir() + "screenshots/", current_game.serial, "screenshots"); - } - - m_game_data.erase(std::remove(m_game_data.begin(), m_game_data.end(), gameinfo), m_game_data.end()); - game_list_log.success("Removed %s - %s", gameinfo->localized_category, current_game.name); - - std::vector serials_to_remove_from_yml{}; - - // Prepare list of serials (title id) to remove in "games.yml" file (if any) - if (is_disc_game && disc->isChecked()) - { - serials_to_remove_from_yml.push_back(current_game.serial); - } - - // Finally, refresh the game list. - // Hidden list in "GuiConfigs/CurrentSettings.ini" file is also properly updated (title removed) if needed - Refresh(true, serials_to_remove_from_yml); - } + ShowRemoveGameDialog({gameinfo}); }); connect(configure_patches, &QAction::triggered, this, [this, gameinfo]() { patch_manager_dialog patch_manager(m_gui_settings, m_game_data, gameinfo->info.serial, gameinfo->GetGameVersion(), this); patch_manager.exec(); }); - connect(check_compat, &QAction::triggered, this, [serial] + connect(check_compat, &QAction::triggered, this, [serial = QString::fromStdString(serial)] { const QString link = "https://rpcs3.net/compatibility?g=" + serial; QDesktopServices::openUrl(QUrl(link)); @@ -1992,7 +1759,7 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) { m_game_compat->RequestCompatibility(true); }); - connect(rename_title, &QAction::triggered, this, [this, name, serial, global_pos] + connect(rename_title, &QAction::triggered, this, [this, name, serial = QString::fromStdString(serial), global_pos] { const QString custom_title = m_persistent_settings->GetValue(gui::persistent::titles, serial, "").toString(); const QString old_title = custom_title.isEmpty() ? name : custom_title; @@ -2017,7 +1784,7 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) Refresh(true); // full refresh in order to reliably sort the list } }); - connect(edit_notes, &QAction::triggered, this, [this, name, serial] + connect(edit_notes, &QAction::triggered, this, [this, name, serial = QString::fromStdString(serial)] { bool accepted; const QString old_notes = m_persistent_settings->GetValue(gui::persistent::notes, serial, "").toString(); @@ -2038,7 +1805,7 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) Refresh(); } }); - connect(reset_time_played, &QAction::triggered, this, [this, name, serial] + connect(reset_time_played, &QAction::triggered, this, [this, name, serial = QString::fromStdString(serial)] { if (QMessageBox::question(this, tr("Confirm Reset"), tr("Reset time played?\n\n%0 [%1]").arg(name).arg(serial)) == QMessageBox::Yes) { @@ -2047,7 +1814,7 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) Refresh(); } }); - connect(copy_info, &QAction::triggered, this, [name, serial] + connect(copy_info, &QAction::triggered, this, [name, serial = QString::fromStdString(serial)] { QApplication::clipboard()->setText(name % QStringLiteral(" [") % serial % QStringLiteral("]")); }); @@ -2055,7 +1822,7 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) { QApplication::clipboard()->setText(name); }); - connect(copy_serial, &QAction::triggered, this, [serial] + connect(copy_serial, &QAction::triggered, this, [serial = QString::fromStdString(serial)] { QApplication::clipboard()->setText(serial); }); @@ -2075,6 +1842,611 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) menu.exec(global_pos); } +void game_list_frame::ShowMultiSelectionContextMenu(const std::vector& games, QPoint& global_pos) +{ + // Make Actions + QMenu menu; + + // Create LLVM cache + QAction* create_cpu_cache = menu.addAction(tr("&Create LLVM Cache")); + connect(create_cpu_cache, &QAction::triggered, [this, games]() + { + BatchCreateCPUCaches(games, false, true); + }); + + // Remove menu + QMenu* remove_menu = menu.addMenu(tr("&Remove")); + + QAction* remove_custom_config = remove_menu->addAction(tr("&Remove Custom Configuration")); + connect(remove_custom_config, &QAction::triggered, [this, games]() + { + BatchRemoveCustomConfigurations(games, true); + }); + + QAction* remove_custom_pad_config = remove_menu->addAction(tr("&Remove Custom Gamepad Configuration")); + connect(remove_custom_pad_config, &QAction::triggered, [this, games]() + { + BatchRemoveCustomPadConfigurations(games, true); + }); + + remove_menu->addSeparator(); + + QAction* remove_shader_cache = remove_menu->addAction(tr("&Remove Shader Cache")); + connect(remove_shader_cache, &QAction::triggered, [this, games]() + { + BatchRemoveShaderCaches(games, true); + }); + + QAction* remove_ppu_cache = remove_menu->addAction(tr("&Remove PPU Cache")); + connect(remove_ppu_cache, &QAction::triggered, [this, games]() + { + BatchRemovePPUCaches(games, true); + }); + + QAction* remove_spu_cache = remove_menu->addAction(tr("&Remove SPU Cache")); + connect(remove_spu_cache, &QAction::triggered, [this, games]() + { + BatchRemoveSPUCaches(games, true); + }); + + QAction* remove_hdd1_cache = remove_menu->addAction(tr("&Remove HDD1 Cache")); + connect(remove_hdd1_cache, &QAction::triggered, [this, games]() + { + BatchRemoveHDD1Caches(games, true); + }); + + QAction* remove_all_caches = remove_menu->addAction(tr("&Remove All Caches")); + connect(remove_all_caches, &QAction::triggered, [this, games]() + { + BatchRemoveAllCaches(games, true); + }); + + remove_menu->addSeparator(); + + QAction* remove_savestates = remove_menu->addAction(tr("&Remove Savestates")); + connect(remove_savestates, &QAction::triggered, [this, games]() + { + SetContentList(SAVESTATES, {}); + BatchRemoveContentLists(games, true); + }); + + // Disable the Remove menu if empty + remove_menu->setEnabled(!remove_menu->isEmpty()); + + menu.addSeparator(); + + // Manage Game menu + QMenu* manage_game_menu = menu.addMenu(tr("&Manage Game")); + + // Create game shortcuts + QAction* create_desktop_shortcut = manage_game_menu->addAction(tr("&Create Desktop Shortcut")); + connect(create_desktop_shortcut, &QAction::triggered, this, [this, games]() + { + if (QMessageBox::question(this, tr("Confirm Creation"), tr("Create desktop shortcut?")) != QMessageBox::Yes) + return; + + CreateShortcuts(games, {gui::utils::shortcut_location::desktop}); + }); + +#ifdef _WIN32 + QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Start Menu Shortcut")); +#elif defined(__APPLE__) + QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Launchpad Shortcut")); +#else + QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Application Menu Shortcut")); +#endif + connect(create_start_menu_shortcut, &QAction::triggered, this, [this, games]() + { + if (QMessageBox::question(this, tr("Confirm Creation"), tr("Create shortcut?")) != QMessageBox::Yes) + return; + + CreateShortcuts(games, {gui::utils::shortcut_location::applications}); + }); + + manage_game_menu->addSeparator(); + + // Hide game in game list + QAction* hide_serial = manage_game_menu->addAction(tr("&Hide In Game List")); + connect(hide_serial, &QAction::triggered, this, [this, games]() + { + if (QMessageBox::question(this, tr("Confirm Hiding"), tr("Hide in game list?")) != QMessageBox::Yes) + return; + + for (const auto& game : games) + { + m_hidden_list.insert(QString::fromStdString(game->info.serial)); + } + + m_gui_settings->SetValue(gui::gl_hidden_list, QStringList(m_hidden_list.values())); + Refresh(); + }); + + // Show game in game list + QAction* show_serial = manage_game_menu->addAction(tr("&Show In Game List")); + connect(show_serial, &QAction::triggered, this, [this, games]() + { + for (const auto& game : games) + { + m_hidden_list.remove(QString::fromStdString(game->info.serial)); + } + + m_gui_settings->SetValue(gui::gl_hidden_list, QStringList(m_hidden_list.values())); + Refresh(); + }); + + manage_game_menu->addSeparator(); + + // Reset time played + QAction* reset_time_played = manage_game_menu->addAction(tr("&Reset Time Played")); + connect(reset_time_played, &QAction::triggered, this, [this, games]() + { + if (QMessageBox::question(this, tr("Confirm Reset"), tr("Reset time played?")) != QMessageBox::Yes) + return; + + for (const auto& game : games) + { + const auto serial = QString::fromStdString(game->info.serial); + + m_persistent_settings->SetPlaytime(serial, 0, false); + m_persistent_settings->SetLastPlayed(serial, 0, true); + } + + Refresh(); + }); + + manage_game_menu->addSeparator(); + + // Remove game + QAction* remove_game = manage_game_menu->addAction(tr("&Remove Game")); + connect(remove_game, &QAction::triggered, this, [this, games]() + { + ShowRemoveGameDialog(games); + }); + + // Game info + QAction* game_info = manage_game_menu->addAction(tr("&Game Info")); + connect(game_info, &QAction::triggered, this, [this, games]() + { + ShowGameInfoDialog(games); + }); + + menu.exec(global_pos); +} + +void game_list_frame::ShowContextMenu(const QPoint& pos) +{ + QPoint global_pos; + std::vector games; + + // NOTE: Currently, only m_game_list supports rows multi selection! + // + // TODO: Add support to rows multi selection to m_game_grid + + if (m_is_list_layout) + { + global_pos = m_game_list->viewport()->mapToGlobal(pos); + + auto item_list = m_game_list->selectedItems(); + game_info gameinfo; + + for (auto item : item_list) + { + if (item->column() != static_cast(gui::game_list_columns::icon)) + continue; + + if (gameinfo = GetGameInfoFromItem(item); gameinfo) + games.push_back(gameinfo); + } + } + else if (game_list_grid_item* item = static_cast(m_game_grid->selected_item())) + { + global_pos = m_game_grid->mapToGlobal(pos); + + if (game_info gameinfo = item->game(); gameinfo) + games.push_back(gameinfo); + } + + switch (games.size()) + { + case 0: + return; + case 1: + ShowSingleSelectionContextMenu(games[0], global_pos); + break; + default: + ShowMultiSelectionContextMenu(games, global_pos); + break; + } +} + +void game_list_frame::SetContentList(u16 content_types, const content_info& content_info) +{ + m_content_info = content_info; + + m_content_info.content_types = content_types; + m_content_info.clear_on_finish = true; // Always overridden by BatchRemoveContentLists() +} + +void game_list_frame::ClearContentList(bool refresh) +{ + if (refresh) + { + std::vector serials_to_remove_from_yml; + + // Prepare the list of serials (title id) to remove in "games.yml" file (if any) + for (const auto& removedDisc : m_content_info.removed_disc_list) + { + serials_to_remove_from_yml.push_back(removedDisc); + } + + // Finally, refresh the game list + Refresh(true, serials_to_remove_from_yml); + } + + m_content_info = {NO_CONTENT}; +} + +game_list_frame::content_info game_list_frame::GetContentInfo(const std::vector& games) +{ + content_info content_info = {NO_CONTENT}; + + if (games.empty()) + return content_info; + + bool is_disc_game = false; + u64 total_disc_size = 0; + u64 total_data_size = 0; + QString text; + + // Fill in content_info + + content_info.is_single_selection = games.size() == 1; + + for (const auto& game : games) + { + GameInfo& current_game = game->info; + + is_disc_game = QString::fromStdString(current_game.category) == cat::cat_disc_game; + + // +1 if it's a disc game's path and it's present in the shared games folder + content_info.in_games_dir_count += (is_disc_game && Emu.IsPathInsideDir(current_game.path, rpcs3::utils::get_games_dir())) ? 1 : 0; + + // Add the name to the content's name list for the related serial + content_info.name_list[current_game.serial].insert(current_game.name); + + if (is_disc_game) + { + if (current_game.size_on_disk != umax) // If size was properly detected + total_disc_size += current_game.size_on_disk; + + // Add the serial to the disc list + content_info.disc_list.insert(current_game.serial); + + // It could be an empty list for a disc game + std::set data_dir_list = rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd0_game_dir(), current_game.serial); + + // Add the path list to the content's path list for the related serial + for (const auto& data_dir : data_dir_list) + { + content_info.path_list[current_game.serial].insert(data_dir); + } + } + else + { + // Add the path to the content's path list for the related serial + content_info.path_list[current_game.serial].insert(current_game.path); + } + } + + // Fill in text based on filled in content_info + + if (content_info.is_single_selection) // Single selection + { + GameInfo& current_game = games[0]->info; + + text = tr("%0 - %1\n").arg(QString::fromStdString(current_game.serial)).arg(QString::fromStdString(current_game.name)); + + if (is_disc_game) + { + text += tr("\nDisc Game Info:\nPath: %0\n").arg(QString::fromStdString(current_game.path)); + + if (total_disc_size) + text += tr("Size: %0\n").arg(gui::utils::format_byte_size(total_disc_size)); + } + + // if a path is present (it could be an empty list for a disc game) + if (const auto& it = content_info.path_list.find(current_game.serial); it != content_info.path_list.end()) + { + text += tr("\n%0 Info:\n").arg(is_disc_game ? tr("Game Data") : games[0]->localized_category); + + for (const auto& data_dir : it->second) + { + text += tr("Path: %0\n").arg(QString::fromStdString(data_dir)); + + if (const u64 data_size = fs::get_dir_size(data_dir, 1); data_size != umax) + { // If size was properly detected + total_data_size += data_size; + text += tr("Size: %0\n").arg(gui::utils::format_byte_size(data_size)); + } + } + + if (it->second.size() > 1) + text += tr("Total size: %0\n").arg(gui::utils::format_byte_size(total_data_size)); + } + } + else // Multi selection + { + for (const auto& [serial, data_dir_list] : content_info.path_list) + { + for (const auto& data_dir : data_dir_list) + { + if (const u64 data_size = fs::get_dir_size(data_dir, 1); data_size != umax) // If size was properly detected + total_data_size += data_size; + } + } + + text = tr("%0 selected games: %1 Disc Game - %2 not Disc Game\n").arg(games.size()) + .arg(content_info.disc_list.size()).arg(games.size() - content_info.disc_list.size()); + + text += tr("\nDisc Game Info:\n"); + + if (content_info.disc_list.size() != content_info.in_games_dir_count) + text += tr("VFS unhosted: %0\n").arg(content_info.disc_list.size() - content_info.in_games_dir_count); + + if (content_info.in_games_dir_count) + text += tr("VFS hosted: %0\n").arg(content_info.in_games_dir_count); + + if (content_info.disc_list.size() != content_info.in_games_dir_count && content_info.in_games_dir_count) + text += tr("Total games: %0\n").arg((content_info.disc_list.size() - content_info.in_games_dir_count) + content_info.in_games_dir_count); + + if (total_disc_size) + text += tr("Total size: %0\n").arg(gui::utils::format_byte_size(total_disc_size)); + + if (content_info.path_list.size()) + text += tr("\nGame Data Info:\nTotal size: %0\n").arg(gui::utils::format_byte_size(total_data_size)); + } + + u64 caches_size = 0; + u64 icons_size = 0; + u64 savestates_size = 0; + u64 captures_size = 0; + u64 recordings_size = 0; + u64 screenshots_size = 0; + + for (const auto& [serial, name_list] : content_info.name_list) + { + // Main cache + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_cache_dir_by_serial(serial), 1); size != umax) + caches_size += size; + + // HDD1 cache + for (const auto& dir : rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd1_cache_dir(), serial)) + { + if (const u64 size = fs::get_dir_size(dir, 1); size != umax) + caches_size += size; + } + + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_icons_dir(serial), 1); size != umax) + icons_size += size; + + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_savestates_dir(serial), 1); size != umax) + savestates_size += size; + + for (const auto& file : rpcs3::utils::get_file_list(rpcs3::utils::get_captures_dir(), serial)) + { + if (fs::stat_t stat{}; fs::get_stat(file, stat)) + captures_size += stat.size; + } + + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_recordings_dir(serial), 1); size != umax) + recordings_size += size; + + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_screenshots_dir(serial), 1); size != umax) + screenshots_size += size; + } + + text += tr("\nEmulator Data Info:\nCaches size: %0\n").arg(gui::utils::format_byte_size(caches_size)); + text += tr("Icons size: %0\n").arg(gui::utils::format_byte_size(icons_size)); + text += tr("Savestates size: %0\n").arg(gui::utils::format_byte_size(savestates_size)); + text += tr("Captures size: %0\n").arg(gui::utils::format_byte_size(captures_size)); + text += tr("Recordings size: %0\n").arg(gui::utils::format_byte_size(recordings_size)); + text += tr("Screenshots size: %0\n").arg(gui::utils::format_byte_size(screenshots_size)); + + // Retrieve disk space info on data path's drive + if (fs::device_stat stat{}; fs::statfs(rpcs3::utils::get_hdd0_dir(), stat)) + text += tr("\nCurrent free disk space: %0\n").arg(gui::utils::format_byte_size(stat.avail_free)); + + content_info.info = text; + + return content_info; +} + +void game_list_frame::ShowRemoveGameDialog(const std::vector& games) +{ + if (games.empty()) + return; + + content_info content_info = GetContentInfo(games); + QString text = content_info.info; + + QCheckBox* disc = new QCheckBox(tr("Remove title from game list (Disc Game path is not removed!)")); + QCheckBox* caches = new QCheckBox(tr("Remove caches and custom configs")); + QCheckBox* icons = new QCheckBox(tr("Remove icons and shortcuts")); + QCheckBox* savestate = new QCheckBox(tr("Remove savestates")); + QCheckBox* captures = new QCheckBox(tr("Remove captures")); + QCheckBox* recordings = new QCheckBox(tr("Remove recordings")); + QCheckBox* screenshots = new QCheckBox(tr("Remove screenshots")); + + if (content_info.disc_list.size()) + { + if (content_info.in_games_dir_count == content_info.disc_list.size()) + { + disc->setToolTip(tr("Title located under auto-detection VFS \"games\" folder cannot be removed")); + disc->setDisabled(true); + } + else + { + if (!content_info.is_single_selection) // Multi selection + disc->setToolTip(tr("Title located under auto-detection VFS \"games\" folder cannot be removed")); + + disc->setChecked(true); + } + } + else + { + disc->setChecked(false); + disc->setVisible(false); + } + + if (content_info.path_list.size()) // If a path is present + { + text += tr("\nPermanently remove %0 and selected (optional) contents from drive?\n") + .arg((content_info.disc_list.size() || !content_info.is_single_selection) + ? tr("Game Data") : games[0]->localized_category); + } + else + { + text += tr("\nPermanently remove selected (optional) contents from drive?\n"); + } + + caches->setChecked(true); + icons->setChecked(true); + + QMessageBox mb(QMessageBox::Question, tr("Confirm Removal"), text, QMessageBox::Yes | QMessageBox::No, this); + mb.setCheckBox(disc); + + QGridLayout* grid = qobject_cast(mb.layout()); + int row, column, rowSpan, columnSpan; + + grid->getItemPosition(grid->indexOf(disc), &row, &column, &rowSpan, &columnSpan); + grid->addWidget(caches, row + 3, column, rowSpan, columnSpan); + grid->addWidget(icons, row + 4, column, rowSpan, columnSpan); + grid->addWidget(savestate, row + 5, column, rowSpan, columnSpan); + grid->addWidget(captures, row + 6, column, rowSpan, columnSpan); + grid->addWidget(recordings, row + 7, column, rowSpan, columnSpan); + grid->addWidget(screenshots, row + 8, column, rowSpan, columnSpan); + + if (mb.exec() != QMessageBox::Yes) + return; + + // Remove data path in "dev_hdd0/game" folder (if any) and lock file in "dev_hdd0/game/$locks" folder (if any) + u16 content_types = DATA | LOCKS; + + // Remove serials (title id) in "games.yml" file (if any) + if (disc->isChecked()) + content_types |= DISC; + + // Remove caches in "cache" and "dev_hdd1/caches" folders (if any) and custom configs in "config/custom_config" folder (if any) + if (caches->isChecked()) + content_types |= CACHES | CUSTOM_CONFIG; + + // Remove icons in "Icons/game_icons" folder (if any) and + // shortcuts in "games/shortcuts" folder and from desktop / start menu (if any) + if (icons->isChecked()) + content_types |= ICONS | SHORTCUTS; + + if (savestate->isChecked()) + content_types |= SAVESTATES; + + if (captures->isChecked()) + content_types |= CAPTURES; + + if (recordings->isChecked()) + content_types |= RECORDINGS; + + if (screenshots->isChecked()) + content_types |= SCREENSHOTS; + + SetContentList(content_types, content_info); + + if (content_info.is_single_selection) // Single selection + { + if (!RemoveContentList(games[0]->info.serial, true)) + { + QMessageBox::critical(this, tr("Failure!"), caches->isChecked() + ? tr("Failed to remove %0 from drive!\nCaches and custom configs have been left intact.").arg(QString::fromStdString(games[0]->info.name)) + : tr("Failed to remove %0 from drive!").arg(QString::fromStdString(games[0]->info.name))); + + return; + } + } + else // Multi selection + { + BatchRemoveContentLists(games, true); + } +} + +void game_list_frame::ShowGameInfoDialog(const std::vector& games) +{ + if (games.empty()) + return; + + QMessageBox::information(this, tr("Game Info"), GetContentInfo(games).info); +} + +bool game_list_frame::IsGameRunning(const std::string& serial) +{ + return !Emu.IsStopped(true) && (serial == Emu.GetTitleID() || (serial == "vsh.self" && Emu.IsVsh())); +} + +bool game_list_frame::ValidateRemoval(const std::string& serial, const std::string& path, const std::string& desc, bool is_interactive) +{ + if (serial.empty()) + { + game_list_log.error("Removal of %s not allowed due to no title ID provided!", desc); + return false; + } + + if (path.empty() || !fs::exists(path) || (!fs::is_dir(path) && !fs::is_file(path))) + { + game_list_log.success("Could not find %s directory/file: %s (%s)", desc, path, serial); + return false; + } + + if (is_interactive) + { + if (IsGameRunning(serial)) + { + game_list_log.error("Removal of %s not allowed due to %s title is running!", desc, serial); + + QMessageBox::critical(this, tr("Removal Aborted"), + tr("Removal of %0 not allowed due to %1 title is running!") + .arg(QString::fromStdString(desc)).arg(QString::fromStdString(serial))); + + return false; + } + + if (QMessageBox::question(this, tr("Confirm Removal"), tr("Remove %0?").arg(QString::fromStdString(desc))) != QMessageBox::Yes) + return false; + } + + return true; +} + +bool game_list_frame::ValidateBatchRemoval(const std::string& desc, bool is_interactive) +{ + if (!Emu.IsStopped(true)) + { + game_list_log.error("Removal of %s not allowed due to emulator is running!", desc); + + if (is_interactive) + { + QMessageBox::critical(this, tr("Removal Aborted"), + tr("Removal of %0 not allowed due to emulator is running!").arg(QString::fromStdString(desc))); + } + + return false; + } + + if (is_interactive) + { + if (QMessageBox::question(this, tr("Confirm Removal"), tr("Remove %0?").arg(QString::fromStdString(desc))) != QMessageBox::Yes) + return false; + } + + return true; +} + bool game_list_frame::CreateCPUCaches(const std::string& path, const std::string& serial, bool is_fast_compilation) { Emu.GracefulShutdown(false); @@ -2096,14 +2468,11 @@ bool game_list_frame::CreateCPUCaches(const game_info& game, bool is_fast_compil return game && CreateCPUCaches(game->info.path, game->info.serial, is_fast_compilation); } -bool game_list_frame::RemoveCustomConfiguration(const std::string& title_id, const game_info& game, bool is_interactive) +bool game_list_frame::RemoveCustomConfiguration(const std::string& serial, const game_info& game, bool is_interactive) { - const std::string path = rpcs3::utils::get_custom_config_path(title_id); + const std::string path = rpcs3::utils::get_custom_config_path(serial); - if (!fs::is_file(path)) - return true; - - if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), tr("Remove custom game configuration?")) != QMessageBox::Yes) + if (!ValidateRemoval(serial, path, "custom configuration", is_interactive)) return true; bool result = true; @@ -2133,25 +2502,22 @@ bool game_list_frame::RemoveCustomConfiguration(const std::string& title_id, con return result; } -bool game_list_frame::RemoveCustomPadConfiguration(const std::string& title_id, const game_info& game, bool is_interactive) +bool game_list_frame::RemoveCustomPadConfiguration(const std::string& serial, const game_info& game, bool is_interactive) { - if (title_id.empty()) + const std::string config_dir = rpcs3::utils::get_input_config_dir(serial); + + if (!ValidateRemoval(serial, config_dir, "custom gamepad configuration", false)) // no interation needed here return true; - const std::string config_dir = rpcs3::utils::get_input_config_dir(title_id); - - if (!fs::is_dir(config_dir)) - return true; - - if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), (!Emu.IsStopped(true) && Emu.GetTitleID() == title_id) - ? tr("Remove custom pad configuration?\nYour configuration will revert to the global pad settings.") - : tr("Remove custom pad configuration?")) != QMessageBox::Yes) + if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), (!Emu.IsStopped(true) && Emu.GetTitleID() == serial) + ? tr("Remove custom gamepad configuration?\nYour configuration will revert to the global pad settings.") + : tr("Remove custom gamepad configuration?")) != QMessageBox::Yes) return true; g_cfg_input_configs.load(); - g_cfg_input_configs.active_configs.erase(title_id); + g_cfg_input_configs.active_configs.erase(serial); g_cfg_input_configs.save(); - game_list_log.notice("Removed active input configuration entry for key '%s'", title_id); + game_list_log.notice("Removed active input configuration entry for key '%s'", serial); if (QDir(QString::fromStdString(config_dir)).removeRecursively()) { @@ -2159,30 +2525,29 @@ bool game_list_frame::RemoveCustomPadConfiguration(const std::string& title_id, { game->has_custom_pad_config = false; } - if (!Emu.IsStopped(true) && Emu.GetTitleID() == title_id) + if (!Emu.IsStopped(true) && Emu.GetTitleID() == serial) { pad::set_enabled(false); - pad::reset(title_id); + pad::reset(serial); pad::set_enabled(true); } - game_list_log.notice("Removed pad configuration directory: %s", config_dir); + game_list_log.notice("Removed gamepad configuration directory: %s", config_dir); return true; } if (is_interactive) { - QMessageBox::warning(this, tr("Warning!"), tr("Failed to completely remove pad configuration directory!")); - game_list_log.fatal("Failed to completely remove pad configuration directory: %s\nError: %s", config_dir, fs::g_tls_error); + QMessageBox::warning(this, tr("Warning!"), tr("Failed to completely remove gamepad configuration directory!")); + game_list_log.fatal("Failed to completely remove gamepad configuration directory: %s\nError: %s", config_dir, fs::g_tls_error); } return false; } -bool game_list_frame::RemoveShadersCache(const std::string& base_dir, bool is_interactive) +bool game_list_frame::RemoveShaderCache(const std::string& serial, bool is_interactive) { - if (!fs::is_dir(base_dir)) - return true; + const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); - if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), tr("Remove shaders cache?")) != QMessageBox::Yes) + if (!ValidateRemoval(serial, base_dir, "shader cache", is_interactive)) return true; u32 caches_removed = 0; @@ -2200,11 +2565,11 @@ bool game_list_frame::RemoveShadersCache(const std::string& base_dir, bool is_in if (QDir(filepath).removeRecursively()) { ++caches_removed; - game_list_log.notice("Removed shaders cache dir: %s", filepath); + game_list_log.notice("Removed shader cache directory: %s", filepath); } else { - game_list_log.warning("Could not completely remove shaders cache dir: %s", filepath); + game_list_log.warning("Could not completely remove shader cache directory: %s", filepath); } ++caches_total; @@ -2213,9 +2578,9 @@ bool game_list_frame::RemoveShadersCache(const std::string& base_dir, bool is_in const bool success = caches_total == caches_removed; if (success) - game_list_log.success("Removed shaders cache in %s", base_dir); + game_list_log.success("Removed shader cache in %s", base_dir); else - game_list_log.fatal("Only %d/%d shaders cache dirs could be removed in %s", caches_removed, caches_total, base_dir); + game_list_log.fatal("Only %d/%d shader cache directories could be removed in %s", caches_removed, caches_total, base_dir); if (QDir(q_base_dir).isEmpty()) { @@ -2228,12 +2593,11 @@ bool game_list_frame::RemoveShadersCache(const std::string& base_dir, bool is_in return success; } -bool game_list_frame::RemovePPUCache(const std::string& base_dir, bool is_interactive) +bool game_list_frame::RemovePPUCache(const std::string& serial, bool is_interactive) { - if (!fs::is_dir(base_dir)) - return true; + const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); - if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), tr("Remove PPU cache?")) != QMessageBox::Yes) + if (!ValidateRemoval(serial, base_dir, "PPU cache", is_interactive)) return true; u32 files_removed = 0; @@ -2279,12 +2643,11 @@ bool game_list_frame::RemovePPUCache(const std::string& base_dir, bool is_intera return success; } -bool game_list_frame::RemoveSPUCache(const std::string& base_dir, bool is_interactive) +bool game_list_frame::RemoveSPUCache(const std::string& serial, bool is_interactive) { - if (!fs::is_dir(base_dir)) - return true; + const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); - if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), tr("Remove SPU cache?")) != QMessageBox::Yes) + if (!ValidateRemoval(serial, base_dir, "SPU cache", is_interactive)) return true; u32 files_removed = 0; @@ -2330,21 +2693,19 @@ bool game_list_frame::RemoveSPUCache(const std::string& base_dir, bool is_intera return success; } -void game_list_frame::RemoveHDD1Cache(const std::string& base_dir, const std::string& title_id, bool is_interactive) +bool game_list_frame::RemoveHDD1Cache(const std::string& serial, bool is_interactive) { - if (!fs::is_dir(base_dir)) - return; + const std::string base_dir = rpcs3::utils::get_hdd1_cache_dir(); - if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), tr("Remove HDD1 cache?")) != QMessageBox::Yes) - return; + if (!ValidateRemoval(serial, base_dir, "HDD1 cache", is_interactive)) + return true; u32 dirs_removed = 0; u32 dirs_total = 0; + const QStringList filter{ QString::fromStdString(serial + "_*") }; const QString q_base_dir = QString::fromStdString(base_dir); - const QStringList filter{ QString::fromStdString(title_id + "_*") }; - QDirIterator dir_iter(q_base_dir, filter, QDir::Dirs | QDir::NoDotAndDotDot); while (dir_iter.hasNext()) @@ -2358,7 +2719,7 @@ void game_list_frame::RemoveHDD1Cache(const std::string& base_dir, const std::st } else { - game_list_log.warning("Could not remove HDD1 cache directory: %s", filepath); + game_list_log.warning("Could not completely remove HDD1 cache directory: %s", filepath); } ++dirs_total; @@ -2367,12 +2728,164 @@ void game_list_frame::RemoveHDD1Cache(const std::string& base_dir, const std::st const bool success = dirs_removed == dirs_total; if (success) - game_list_log.success("Removed HDD1 cache in %s (%s)", base_dir, title_id); + game_list_log.success("Removed HDD1 cache in %s (%s)", base_dir, serial); else - game_list_log.fatal("Only %d/%d HDD1 cache directories could be removed in %s (%s)", dirs_removed, dirs_total, base_dir, title_id); + game_list_log.fatal("Only %d/%d HDD1 cache directories could be removed in %s (%s)", dirs_removed, dirs_total, base_dir, serial); + + return success; } -void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, QString progressLabel, std::function action, std::function cancel_log, bool refresh_on_finish, bool can_be_concurrent, std::function should_wait_cb) +bool game_list_frame::RemoveAllCaches(const std::string& serial, bool is_interactive) +{ + // Just used for confirmation, if requested. Folder returned by fs::get_config_dir() is always present! + if (!ValidateRemoval(serial, fs::get_config_dir(), "all caches", is_interactive)) + return true; + + const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); + + if (!ValidateRemoval(serial, base_dir, "main cache", false)) // no interation needed here + return true; + + bool success = false; + + if (fs::remove_all(base_dir)) + { + success = true; + game_list_log.success("Removed main cache in %s", base_dir); + + } + else + { + game_list_log.fatal("Could not completely remove main cache in %s (%s)", base_dir, serial); + } + + success |= RemoveHDD1Cache(serial); + + return success; +} + +bool game_list_frame::RemoveContentList(const std::string& serial, bool is_interactive) +{ + // Just used for confirmation, if requested. Folder returned by fs::get_config_dir() is always present! + if (!ValidateRemoval(serial, fs::get_config_dir(), "selected content", is_interactive)) + { + if (m_content_info.clear_on_finish) + ClearContentList(); // Clear only the content's info + + return true; + } + + u16 content_types = m_content_info.content_types; + + // Remove data path in "dev_hdd0/game" folder (if any) + if (content_types & DATA) + { + if (const auto it = m_content_info.path_list.find(serial); it != m_content_info.path_list.cend()) + { + if (RemoveContentPathList(it->second, "data") != it->second.size()) + { + if (m_content_info.clear_on_finish) + ClearContentList(); // Clear only the content's info + + // Skip the removal of the remaining selected contents in case some data paths could not be removed + return false; + } + } + } + + // Add serial (title id) to the list of serials to be removed in "games.yml" file (if any) + if (content_types & DISC) + { + if (const auto it = m_content_info.disc_list.find(serial); it != m_content_info.disc_list.cend()) + m_content_info.removed_disc_list.insert(serial); + } + + // Remove lock file in "dev_hdd0/game/$locks" folder (if any) + if (content_types & LOCKS) + { + if (ValidateRemoval(serial, rpcs3::utils::get_hdd0_locks_dir(), "lock")) + RemoveContentBySerial(rpcs3::utils::get_hdd0_locks_dir(), serial, "lock"); + } + + // Remove caches in "cache" and "dev_hdd1/caches" folders (if any) + if (content_types & CACHES) + { + if (ValidateRemoval(serial, rpcs3::utils::get_cache_dir_by_serial(serial), "all caches")) + RemoveAllCaches(serial); + } + + // Remove custom configs in "config/custom_config" folder (if any) + if (content_types & CUSTOM_CONFIG) + { + if (ValidateRemoval(serial, rpcs3::utils::get_custom_config_path(serial), "custom configuration")) + RemoveCustomConfiguration(serial); + + if (ValidateRemoval(serial, rpcs3::utils::get_input_config_dir(serial), "custom gamepad configuration")) + RemoveCustomPadConfiguration(serial); + } + + // Remove icons in "Icons/game_icons" folder (if any) + if (content_types & ICONS) + { + if (ValidateRemoval(serial, rpcs3::utils::get_icons_dir(serial), "icons")) + RemoveContentBySerial(rpcs3::utils::get_icons_dir(), serial, "icons"); + } + + // Remove shortcuts in "games/shortcuts" folder and from desktop / start menu (if any) + if (content_types & SHORTCUTS) + { + if (const auto it = m_content_info.name_list.find(serial); it != m_content_info.name_list.cend()) + { + const bool remove_rpcs3_links = ValidateRemoval(serial, rpcs3::utils::get_games_shortcuts_dir(), "link"); + + for (const auto& name : it->second) + { + // Remove illegal characters from name to match the link name created by gui::utils::create_shortcut() + const std::string simple_name = QString::fromStdString(vfs::escape(name, true)).simplified().toStdString(); + + // Remove rpcs3 shortcuts + if (remove_rpcs3_links) + RemoveContentBySerial(rpcs3::utils::get_games_shortcuts_dir(), simple_name + ".lnk", "link"); + + // TODO: Remove shortcuts from desktop/start menu + } + } + } + + if (content_types & SAVESTATES) + { + if (ValidateRemoval(serial, rpcs3::utils::get_savestates_dir(serial), "savestates")) + RemoveContentBySerial(rpcs3::utils::get_savestates_dir(), serial, "savestates"); + } + + if (content_types & CAPTURES) + { + if (ValidateRemoval(serial, rpcs3::utils::get_captures_dir(), "captures")) + RemoveContentBySerial(rpcs3::utils::get_captures_dir(), serial, "captures"); + } + + if (content_types & RECORDINGS) + { + if (ValidateRemoval(serial, rpcs3::utils::get_recordings_dir(serial), "recordings")) + RemoveContentBySerial(rpcs3::utils::get_recordings_dir(), serial, "recordings"); + } + + if (content_types & SCREENSHOTS) + { + if (ValidateRemoval(serial, rpcs3::utils::get_screenshots_dir(serial), "screenshots")) + RemoveContentBySerial(rpcs3::utils::get_screenshots_dir(), serial, "screenshots"); + } + + if (m_content_info.clear_on_finish) + ClearContentList(true); // Update the game list and clear the content's info once removed + + return true; +} + +void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, + QString progressLabel, std::function action, + std::function cancel_log, std::function action_on_finish, bool refresh_on_finish, + bool can_be_concurrent, std::function should_wait_cb) { // Concurrent tasks should not wait (at least not in current implementation) ensure(!should_wait_cb || !can_be_concurrent); @@ -2435,6 +2948,11 @@ void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set pdlg->setCancelButtonText(tr("OK")); QApplication::beep(); + if (action_on_finish) + { + action_on_finish(); + } + if (refresh_on_finish && index) { Refresh(true); @@ -2469,6 +2987,11 @@ void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set connect(pdlg, &progress_dialog::canceled, this, [pdlg](){ pdlg->deleteLater(); }); QApplication::beep(); + if (action_on_finish) + { + action_on_finish(); + } + // Signal termination back to the callback action(""); @@ -2482,16 +3005,21 @@ void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set QTimer::singleShot(1, this, *periodic_func); } -void game_list_frame::BatchCreateCPUCaches(const std::vector& game_data, bool is_fast_compilation) +void game_list_frame::BatchCreateCPUCaches(const std::vector& games, bool is_fast_compilation, bool is_interactive) { + if (is_interactive && QMessageBox::question(this, tr("Confirm Creation"), tr("Create LLVM cache?")) != QMessageBox::Yes) + { + return; + } + std::set serials; - if (game_data.empty()) + if (games.empty()) { serials.emplace("vsh.self"); } - for (const auto& game : (game_data.empty() ? m_game_data : game_data)) + for (const auto& game : (games.empty() ? m_game_data : games)) { serials.emplace(game->info.serial); } @@ -2525,7 +3053,7 @@ void game_list_frame::BatchCreateCPUCaches(const std::vector& game_da }); BatchActionBySerials(pdlg, serials, tr("%0\nProgress: %1/%2 caches compiled").arg(main_label), - [&, game_data](const std::string& serial) + [&, games](const std::string& serial) { if (serial.empty()) { @@ -2547,24 +3075,28 @@ void game_list_frame::BatchCreateCPUCaches(const std::vector& game_da [this](u32, u32) { game_list_log.notice("LLVM Cache Batch Creation was canceled"); - }, false, false, + }, nullptr, false, false, []() { return !Emu.IsStopped(true); }); } -void game_list_frame::BatchRemovePPUCaches() +void game_list_frame::BatchRemovePPUCaches(const std::vector& games, bool is_interactive) { - if (Emu.GetStatus(false) != system_state::stopped) + if (!ValidateBatchRemoval("PPU cache", is_interactive)) { return; } std::set serials; - serials.emplace("vsh.self"); - for (const auto& game : m_game_data) + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_data : games)) { serials.emplace(game->info.serial); } @@ -2582,28 +3114,32 @@ void game_list_frame::BatchRemovePPUCaches() pdlg->setAutoReset(false); pdlg->open(); - BatchActionBySerials(pdlg, serials, tr("%0/%1 caches cleared"), + BatchActionBySerials(pdlg, serials, tr("%0/%1 PPU caches cleared"), [this](const std::string& serial) { - return !serial.empty() &&Emu.IsStopped(true) && RemovePPUCache(GetCacheDirBySerial(serial)); + return !serial.empty() && Emu.IsStopped(true) && RemovePPUCache(serial); }, - [this](u32, u32) + [this](u32 removed, u32 total) { - game_list_log.notice("PPU Cache Batch Removal was canceled"); - }, false); + game_list_log.notice("PPU Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); } -void game_list_frame::BatchRemoveSPUCaches() +void game_list_frame::BatchRemoveSPUCaches(const std::vector& games, bool is_interactive) { - if (Emu.GetStatus(false) != system_state::stopped) + if (!ValidateBatchRemoval("SPU cache", is_interactive)) { return; } std::set serials; - serials.emplace("vsh.self"); - for (const auto& game : m_game_data) + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_data : games)) { serials.emplace(game->info.serial); } @@ -2621,21 +3157,166 @@ void game_list_frame::BatchRemoveSPUCaches() pdlg->setAutoReset(false); pdlg->open(); - BatchActionBySerials(pdlg, serials, tr("%0/%1 caches cleared"), + BatchActionBySerials(pdlg, serials, tr("%0/%1 SPU caches cleared"), [this](const std::string& serial) { - return !serial.empty() && Emu.IsStopped(true) && RemoveSPUCache(GetCacheDirBySerial(serial)); + return !serial.empty() && Emu.IsStopped(true) && RemoveSPUCache(serial); }, [this](u32 removed, u32 total) { - game_list_log.notice("SPU Cache Batch Removal was canceled. %d/%d folders cleared", removed, total); + game_list_log.notice("SPU Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); +} + +void game_list_frame::BatchRemoveHDD1Caches(const std::vector& games, bool is_interactive) +{ + if (!ValidateBatchRemoval("HDD1 cache", is_interactive)) + { + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_data : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(this, tr("HDD1 Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("HDD1 Cache Batch Removal"), tr("Removing all HDD1 caches"), tr("Cancel"), 0, total, false, this); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 HDD1 caches cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveHDD1Cache(serial); + }, + [this](u32 removed, u32 total) + { + game_list_log.notice("HDD1 Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); +} + +void game_list_frame::BatchRemoveAllCaches(const std::vector& games, bool is_interactive) +{ + if (!ValidateBatchRemoval("all caches", is_interactive)) + { + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_data : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(this, tr("Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Cache Batch Removal"), tr("Removing all caches"), tr("Cancel"), 0, total, false, this); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 caches cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveAllCaches(serial); + }, + [this](u32 removed, u32 total) + { + game_list_log.notice("Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); +} + +void game_list_frame::BatchRemoveContentLists(const std::vector& games, bool is_interactive) +{ + // Let the batch process (not RemoveContentList()) make cleanup when terminated + m_content_info.clear_on_finish = false; + + if (!ValidateBatchRemoval("selected content", is_interactive)) + { + ClearContentList(); // Clear only the content's info + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_data : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(this, tr("Content Batch Removal"), tr("No files found"), QMessageBox::Ok); + + ClearContentList(); // Clear only the content's info + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Content Batch Removal"), tr("Removing all contents"), tr("Cancel"), 0, total, false, this); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 contents cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveContentList(serial); + }, + [this](u32 removed, u32 total) + { + game_list_log.notice("Content Batch Removal was canceled. %d/%d contents cleared", removed, total); + }, + [this]() // Make cleanup when batch process terminated + { + ClearContentList(true); // Update the game list and clear the content's info once removed }, false); } -void game_list_frame::BatchRemoveCustomConfigurations() +void game_list_frame::BatchRemoveCustomConfigurations(const std::vector& games, bool is_interactive) { + if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), tr("Remove custom configuration?")) != QMessageBox::Yes) + { + return; + } + std::set serials; - for (const auto& game : m_game_data) + + for (const auto& game : (games.empty() ? m_game_data : games)) { if (game->has_custom_config && !serials.count(game->info.serial)) { @@ -2664,54 +3345,65 @@ void game_list_frame::BatchRemoveCustomConfigurations() [this](u32 removed, u32 total) { game_list_log.notice("Custom Configuration Batch Removal was canceled. %d/%d custom configurations cleared", removed, total); - }, true); + }, nullptr, true); } -void game_list_frame::BatchRemoveCustomPadConfigurations() +void game_list_frame::BatchRemoveCustomPadConfigurations(const std::vector& games, bool is_interactive) { + if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), tr("Remove custom gamepad configuration?")) != QMessageBox::Yes) + { + return; + } + std::set serials; - for (const auto& game : m_game_data) + + for (const auto& game : (games.empty() ? m_game_data : games)) { if (game->has_custom_pad_config && !serials.count(game->info.serial)) { serials.emplace(game->info.serial); } } + const u32 total = ::size32(serials); if (total == 0) { - QMessageBox::information(this, tr("Custom Pad Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); + QMessageBox::information(this, tr("Custom Gamepad Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); return; } - progress_dialog* pdlg = new progress_dialog(tr("Custom Pad Configuration Batch Removal"), tr("Removing all custom pad configurations"), tr("Cancel"), 0, total, false, this); + progress_dialog* pdlg = new progress_dialog(tr("Custom Gamepad Configuration Batch Removal"), tr("Removing all custom gamepad configurations"), tr("Cancel"), 0, total, false, this); pdlg->setAutoClose(false); pdlg->setAutoReset(false); pdlg->open(); - BatchActionBySerials(pdlg, serials, tr("%0/%1 custom pad configurations cleared"), + BatchActionBySerials(pdlg, serials, tr("%0/%1 custom gamepad configurations cleared"), [this](const std::string& serial) { return !serial.empty() && Emu.IsStopped(true) && RemoveCustomPadConfiguration(serial); }, [this](u32 removed, u32 total) { - game_list_log.notice("Custom Pad Configuration Batch Removal was canceled. %d/%d custom pad configurations cleared", removed, total); - }, true); + game_list_log.notice("Custom Gamepad Configuration Batch Removal was canceled. %d/%d custom gamepad configurations cleared", removed, total); + }, nullptr, true); } -void game_list_frame::BatchRemoveShaderCaches() +void game_list_frame::BatchRemoveShaderCaches(const std::vector& games, bool is_interactive) { - if (Emu.GetStatus(false) != system_state::stopped) + if (!ValidateBatchRemoval("shader cache", is_interactive)) { return; } std::set serials; - serials.emplace("vsh.self"); - for (const auto& game : m_game_data) + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_data : games)) { serials.emplace(game->info.serial); } @@ -2732,12 +3424,12 @@ void game_list_frame::BatchRemoveShaderCaches() BatchActionBySerials(pdlg, serials, tr("%0/%1 shader caches cleared"), [this](const std::string& serial) { - return !serial.empty() && Emu.IsStopped(true) && RemoveShadersCache(GetCacheDirBySerial(serial)); + return !serial.empty() && Emu.IsStopped(true) && RemoveShaderCache(serial); }, [this](u32 removed, u32 total) { - game_list_log.notice("Shader Cache Batch Removal was canceled. %d/%d cleared", removed, total); - }, false); + game_list_log.notice("Shader Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); } void game_list_frame::ShowCustomConfigIcon(const game_info& game) diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index bcdd643ca2..5de72360e3 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -63,13 +63,54 @@ public: bool IsEntryVisible(const game_info& game, bool search_fallback = false) const; + enum content_type + { + NO_CONTENT = 0, + DISC = (1 << 0), + DATA = (1 << 1), + LOCKS = (1 << 2), + CACHES = (1 << 3), + CUSTOM_CONFIG = (1 << 4), + ICONS = (1 << 5), + SHORTCUTS = (1 << 6), + SAVESTATES = (1 << 7), + CAPTURES = (1 << 8), + RECORDINGS = (1 << 9), + SCREENSHOTS = (1 << 10) + }; + + struct content_info + { + u16 content_types = NO_CONTENT; // Always set by SetContentList() + bool clear_on_finish = true; // Always overridden by BatchRemoveContentLists() + + bool is_single_selection = false; + u16 in_games_dir_count = 0; + QString info; + std::map> name_list; + std::map> path_list; + std::set disc_list; + std::set removed_disc_list; // Filled in by RemoveContentList() + }; + public Q_SLOTS: - void BatchCreateCPUCaches(const std::vector& game_data = {}, bool is_fast_compilation = false); - void BatchRemovePPUCaches(); - void BatchRemoveSPUCaches(); - void BatchRemoveCustomConfigurations(); - void BatchRemoveCustomPadConfigurations(); - void BatchRemoveShaderCaches(); + void BatchCreateCPUCaches(const std::vector& games = {}, bool is_fast_compilation = false, bool is_interactive = false); + void BatchRemoveCustomConfigurations(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveCustomPadConfigurations(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveShaderCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemovePPUCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveSPUCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveHDD1Caches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveAllCaches(const std::vector& games = {}, bool is_interactive = false); + + // NOTES: + // - SetContentList() MUST always be called to set the content's info to be removed by: + // - RemoveContentList() + // - BatchRemoveContentLists() + // + void SetContentList(u16 content_types, const content_info& content_info); + void BatchRemoveContentLists(const std::vector& games = {}, bool is_interactive = false); + void SetListMode(bool is_list); void SetSearchText(const QString& text); void SetShowCompatibilityInGrid(bool show); @@ -132,22 +173,49 @@ private: void ShowCustomConfigIcon(const game_info& game); bool SearchMatchesApp(const QString& name, const QString& serial, bool fallback = false) const; - bool RemoveCustomConfiguration(const std::string& title_id, const game_info& game = nullptr, bool is_interactive = false); - bool RemoveCustomPadConfiguration(const std::string& title_id, const game_info& game = nullptr, bool is_interactive = false); - bool RemoveShadersCache(const std::string& base_dir, bool is_interactive = false); - bool RemovePPUCache(const std::string& base_dir, bool is_interactive = false); - bool RemoveSPUCache(const std::string& base_dir, bool is_interactive = false); - void RemoveHDD1Cache(const std::string& base_dir, const std::string& title_id, bool is_interactive = false); + void ShowSingleSelectionContextMenu(const game_info& gameinfo, QPoint& global_pos); + void ShowMultiSelectionContextMenu(const std::vector& games, QPoint& global_pos); + + // NOTE: + // m_content_info is used by: + // - SetContentList() + // - ClearContentList() + // - GetContentInfo() + // - RemoveContentList() + // - BatchRemoveContentLists() + // + content_info m_content_info; + + void ClearContentList(bool refresh = false); + content_info GetContentInfo(const std::vector& games); + + void ShowRemoveGameDialog(const std::vector& games); + void ShowGameInfoDialog(const std::vector& games); + + static bool IsGameRunning(const std::string& serial); + bool ValidateRemoval(const std::string& serial, const std::string& path, const std::string& desc, bool is_interactive = false); + bool ValidateBatchRemoval(const std::string& desc, bool is_interactive = false); + static bool CreateCPUCaches(const std::string& path, const std::string& serial = {}, bool is_fast_compilation = false); static bool CreateCPUCaches(const game_info& game, bool is_fast_compilation = false); + bool RemoveCustomConfiguration(const std::string& serial, const game_info& game = nullptr, bool is_interactive = false); + bool RemoveCustomPadConfiguration(const std::string& serial, const game_info& game = nullptr, bool is_interactive = false); + bool RemoveShaderCache(const std::string& serial, bool is_interactive = false); + bool RemovePPUCache(const std::string& serial, bool is_interactive = false); + bool RemoveSPUCache(const std::string& serial, bool is_interactive = false); + bool RemoveHDD1Cache(const std::string& serial, bool is_interactive = false); + bool RemoveAllCaches(const std::string& serial, bool is_interactive = false); + bool RemoveContentList(const std::string& serial, bool is_interactive = false); static bool RemoveContentPath(const std::string& path, const std::string& desc); - static u32 RemoveContentPathList(const std::vector& path_list, const std::string& desc); + static u32 RemoveContentPathList(const std::set& path_list, const std::string& desc); static bool RemoveContentBySerial(const std::string& base_dir, const std::string& serial, const std::string& desc); - static std::vector GetDirListBySerial(const std::string& base_dir, const std::string& serial); - void BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, QString progressLabel, std::function action, std::function cancel_log, bool refresh_on_finish, bool can_be_concurrent = false, std::function should_wait_cb = {}); - static std::string GetCacheDirBySerial(const std::string& serial); - static std::string GetDataDirBySerial(const std::string& serial); + + void BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, + QString progressLabel, std::function action, + std::function cancel_log, std::function action_on_finish, bool refresh_on_finish, + bool can_be_concurrent = false, std::function should_wait_cb = {}); + std::string CurrentSelectionPath(); game_info GetGameInfoByMode(const QTableWidgetItem* item) const; diff --git a/rpcs3/rpcs3qt/game_list_table.cpp b/rpcs3/rpcs3qt/game_list_table.cpp index 8d721f86ec..3d010c7689 100644 --- a/rpcs3/rpcs3qt/game_list_table.cpp +++ b/rpcs3/rpcs3qt/game_list_table.cpp @@ -24,7 +24,7 @@ game_list_table::game_list_table(game_list_frame* frame, std::shared_ptrsetSingleStep(20); diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 2778a1d92a..6132e237f8 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -221,7 +221,7 @@ bool main_window::Init([[maybe_unused]] bool with_cli_boot) if (enable_play_last) { - ui->sysPauseAct->setText(tr("&Play last played game")); + ui->sysPauseAct->setText(tr("&Play Last Played Game")); ui->sysPauseAct->setIcon(m_icon_play); ui->toolbar_start->setToolTip(start_tooltip); } @@ -2722,15 +2722,43 @@ void main_window::CreateConnects() }); connect(ui->exitAct, &QAction::triggered, this, &QWidget::close); - connect(ui->batchCreateCPUCachesAct, &QAction::triggered, m_game_list_frame, [list = m_game_list_frame]() { list->BatchCreateCPUCaches(); }); - connect(ui->batchRemoveCustomConfigurationsAct, &QAction::triggered, m_game_list_frame, &game_list_frame::BatchRemoveCustomConfigurations); - connect(ui->batchRemoveCustomPadConfigurationsAct, &QAction::triggered, m_game_list_frame, &game_list_frame::BatchRemoveCustomPadConfigurations); - connect(ui->batchRemoveShaderCachesAct, &QAction::triggered, m_game_list_frame, &game_list_frame::BatchRemoveShaderCaches); - connect(ui->batchRemovePPUCachesAct, &QAction::triggered, m_game_list_frame, &game_list_frame::BatchRemovePPUCaches); - connect(ui->batchRemoveSPUCachesAct, &QAction::triggered, m_game_list_frame, &game_list_frame::BatchRemoveSPUCaches); - connect(ui->removeHDD1CachesAct, &QAction::triggered, this, &main_window::RemoveHDD1Caches); - connect(ui->removeAllCachesAct, &QAction::triggered, this, &main_window::RemoveAllCaches); - connect(ui->removeSavestatesAct, &QAction::triggered, this, &main_window::RemoveSavestates); + connect(ui->batchCreateCPUCachesAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->BatchCreateCPUCaches({}, false, true); + }); + connect(ui->batchRemoveCustomConfigurationsAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->BatchRemoveCustomConfigurations({}, true); + }); + connect(ui->batchRemoveCustomPadConfigurationsAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->BatchRemoveCustomPadConfigurations({}, true); + }); + connect(ui->batchRemoveShaderCachesAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->BatchRemoveShaderCaches({}, true); + }); + connect(ui->batchRemovePPUCachesAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->BatchRemovePPUCaches({}, true); + }); + connect(ui->batchRemoveSPUCachesAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->BatchRemoveSPUCaches({}, true); + }); + connect(ui->removeHDD1CachesAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->BatchRemoveHDD1Caches({}, true); + }); + connect(ui->removeAllCachesAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->BatchRemoveAllCaches({}, true); + }); + connect(ui->removeSavestatesAct, &QAction::triggered, this, [this]() + { + m_game_list_frame->SetContentList(game_list_frame::content_type::SAVESTATES, {}); + m_game_list_frame->BatchRemoveContentLists({}, true); + }); connect(ui->cleanUpGameListAct, &QAction::triggered, this, &main_window::CleanUpGameList); connect(ui->removeFirmwareCacheAct, &QAction::triggered, this, &main_window::RemoveFirmwareCache); @@ -3659,67 +3687,6 @@ void main_window::SetIconSizeActions(int idx) const ui->setIconSizeLargeAct->setChecked(true); } -void main_window::RemoveHDD1Caches() -{ - if (fs::remove_all(rpcs3::utils::get_hdd1_dir() + "caches", false)) - { - QMessageBox::information(this, tr("HDD1 Caches Removed"), tr("HDD1 caches successfully removed")); - } - else - { - QMessageBox::warning(this, tr("Error"), tr("Could not remove HDD1 caches")); - } -} - -void main_window::RemoveAllCaches() -{ - if (QMessageBox::question(this, tr("Confirm Removal"), tr("Remove all caches?")) != QMessageBox::Yes) - return; - - const std::string cache_base_dir = rpcs3::utils::get_cache_dir(); - u64 caches_count = 0; - u64 caches_removed = 0; - - for (const game_info& game : m_game_list_frame->GetGameInfo()) // Loop on detected games - { - if (game && QString::fromStdString(game->info.category) != cat::cat_ps3_os && fs::exists(cache_base_dir + game->info.serial)) // If not OS category and cache exists - { - caches_count++; - - if (fs::remove_all(cache_base_dir + game->info.serial)) - { - caches_removed++; - } - } - } - - if (caches_count == caches_removed) - { - QMessageBox::information(this, tr("Caches Removed"), tr("%0 cache(s) successfully removed").arg(caches_removed)); - } - else - { - QMessageBox::warning(this, tr("Error"), tr("Could not remove %0 of %1 cache(s)").arg(caches_count - caches_removed).arg(caches_count)); - } - - RemoveHDD1Caches(); -} - -void main_window::RemoveSavestates() -{ - if (QMessageBox::question(this, tr("Confirm Removal"), tr("Remove savestates?")) != QMessageBox::Yes) - return; - - if (fs::remove_all(fs::get_config_dir() + "savestates", false)) - { - QMessageBox::information(this, tr("Savestates Removed"), tr("Savestates successfully removed")); - } - else - { - QMessageBox::warning(this, tr("Error"), tr("Could not remove savestates")); - } -} - void main_window::CleanUpGameList() { if (QMessageBox::question(this, tr("Confirm Removal"), tr("Remove invalid game paths from game list?\n" diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index f93f17a484..ada8f01cad 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -114,9 +114,6 @@ private Q_SLOTS: void SetIconSizeActions(int idx) const; void ResizeIcons(int index); - void RemoveHDD1Caches(); - void RemoveAllCaches(); - void RemoveSavestates(); void CleanUpGameList(); void RemoveFirmwareCache(); diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index 39a3c014bb..bf75029d38 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -1174,7 +1174,7 @@ - Remove Custom Pad Configurations + Remove Custom Gamepad Configurations From 1eb0b2260d6d47e21f0066df34cbb91068e7275d Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 6 Jan 2026 14:19:59 +0100 Subject: [PATCH 071/630] Refactor game_list_frame --- rpcs3/rpcs3.vcxproj | 36 +- rpcs3/rpcs3.vcxproj.filters | 24 + rpcs3/rpcs3qt/CMakeLists.txt | 2 + rpcs3/rpcs3qt/game_list_actions.cpp | 1604 ++++++++++++++ rpcs3/rpcs3qt/game_list_actions.h | 113 + rpcs3/rpcs3qt/game_list_context_menu.cpp | 907 ++++++++ rpcs3/rpcs3qt/game_list_context_menu.h | 32 + rpcs3/rpcs3qt/game_list_frame.cpp | 2457 +--------------------- rpcs3/rpcs3qt/game_list_frame.h | 144 +- rpcs3/rpcs3qt/game_list_grid.cpp | 2 - rpcs3/rpcs3qt/main_window.cpp | 24 +- 11 files changed, 2767 insertions(+), 2578 deletions(-) create mode 100644 rpcs3/rpcs3qt/game_list_actions.cpp create mode 100644 rpcs3/rpcs3qt/game_list_actions.h create mode 100644 rpcs3/rpcs3qt/game_list_context_menu.cpp create mode 100644 rpcs3/rpcs3qt/game_list_context_menu.h diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 9bef8696fe..028f2e74c8 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -289,6 +289,12 @@ true + + true + + + true + true @@ -586,6 +592,12 @@ true + + true + + + true + true @@ -833,7 +845,9 @@ + + @@ -1458,6 +1472,26 @@ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + $(QTDIR)\bin\moc.exe;%(FullPath) @@ -2236,4 +2270,4 @@ - + \ No newline at end of file diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 5d9f844e63..100a9b1d8f 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1254,6 +1254,24 @@ Io\camera + + Gui\game list + + + Gui\game list + + + Generated Files\Debug + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Release + @@ -1837,6 +1855,12 @@ Gui\debugger + + Gui\game list + + + Gui\game list + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index 9352f58823..5b74a77a59 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -31,7 +31,9 @@ add_library(rpcs3_ui STATIC flow_widget_item.cpp game_compatibility.cpp game_list.cpp + game_list_actions.cpp game_list_base.cpp + game_list_context_menu.cpp game_list_delegate.cpp game_list_frame.cpp game_list_grid.cpp diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp new file mode 100644 index 0000000000..3e8a57d703 --- /dev/null +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -0,0 +1,1604 @@ +#include "stdafx.h" +#include "game_list_actions.h" +#include "game_list_frame.h" +#include "gui_settings.h" +#include "category.h" +#include "qt_utils.h" +#include "progress_dialog.h" + +#include "Utilities/File.h" + +#include "Emu/System.h" +#include "Emu/system_utils.hpp" +#include "Emu/VFS.h" +#include "Emu/vfs_config.h" + +#include "Input/pad_thread.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +LOG_CHANNEL(game_list_log, "GameList"); + +extern atomic_t g_system_progress_canceled; + +game_list_actions::game_list_actions(game_list_frame* frame, std::shared_ptr gui_settings) + : m_game_list_frame(frame), m_gui_settings(std::move(gui_settings)) +{ + ensure(!!m_game_list_frame); + ensure(!!m_gui_settings); +} + +game_list_actions::~game_list_actions() +{ +} + +void game_list_actions::SetContentList(u16 content_types, const content_info& content_info) +{ + m_content_info = content_info; + + m_content_info.content_types = content_types; + m_content_info.clear_on_finish = true; // Always overridden by BatchRemoveContentLists() +} + +void game_list_actions::ClearContentList(bool refresh) +{ + if (refresh) + { + std::vector serials_to_remove_from_yml; + + // Prepare the list of serials (title id) to remove in "games.yml" file (if any) + for (const auto& removedDisc : m_content_info.removed_disc_list) + { + serials_to_remove_from_yml.push_back(removedDisc); + } + + // Finally, refresh the game list + m_game_list_frame->Refresh(true, serials_to_remove_from_yml); + } + + m_content_info = {NO_CONTENT}; +} + +game_list_actions::content_info game_list_actions::GetContentInfo(const std::vector& games) +{ + content_info content_info = {NO_CONTENT}; + + if (games.empty()) + return content_info; + + bool is_disc_game = false; + u64 total_disc_size = 0; + u64 total_data_size = 0; + QString text; + + // Fill in content_info + + content_info.is_single_selection = games.size() == 1; + + for (const auto& game : games) + { + GameInfo& current_game = game->info; + + is_disc_game = QString::fromStdString(current_game.category) == cat::cat_disc_game; + + // +1 if it's a disc game's path and it's present in the shared games folder + content_info.in_games_dir_count += (is_disc_game && Emu.IsPathInsideDir(current_game.path, rpcs3::utils::get_games_dir())) ? 1 : 0; + + // Add the name to the content's name list for the related serial + content_info.name_list[current_game.serial].insert(current_game.name); + + if (is_disc_game) + { + if (current_game.size_on_disk != umax) // If size was properly detected + total_disc_size += current_game.size_on_disk; + + // Add the serial to the disc list + content_info.disc_list.insert(current_game.serial); + + // It could be an empty list for a disc game + std::set data_dir_list = rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd0_game_dir(), current_game.serial); + + // Add the path list to the content's path list for the related serial + for (const auto& data_dir : data_dir_list) + { + content_info.path_list[current_game.serial].insert(data_dir); + } + } + else + { + // Add the path to the content's path list for the related serial + content_info.path_list[current_game.serial].insert(current_game.path); + } + } + + // Fill in text based on filled in content_info + + if (content_info.is_single_selection) // Single selection + { + GameInfo& current_game = games[0]->info; + + text = tr("%0 - %1\n").arg(QString::fromStdString(current_game.serial)).arg(QString::fromStdString(current_game.name)); + + if (is_disc_game) + { + text += tr("\nDisc Game Info:\nPath: %0\n").arg(QString::fromStdString(current_game.path)); + + if (total_disc_size) + text += tr("Size: %0\n").arg(gui::utils::format_byte_size(total_disc_size)); + } + + // if a path is present (it could be an empty list for a disc game) + if (const auto& it = content_info.path_list.find(current_game.serial); it != content_info.path_list.end()) + { + text += tr("\n%0 Info:\n").arg(is_disc_game ? tr("Game Data") : games[0]->localized_category); + + for (const auto& data_dir : it->second) + { + text += tr("Path: %0\n").arg(QString::fromStdString(data_dir)); + + if (const u64 data_size = fs::get_dir_size(data_dir, 1); data_size != umax) + { // If size was properly detected + total_data_size += data_size; + text += tr("Size: %0\n").arg(gui::utils::format_byte_size(data_size)); + } + } + + if (it->second.size() > 1) + text += tr("Total size: %0\n").arg(gui::utils::format_byte_size(total_data_size)); + } + } + else // Multi selection + { + for (const auto& [serial, data_dir_list] : content_info.path_list) + { + for (const auto& data_dir : data_dir_list) + { + if (const u64 data_size = fs::get_dir_size(data_dir, 1); data_size != umax) // If size was properly detected + total_data_size += data_size; + } + } + + text = tr("%0 selected games: %1 Disc Game - %2 not Disc Game\n").arg(games.size()) + .arg(content_info.disc_list.size()).arg(games.size() - content_info.disc_list.size()); + + text += tr("\nDisc Game Info:\n"); + + if (content_info.disc_list.size() != content_info.in_games_dir_count) + text += tr("VFS unhosted: %0\n").arg(content_info.disc_list.size() - content_info.in_games_dir_count); + + if (content_info.in_games_dir_count) + text += tr("VFS hosted: %0\n").arg(content_info.in_games_dir_count); + + if (content_info.disc_list.size() != content_info.in_games_dir_count && content_info.in_games_dir_count) + text += tr("Total games: %0\n").arg((content_info.disc_list.size() - content_info.in_games_dir_count) + content_info.in_games_dir_count); + + if (total_disc_size) + text += tr("Total size: %0\n").arg(gui::utils::format_byte_size(total_disc_size)); + + if (content_info.path_list.size()) + text += tr("\nGame Data Info:\nTotal size: %0\n").arg(gui::utils::format_byte_size(total_data_size)); + } + + u64 caches_size = 0; + u64 icons_size = 0; + u64 savestates_size = 0; + u64 captures_size = 0; + u64 recordings_size = 0; + u64 screenshots_size = 0; + + for (const auto& [serial, name_list] : content_info.name_list) + { + // Main cache + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_cache_dir_by_serial(serial), 1); size != umax) + caches_size += size; + + // HDD1 cache + for (const auto& dir : rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd1_cache_dir(), serial)) + { + if (const u64 size = fs::get_dir_size(dir, 1); size != umax) + caches_size += size; + } + + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_icons_dir(serial), 1); size != umax) + icons_size += size; + + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_savestates_dir(serial), 1); size != umax) + savestates_size += size; + + for (const auto& file : rpcs3::utils::get_file_list(rpcs3::utils::get_captures_dir(), serial)) + { + if (fs::stat_t stat{}; fs::get_stat(file, stat)) + captures_size += stat.size; + } + + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_recordings_dir(serial), 1); size != umax) + recordings_size += size; + + if (const u64 size = fs::get_dir_size(rpcs3::utils::get_screenshots_dir(serial), 1); size != umax) + screenshots_size += size; + } + + text += tr("\nEmulator Data Info:\nCaches size: %0\n").arg(gui::utils::format_byte_size(caches_size)); + text += tr("Icons size: %0\n").arg(gui::utils::format_byte_size(icons_size)); + text += tr("Savestates size: %0\n").arg(gui::utils::format_byte_size(savestates_size)); + text += tr("Captures size: %0\n").arg(gui::utils::format_byte_size(captures_size)); + text += tr("Recordings size: %0\n").arg(gui::utils::format_byte_size(recordings_size)); + text += tr("Screenshots size: %0\n").arg(gui::utils::format_byte_size(screenshots_size)); + + // Retrieve disk space info on data path's drive + if (fs::device_stat stat{}; fs::statfs(rpcs3::utils::get_hdd0_dir(), stat)) + text += tr("\nCurrent free disk space: %0\n").arg(gui::utils::format_byte_size(stat.avail_free)); + + content_info.info = text; + + return content_info; +} + +void game_list_actions::ShowRemoveGameDialog(const std::vector& games) +{ + if (games.empty()) + return; + + content_info content_info = GetContentInfo(games); + QString text = content_info.info; + + QCheckBox* disc = new QCheckBox(tr("Remove title from game list (Disc Game path is not removed!)")); + QCheckBox* caches = new QCheckBox(tr("Remove caches and custom configs")); + QCheckBox* icons = new QCheckBox(tr("Remove icons and shortcuts")); + QCheckBox* savestate = new QCheckBox(tr("Remove savestates")); + QCheckBox* captures = new QCheckBox(tr("Remove captures")); + QCheckBox* recordings = new QCheckBox(tr("Remove recordings")); + QCheckBox* screenshots = new QCheckBox(tr("Remove screenshots")); + + if (content_info.disc_list.size()) + { + if (content_info.in_games_dir_count == content_info.disc_list.size()) + { + disc->setToolTip(tr("Title located under auto-detection VFS \"games\" folder cannot be removed")); + disc->setDisabled(true); + } + else + { + if (!content_info.is_single_selection) // Multi selection + disc->setToolTip(tr("Title located under auto-detection VFS \"games\" folder cannot be removed")); + + disc->setChecked(true); + } + } + else + { + disc->setChecked(false); + disc->setVisible(false); + } + + if (content_info.path_list.size()) // If a path is present + { + text += tr("\nPermanently remove %0 and selected (optional) contents from drive?\n") + .arg((content_info.disc_list.size() || !content_info.is_single_selection) ? tr("Game Data") : games[0]->localized_category); + } + else + { + text += tr("\nPermanently remove selected (optional) contents from drive?\n"); + } + + caches->setChecked(true); + icons->setChecked(true); + + QMessageBox mb(QMessageBox::Question, tr("Confirm Removal"), text, QMessageBox::Yes | QMessageBox::No, m_game_list_frame); + mb.setCheckBox(disc); + + QGridLayout* grid = qobject_cast(mb.layout()); + int row, column, rowSpan, columnSpan; + + grid->getItemPosition(grid->indexOf(disc), &row, &column, &rowSpan, &columnSpan); + grid->addWidget(caches, row + 3, column, rowSpan, columnSpan); + grid->addWidget(icons, row + 4, column, rowSpan, columnSpan); + grid->addWidget(savestate, row + 5, column, rowSpan, columnSpan); + grid->addWidget(captures, row + 6, column, rowSpan, columnSpan); + grid->addWidget(recordings, row + 7, column, rowSpan, columnSpan); + grid->addWidget(screenshots, row + 8, column, rowSpan, columnSpan); + + if (mb.exec() != QMessageBox::Yes) + return; + + // Remove data path in "dev_hdd0/game" folder (if any) and lock file in "dev_hdd0/game/$locks" folder (if any) + u16 content_types = DATA | LOCKS; + + // Remove serials (title id) in "games.yml" file (if any) + if (disc->isChecked()) + content_types |= DISC; + + // Remove caches in "cache" and "dev_hdd1/caches" folders (if any) and custom configs in "config/custom_config" folder (if any) + if (caches->isChecked()) + content_types |= CACHES | CUSTOM_CONFIG; + + // Remove icons in "Icons/game_icons" folder (if any) and + // shortcuts in "games/shortcuts" folder and from desktop / start menu (if any) + if (icons->isChecked()) + content_types |= ICONS | SHORTCUTS; + + if (savestate->isChecked()) + content_types |= SAVESTATES; + + if (captures->isChecked()) + content_types |= CAPTURES; + + if (recordings->isChecked()) + content_types |= RECORDINGS; + + if (screenshots->isChecked()) + content_types |= SCREENSHOTS; + + SetContentList(content_types, content_info); + + if (content_info.is_single_selection) // Single selection + { + if (!RemoveContentList(games[0]->info.serial, true)) + { + QMessageBox::critical(m_game_list_frame, tr("Failure!"), caches->isChecked() + ? tr("Failed to remove %0 from drive!\nCaches and custom configs have been left intact.").arg(QString::fromStdString(games[0]->info.name)) + : tr("Failed to remove %0 from drive!").arg(QString::fromStdString(games[0]->info.name))); + + return; + } + } + else // Multi selection + { + BatchRemoveContentLists(games, true); + } +} + +void game_list_actions::ShowGameInfoDialog(const std::vector& games) +{ + if (games.empty()) + return; + + QMessageBox::information(m_game_list_frame, tr("Game Info"), GetContentInfo(games).info); +} + +bool game_list_actions::IsGameRunning(const std::string& serial) +{ + return !Emu.IsStopped(true) && (serial == Emu.GetTitleID() || (serial == "vsh.self" && Emu.IsVsh())); +} + +bool game_list_actions::ValidateRemoval(const std::string& serial, const std::string& path, const std::string& desc, bool is_interactive) +{ + if (serial.empty()) + { + game_list_log.error("Removal of %s not allowed due to no title ID provided!", desc); + return false; + } + + if (path.empty() || !fs::exists(path) || (!fs::is_dir(path) && !fs::is_file(path))) + { + game_list_log.success("Could not find %s directory/file: %s (%s)", desc, path, serial); + return false; + } + + if (is_interactive) + { + if (IsGameRunning(serial)) + { + game_list_log.error("Removal of %s not allowed due to %s title is running!", desc, serial); + + QMessageBox::critical(m_game_list_frame, tr("Removal Aborted"), + tr("Removal of %0 not allowed due to %1 title is running!") + .arg(QString::fromStdString(desc)).arg(QString::fromStdString(serial))); + + return false; + } + + if (QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), tr("Remove %0?").arg(QString::fromStdString(desc))) != QMessageBox::Yes) + return false; + } + + return true; +} + +bool game_list_actions::ValidateBatchRemoval(const std::string& desc, bool is_interactive) +{ + if (!Emu.IsStopped(true)) + { + game_list_log.error("Removal of %s not allowed due to emulator is running!", desc); + + if (is_interactive) + { + QMessageBox::critical(m_game_list_frame, tr("Removal Aborted"), + tr("Removal of %0 not allowed due to emulator is running!").arg(QString::fromStdString(desc))); + } + + return false; + } + + if (is_interactive) + { + if (QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), tr("Remove %0?").arg(QString::fromStdString(desc))) != QMessageBox::Yes) + return false; + } + + return true; +} + +bool game_list_actions::CreateCPUCaches(const std::string& path, const std::string& serial, bool is_fast_compilation) +{ + Emu.GracefulShutdown(false); + Emu.SetForceBoot(true); + Emu.SetPrecompileCacheOption(emu_precompilation_option_t{.is_fast = is_fast_compilation}); + + if (const auto error = Emu.BootGame(fs::is_file(path) ? fs::get_parent_dir(path) : path, serial, true); error != game_boot_result::no_errors) + { + game_list_log.error("Could not create LLVM caches for %s, error: %s", path, error); + return false; + } + + game_list_log.warning("Creating LLVM Caches for %s", path); + return true; +} + +bool game_list_actions::CreateCPUCaches(const game_info& game, bool is_fast_compilation) +{ + return game && CreateCPUCaches(game->info.path, game->info.serial, is_fast_compilation); +} + +bool game_list_actions::RemoveCustomConfiguration(const std::string& serial, const game_info& game, bool is_interactive) +{ + const std::string path = rpcs3::utils::get_custom_config_path(serial); + + if (!ValidateRemoval(serial, path, "custom configuration", is_interactive)) + return true; + + bool result = true; + + if (fs::is_file(path)) + { + if (fs::remove_file(path)) + { + if (game) + { + game->has_custom_config = false; + } + game_list_log.success("Removed configuration file: %s", path); + } + else + { + game_list_log.fatal("Failed to remove configuration file: %s\nError: %s", path, fs::g_tls_error); + result = false; + } + } + + if (is_interactive && !result) + { + QMessageBox::warning(m_game_list_frame, tr("Warning!"), tr("Failed to remove configuration file!")); + } + + return result; +} + +bool game_list_actions::RemoveCustomPadConfiguration(const std::string& serial, const game_info& game, bool is_interactive) +{ + const std::string config_dir = rpcs3::utils::get_input_config_dir(serial); + + if (!ValidateRemoval(serial, config_dir, "custom gamepad configuration", false)) // no interation needed here + return true; + + if (is_interactive && QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), (!Emu.IsStopped(true) && Emu.GetTitleID() == serial) + ? tr("Remove custom gamepad configuration?\nYour configuration will revert to the global pad settings.") + : tr("Remove custom gamepad configuration?")) != QMessageBox::Yes) + return true; + + g_cfg_input_configs.load(); + g_cfg_input_configs.active_configs.erase(serial); + g_cfg_input_configs.save(); + game_list_log.notice("Removed active input configuration entry for key '%s'", serial); + + if (QDir(QString::fromStdString(config_dir)).removeRecursively()) + { + if (game) + { + game->has_custom_pad_config = false; + } + if (!Emu.IsStopped(true) && Emu.GetTitleID() == serial) + { + pad::set_enabled(false); + pad::reset(serial); + pad::set_enabled(true); + } + game_list_log.notice("Removed gamepad configuration directory: %s", config_dir); + return true; + } + + if (is_interactive) + { + QMessageBox::warning(m_game_list_frame, tr("Warning!"), tr("Failed to completely remove gamepad configuration directory!")); + game_list_log.fatal("Failed to completely remove gamepad configuration directory: %s\nError: %s", config_dir, fs::g_tls_error); + } + return false; +} + +bool game_list_actions::RemoveShaderCache(const std::string& serial, bool is_interactive) +{ + const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); + + if (!ValidateRemoval(serial, base_dir, "shader cache", is_interactive)) + return true; + + u32 caches_removed = 0; + u32 caches_total = 0; + + const QStringList filter{ QStringLiteral("shaders_cache") }; + const QString q_base_dir = QString::fromStdString(base_dir); + + QDirIterator dir_iter(q_base_dir, filter, QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + + while (dir_iter.hasNext()) + { + const QString filepath = dir_iter.next(); + + if (QDir(filepath).removeRecursively()) + { + ++caches_removed; + game_list_log.notice("Removed shader cache directory: %s", filepath); + } + else + { + game_list_log.warning("Could not completely remove shader cache directory: %s", filepath); + } + + ++caches_total; + } + + const bool success = caches_total == caches_removed; + + if (success) + game_list_log.success("Removed shader cache in %s", base_dir); + else + game_list_log.fatal("Only %d/%d shader cache directories could be removed in %s", caches_removed, caches_total, base_dir); + + if (QDir(q_base_dir).isEmpty()) + { + if (fs::remove_dir(base_dir)) + game_list_log.notice("Removed empty shader cache directory: %s", base_dir); + else + game_list_log.error("Could not remove empty shader cache directory: '%s' (%s)", base_dir, fs::g_tls_error); + } + + return success; +} + +bool game_list_actions::RemovePPUCache(const std::string& serial, bool is_interactive) +{ + const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); + + if (!ValidateRemoval(serial, base_dir, "PPU cache", is_interactive)) + return true; + + u32 files_removed = 0; + u32 files_total = 0; + + const QStringList filter{ QStringLiteral("v*.obj"), QStringLiteral("v*.obj.gz") }; + const QString q_base_dir = QString::fromStdString(base_dir); + + QDirIterator dir_iter(q_base_dir, filter, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + + while (dir_iter.hasNext()) + { + const QString filepath = dir_iter.next(); + + if (QFile::remove(filepath)) + { + ++files_removed; + game_list_log.notice("Removed PPU cache file: %s", filepath); + } + else + { + game_list_log.warning("Could not remove PPU cache file: %s", filepath); + } + + ++files_total; + } + + const bool success = files_total == files_removed; + + if (success) + game_list_log.success("Removed PPU cache in %s", base_dir); + else + game_list_log.fatal("Only %d/%d PPU cache files could be removed in %s", files_removed, files_total, base_dir); + + if (QDir(q_base_dir).isEmpty()) + { + if (fs::remove_dir(base_dir)) + game_list_log.notice("Removed empty PPU cache directory: %s", base_dir); + else + game_list_log.error("Could not remove empty PPU cache directory: '%s' (%s)", base_dir, fs::g_tls_error); + } + + return success; +} + +bool game_list_actions::RemoveSPUCache(const std::string& serial, bool is_interactive) +{ + const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); + + if (!ValidateRemoval(serial, base_dir, "SPU cache", is_interactive)) + return true; + + u32 files_removed = 0; + u32 files_total = 0; + + const QStringList filter{ QStringLiteral("spu*.dat"), QStringLiteral("spu*.dat.gz"), QStringLiteral("spu*.obj"), QStringLiteral("spu*.obj.gz") }; + const QString q_base_dir = QString::fromStdString(base_dir); + + QDirIterator dir_iter(q_base_dir, filter, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + + while (dir_iter.hasNext()) + { + const QString filepath = dir_iter.next(); + + if (QFile::remove(filepath)) + { + ++files_removed; + game_list_log.notice("Removed SPU cache file: %s", filepath); + } + else + { + game_list_log.warning("Could not remove SPU cache file: %s", filepath); + } + + ++files_total; + } + + const bool success = files_total == files_removed; + + if (success) + game_list_log.success("Removed SPU cache in %s", base_dir); + else + game_list_log.fatal("Only %d/%d SPU cache files could be removed in %s", files_removed, files_total, base_dir); + + if (QDir(q_base_dir).isEmpty()) + { + if (fs::remove_dir(base_dir)) + game_list_log.notice("Removed empty SPU cache directory: %s", base_dir); + else + game_list_log.error("Could not remove empty SPU cache directory: '%s' (%s)", base_dir, fs::g_tls_error); + } + + return success; +} + +bool game_list_actions::RemoveHDD1Cache(const std::string& serial, bool is_interactive) +{ + const std::string base_dir = rpcs3::utils::get_hdd1_cache_dir(); + + if (!ValidateRemoval(serial, base_dir, "HDD1 cache", is_interactive)) + return true; + + u32 dirs_removed = 0; + u32 dirs_total = 0; + + const QStringList filter{ QString::fromStdString(serial + "_*") }; + const QString q_base_dir = QString::fromStdString(base_dir); + + QDirIterator dir_iter(q_base_dir, filter, QDir::Dirs | QDir::NoDotAndDotDot); + + while (dir_iter.hasNext()) + { + const QString filepath = dir_iter.next(); + + if (fs::remove_all(filepath.toStdString())) + { + ++dirs_removed; + game_list_log.notice("Removed HDD1 cache directory: %s", filepath); + } + else + { + game_list_log.warning("Could not completely remove HDD1 cache directory: %s", filepath); + } + + ++dirs_total; + } + + const bool success = dirs_removed == dirs_total; + + if (success) + game_list_log.success("Removed HDD1 cache in %s (%s)", base_dir, serial); + else + game_list_log.fatal("Only %d/%d HDD1 cache directories could be removed in %s (%s)", dirs_removed, dirs_total, base_dir, serial); + + return success; +} + +bool game_list_actions::RemoveAllCaches(const std::string& serial, bool is_interactive) +{ + // Just used for confirmation, if requested. Folder returned by fs::get_config_dir() is always present! + if (!ValidateRemoval(serial, fs::get_config_dir(), "all caches", is_interactive)) + return true; + + const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); + + if (!ValidateRemoval(serial, base_dir, "main cache", false)) // no interation needed here + return true; + + bool success = false; + + if (fs::remove_all(base_dir)) + { + success = true; + game_list_log.success("Removed main cache in %s", base_dir); + + } + else + { + game_list_log.fatal("Could not completely remove main cache in %s (%s)", base_dir, serial); + } + + success |= RemoveHDD1Cache(serial); + + return success; +} + +bool game_list_actions::RemoveContentList(const std::string& serial, bool is_interactive) +{ + // Just used for confirmation, if requested. Folder returned by fs::get_config_dir() is always present! + if (!ValidateRemoval(serial, fs::get_config_dir(), "selected content", is_interactive)) + { + if (m_content_info.clear_on_finish) + ClearContentList(); // Clear only the content's info + + return true; + } + + u16 content_types = m_content_info.content_types; + + // Remove data path in "dev_hdd0/game" folder (if any) + if (content_types & DATA) + { + if (const auto it = m_content_info.path_list.find(serial); it != m_content_info.path_list.cend()) + { + if (RemoveContentPathList(it->second, "data") != it->second.size()) + { + if (m_content_info.clear_on_finish) + ClearContentList(); // Clear only the content's info + + // Skip the removal of the remaining selected contents in case some data paths could not be removed + return false; + } + } + } + + // Add serial (title id) to the list of serials to be removed in "games.yml" file (if any) + if (content_types & DISC) + { + if (const auto it = m_content_info.disc_list.find(serial); it != m_content_info.disc_list.cend()) + m_content_info.removed_disc_list.insert(serial); + } + + // Remove lock file in "dev_hdd0/game/$locks" folder (if any) + if (content_types & LOCKS) + { + if (ValidateRemoval(serial, rpcs3::utils::get_hdd0_locks_dir(), "lock")) + RemoveContentBySerial(rpcs3::utils::get_hdd0_locks_dir(), serial, "lock"); + } + + // Remove caches in "cache" and "dev_hdd1/caches" folders (if any) + if (content_types & CACHES) + { + if (ValidateRemoval(serial, rpcs3::utils::get_cache_dir_by_serial(serial), "all caches")) + RemoveAllCaches(serial); + } + + // Remove custom configs in "config/custom_config" folder (if any) + if (content_types & CUSTOM_CONFIG) + { + if (ValidateRemoval(serial, rpcs3::utils::get_custom_config_path(serial), "custom configuration")) + RemoveCustomConfiguration(serial); + + if (ValidateRemoval(serial, rpcs3::utils::get_input_config_dir(serial), "custom gamepad configuration")) + RemoveCustomPadConfiguration(serial); + } + + // Remove icons in "Icons/game_icons" folder (if any) + if (content_types & ICONS) + { + if (ValidateRemoval(serial, rpcs3::utils::get_icons_dir(serial), "icons")) + RemoveContentBySerial(rpcs3::utils::get_icons_dir(), serial, "icons"); + } + + // Remove shortcuts in "games/shortcuts" folder and from desktop / start menu (if any) + if (content_types & SHORTCUTS) + { + if (const auto it = m_content_info.name_list.find(serial); it != m_content_info.name_list.cend()) + { + const bool remove_rpcs3_links = ValidateRemoval(serial, rpcs3::utils::get_games_shortcuts_dir(), "link"); + + for (const auto& name : it->second) + { + // Remove illegal characters from name to match the link name created by gui::utils::create_shortcut() + const std::string simple_name = QString::fromStdString(vfs::escape(name, true)).simplified().toStdString(); + + // Remove rpcs3 shortcuts + if (remove_rpcs3_links) + RemoveContentBySerial(rpcs3::utils::get_games_shortcuts_dir(), simple_name + ".lnk", "link"); + + // TODO: Remove shortcuts from desktop/start menu + } + } + } + + if (content_types & SAVESTATES) + { + if (ValidateRemoval(serial, rpcs3::utils::get_savestates_dir(serial), "savestates")) + RemoveContentBySerial(rpcs3::utils::get_savestates_dir(), serial, "savestates"); + } + + if (content_types & CAPTURES) + { + if (ValidateRemoval(serial, rpcs3::utils::get_captures_dir(), "captures")) + RemoveContentBySerial(rpcs3::utils::get_captures_dir(), serial, "captures"); + } + + if (content_types & RECORDINGS) + { + if (ValidateRemoval(serial, rpcs3::utils::get_recordings_dir(serial), "recordings")) + RemoveContentBySerial(rpcs3::utils::get_recordings_dir(), serial, "recordings"); + } + + if (content_types & SCREENSHOTS) + { + if (ValidateRemoval(serial, rpcs3::utils::get_screenshots_dir(serial), "screenshots")) + RemoveContentBySerial(rpcs3::utils::get_screenshots_dir(), serial, "screenshots"); + } + + if (m_content_info.clear_on_finish) + ClearContentList(true); // Update the game list and clear the content's info once removed + + return true; +} + +void game_list_actions::BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, + QString progressLabel, std::function action, + std::function cancel_log, std::function action_on_finish, bool refresh_on_finish, + bool can_be_concurrent, std::function should_wait_cb) +{ + // Concurrent tasks should not wait (at least not in current implementation) + ensure(!should_wait_cb || !can_be_concurrent); + + g_system_progress_canceled = false; + + const std::shared_ptr> iterate_over_serial = std::make_shared>(); + + const std::shared_ptr> index = std::make_shared>(0); + + const int serials_size = ::narrow(serials.size()); + + *iterate_over_serial = [=, this, index_ptr = index](int index) + { + if (index == serials_size) + { + return false; + } + + const std::string& serial = *std::next(serials.begin(), index); + + if (pdlg->wasCanceled() || g_system_progress_canceled.exchange(false)) + { + if (cancel_log) + { + cancel_log(index, serials_size); + } + return false; + } + + if (action(serial)) + { + const int done = index_ptr->load(); + pdlg->setLabelText(progressLabel.arg(done + 1).arg(serials_size)); + pdlg->SetValue(done + 1); + } + + (*index_ptr)++; + return true; + }; + + if (can_be_concurrent) + { + // Unused currently + + QList indices; + + for (int i = 0; i < serials_size; i++) + { + indices.append(i); + } + + QFutureWatcher* future_watcher = new QFutureWatcher(m_game_list_frame); + + future_watcher->setFuture(QtConcurrent::map(std::move(indices), *iterate_over_serial)); + + connect(future_watcher, &QFutureWatcher::finished, m_game_list_frame, [=, this]() + { + pdlg->setLabelText(progressLabel.arg(index->load()).arg(serials_size)); + pdlg->setCancelButtonText(tr("OK")); + QApplication::beep(); + + if (action_on_finish) + { + action_on_finish(); + } + + if (refresh_on_finish && index) + { + m_game_list_frame->Refresh(true); + } + + future_watcher->deleteLater(); + }); + + return; + } + + const std::shared_ptr> periodic_func = std::make_shared>(); + + *periodic_func = [=, this]() + { + if (should_wait_cb && should_wait_cb()) + { + // Conditions are not met for execution + // Check again later + QTimer::singleShot(5, m_game_list_frame, *periodic_func); + return; + } + + if ((*iterate_over_serial)(*index)) + { + QTimer::singleShot(1, m_game_list_frame, *periodic_func); + return; + } + + pdlg->setLabelText(progressLabel.arg(index->load()).arg(serials_size)); + pdlg->setCancelButtonText(tr("OK")); + connect(pdlg, &progress_dialog::canceled, m_game_list_frame, [pdlg](){ pdlg->deleteLater(); }); + QApplication::beep(); + + if (action_on_finish) + { + action_on_finish(); + } + + // Signal termination back to the callback + action(""); + + if (refresh_on_finish && index) + { + m_game_list_frame->Refresh(true); + } + }; + + // Invoked on the next event loop processing iteration + QTimer::singleShot(1, m_game_list_frame, *periodic_func); +} + +void game_list_actions::BatchCreateCPUCaches(const std::vector& games, bool is_fast_compilation, bool is_interactive) +{ + if (is_interactive && QMessageBox::question(m_game_list_frame, tr("Confirm Creation"), tr("Create LLVM cache?")) != QMessageBox::Yes) + { + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + serials.emplace(game->info.serial); + } + + const usz total = serials.size(); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("LLVM Cache Batch Creation"), tr("No titles found"), QMessageBox::Ok); + return; + } + + if (!m_gui_settings->GetBootConfirmation(m_game_list_frame)) + { + return; + } + + const QString main_label = tr("Creating all LLVM caches"); + + progress_dialog* pdlg = new progress_dialog(tr("LLVM Cache Batch Creation"), main_label, tr("Cancel"), 0, ::narrow(total), false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + connect(pdlg, &progress_dialog::canceled, m_game_list_frame, []() + { + if (!Emu.IsStopped()) + { + Emu.GracefulShutdown(false, true); + } + }); + + BatchActionBySerials(pdlg, serials, tr("%0\nProgress: %1/%2 caches compiled").arg(main_label), + [this, is_fast_compilation](const std::string& serial) + { + if (serial.empty()) + { + return false; + } + + if (Emu.IsStopped(true)) + { + const auto& games = m_game_list_frame->GetGameInfo(); + + const auto it = std::find_if(games.cbegin(), games.cend(), FN(x->info.serial == serial)); + + if (it != games.cend()) + { + return CreateCPUCaches((*it)->info.path, serial, is_fast_compilation); + } + } + + return false; + }, + [](u32, u32) + { + game_list_log.notice("LLVM Cache Batch Creation was canceled"); + }, nullptr, false, false, + []() + { + return !Emu.IsStopped(true); + }); +} + +void game_list_actions::BatchRemovePPUCaches(const std::vector& games, bool is_interactive) +{ + if (!ValidateBatchRemoval("PPU cache", is_interactive)) + { + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("PPU Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("PPU Cache Batch Removal"), tr("Removing all PPU caches"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 PPU caches cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemovePPUCache(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("PPU Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); +} + +void game_list_actions::BatchRemoveSPUCaches(const std::vector& games, bool is_interactive) +{ + if (!ValidateBatchRemoval("SPU cache", is_interactive)) + { + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("SPU Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("SPU Cache Batch Removal"), tr("Removing all SPU caches"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 SPU caches cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveSPUCache(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("SPU Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); +} + +void game_list_actions::BatchRemoveHDD1Caches(const std::vector& games, bool is_interactive) +{ + if (!ValidateBatchRemoval("HDD1 cache", is_interactive)) + { + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("HDD1 Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("HDD1 Cache Batch Removal"), tr("Removing all HDD1 caches"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 HDD1 caches cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveHDD1Cache(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("HDD1 Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); +} + +void game_list_actions::BatchRemoveAllCaches(const std::vector& games, bool is_interactive) +{ + if (!ValidateBatchRemoval("all caches", is_interactive)) + { + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Cache Batch Removal"), tr("Removing all caches"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 caches cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveAllCaches(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); +} + +void game_list_actions::BatchRemoveContentLists(const std::vector& games, bool is_interactive) +{ + // Let the batch process (not RemoveContentList()) make cleanup when terminated + m_content_info.clear_on_finish = false; + + if (!ValidateBatchRemoval("selected content", is_interactive)) + { + ClearContentList(); // Clear only the content's info + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("Content Batch Removal"), tr("No files found"), QMessageBox::Ok); + + ClearContentList(); // Clear only the content's info + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Content Batch Removal"), tr("Removing all contents"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 contents cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveContentList(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("Content Batch Removal was canceled. %d/%d contents cleared", removed, total); + }, + [this]() // Make cleanup when batch process terminated + { + ClearContentList(true); // Update the game list and clear the content's info once removed + }, false); +} + +void game_list_actions::BatchRemoveCustomConfigurations(const std::vector& games, bool is_interactive) +{ + if (is_interactive && QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), tr("Remove custom configuration?")) != QMessageBox::Yes) + { + return; + } + + std::set serials; + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + if (game->has_custom_config && !serials.count(game->info.serial)) + { + serials.emplace(game->info.serial); + } + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("Custom Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Custom Configuration Batch Removal"), tr("Removing all custom configurations"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 custom configurations cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveCustomConfiguration(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("Custom Configuration Batch Removal was canceled. %d/%d custom configurations cleared", removed, total); + }, nullptr, true); +} + +void game_list_actions::BatchRemoveCustomPadConfigurations(const std::vector& games, bool is_interactive) +{ + if (is_interactive && QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), tr("Remove custom gamepad configuration?")) != QMessageBox::Yes) + { + return; + } + + std::set serials; + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + if (game->has_custom_pad_config && !serials.count(game->info.serial)) + { + serials.emplace(game->info.serial); + } + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("Custom Gamepad Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Custom Gamepad Configuration Batch Removal"), tr("Removing all custom gamepad configurations"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 custom gamepad configurations cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveCustomPadConfiguration(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("Custom Gamepad Configuration Batch Removal was canceled. %d/%d custom gamepad configurations cleared", removed, total); + }, nullptr, true); +} + +void game_list_actions::BatchRemoveShaderCaches(const std::vector& games, bool is_interactive) +{ + if (!ValidateBatchRemoval("shader cache", is_interactive)) + { + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("Shader Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Shader Cache Batch Removal"), tr("Removing all shader caches"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 shader caches cleared"), + [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveShaderCache(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("Shader Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); +} + +void game_list_actions::CreateShortcuts(const std::vector& games, const std::set& locations) +{ + if (games.empty()) + { + game_list_log.notice("Skip creating shortcuts. No games selected."); + return; + } + + if (locations.empty()) + { + game_list_log.error("Failed to create shortcuts. No locations selected."); + return; + } + + bool success = true; + + for (const game_info& gameinfo : games) + { + std::string gameid_token_value; + + const std::string dev_flash = g_cfg_vfs.get_dev_flash(); + + if (gameinfo->info.category == "DG" && !fs::is_file(rpcs3::utils::get_hdd0_dir() + "/game/" + gameinfo->info.serial + "/USRDIR/EBOOT.BIN")) + { + const usz ps3_game_dir_pos = fs::get_parent_dir(gameinfo->info.path).size(); + std::string relative_boot_dir = gameinfo->info.path.substr(ps3_game_dir_pos); + + if (usz char_pos = relative_boot_dir.find_first_not_of(fs::delim); char_pos != umax) + { + relative_boot_dir = relative_boot_dir.substr(char_pos); + } + else + { + relative_boot_dir.clear(); + } + + if (!relative_boot_dir.empty()) + { + if (relative_boot_dir != "PS3_GAME") + { + gameid_token_value = gameinfo->info.serial + "/" + relative_boot_dir; + } + else + { + gameid_token_value = gameinfo->info.serial; + } + } + } + else + { + gameid_token_value = gameinfo->info.serial; + } + +#ifdef __linux__ + const std::string target_cli_args = gameinfo->info.path.starts_with(dev_flash) ? fmt::format("--no-gui \"%%%%RPCS3_VFS%%%%:dev_flash/%s\"", gameinfo->info.path.substr(dev_flash.size())) + : fmt::format("--no-gui \"%%%%RPCS3_GAMEID%%%%:%s\"", gameid_token_value); +#else + const std::string target_cli_args = gameinfo->info.path.starts_with(dev_flash) ? fmt::format("--no-gui \"%%RPCS3_VFS%%:dev_flash/%s\"", gameinfo->info.path.substr(dev_flash.size())) + : fmt::format("--no-gui \"%%RPCS3_GAMEID%%:%s\"", gameid_token_value); +#endif + const std::string target_icon_dir = fmt::format("%sIcons/game_icons/%s/", fs::get_config_dir(), gameinfo->info.serial); + + if (!fs::create_path(target_icon_dir)) + { + game_list_log.error("Failed to create shortcut path %s (%s)", QString::fromStdString(gameinfo->info.name).simplified(), target_icon_dir, fs::g_tls_error); + success = false; + continue; + } + + for (const gui::utils::shortcut_location& location : locations) + { + std::string destination; + + switch (location) + { + case gui::utils::shortcut_location::desktop: + destination = "desktop"; + break; + case gui::utils::shortcut_location::applications: + destination = "application menu"; + break; +#ifdef _WIN32 + case gui::utils::shortcut_location::rpcs3_shortcuts: + destination = "/games/shortcuts/"; + break; +#endif + } + + if (!gameid_token_value.empty() && gui::utils::create_shortcut(gameinfo->info.name, gameinfo->info.serial, target_cli_args, gameinfo->info.name, gameinfo->info.icon_path, target_icon_dir, location)) + { + game_list_log.success("Created %s shortcut for %s", destination, QString::fromStdString(gameinfo->info.name).simplified()); + } + else + { + game_list_log.error("Failed to create %s shortcut for %s", destination, QString::fromStdString(gameinfo->info.name).simplified()); + success = false; + } + } + } + +#ifdef _WIN32 + if (locations.size() == 1 && locations.contains(gui::utils::shortcut_location::rpcs3_shortcuts)) + { + return; + } +#endif + + if (success) + { + QMessageBox::information(m_game_list_frame, tr("Success!"), tr("Successfully created shortcut(s).")); + } + else + { + QMessageBox::warning(m_game_list_frame, tr("Warning!"), tr("Failed to create one or more shortcuts!")); + } +} + +bool game_list_actions::RemoveContentPath(const std::string& path, const std::string& desc) +{ + if (!fs::exists(path)) + { + return true; + } + + if (fs::is_dir(path)) + { + if (fs::remove_all(path)) + { + game_list_log.notice("Removed '%s' directory: '%s'", desc, path); + } + else + { + game_list_log.error("Could not remove '%s' directory: '%s' (%s)", desc, path, fs::g_tls_error); + + return false; + } + } + else // If file + { + if (fs::remove_file(path)) + { + game_list_log.notice("Removed '%s' file: '%s'", desc, path); + } + else + { + game_list_log.error("Could not remove '%s' file: '%s' (%s)", desc, path, fs::g_tls_error); + + return false; + } + } + + return true; +} + +u32 game_list_actions::RemoveContentPathList(const std::set& path_list, const std::string& desc) +{ + u32 paths_removed = 0; + + for (const std::string& path : path_list) + { + if (RemoveContentPath(path, desc)) + { + paths_removed++; + } + } + + return paths_removed; +} + +bool game_list_actions::RemoveContentBySerial(const std::string& base_dir, const std::string& serial, const std::string& desc) +{ + bool success = true; + + for (const auto& entry : fs::dir(base_dir)) + { + // Search for any path starting with serial (e.g. BCES01118_BCES01118) + if (!entry.name.starts_with(serial)) + { + continue; + } + + if (!RemoveContentPath(base_dir + entry.name, desc)) + { + success = false; // Mark as failed if there is at least one failure + } + } + + return success; +} diff --git a/rpcs3/rpcs3qt/game_list_actions.h b/rpcs3/rpcs3qt/game_list_actions.h new file mode 100644 index 0000000000..7c5f603337 --- /dev/null +++ b/rpcs3/rpcs3qt/game_list_actions.h @@ -0,0 +1,113 @@ +#pragma once + +#include "gui_game_info.h" +#include "shortcut_utils.h" + +#include + +class progress_dialog; +class game_list_frame; +class gui_settings; + +class game_list_actions : QObject +{ + Q_OBJECT + +public: + game_list_actions(game_list_frame* frame, std::shared_ptr gui_settings); + virtual ~game_list_actions(); + + enum content_type + { + NO_CONTENT = 0, + DISC = (1 << 0), + DATA = (1 << 1), + LOCKS = (1 << 2), + CACHES = (1 << 3), + CUSTOM_CONFIG = (1 << 4), + ICONS = (1 << 5), + SHORTCUTS = (1 << 6), + SAVESTATES = (1 << 7), + CAPTURES = (1 << 8), + RECORDINGS = (1 << 9), + SCREENSHOTS = (1 << 10) + }; + + struct content_info + { + u16 content_types = NO_CONTENT; // Always set by SetContentList() + bool clear_on_finish = true; // Always overridden by BatchRemoveContentLists() + + bool is_single_selection = false; + u16 in_games_dir_count = 0; + QString info; + std::map> name_list; + std::map> path_list; + std::set disc_list; + std::set removed_disc_list; // Filled in by RemoveContentList() + }; + + static bool IsGameRunning(const std::string& serial); + + void CreateShortcuts(const std::vector& games, const std::set& locations); + + void ShowRemoveGameDialog(const std::vector& games); + void ShowGameInfoDialog(const std::vector& games); + + void BatchCreateCPUCaches(const std::vector& games = {}, bool is_fast_compilation = false, bool is_interactive = false); + void BatchRemoveCustomConfigurations(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveCustomPadConfigurations(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveShaderCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemovePPUCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveSPUCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveHDD1Caches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveAllCaches(const std::vector& games = {}, bool is_interactive = false); + + // NOTES: + // - SetContentList() MUST always be called to set the content's info to be removed by: + // - RemoveContentList() + // - BatchRemoveContentLists() + // + void SetContentList(u16 content_types, const content_info& content_info); + void BatchRemoveContentLists(const std::vector& games = {}, bool is_interactive = false); + + void ClearContentList(bool refresh = false); + content_info GetContentInfo(const std::vector& games); + + bool ValidateRemoval(const std::string& serial, const std::string& path, const std::string& desc, bool is_interactive = false); + bool ValidateBatchRemoval(const std::string& desc, bool is_interactive = false); + + static bool CreateCPUCaches(const std::string& path, const std::string& serial = {}, bool is_fast_compilation = false); + static bool CreateCPUCaches(const game_info& game, bool is_fast_compilation = false); + bool RemoveCustomConfiguration(const std::string& serial, const game_info& game = nullptr, bool is_interactive = false); + bool RemoveCustomPadConfiguration(const std::string& serial, const game_info& game = nullptr, bool is_interactive = false); + bool RemoveShaderCache(const std::string& serial, bool is_interactive = false); + bool RemovePPUCache(const std::string& serial, bool is_interactive = false); + bool RemoveSPUCache(const std::string& serial, bool is_interactive = false); + bool RemoveHDD1Cache(const std::string& serial, bool is_interactive = false); + bool RemoveAllCaches(const std::string& serial, bool is_interactive = false); + bool RemoveContentList(const std::string& serial, bool is_interactive = false); + + static bool RemoveContentPath(const std::string& path, const std::string& desc); + static u32 RemoveContentPathList(const std::set& path_list, const std::string& desc); + static bool RemoveContentBySerial(const std::string& base_dir, const std::string& serial, const std::string& desc); + +private: + game_list_frame* m_game_list_frame = nullptr; + std::shared_ptr m_gui_settings; + + // NOTE: + // m_content_info is used by: + // - SetContentList() + // - ClearContentList() + // - GetContentInfo() + // - RemoveContentList() + // - BatchRemoveContentLists() + // + content_info m_content_info; + + void BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, + QString progressLabel, std::function action, + std::function cancel_log, std::function action_on_finish, bool refresh_on_finish, + bool can_be_concurrent = false, std::function should_wait_cb = {}); +}; diff --git a/rpcs3/rpcs3qt/game_list_context_menu.cpp b/rpcs3/rpcs3qt/game_list_context_menu.cpp new file mode 100644 index 0000000000..a04f5b0128 --- /dev/null +++ b/rpcs3/rpcs3qt/game_list_context_menu.cpp @@ -0,0 +1,907 @@ +#include "stdafx.h" +#include "game_list_context_menu.h" +#include "game_list_frame.h" +#include "gui_settings.h" +#include "category.h" +#include "input_dialog.h" +#include "qt_utils.h" +#include "shortcut_utils.h" +#include "settings_dialog.h" +#include "pad_settings_dialog.h" +#include "patch_manager_dialog.h" +#include "persistent_settings.h" + +#include "Utilities/File.h" +#include "Emu/system_utils.hpp" + +#include "QApplication" +#include "QClipboard" +#include "QDesktopServices" +#include "QFileDialog" +#include "QInputDialog" +#include "QMessageBox" + +LOG_CHANNEL(game_list_log, "GameList"); +LOG_CHANNEL(sys_log, "SYS"); + +std::string get_savestate_file(std::string_view title_id, std::string_view boot_pat, s64 rel_id, u64 aggregate_file_size = umax); + +game_list_context_menu::game_list_context_menu(game_list_frame* frame) + : QMenu(frame) + , m_game_list_frame(ensure(frame)) + , m_game_list_actions(ensure(frame->actions())) + , m_gui_settings(ensure(frame->get_gui_settings())) + , m_emu_settings(ensure(frame->get_emu_settings())) + , m_persistent_settings(ensure(frame->get_persistent_settings())) +{ +} + +game_list_context_menu::~game_list_context_menu() +{ +} + +void game_list_context_menu::show_menu(const std::vector& games, const QPoint& global_pos) +{ + if (games.empty()) return; + + if (games.size() == 1) + { + show_single_selection_context_menu(games.front(), global_pos); + } + else + { + show_multi_selection_context_menu(games, global_pos); + } +} + +void game_list_context_menu::show_single_selection_context_menu(const game_info& gameinfo, const QPoint& global_pos) +{ + ensure(!!gameinfo); + + GameInfo current_game = gameinfo->info; + const std::string serial = current_game.serial; + const QString name = QString::fromStdString(current_game.name).simplified(); + const bool is_current_running_game = game_list_actions::IsGameRunning(serial); + + // Make Actions + QAction* boot = new QAction(gameinfo->has_custom_config + ? (is_current_running_game + ? tr("&Reboot with Global Configuration") + : tr("&Boot with Global Configuration")) + : (is_current_running_game + ? tr("&Reboot") + : tr("&Boot"))); + + QFont font = boot->font(); + font.setBold(true); + + if (gameinfo->has_custom_config) + { + QAction* boot_custom = addAction(is_current_running_game + ? tr("&Reboot with Custom Configuration") + : tr("&Boot with Custom Configuration")); + boot_custom->setFont(font); + connect(boot_custom, &QAction::triggered, m_game_list_frame, [this, gameinfo] + { + sys_log.notice("Booting from gamelist per context menu..."); + Q_EMIT m_game_list_frame->RequestBoot(gameinfo); + }); + } + else + { + boot->setFont(font); + } + + addAction(boot); + + { + QAction* boot_default = addAction(is_current_running_game + ? tr("&Reboot with Default Configuration") + : tr("&Boot with Default Configuration")); + + connect(boot_default, &QAction::triggered, m_game_list_frame, [this, gameinfo] + { + sys_log.notice("Booting from gamelist per context menu..."); + Q_EMIT m_game_list_frame->RequestBoot(gameinfo, cfg_mode::default_config); + }); + + QAction* boot_manual = addAction(is_current_running_game + ? tr("&Reboot with Manually Selected Configuration") + : tr("&Boot with Manually Selected Configuration")); + + connect(boot_manual, &QAction::triggered, m_game_list_frame, [this, gameinfo] + { + if (const std::string file_path = QFileDialog::getOpenFileName(m_game_list_frame, "Select Config File", "", tr("Config Files (*.yml);;All files (*.*)")).toStdString(); !file_path.empty()) + { + sys_log.notice("Booting from gamelist per context menu..."); + Q_EMIT m_game_list_frame->RequestBoot(gameinfo, cfg_mode::custom_selection, file_path); + } + else + { + sys_log.notice("Manual config selection aborted."); + } + }); + } + + extern bool is_savestate_compatible(const std::string& filepath); + + if (const std::string sstate = get_savestate_file(serial, current_game.path, 1); is_savestate_compatible(sstate)) + { + const bool has_ambiguity = !get_savestate_file(serial, current_game.path, 2).empty(); + + QAction* boot_state = addAction(is_current_running_game + ? tr("&Reboot with last SaveState") + : tr("&Boot with last SaveState")); + + connect(boot_state, &QAction::triggered, m_game_list_frame, [this, gameinfo, sstate] + { + sys_log.notice("Booting savestate from gamelist per context menu..."); + Q_EMIT m_game_list_frame->RequestBoot(gameinfo, cfg_mode::custom, "", sstate); + }); + + if (has_ambiguity) + { + QAction* choose_state = addAction(is_current_running_game + ? tr("&Choose SaveState to reboot") + : tr("&Choose SaveState to boot")); + + connect(choose_state, &QAction::triggered, m_game_list_frame, [this, gameinfo] + { + // If there is any ambiguity, launch the savestate manager + Q_EMIT m_game_list_frame->RequestSaveStateManager(gameinfo); + }); + } + } + + addSeparator(); + + QAction* configure = addAction(gameinfo->has_custom_config + ? tr("&Change Custom Configuration") + : tr("&Create Custom Configuration From Global Settings")); + QAction* create_game_default_config = gameinfo->has_custom_config ? nullptr + : addAction(tr("&Create Custom Configuration From Default Settings")); + QAction* pad_configure = addAction(gameinfo->has_custom_pad_config + ? tr("&Change Custom Gamepad Configuration") + : tr("&Create Custom Gamepad Configuration")); + QAction* configure_patches = addAction(tr("&Manage Game Patches")); + + addSeparator(); + + // Create LLVM cache + QAction* create_cpu_cache = addAction(tr("&Create LLVM Cache")); + + // Remove menu + QMenu* remove_menu = addMenu(tr("&Remove")); + + if (gameinfo->has_custom_config) + { + QAction* remove_custom_config = remove_menu->addAction(tr("&Remove Custom Configuration")); + connect(remove_custom_config, &QAction::triggered, this, [this, serial, gameinfo]() + { + if (m_game_list_actions->RemoveCustomConfiguration(serial, gameinfo, true)) + { + m_game_list_frame->ShowCustomConfigIcon(gameinfo); + } + }); + } + if (gameinfo->has_custom_pad_config) + { + QAction* remove_custom_pad_config = remove_menu->addAction(tr("&Remove Custom Gamepad Configuration")); + connect(remove_custom_pad_config, &QAction::triggered, this, [this, serial, gameinfo]() + { + if (m_game_list_actions->RemoveCustomPadConfiguration(serial, gameinfo, true)) + { + m_game_list_frame->ShowCustomConfigIcon(gameinfo); + } + }); + } + + const std::string cache_base_dir = fs::get_path_if_dir(rpcs3::utils::get_cache_dir_by_serial(serial)); + const bool has_hdd1_cache_dir = !rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd1_cache_dir(), serial).empty(); + const std::string savestates_dir = fs::get_path_if_dir(rpcs3::utils::get_savestates_dir(serial)); + + if (!cache_base_dir.empty()) + { + remove_menu->addSeparator(); + + QAction* remove_shader_cache = remove_menu->addAction(tr("&Remove Shader Cache")); + remove_shader_cache->setEnabled(!is_current_running_game); + connect(remove_shader_cache, &QAction::triggered, this, [this, serial]() + { + m_game_list_actions->RemoveShaderCache(serial, true); + }); + + QAction* remove_ppu_cache = remove_menu->addAction(tr("&Remove PPU Cache")); + remove_ppu_cache->setEnabled(!is_current_running_game); + connect(remove_ppu_cache, &QAction::triggered, this, [this, serial]() + { + m_game_list_actions->RemovePPUCache(serial, true); + }); + + QAction* remove_spu_cache = remove_menu->addAction(tr("&Remove SPU Cache")); + remove_spu_cache->setEnabled(!is_current_running_game); + connect(remove_spu_cache, &QAction::triggered, this, [this, serial]() + { + m_game_list_actions->RemoveSPUCache(serial, true); + }); + } + + if (has_hdd1_cache_dir) + { + QAction* remove_hdd1_cache = remove_menu->addAction(tr("&Remove HDD1 Cache")); + remove_hdd1_cache->setEnabled(!is_current_running_game); + connect(remove_hdd1_cache, &QAction::triggered, this, [this, serial]() + { + m_game_list_actions->RemoveHDD1Cache(serial, true); + }); + } + + if (!cache_base_dir.empty() || has_hdd1_cache_dir) + { + QAction* remove_all_caches = remove_menu->addAction(tr("&Remove All Caches")); + remove_all_caches->setEnabled(!is_current_running_game); + connect(remove_all_caches, &QAction::triggered, this, [this, serial]() + { + m_game_list_actions->RemoveAllCaches(serial, true); + }); + } + + if (!savestates_dir.empty()) + { + remove_menu->addSeparator(); + + QAction* remove_savestates = remove_menu->addAction(tr("&Remove Savestates")); + remove_savestates->setEnabled(!is_current_running_game); + connect(remove_savestates, &QAction::triggered, this, [this, serial]() + { + m_game_list_actions->SetContentList(game_list_actions::content_type::SAVESTATES, {}); + m_game_list_actions->RemoveContentList(serial, true); + }); + } + + // Disable the Remove menu if empty + remove_menu->setEnabled(!remove_menu->isEmpty()); + + addSeparator(); + + // Manage Game menu + QMenu* manage_game_menu = addMenu(tr("&Manage Game")); + + // Create game shortcuts + QAction* create_desktop_shortcut = manage_game_menu->addAction(tr("&Create Desktop Shortcut")); + connect(create_desktop_shortcut, &QAction::triggered, this, [this, gameinfo]() + { + m_game_list_actions->CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::desktop}); + }); +#ifdef _WIN32 + QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Start Menu Shortcut")); +#elif defined(__APPLE__) + QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Launchpad Shortcut")); +#else + QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Application Menu Shortcut")); +#endif + connect(create_start_menu_shortcut, &QAction::triggered, this, [this, gameinfo]() + { + m_game_list_actions->CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::applications}); + }); + + manage_game_menu->addSeparator(); + + // Hide/rename game in game list + QAction* hide_serial = manage_game_menu->addAction(tr("&Hide In Game List")); + hide_serial->setCheckable(true); + hide_serial->setChecked(m_game_list_frame->hidden_list().contains(QString::fromStdString(serial))); + QAction* rename_title = manage_game_menu->addAction(tr("&Rename In Game List")); + + // Edit tooltip notes/reset time played + QAction* edit_notes = manage_game_menu->addAction(tr("&Edit Tooltip Notes")); + QAction* reset_time_played = manage_game_menu->addAction(tr("&Reset Time Played")); + + manage_game_menu->addSeparator(); + + // Remove game + QAction* remove_game = manage_game_menu->addAction(tr("&Remove %1").arg(gameinfo->localized_category)); + remove_game->setEnabled(!is_current_running_game); + + // Game info + QAction* game_info = manage_game_menu->addAction(tr("&Game Info")); + connect(game_info, &QAction::triggered, this, [this, gameinfo]() + { + m_game_list_actions->ShowGameInfoDialog({gameinfo}); + }); + + // Custom Images menu + QMenu* icon_menu = addMenu(tr("&Custom Images")); + const std::array custom_icon_actions = + { + icon_menu->addAction(tr("&Import Custom Icon")), + icon_menu->addAction(tr("&Replace Custom Icon")), + icon_menu->addAction(tr("&Remove Custom Icon")) + }; + icon_menu->addSeparator(); + const std::array custom_gif_actions = + { + icon_menu->addAction(tr("&Import Hover Gif")), + icon_menu->addAction(tr("&Replace Hover Gif")), + icon_menu->addAction(tr("&Remove Hover Gif")) + }; + icon_menu->addSeparator(); + const std::array custom_shader_icon_actions = + { + icon_menu->addAction(tr("&Import Custom Shader Loading Background")), + icon_menu->addAction(tr("&Replace Custom Shader Loading Background")), + icon_menu->addAction(tr("&Remove Custom Shader Loading Background")) + }; + + if (const std::string custom_icon_dir_path = rpcs3::utils::get_icons_dir(serial); + fs::create_path(custom_icon_dir_path)) + { + enum class icon_action + { + add, + replace, + remove + }; + enum class icon_type + { + game_list, + hover_gif, + shader_load + }; + + const auto handle_icon = [this, serial](const QString& game_icon_path, const QString& suffix, icon_action action, icon_type type) + { + QString icon_path; + + if (action != icon_action::remove) + { + QString msg; + switch (type) + { + case icon_type::game_list: + msg = tr("Select Custom Icon"); + break; + case icon_type::hover_gif: + msg = tr("Select Custom Hover Gif"); + break; + case icon_type::shader_load: + msg = tr("Select Custom Shader Loading Background"); + break; + } + icon_path = QFileDialog::getOpenFileName(m_game_list_frame, msg, "", tr("%0 (*.%0);;All files (*.*)").arg(suffix)); + } + if (action == icon_action::remove || !icon_path.isEmpty()) + { + bool refresh = false; + + QString msg; + switch (type) + { + case icon_type::game_list: + msg = tr("Remove Custom Icon of %0?").arg(QString::fromStdString(serial)); + break; + case icon_type::hover_gif: + msg = tr("Remove Custom Hover Gif of %0?").arg(QString::fromStdString(serial)); + break; + case icon_type::shader_load: + msg = tr("Remove Custom Shader Loading Background of %0?").arg(QString::fromStdString(serial)); + break; + } + + if (action == icon_action::replace || (action == icon_action::remove && + QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), msg) == QMessageBox::Yes)) + { + if (QFile file(game_icon_path); file.exists() && !file.remove()) + { + game_list_log.error("Could not remove old file: '%s'", game_icon_path, file.errorString()); + QMessageBox::warning(m_game_list_frame, tr("Warning!"), tr("Failed to remove the old file!")); + return; + } + + game_list_log.success("Removed file: '%s'", game_icon_path); + if (action == icon_action::remove) + { + refresh = true; + } + } + + if (action != icon_action::remove) + { + if (!QFile::copy(icon_path, game_icon_path)) + { + game_list_log.error("Could not import file '%s' to '%s'.", icon_path, game_icon_path); + QMessageBox::warning(m_game_list_frame, tr("Warning!"), tr("Failed to import the new file!")); + } + else + { + game_list_log.success("Imported file '%s' to '%s'", icon_path, game_icon_path); + refresh = true; + } + } + + if (refresh) + { + m_game_list_frame->Refresh(true); + } + } + }; + + const std::vector&>> icon_map = + { + {icon_type::game_list, "/ICON0.PNG", "png", custom_icon_actions}, + {icon_type::hover_gif, "/hover.gif", "gif", custom_gif_actions}, + {icon_type::shader_load, "/PIC1.PNG", "png", custom_shader_icon_actions}, + }; + + for (const auto& [type, icon_name, suffix, actions] : icon_map) + { + const QString icon_path = QString::fromStdString(custom_icon_dir_path) + icon_name; + + if (QFile::exists(icon_path)) + { + actions[static_cast(icon_action::add)]->setVisible(false); + connect(actions[static_cast(icon_action::replace)], &QAction::triggered, m_game_list_frame, [handle_icon, icon_path, t = type, s = suffix] { handle_icon(icon_path, s, icon_action::replace, t); }); + connect(actions[static_cast(icon_action::remove)], &QAction::triggered, m_game_list_frame, [handle_icon, icon_path, t = type, s = suffix] { handle_icon(icon_path, s, icon_action::remove, t); }); + } + else + { + connect(actions[static_cast(icon_action::add)], &QAction::triggered, m_game_list_frame, [handle_icon, icon_path, t = type, s = suffix] { handle_icon(icon_path, s, icon_action::add, t); }); + actions[static_cast(icon_action::replace)]->setVisible(false); + actions[static_cast(icon_action::remove)]->setEnabled(false); + } + } + } + else + { + game_list_log.error("Could not create path '%s'", custom_icon_dir_path); + icon_menu->setEnabled(false); + } + + addSeparator(); + + // Open Folder menu + QMenu* open_folder_menu = addMenu(tr("&Open Folder")); + + const bool is_disc_game = QString::fromStdString(current_game.category) == cat::cat_disc_game; + const std::string data_dir = fs::get_path_if_dir(rpcs3::utils::get_data_dir(serial)); + const std::string captures_dir = fs::get_path_if_dir(rpcs3::utils::get_captures_dir()); + const std::string recordings_dir = fs::get_path_if_dir(rpcs3::utils::get_recordings_dir(serial)); + const std::string screenshots_dir = fs::get_path_if_dir(rpcs3::utils::get_screenshots_dir(serial)); + std::set data_dir_list; + + if (is_disc_game) + { + QAction* open_disc_game_folder = open_folder_menu->addAction(tr("&Open Disc Game Folder")); + connect(open_disc_game_folder, &QAction::triggered, this, [current_game]() + { + gui::utils::open_dir(current_game.path); + }); + + // It could be an empty list for a disc game + data_dir_list = rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd0_game_dir(), serial); + } + else + { + data_dir_list.insert(current_game.path); + } + + if (!data_dir_list.empty()) // "true" if a path is present (it could be an empty list for a disc game) + { + QAction* open_data_folder = open_folder_menu->addAction(tr("&Open %0 Folder").arg(is_disc_game ? tr("Game Data") : gameinfo->localized_category)); + connect(open_data_folder, &QAction::triggered, this, [data_dir_list]() + { + for (const std::string& data_dir : data_dir_list) + { + gui::utils::open_dir(data_dir); + } + }); + } + + if (gameinfo->has_custom_config) + { + QAction* open_config_folder = open_folder_menu->addAction(tr("&Open Custom Config Folder")); + connect(open_config_folder, &QAction::triggered, this, [serial]() + { + const std::string config_path = rpcs3::utils::get_custom_config_path(serial); + + if (fs::is_file(config_path)) + gui::utils::open_dir(config_path); + }); + } + + // This is a debug feature, let's hide it by reusing debug tab protection + if (m_gui_settings->GetValue(gui::m_showDebugTab).toBool() && !cache_base_dir.empty()) + { + QAction* open_cache_folder = open_folder_menu->addAction(tr("&Open Cache Folder")); + connect(open_cache_folder, &QAction::triggered, this, [cache_base_dir]() + { + gui::utils::open_dir(cache_base_dir); + }); + } + + if (!data_dir.empty()) + { + QAction* open_data_folder = open_folder_menu->addAction(tr("&Open Data Folder")); + connect(open_data_folder, &QAction::triggered, this, [data_dir]() + { + gui::utils::open_dir(data_dir); + }); + } + + if (!savestates_dir.empty()) + { + QAction* open_savestates_folder = open_folder_menu->addAction(tr("&Open Savestates Folder")); + connect(open_savestates_folder, &QAction::triggered, this, [savestates_dir]() + { + gui::utils::open_dir(savestates_dir); + }); + } + + if (!captures_dir.empty()) + { + QAction* open_captures_folder = open_folder_menu->addAction(tr("&Open Captures Folder")); + connect(open_captures_folder, &QAction::triggered, this, [captures_dir]() + { + gui::utils::open_dir(captures_dir); + }); + } + + if (!recordings_dir.empty()) + { + QAction* open_recordings_folder = open_folder_menu->addAction(tr("&Open Recordings Folder")); + connect(open_recordings_folder, &QAction::triggered, this, [recordings_dir]() + { + gui::utils::open_dir(recordings_dir); + }); + } + + if (!screenshots_dir.empty()) + { + QAction* open_screenshots_folder = open_folder_menu->addAction(tr("&Open Screenshots Folder")); + connect(open_screenshots_folder, &QAction::triggered, this, [screenshots_dir]() + { + gui::utils::open_dir(screenshots_dir); + }); + } + + // Copy Info menu + QMenu* info_menu = addMenu(tr("&Copy Info")); + QAction* copy_info = info_menu->addAction(tr("&Copy Name + Serial")); + QAction* copy_name = info_menu->addAction(tr("&Copy Name")); + QAction* copy_serial = info_menu->addAction(tr("&Copy Serial")); + + addSeparator(); + + QAction* check_compat = addAction(tr("&Check Game Compatibility")); + QAction* download_compat = addAction(tr("&Download Compatibility Database")); + + connect(boot, &QAction::triggered, m_game_list_frame, [this, gameinfo]() + { + sys_log.notice("Booting from gamelist per context menu..."); + Q_EMIT m_game_list_frame->RequestBoot(gameinfo, cfg_mode::global); + }); + + const auto configure_l = [this, current_game, gameinfo](bool create_cfg_from_global_cfg) + { + settings_dialog dlg(m_gui_settings, m_emu_settings, 0, m_game_list_frame, ¤t_game, create_cfg_from_global_cfg); + + connect(&dlg, &settings_dialog::EmuSettingsApplied, [this, gameinfo]() + { + if (!gameinfo->has_custom_config) + { + gameinfo->has_custom_config = true; + m_game_list_frame->ShowCustomConfigIcon(gameinfo); + } + Q_EMIT m_game_list_frame->NotifyEmuSettingsChange(); + }); + + dlg.exec(); + }; + + if (create_game_default_config) + { + connect(configure, &QAction::triggered, m_game_list_frame, [configure_l]() { configure_l(true); }); + connect(create_game_default_config, &QAction::triggered, m_game_list_frame, [configure_l = std::move(configure_l)]() { configure_l(false); }); + } + else + { + connect(configure, &QAction::triggered, m_game_list_frame, [configure_l = std::move(configure_l)]() { configure_l(true); }); + } + + connect(pad_configure, &QAction::triggered, m_game_list_frame, [this, current_game, gameinfo]() + { + pad_settings_dialog dlg(m_gui_settings, m_game_list_frame, ¤t_game); + + if (dlg.exec() == QDialog::Accepted && !gameinfo->has_custom_pad_config) + { + gameinfo->has_custom_pad_config = true; + m_game_list_frame->ShowCustomConfigIcon(gameinfo); + } + }); + connect(hide_serial, &QAction::triggered, m_game_list_frame, [this, serial = QString::fromStdString(serial)](bool checked) + { + if (checked) + m_game_list_frame->hidden_list().insert(serial); + else + m_game_list_frame->hidden_list().remove(serial); + + m_gui_settings->SetValue(gui::gl_hidden_list, QStringList(m_game_list_frame->hidden_list().values())); + m_game_list_frame->Refresh(); + }); + connect(create_cpu_cache, &QAction::triggered, m_game_list_frame, [this, gameinfo] + { + if (m_gui_settings->GetBootConfirmation(m_game_list_frame)) + { + m_game_list_actions->CreateCPUCaches(gameinfo); + } + }); + connect(remove_game, &QAction::triggered, this, [this, gameinfo] + { + m_game_list_actions->ShowRemoveGameDialog({gameinfo}); + }); + connect(configure_patches, &QAction::triggered, m_game_list_frame, [this, gameinfo]() + { + patch_manager_dialog patch_manager(m_gui_settings, m_game_list_frame->GetGameInfo(), gameinfo->info.serial, gameinfo->GetGameVersion(), m_game_list_frame); + patch_manager.exec(); + }); + connect(check_compat, &QAction::triggered, this, [serial = QString::fromStdString(serial)] + { + const QString link = "https://rpcs3.net/compatibility?g=" + serial; + QDesktopServices::openUrl(QUrl(link)); + }); + connect(download_compat, &QAction::triggered, m_game_list_frame, [this] + { + ensure(m_game_list_frame->GetGameCompatibility())->RequestCompatibility(true); + }); + connect(rename_title, &QAction::triggered, m_game_list_frame, [this, name, serial = QString::fromStdString(serial), global_pos] + { + const QString custom_title = m_persistent_settings->GetValue(gui::persistent::titles, serial, "").toString(); + const QString old_title = custom_title.isEmpty() ? name : custom_title; + + input_dialog dlg(128, old_title, tr("Rename Title"), tr("%0\n%1\n\nYou can clear the line in order to use the original title.").arg(name).arg(serial), name, m_game_list_frame); + dlg.move(global_pos); + + if (dlg.exec() == QDialog::Accepted) + { + const QString new_title = dlg.get_input_text().simplified(); + + if (new_title.isEmpty() || new_title == name) + { + m_game_list_frame->titles().erase(serial); + m_persistent_settings->RemoveValue(gui::persistent::titles, serial); + } + else + { + m_game_list_frame->titles().insert_or_assign(serial, new_title); + m_persistent_settings->SetValue(gui::persistent::titles, serial, new_title); + } + m_game_list_frame->Refresh(true); // full refresh in order to reliably sort the list + } + }); + connect(edit_notes, &QAction::triggered, m_game_list_frame, [this, name, serial = QString::fromStdString(serial)] + { + bool accepted = false; + const QString old_notes = m_persistent_settings->GetValue(gui::persistent::notes, serial, "").toString(); + const QString new_notes = QInputDialog::getMultiLineText(m_game_list_frame, tr("Edit Tooltip Notes"), tr("%0\n%1").arg(name).arg(serial), old_notes, &accepted); + + if (accepted) + { + if (new_notes.simplified().isEmpty()) + { + m_game_list_frame->notes().erase(serial); + m_persistent_settings->RemoveValue(gui::persistent::notes, serial); + } + else + { + m_game_list_frame->notes().insert_or_assign(serial, new_notes); + m_persistent_settings->SetValue(gui::persistent::notes, serial, new_notes); + } + m_game_list_frame->Refresh(); + } + }); + connect(reset_time_played, &QAction::triggered, m_game_list_frame, [this, name, serial = QString::fromStdString(serial)] + { + if (QMessageBox::question(m_game_list_frame, tr("Confirm Reset"), tr("Reset time played?\n\n%0 [%1]").arg(name).arg(serial)) == QMessageBox::Yes) + { + m_persistent_settings->SetPlaytime(serial, 0, false); + m_persistent_settings->SetLastPlayed(serial, 0, true); + m_game_list_frame->Refresh(); + } + }); + connect(copy_info, &QAction::triggered, this, [name, serial = QString::fromStdString(serial)] + { + QApplication::clipboard()->setText(name % QStringLiteral(" [") % serial % QStringLiteral("]")); + }); + connect(copy_name, &QAction::triggered, this, [name] + { + QApplication::clipboard()->setText(name); + }); + connect(copy_serial, &QAction::triggered, this, [serial = QString::fromStdString(serial)] + { + QApplication::clipboard()->setText(serial); + }); + + // Disable options depending on software category + const QString category = QString::fromStdString(current_game.category); + + if (category == cat::cat_ps3_os) + { + remove_game->setEnabled(false); + } + else if (category != cat::cat_disc_game && category != cat::cat_hdd_game) + { + check_compat->setEnabled(false); + } + + exec(global_pos); +} + +void game_list_context_menu::show_multi_selection_context_menu(const std::vector& games, const QPoint& global_pos) +{ + ensure(!games.empty()); + + // Create LLVM cache + QAction* create_cpu_cache = addAction(tr("&Create LLVM Cache")); + connect(create_cpu_cache, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->BatchCreateCPUCaches(games, false, true); + }); + + // Remove menu + QMenu* remove_menu = addMenu(tr("&Remove")); + + QAction* remove_custom_config = remove_menu->addAction(tr("&Remove Custom Configuration")); + connect(remove_custom_config, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->BatchRemoveCustomConfigurations(games, true); + }); + + QAction* remove_custom_pad_config = remove_menu->addAction(tr("&Remove Custom Gamepad Configuration")); + connect(remove_custom_pad_config, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->BatchRemoveCustomPadConfigurations(games, true); + }); + + remove_menu->addSeparator(); + + QAction* remove_shader_cache = remove_menu->addAction(tr("&Remove Shader Cache")); + connect(remove_shader_cache, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->BatchRemoveShaderCaches(games, true); + }); + + QAction* remove_ppu_cache = remove_menu->addAction(tr("&Remove PPU Cache")); + connect(remove_ppu_cache, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->BatchRemovePPUCaches(games, true); + }); + + QAction* remove_spu_cache = remove_menu->addAction(tr("&Remove SPU Cache")); + connect(remove_spu_cache, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->BatchRemoveSPUCaches(games, true); + }); + + QAction* remove_hdd1_cache = remove_menu->addAction(tr("&Remove HDD1 Cache")); + connect(remove_hdd1_cache, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->BatchRemoveHDD1Caches(games, true); + }); + + QAction* remove_all_caches = remove_menu->addAction(tr("&Remove All Caches")); + connect(remove_all_caches, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->BatchRemoveAllCaches(games, true); + }); + + remove_menu->addSeparator(); + + QAction* remove_savestates = remove_menu->addAction(tr("&Remove Savestates")); + connect(remove_savestates, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->SetContentList(game_list_actions::content_type::SAVESTATES, {}); + m_game_list_actions->BatchRemoveContentLists(games, true); + }); + + // Disable the Remove menu if empty + remove_menu->setEnabled(!remove_menu->isEmpty()); + + addSeparator(); + + // Manage Game menu + QMenu* manage_game_menu = addMenu(tr("&Manage Game")); + + // Create game shortcuts + QAction* create_desktop_shortcut = manage_game_menu->addAction(tr("&Create Desktop Shortcut")); + connect(create_desktop_shortcut, &QAction::triggered, m_game_list_frame, [this, games]() + { + if (QMessageBox::question(m_game_list_frame, tr("Confirm Creation"), tr("Create desktop shortcut?")) != QMessageBox::Yes) + return; + + m_game_list_actions->CreateShortcuts(games, {gui::utils::shortcut_location::desktop}); + }); + +#ifdef _WIN32 + QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Start Menu Shortcut")); +#elif defined(__APPLE__) + QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Launchpad Shortcut")); +#else + QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Application Menu Shortcut")); +#endif + connect(create_start_menu_shortcut, &QAction::triggered, m_game_list_frame, [this, games]() + { + if (QMessageBox::question(m_game_list_frame, tr("Confirm Creation"), tr("Create shortcut?")) != QMessageBox::Yes) + return; + + m_game_list_actions->CreateShortcuts(games, {gui::utils::shortcut_location::applications}); + }); + + manage_game_menu->addSeparator(); + + // Hide game in game list + QAction* hide_serial = manage_game_menu->addAction(tr("&Hide In Game List")); + connect(hide_serial, &QAction::triggered, m_game_list_frame, [this, games]() + { + if (QMessageBox::question(m_game_list_frame, tr("Confirm Hiding"), tr("Hide in game list?")) != QMessageBox::Yes) + return; + + for (const auto& game : games) + { + m_game_list_frame->hidden_list().insert(QString::fromStdString(game->info.serial)); + } + + m_gui_settings->SetValue(gui::gl_hidden_list, QStringList(m_game_list_frame->hidden_list().values())); + m_game_list_frame->Refresh(); + }); + + // Show game in game list + QAction* show_serial = manage_game_menu->addAction(tr("&Show In Game List")); + connect(show_serial, &QAction::triggered, m_game_list_frame, [this, games]() + { + for (const auto& game : games) + { + m_game_list_frame->hidden_list().remove(QString::fromStdString(game->info.serial)); + } + + m_gui_settings->SetValue(gui::gl_hidden_list, QStringList(m_game_list_frame->hidden_list().values())); + m_game_list_frame->Refresh(); + }); + + manage_game_menu->addSeparator(); + + // Reset time played + QAction* reset_time_played = manage_game_menu->addAction(tr("&Reset Time Played")); + connect(reset_time_played, &QAction::triggered, m_game_list_frame, [this, games]() + { + if (QMessageBox::question(m_game_list_frame, tr("Confirm Reset"), tr("Reset time played?")) != QMessageBox::Yes) + return; + + for (const auto& game : games) + { + const auto serial = QString::fromStdString(game->info.serial); + + m_persistent_settings->SetPlaytime(serial, 0, false); + m_persistent_settings->SetLastPlayed(serial, 0, true); + } + + m_game_list_frame->Refresh(); + }); + + manage_game_menu->addSeparator(); + + // Remove game + QAction* remove_game = manage_game_menu->addAction(tr("&Remove Game")); + connect(remove_game, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->ShowRemoveGameDialog(games); + }); + + // Game info + QAction* game_info = manage_game_menu->addAction(tr("&Game Info")); + connect(game_info, &QAction::triggered, this, [this, games]() + { + m_game_list_actions->ShowGameInfoDialog(games); + }); + + exec(global_pos); +} diff --git a/rpcs3/rpcs3qt/game_list_context_menu.h b/rpcs3/rpcs3qt/game_list_context_menu.h new file mode 100644 index 0000000000..9da7d62dcf --- /dev/null +++ b/rpcs3/rpcs3qt/game_list_context_menu.h @@ -0,0 +1,32 @@ +#pragma once + +#include "gui_game_info.h" + +#include "QMenu" + +class game_list_actions; +class game_list_frame; +class gui_settings; +class emu_settings; +class persistent_settings; + +class game_list_context_menu : QMenu +{ + Q_OBJECT + +public: + game_list_context_menu(game_list_frame* frame); + virtual ~game_list_context_menu(); + + void show_menu(const std::vector& games, const QPoint& global_pos); + +private: + void show_single_selection_context_menu(const game_info& gameinfo, const QPoint& global_pos); + void show_multi_selection_context_menu(const std::vector& games, const QPoint& global_pos); + + game_list_frame* m_game_list_frame = nullptr; + std::shared_ptr m_game_list_actions; + std::shared_ptr m_gui_settings; + std::shared_ptr m_emu_settings; + std::shared_ptr m_persistent_settings; +}; diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 55703912b5..6910012fc3 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -1,8 +1,6 @@ #include "game_list_frame.h" +#include "game_list_context_menu.h" #include "qt_utils.h" -#include "settings_dialog.h" -#include "pad_settings_dialog.h" -#include "input_dialog.h" #include "localized.h" #include "progress_dialog.h" #include "persistent_settings.h" @@ -12,49 +10,37 @@ #include "game_list_table.h" #include "game_list_grid.h" #include "game_list_grid_item.h" -#include "patch_manager_dialog.h" #include "Emu/System.h" #include "Emu/vfs_config.h" -#include "Emu/VFS.h" #include "Emu/system_utils.hpp" #include "Loader/PSF.h" #include "util/types.hpp" #include "Utilities/File.h" #include "util/sysinfo.hpp" -#include "Input/pad_thread.h" #include #include -#include #include -#include #include #include -#include #include -#include #include #include -#include #include -#include -#include LOG_CHANNEL(game_list_log, "GameList"); LOG_CHANNEL(sys_log, "SYS"); -extern atomic_t g_system_progress_canceled; - -std::string get_savestate_file(std::string_view title_id, std::string_view boot_pat, s64 rel_id, u64 aggregate_file_size = umax); - game_list_frame::game_list_frame(std::shared_ptr gui_settings, std::shared_ptr emu_settings, std::shared_ptr persistent_settings, QWidget* parent) : custom_dock_widget(tr("Game List"), parent) , m_gui_settings(std::move(gui_settings)) , m_emu_settings(std::move(emu_settings)) , m_persistent_settings(std::move(persistent_settings)) { + m_game_list_actions = std::make_shared(this, m_gui_settings); + m_icon_size = gui::gl_icon_size_min; // ensure a valid size m_is_list_layout = m_gui_settings->GetValue(gui::gl_listMode).toBool(); m_margin_factor = m_gui_settings->GetValue(gui::gl_marginFactor).toReal(); @@ -326,79 +312,6 @@ bool game_list_frame::IsEntryVisible(const game_info& game, bool search_fallback return is_visible && matches_category() && SearchMatchesApp(QString::fromStdString(game->info.name), serial, search_fallback); } -bool game_list_frame::RemoveContentPath(const std::string& path, const std::string& desc) -{ - if (!fs::exists(path)) - { - return true; - } - - if (fs::is_dir(path)) - { - if (fs::remove_all(path)) - { - game_list_log.notice("Removed '%s' directory: '%s'", desc, path); - } - else - { - game_list_log.error("Could not remove '%s' directory: '%s' (%s)", desc, path, fs::g_tls_error); - - return false; - } - } - else // If file - { - if (fs::remove_file(path)) - { - game_list_log.notice("Removed '%s' file: '%s'", desc, path); - } - else - { - game_list_log.error("Could not remove '%s' file: '%s' (%s)", desc, path, fs::g_tls_error); - - return false; - } - } - - return true; -} - -u32 game_list_frame::RemoveContentPathList(const std::set& path_list, const std::string& desc) -{ - u32 paths_removed = 0; - - for (const std::string& path : path_list) - { - if (RemoveContentPath(path, desc)) - { - paths_removed++; - } - } - - return paths_removed; -} - -bool game_list_frame::RemoveContentBySerial(const std::string& base_dir, const std::string& serial, const std::string& desc) -{ - bool success = true; - - for (const auto& entry : fs::dir(base_dir)) - { - // Search for any path starting with serial (e.g. BCES01118_BCES01118) - if (!entry.name.starts_with(serial)) - { - continue; - } - - if (!RemoveContentPath(base_dir + entry.name, desc)) - { - success = false; // Mark as failed if there is at least one failure - } - } - - return success; -} - void game_list_frame::push_path(const std::string& path, std::vector& legit_paths) { { @@ -1043,976 +956,6 @@ void game_list_frame::ItemSelectionChangedSlot() Q_EMIT NotifyGameSelection(game); } -void game_list_frame::CreateShortcuts(const std::vector& games, const std::set& locations) -{ - if (games.empty()) - { - game_list_log.notice("Skip creating shortcuts. No games selected."); - return; - } - - if (locations.empty()) - { - game_list_log.error("Failed to create shortcuts. No locations selected."); - return; - } - - bool success = true; - - for (const game_info& gameinfo : games) - { - std::string gameid_token_value; - - const std::string dev_flash = g_cfg_vfs.get_dev_flash(); - - if (gameinfo->info.category == "DG" && !fs::is_file(rpcs3::utils::get_hdd0_dir() + "/game/" + gameinfo->info.serial + "/USRDIR/EBOOT.BIN")) - { - const usz ps3_game_dir_pos = fs::get_parent_dir(gameinfo->info.path).size(); - std::string relative_boot_dir = gameinfo->info.path.substr(ps3_game_dir_pos); - - if (usz char_pos = relative_boot_dir.find_first_not_of(fs::delim); char_pos != umax) - { - relative_boot_dir = relative_boot_dir.substr(char_pos); - } - else - { - relative_boot_dir.clear(); - } - - if (!relative_boot_dir.empty()) - { - if (relative_boot_dir != "PS3_GAME") - { - gameid_token_value = gameinfo->info.serial + "/" + relative_boot_dir; - } - else - { - gameid_token_value = gameinfo->info.serial; - } - } - } - else - { - gameid_token_value = gameinfo->info.serial; - } - -#ifdef __linux__ - const std::string target_cli_args = gameinfo->info.path.starts_with(dev_flash) ? fmt::format("--no-gui \"%%%%RPCS3_VFS%%%%:dev_flash/%s\"", gameinfo->info.path.substr(dev_flash.size())) - : fmt::format("--no-gui \"%%%%RPCS3_GAMEID%%%%:%s\"", gameid_token_value); -#else - const std::string target_cli_args = gameinfo->info.path.starts_with(dev_flash) ? fmt::format("--no-gui \"%%RPCS3_VFS%%:dev_flash/%s\"", gameinfo->info.path.substr(dev_flash.size())) - : fmt::format("--no-gui \"%%RPCS3_GAMEID%%:%s\"", gameid_token_value); -#endif - const std::string target_icon_dir = fmt::format("%sIcons/game_icons/%s/", fs::get_config_dir(), gameinfo->info.serial); - - if (!fs::create_path(target_icon_dir)) - { - game_list_log.error("Failed to create shortcut path %s (%s)", QString::fromStdString(gameinfo->info.name).simplified(), target_icon_dir, fs::g_tls_error); - success = false; - continue; - } - - for (const gui::utils::shortcut_location& location : locations) - { - std::string destination; - - switch (location) - { - case gui::utils::shortcut_location::desktop: - destination = "desktop"; - break; - case gui::utils::shortcut_location::applications: - destination = "application menu"; - break; -#ifdef _WIN32 - case gui::utils::shortcut_location::rpcs3_shortcuts: - destination = "/games/shortcuts/"; - break; -#endif - } - - if (!gameid_token_value.empty() && gui::utils::create_shortcut(gameinfo->info.name, gameinfo->info.serial, target_cli_args, gameinfo->info.name, gameinfo->info.icon_path, target_icon_dir, location)) - { - game_list_log.success("Created %s shortcut for %s", destination, QString::fromStdString(gameinfo->info.name).simplified()); - } - else - { - game_list_log.error("Failed to create %s shortcut for %s", destination, QString::fromStdString(gameinfo->info.name).simplified()); - success = false; - } - } - } - -#ifdef _WIN32 - if (locations.size() == 1 && locations.contains(gui::utils::shortcut_location::rpcs3_shortcuts)) - { - return; - } -#endif - - if (success) - { - QMessageBox::information(this, tr("Success!"), tr("Successfully created shortcut(s).")); - } - else - { - QMessageBox::warning(this, tr("Warning!"), tr("Failed to create one or more shortcuts!")); - } -} - -void game_list_frame::ShowSingleSelectionContextMenu(const game_info& gameinfo, QPoint& global_pos) -{ - GameInfo current_game = gameinfo->info; - const std::string serial = current_game.serial; - const QString name = QString::fromStdString(current_game.name).simplified(); - const bool is_current_running_game = IsGameRunning(serial); - - // Make Actions - QMenu menu; - - QAction* boot = new QAction(gameinfo->has_custom_config - ? (is_current_running_game - ? tr("&Reboot with Global Configuration") - : tr("&Boot with Global Configuration")) - : (is_current_running_game - ? tr("&Reboot") - : tr("&Boot"))); - - QFont font = boot->font(); - font.setBold(true); - - if (gameinfo->has_custom_config) - { - QAction* boot_custom = menu.addAction(is_current_running_game - ? tr("&Reboot with Custom Configuration") - : tr("&Boot with Custom Configuration")); - boot_custom->setFont(font); - connect(boot_custom, &QAction::triggered, [this, gameinfo] - { - sys_log.notice("Booting from gamelist per context menu..."); - Q_EMIT RequestBoot(gameinfo); - }); - } - else - { - boot->setFont(font); - } - - menu.addAction(boot); - - { - QAction* boot_default = menu.addAction(is_current_running_game - ? tr("&Reboot with Default Configuration") - : tr("&Boot with Default Configuration")); - - connect(boot_default, &QAction::triggered, [this, gameinfo] - { - sys_log.notice("Booting from gamelist per context menu..."); - Q_EMIT RequestBoot(gameinfo, cfg_mode::default_config); - }); - - QAction* boot_manual = menu.addAction(is_current_running_game - ? tr("&Reboot with Manually Selected Configuration") - : tr("&Boot with Manually Selected Configuration")); - - connect(boot_manual, &QAction::triggered, [this, gameinfo] - { - if (const std::string file_path = QFileDialog::getOpenFileName(this, "Select Config File", "", tr("Config Files (*.yml);;All files (*.*)")).toStdString(); !file_path.empty()) - { - sys_log.notice("Booting from gamelist per context menu..."); - Q_EMIT RequestBoot(gameinfo, cfg_mode::custom_selection, file_path); - } - else - { - sys_log.notice("Manual config selection aborted."); - } - }); - } - - extern bool is_savestate_compatible(const std::string& filepath); - - if (const std::string sstate = get_savestate_file(serial, current_game.path, 1); is_savestate_compatible(sstate)) - { - const bool has_ambiguity = !get_savestate_file(serial, current_game.path, 2).empty(); - - QAction* boot_state = menu.addAction(is_current_running_game - ? tr("&Reboot with last SaveState") - : tr("&Boot with last SaveState")); - - connect(boot_state, &QAction::triggered, [this, gameinfo, sstate] - { - sys_log.notice("Booting savestate from gamelist per context menu..."); - Q_EMIT RequestBoot(gameinfo, cfg_mode::custom, "", sstate); - }); - - if (has_ambiguity) - { - QAction* choose_state = menu.addAction(is_current_running_game - ? tr("&Choose SaveState to reboot") - : tr("&Choose SaveState to boot")); - - connect(choose_state, &QAction::triggered, [this, gameinfo] - { - // If there is any ambiguity, launch the savestate manager - Q_EMIT RequestSaveStateManager(gameinfo); - }); - } - } - - menu.addSeparator(); - - QAction* configure = menu.addAction(gameinfo->has_custom_config - ? tr("&Change Custom Configuration") - : tr("&Create Custom Configuration From Global Settings")); - QAction* create_game_default_config = gameinfo->has_custom_config ? nullptr - : menu.addAction(tr("&Create Custom Configuration From Default Settings")); - QAction* pad_configure = menu.addAction(gameinfo->has_custom_pad_config - ? tr("&Change Custom Gamepad Configuration") - : tr("&Create Custom Gamepad Configuration")); - QAction* configure_patches = menu.addAction(tr("&Manage Game Patches")); - - menu.addSeparator(); - - // Create LLVM cache - QAction* create_cpu_cache = menu.addAction(tr("&Create LLVM Cache")); - - // Remove menu - QMenu* remove_menu = menu.addMenu(tr("&Remove")); - - if (gameinfo->has_custom_config) - { - QAction* remove_custom_config = remove_menu->addAction(tr("&Remove Custom Configuration")); - connect(remove_custom_config, &QAction::triggered, [this, serial, gameinfo]() - { - if (RemoveCustomConfiguration(serial, gameinfo, true)) - { - ShowCustomConfigIcon(gameinfo); - } - }); - } - if (gameinfo->has_custom_pad_config) - { - QAction* remove_custom_pad_config = remove_menu->addAction(tr("&Remove Custom Gamepad Configuration")); - connect(remove_custom_pad_config, &QAction::triggered, [this, serial, gameinfo]() - { - if (RemoveCustomPadConfiguration(serial, gameinfo, true)) - { - ShowCustomConfigIcon(gameinfo); - } - }); - } - - const std::string cache_base_dir = fs::get_path_if_dir(rpcs3::utils::get_cache_dir_by_serial(serial)); - const bool has_hdd1_cache_dir = !rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd1_cache_dir(), serial).empty(); - const std::string savestates_dir = fs::get_path_if_dir(rpcs3::utils::get_savestates_dir(serial)); - - if (!cache_base_dir.empty()) - { - remove_menu->addSeparator(); - - QAction* remove_shader_cache = remove_menu->addAction(tr("&Remove Shader Cache")); - remove_shader_cache->setEnabled(!is_current_running_game); - connect(remove_shader_cache, &QAction::triggered, [this, serial]() - { - RemoveShaderCache(serial, true); - }); - - QAction* remove_ppu_cache = remove_menu->addAction(tr("&Remove PPU Cache")); - remove_ppu_cache->setEnabled(!is_current_running_game); - connect(remove_ppu_cache, &QAction::triggered, [this, serial]() - { - RemovePPUCache(serial, true); - }); - - QAction* remove_spu_cache = remove_menu->addAction(tr("&Remove SPU Cache")); - remove_spu_cache->setEnabled(!is_current_running_game); - connect(remove_spu_cache, &QAction::triggered, [this, serial]() - { - RemoveSPUCache(serial, true); - }); - } - - if (has_hdd1_cache_dir) - { - QAction* remove_hdd1_cache = remove_menu->addAction(tr("&Remove HDD1 Cache")); - remove_hdd1_cache->setEnabled(!is_current_running_game); - connect(remove_hdd1_cache, &QAction::triggered, [this, serial]() - { - RemoveHDD1Cache(serial, true); - }); - } - - if (!cache_base_dir.empty() || has_hdd1_cache_dir) - { - QAction* remove_all_caches = remove_menu->addAction(tr("&Remove All Caches")); - remove_all_caches->setEnabled(!is_current_running_game); - connect(remove_all_caches, &QAction::triggered, [this, serial]() - { - RemoveAllCaches(serial, true); - }); - } - - if (!savestates_dir.empty()) - { - remove_menu->addSeparator(); - - QAction* remove_savestates = remove_menu->addAction(tr("&Remove Savestates")); - remove_savestates->setEnabled(!is_current_running_game); - connect(remove_savestates, &QAction::triggered, [this, serial]() - { - SetContentList(SAVESTATES, {}); - RemoveContentList(serial, true); - }); - } - - // Disable the Remove menu if empty - remove_menu->setEnabled(!remove_menu->isEmpty()); - - menu.addSeparator(); - - // Manage Game menu - QMenu* manage_game_menu = menu.addMenu(tr("&Manage Game")); - - // Create game shortcuts - QAction* create_desktop_shortcut = manage_game_menu->addAction(tr("&Create Desktop Shortcut")); - connect(create_desktop_shortcut, &QAction::triggered, this, [this, gameinfo]() - { - CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::desktop}); - }); -#ifdef _WIN32 - QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Start Menu Shortcut")); -#elif defined(__APPLE__) - QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Launchpad Shortcut")); -#else - QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Application Menu Shortcut")); -#endif - connect(create_start_menu_shortcut, &QAction::triggered, this, [this, gameinfo]() - { - CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::applications}); - }); - - manage_game_menu->addSeparator(); - - // Hide/rename game in game list - QAction* hide_serial = manage_game_menu->addAction(tr("&Hide In Game List")); - hide_serial->setCheckable(true); - hide_serial->setChecked(m_hidden_list.contains(QString::fromStdString(serial))); - QAction* rename_title = manage_game_menu->addAction(tr("&Rename In Game List")); - - // Edit tooltip notes/reset time played - QAction* edit_notes = manage_game_menu->addAction(tr("&Edit Tooltip Notes")); - QAction* reset_time_played = manage_game_menu->addAction(tr("&Reset Time Played")); - - manage_game_menu->addSeparator(); - - // Remove game - QAction* remove_game = manage_game_menu->addAction(tr("&Remove %1").arg(gameinfo->localized_category)); - remove_game->setEnabled(!is_current_running_game); - - // Game info - QAction* game_info = manage_game_menu->addAction(tr("&Game Info")); - connect(game_info, &QAction::triggered, this, [this, gameinfo]() - { - ShowGameInfoDialog({gameinfo}); - }); - - // Custom Images menu - QMenu* icon_menu = menu.addMenu(tr("&Custom Images")); - const std::array custom_icon_actions = - { - icon_menu->addAction(tr("&Import Custom Icon")), - icon_menu->addAction(tr("&Replace Custom Icon")), - icon_menu->addAction(tr("&Remove Custom Icon")) - }; - icon_menu->addSeparator(); - const std::array custom_gif_actions = - { - icon_menu->addAction(tr("&Import Hover Gif")), - icon_menu->addAction(tr("&Replace Hover Gif")), - icon_menu->addAction(tr("&Remove Hover Gif")) - }; - icon_menu->addSeparator(); - const std::array custom_shader_icon_actions = - { - icon_menu->addAction(tr("&Import Custom Shader Loading Background")), - icon_menu->addAction(tr("&Replace Custom Shader Loading Background")), - icon_menu->addAction(tr("&Remove Custom Shader Loading Background")) - }; - - if (const std::string custom_icon_dir_path = rpcs3::utils::get_icons_dir(serial); - fs::create_path(custom_icon_dir_path)) - { - enum class icon_action - { - add, - replace, - remove - }; - enum class icon_type - { - game_list, - hover_gif, - shader_load - }; - - const auto handle_icon = [this, serial](const QString& game_icon_path, const QString& suffix, icon_action action, icon_type type) - { - QString icon_path; - - if (action != icon_action::remove) - { - QString msg; - switch (type) - { - case icon_type::game_list: - msg = tr("Select Custom Icon"); - break; - case icon_type::hover_gif: - msg = tr("Select Custom Hover Gif"); - break; - case icon_type::shader_load: - msg = tr("Select Custom Shader Loading Background"); - break; - } - icon_path = QFileDialog::getOpenFileName(this, msg, "", tr("%0 (*.%0);;All files (*.*)").arg(suffix)); - } - if (action == icon_action::remove || !icon_path.isEmpty()) - { - bool refresh = false; - - QString msg; - switch (type) - { - case icon_type::game_list: - msg = tr("Remove Custom Icon of %0?").arg(QString::fromStdString(serial)); - break; - case icon_type::hover_gif: - msg = tr("Remove Custom Hover Gif of %0?").arg(QString::fromStdString(serial)); - break; - case icon_type::shader_load: - msg = tr("Remove Custom Shader Loading Background of %0?").arg(QString::fromStdString(serial)); - break; - } - - if (action == icon_action::replace || (action == icon_action::remove && - QMessageBox::question(this, tr("Confirm Removal"), msg) == QMessageBox::Yes)) - { - if (QFile file(game_icon_path); file.exists() && !file.remove()) - { - game_list_log.error("Could not remove old file: '%s'", game_icon_path, file.errorString()); - QMessageBox::warning(this, tr("Warning!"), tr("Failed to remove the old file!")); - return; - } - - game_list_log.success("Removed file: '%s'", game_icon_path); - if (action == icon_action::remove) - { - refresh = true; - } - } - - if (action != icon_action::remove) - { - if (!QFile::copy(icon_path, game_icon_path)) - { - game_list_log.error("Could not import file '%s' to '%s'.", icon_path, game_icon_path); - QMessageBox::warning(this, tr("Warning!"), tr("Failed to import the new file!")); - } - else - { - game_list_log.success("Imported file '%s' to '%s'", icon_path, game_icon_path); - refresh = true; - } - } - - if (refresh) - { - Refresh(true); - } - } - }; - - const std::vector&>> icon_map = - { - {icon_type::game_list, "/ICON0.PNG", "png", custom_icon_actions}, - {icon_type::hover_gif, "/hover.gif", "gif", custom_gif_actions}, - {icon_type::shader_load, "/PIC1.PNG", "png", custom_shader_icon_actions}, - }; - - for (const auto& [type, icon_name, suffix, actions] : icon_map) - { - const QString icon_path = QString::fromStdString(custom_icon_dir_path) + icon_name; - - if (QFile::exists(icon_path)) - { - actions[static_cast(icon_action::add)]->setVisible(false); - connect(actions[static_cast(icon_action::replace)], &QAction::triggered, this, [handle_icon, icon_path, t = type, s = suffix] { handle_icon(icon_path, s, icon_action::replace, t); }); - connect(actions[static_cast(icon_action::remove)], &QAction::triggered, this, [handle_icon, icon_path, t = type, s = suffix] { handle_icon(icon_path, s, icon_action::remove, t); }); - } - else - { - connect(actions[static_cast(icon_action::add)], &QAction::triggered, this, [handle_icon, icon_path, t = type, s = suffix] { handle_icon(icon_path, s, icon_action::add, t); }); - actions[static_cast(icon_action::replace)]->setVisible(false); - actions[static_cast(icon_action::remove)]->setEnabled(false); - } - } - } - else - { - game_list_log.error("Could not create path '%s'", custom_icon_dir_path); - icon_menu->setEnabled(false); - } - - menu.addSeparator(); - - // Open Folder menu - QMenu* open_folder_menu = menu.addMenu(tr("&Open Folder")); - - const bool is_disc_game = QString::fromStdString(current_game.category) == cat::cat_disc_game; - const std::string data_dir = fs::get_path_if_dir(rpcs3::utils::get_data_dir(serial)); - const std::string captures_dir = fs::get_path_if_dir(rpcs3::utils::get_captures_dir()); - const std::string recordings_dir = fs::get_path_if_dir(rpcs3::utils::get_recordings_dir(serial)); - const std::string screenshots_dir = fs::get_path_if_dir(rpcs3::utils::get_screenshots_dir(serial)); - std::set data_dir_list; - - if (is_disc_game) - { - QAction* open_disc_game_folder = open_folder_menu->addAction(tr("&Open Disc Game Folder")); - connect(open_disc_game_folder, &QAction::triggered, [current_game]() - { - gui::utils::open_dir(current_game.path); - }); - - // It could be an empty list for a disc game - data_dir_list = rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd0_game_dir(), serial); - } - else - { - data_dir_list.insert(current_game.path); - } - - if (!data_dir_list.empty()) // "true" if a path is present (it could be an empty list for a disc game) - { - QAction* open_data_folder = open_folder_menu->addAction(tr("&Open %0 Folder").arg(is_disc_game ? tr("Game Data") : gameinfo->localized_category)); - connect(open_data_folder, &QAction::triggered, [data_dir_list]() - { - for (const std::string& data_dir : data_dir_list) - { - gui::utils::open_dir(data_dir); - } - }); - } - - if (gameinfo->has_custom_config) - { - QAction* open_config_folder = open_folder_menu->addAction(tr("&Open Custom Config Folder")); - connect(open_config_folder, &QAction::triggered, [serial]() - { - const std::string config_path = rpcs3::utils::get_custom_config_path(serial); - - if (fs::is_file(config_path)) - gui::utils::open_dir(config_path); - }); - } - - // This is a debug feature, let's hide it by reusing debug tab protection - if (m_gui_settings->GetValue(gui::m_showDebugTab).toBool() && !cache_base_dir.empty()) - { - QAction* open_cache_folder = open_folder_menu->addAction(tr("&Open Cache Folder")); - connect(open_cache_folder, &QAction::triggered, [cache_base_dir]() - { - gui::utils::open_dir(cache_base_dir); - }); - } - - if (!data_dir.empty()) - { - QAction* open_data_folder = open_folder_menu->addAction(tr("&Open Data Folder")); - connect(open_data_folder, &QAction::triggered, [data_dir]() - { - gui::utils::open_dir(data_dir); - }); - } - - if (!savestates_dir.empty()) - { - QAction* open_savestates_folder = open_folder_menu->addAction(tr("&Open Savestates Folder")); - connect(open_savestates_folder, &QAction::triggered, [savestates_dir]() - { - gui::utils::open_dir(savestates_dir); - }); - } - - if (!captures_dir.empty()) - { - QAction* open_captures_folder = open_folder_menu->addAction(tr("&Open Captures Folder")); - connect(open_captures_folder, &QAction::triggered, [captures_dir]() - { - gui::utils::open_dir(captures_dir); - }); - } - - if (!recordings_dir.empty()) - { - QAction* open_recordings_folder = open_folder_menu->addAction(tr("&Open Recordings Folder")); - connect(open_recordings_folder, &QAction::triggered, [recordings_dir]() - { - gui::utils::open_dir(recordings_dir); - }); - } - - if (!screenshots_dir.empty()) - { - QAction* open_screenshots_folder = open_folder_menu->addAction(tr("&Open Screenshots Folder")); - connect(open_screenshots_folder, &QAction::triggered, [screenshots_dir]() - { - gui::utils::open_dir(screenshots_dir); - }); - } - - // Copy Info menu - QMenu* info_menu = menu.addMenu(tr("&Copy Info")); - QAction* copy_info = info_menu->addAction(tr("&Copy Name + Serial")); - QAction* copy_name = info_menu->addAction(tr("&Copy Name")); - QAction* copy_serial = info_menu->addAction(tr("&Copy Serial")); - - menu.addSeparator(); - - QAction* check_compat = menu.addAction(tr("&Check Game Compatibility")); - QAction* download_compat = menu.addAction(tr("&Download Compatibility Database")); - - connect(boot, &QAction::triggered, this, [this, gameinfo]() - { - sys_log.notice("Booting from gamelist per context menu..."); - Q_EMIT RequestBoot(gameinfo, cfg_mode::global); - }); - - auto configure_l = [this, current_game, gameinfo](bool create_cfg_from_global_cfg) - { - settings_dialog dlg(m_gui_settings, m_emu_settings, 0, this, ¤t_game, create_cfg_from_global_cfg); - - connect(&dlg, &settings_dialog::EmuSettingsApplied, [this, gameinfo]() - { - if (!gameinfo->has_custom_config) - { - gameinfo->has_custom_config = true; - ShowCustomConfigIcon(gameinfo); - } - Q_EMIT NotifyEmuSettingsChange(); - }); - - dlg.exec(); - }; - - if (create_game_default_config) - { - connect(configure, &QAction::triggered, this, [configure_l]() { configure_l(true); }); - connect(create_game_default_config, &QAction::triggered, this, [configure_l = std::move(configure_l)]() { configure_l(false); }); - } - else - { - connect(configure, &QAction::triggered, this, [configure_l = std::move(configure_l)]() { configure_l(true); }); - } - - connect(pad_configure, &QAction::triggered, this, [this, current_game, gameinfo]() - { - pad_settings_dialog dlg(m_gui_settings, this, ¤t_game); - - if (dlg.exec() == QDialog::Accepted && !gameinfo->has_custom_pad_config) - { - gameinfo->has_custom_pad_config = true; - ShowCustomConfigIcon(gameinfo); - } - }); - connect(hide_serial, &QAction::triggered, this, [serial = QString::fromStdString(serial), this](bool checked) - { - if (checked) - m_hidden_list.insert(serial); - else - m_hidden_list.remove(serial); - - m_gui_settings->SetValue(gui::gl_hidden_list, QStringList(m_hidden_list.values())); - Refresh(); - }); - connect(create_cpu_cache, &QAction::triggered, this, [gameinfo, this] - { - if (m_gui_settings->GetBootConfirmation(this)) - { - CreateCPUCaches(gameinfo); - } - }); - connect(remove_game, &QAction::triggered, this, [this, gameinfo] - { - ShowRemoveGameDialog({gameinfo}); - }); - connect(configure_patches, &QAction::triggered, this, [this, gameinfo]() - { - patch_manager_dialog patch_manager(m_gui_settings, m_game_data, gameinfo->info.serial, gameinfo->GetGameVersion(), this); - patch_manager.exec(); - }); - connect(check_compat, &QAction::triggered, this, [serial = QString::fromStdString(serial)] - { - const QString link = "https://rpcs3.net/compatibility?g=" + serial; - QDesktopServices::openUrl(QUrl(link)); - }); - connect(download_compat, &QAction::triggered, this, [this] - { - m_game_compat->RequestCompatibility(true); - }); - connect(rename_title, &QAction::triggered, this, [this, name, serial = QString::fromStdString(serial), global_pos] - { - const QString custom_title = m_persistent_settings->GetValue(gui::persistent::titles, serial, "").toString(); - const QString old_title = custom_title.isEmpty() ? name : custom_title; - - input_dialog dlg(128, old_title, tr("Rename Title"), tr("%0\n%1\n\nYou can clear the line in order to use the original title.").arg(name).arg(serial), name, this); - dlg.move(global_pos); - - if (dlg.exec() == QDialog::Accepted) - { - const QString new_title = dlg.get_input_text().simplified(); - - if (new_title.isEmpty() || new_title == name) - { - m_titles.erase(serial); - m_persistent_settings->RemoveValue(gui::persistent::titles, serial); - } - else - { - m_titles.insert_or_assign(serial, new_title); - m_persistent_settings->SetValue(gui::persistent::titles, serial, new_title); - } - Refresh(true); // full refresh in order to reliably sort the list - } - }); - connect(edit_notes, &QAction::triggered, this, [this, name, serial = QString::fromStdString(serial)] - { - bool accepted; - const QString old_notes = m_persistent_settings->GetValue(gui::persistent::notes, serial, "").toString(); - const QString new_notes = QInputDialog::getMultiLineText(this, tr("Edit Tooltip Notes"), tr("%0\n%1").arg(name).arg(serial), old_notes, &accepted); - - if (accepted) - { - if (new_notes.simplified().isEmpty()) - { - m_notes.erase(serial); - m_persistent_settings->RemoveValue(gui::persistent::notes, serial); - } - else - { - m_notes.insert_or_assign(serial, new_notes); - m_persistent_settings->SetValue(gui::persistent::notes, serial, new_notes); - } - Refresh(); - } - }); - connect(reset_time_played, &QAction::triggered, this, [this, name, serial = QString::fromStdString(serial)] - { - if (QMessageBox::question(this, tr("Confirm Reset"), tr("Reset time played?\n\n%0 [%1]").arg(name).arg(serial)) == QMessageBox::Yes) - { - m_persistent_settings->SetPlaytime(serial, 0, false); - m_persistent_settings->SetLastPlayed(serial, 0, true); - Refresh(); - } - }); - connect(copy_info, &QAction::triggered, this, [name, serial = QString::fromStdString(serial)] - { - QApplication::clipboard()->setText(name % QStringLiteral(" [") % serial % QStringLiteral("]")); - }); - connect(copy_name, &QAction::triggered, this, [name] - { - QApplication::clipboard()->setText(name); - }); - connect(copy_serial, &QAction::triggered, this, [serial = QString::fromStdString(serial)] - { - QApplication::clipboard()->setText(serial); - }); - - // Disable options depending on software category - const QString category = QString::fromStdString(current_game.category); - - if (category == cat::cat_ps3_os) - { - remove_game->setEnabled(false); - } - else if (category != cat::cat_disc_game && category != cat::cat_hdd_game) - { - check_compat->setEnabled(false); - } - - menu.exec(global_pos); -} - -void game_list_frame::ShowMultiSelectionContextMenu(const std::vector& games, QPoint& global_pos) -{ - // Make Actions - QMenu menu; - - // Create LLVM cache - QAction* create_cpu_cache = menu.addAction(tr("&Create LLVM Cache")); - connect(create_cpu_cache, &QAction::triggered, [this, games]() - { - BatchCreateCPUCaches(games, false, true); - }); - - // Remove menu - QMenu* remove_menu = menu.addMenu(tr("&Remove")); - - QAction* remove_custom_config = remove_menu->addAction(tr("&Remove Custom Configuration")); - connect(remove_custom_config, &QAction::triggered, [this, games]() - { - BatchRemoveCustomConfigurations(games, true); - }); - - QAction* remove_custom_pad_config = remove_menu->addAction(tr("&Remove Custom Gamepad Configuration")); - connect(remove_custom_pad_config, &QAction::triggered, [this, games]() - { - BatchRemoveCustomPadConfigurations(games, true); - }); - - remove_menu->addSeparator(); - - QAction* remove_shader_cache = remove_menu->addAction(tr("&Remove Shader Cache")); - connect(remove_shader_cache, &QAction::triggered, [this, games]() - { - BatchRemoveShaderCaches(games, true); - }); - - QAction* remove_ppu_cache = remove_menu->addAction(tr("&Remove PPU Cache")); - connect(remove_ppu_cache, &QAction::triggered, [this, games]() - { - BatchRemovePPUCaches(games, true); - }); - - QAction* remove_spu_cache = remove_menu->addAction(tr("&Remove SPU Cache")); - connect(remove_spu_cache, &QAction::triggered, [this, games]() - { - BatchRemoveSPUCaches(games, true); - }); - - QAction* remove_hdd1_cache = remove_menu->addAction(tr("&Remove HDD1 Cache")); - connect(remove_hdd1_cache, &QAction::triggered, [this, games]() - { - BatchRemoveHDD1Caches(games, true); - }); - - QAction* remove_all_caches = remove_menu->addAction(tr("&Remove All Caches")); - connect(remove_all_caches, &QAction::triggered, [this, games]() - { - BatchRemoveAllCaches(games, true); - }); - - remove_menu->addSeparator(); - - QAction* remove_savestates = remove_menu->addAction(tr("&Remove Savestates")); - connect(remove_savestates, &QAction::triggered, [this, games]() - { - SetContentList(SAVESTATES, {}); - BatchRemoveContentLists(games, true); - }); - - // Disable the Remove menu if empty - remove_menu->setEnabled(!remove_menu->isEmpty()); - - menu.addSeparator(); - - // Manage Game menu - QMenu* manage_game_menu = menu.addMenu(tr("&Manage Game")); - - // Create game shortcuts - QAction* create_desktop_shortcut = manage_game_menu->addAction(tr("&Create Desktop Shortcut")); - connect(create_desktop_shortcut, &QAction::triggered, this, [this, games]() - { - if (QMessageBox::question(this, tr("Confirm Creation"), tr("Create desktop shortcut?")) != QMessageBox::Yes) - return; - - CreateShortcuts(games, {gui::utils::shortcut_location::desktop}); - }); - -#ifdef _WIN32 - QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Start Menu Shortcut")); -#elif defined(__APPLE__) - QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Launchpad Shortcut")); -#else - QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Application Menu Shortcut")); -#endif - connect(create_start_menu_shortcut, &QAction::triggered, this, [this, games]() - { - if (QMessageBox::question(this, tr("Confirm Creation"), tr("Create shortcut?")) != QMessageBox::Yes) - return; - - CreateShortcuts(games, {gui::utils::shortcut_location::applications}); - }); - - manage_game_menu->addSeparator(); - - // Hide game in game list - QAction* hide_serial = manage_game_menu->addAction(tr("&Hide In Game List")); - connect(hide_serial, &QAction::triggered, this, [this, games]() - { - if (QMessageBox::question(this, tr("Confirm Hiding"), tr("Hide in game list?")) != QMessageBox::Yes) - return; - - for (const auto& game : games) - { - m_hidden_list.insert(QString::fromStdString(game->info.serial)); - } - - m_gui_settings->SetValue(gui::gl_hidden_list, QStringList(m_hidden_list.values())); - Refresh(); - }); - - // Show game in game list - QAction* show_serial = manage_game_menu->addAction(tr("&Show In Game List")); - connect(show_serial, &QAction::triggered, this, [this, games]() - { - for (const auto& game : games) - { - m_hidden_list.remove(QString::fromStdString(game->info.serial)); - } - - m_gui_settings->SetValue(gui::gl_hidden_list, QStringList(m_hidden_list.values())); - Refresh(); - }); - - manage_game_menu->addSeparator(); - - // Reset time played - QAction* reset_time_played = manage_game_menu->addAction(tr("&Reset Time Played")); - connect(reset_time_played, &QAction::triggered, this, [this, games]() - { - if (QMessageBox::question(this, tr("Confirm Reset"), tr("Reset time played?")) != QMessageBox::Yes) - return; - - for (const auto& game : games) - { - const auto serial = QString::fromStdString(game->info.serial); - - m_persistent_settings->SetPlaytime(serial, 0, false); - m_persistent_settings->SetLastPlayed(serial, 0, true); - } - - Refresh(); - }); - - manage_game_menu->addSeparator(); - - // Remove game - QAction* remove_game = manage_game_menu->addAction(tr("&Remove Game")); - connect(remove_game, &QAction::triggered, this, [this, games]() - { - ShowRemoveGameDialog(games); - }); - - // Game info - QAction* game_info = manage_game_menu->addAction(tr("&Game Info")); - connect(game_info, &QAction::triggered, this, [this, games]() - { - ShowGameInfoDialog(games); - }); - - menu.exec(global_pos); -} - void game_list_frame::ShowContextMenu(const QPoint& pos) { QPoint global_pos; @@ -2026,10 +969,10 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) { global_pos = m_game_list->viewport()->mapToGlobal(pos); - auto item_list = m_game_list->selectedItems(); + const auto item_list = m_game_list->selectedItems(); game_info gameinfo; - for (auto item : item_list) + for (const auto& item : item_list) { if (item->column() != static_cast(gui::game_list_columns::icon)) continue; @@ -2046,1392 +989,13 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) games.push_back(gameinfo); } - switch (games.size()) + if (!games.empty()) { - case 0: - return; - case 1: - ShowSingleSelectionContextMenu(games[0], global_pos); - break; - default: - ShowMultiSelectionContextMenu(games, global_pos); - break; + game_list_context_menu menu(this); + menu.show_menu(games, global_pos); } } -void game_list_frame::SetContentList(u16 content_types, const content_info& content_info) -{ - m_content_info = content_info; - - m_content_info.content_types = content_types; - m_content_info.clear_on_finish = true; // Always overridden by BatchRemoveContentLists() -} - -void game_list_frame::ClearContentList(bool refresh) -{ - if (refresh) - { - std::vector serials_to_remove_from_yml; - - // Prepare the list of serials (title id) to remove in "games.yml" file (if any) - for (const auto& removedDisc : m_content_info.removed_disc_list) - { - serials_to_remove_from_yml.push_back(removedDisc); - } - - // Finally, refresh the game list - Refresh(true, serials_to_remove_from_yml); - } - - m_content_info = {NO_CONTENT}; -} - -game_list_frame::content_info game_list_frame::GetContentInfo(const std::vector& games) -{ - content_info content_info = {NO_CONTENT}; - - if (games.empty()) - return content_info; - - bool is_disc_game = false; - u64 total_disc_size = 0; - u64 total_data_size = 0; - QString text; - - // Fill in content_info - - content_info.is_single_selection = games.size() == 1; - - for (const auto& game : games) - { - GameInfo& current_game = game->info; - - is_disc_game = QString::fromStdString(current_game.category) == cat::cat_disc_game; - - // +1 if it's a disc game's path and it's present in the shared games folder - content_info.in_games_dir_count += (is_disc_game && Emu.IsPathInsideDir(current_game.path, rpcs3::utils::get_games_dir())) ? 1 : 0; - - // Add the name to the content's name list for the related serial - content_info.name_list[current_game.serial].insert(current_game.name); - - if (is_disc_game) - { - if (current_game.size_on_disk != umax) // If size was properly detected - total_disc_size += current_game.size_on_disk; - - // Add the serial to the disc list - content_info.disc_list.insert(current_game.serial); - - // It could be an empty list for a disc game - std::set data_dir_list = rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd0_game_dir(), current_game.serial); - - // Add the path list to the content's path list for the related serial - for (const auto& data_dir : data_dir_list) - { - content_info.path_list[current_game.serial].insert(data_dir); - } - } - else - { - // Add the path to the content's path list for the related serial - content_info.path_list[current_game.serial].insert(current_game.path); - } - } - - // Fill in text based on filled in content_info - - if (content_info.is_single_selection) // Single selection - { - GameInfo& current_game = games[0]->info; - - text = tr("%0 - %1\n").arg(QString::fromStdString(current_game.serial)).arg(QString::fromStdString(current_game.name)); - - if (is_disc_game) - { - text += tr("\nDisc Game Info:\nPath: %0\n").arg(QString::fromStdString(current_game.path)); - - if (total_disc_size) - text += tr("Size: %0\n").arg(gui::utils::format_byte_size(total_disc_size)); - } - - // if a path is present (it could be an empty list for a disc game) - if (const auto& it = content_info.path_list.find(current_game.serial); it != content_info.path_list.end()) - { - text += tr("\n%0 Info:\n").arg(is_disc_game ? tr("Game Data") : games[0]->localized_category); - - for (const auto& data_dir : it->second) - { - text += tr("Path: %0\n").arg(QString::fromStdString(data_dir)); - - if (const u64 data_size = fs::get_dir_size(data_dir, 1); data_size != umax) - { // If size was properly detected - total_data_size += data_size; - text += tr("Size: %0\n").arg(gui::utils::format_byte_size(data_size)); - } - } - - if (it->second.size() > 1) - text += tr("Total size: %0\n").arg(gui::utils::format_byte_size(total_data_size)); - } - } - else // Multi selection - { - for (const auto& [serial, data_dir_list] : content_info.path_list) - { - for (const auto& data_dir : data_dir_list) - { - if (const u64 data_size = fs::get_dir_size(data_dir, 1); data_size != umax) // If size was properly detected - total_data_size += data_size; - } - } - - text = tr("%0 selected games: %1 Disc Game - %2 not Disc Game\n").arg(games.size()) - .arg(content_info.disc_list.size()).arg(games.size() - content_info.disc_list.size()); - - text += tr("\nDisc Game Info:\n"); - - if (content_info.disc_list.size() != content_info.in_games_dir_count) - text += tr("VFS unhosted: %0\n").arg(content_info.disc_list.size() - content_info.in_games_dir_count); - - if (content_info.in_games_dir_count) - text += tr("VFS hosted: %0\n").arg(content_info.in_games_dir_count); - - if (content_info.disc_list.size() != content_info.in_games_dir_count && content_info.in_games_dir_count) - text += tr("Total games: %0\n").arg((content_info.disc_list.size() - content_info.in_games_dir_count) + content_info.in_games_dir_count); - - if (total_disc_size) - text += tr("Total size: %0\n").arg(gui::utils::format_byte_size(total_disc_size)); - - if (content_info.path_list.size()) - text += tr("\nGame Data Info:\nTotal size: %0\n").arg(gui::utils::format_byte_size(total_data_size)); - } - - u64 caches_size = 0; - u64 icons_size = 0; - u64 savestates_size = 0; - u64 captures_size = 0; - u64 recordings_size = 0; - u64 screenshots_size = 0; - - for (const auto& [serial, name_list] : content_info.name_list) - { - // Main cache - if (const u64 size = fs::get_dir_size(rpcs3::utils::get_cache_dir_by_serial(serial), 1); size != umax) - caches_size += size; - - // HDD1 cache - for (const auto& dir : rpcs3::utils::get_dir_list(rpcs3::utils::get_hdd1_cache_dir(), serial)) - { - if (const u64 size = fs::get_dir_size(dir, 1); size != umax) - caches_size += size; - } - - if (const u64 size = fs::get_dir_size(rpcs3::utils::get_icons_dir(serial), 1); size != umax) - icons_size += size; - - if (const u64 size = fs::get_dir_size(rpcs3::utils::get_savestates_dir(serial), 1); size != umax) - savestates_size += size; - - for (const auto& file : rpcs3::utils::get_file_list(rpcs3::utils::get_captures_dir(), serial)) - { - if (fs::stat_t stat{}; fs::get_stat(file, stat)) - captures_size += stat.size; - } - - if (const u64 size = fs::get_dir_size(rpcs3::utils::get_recordings_dir(serial), 1); size != umax) - recordings_size += size; - - if (const u64 size = fs::get_dir_size(rpcs3::utils::get_screenshots_dir(serial), 1); size != umax) - screenshots_size += size; - } - - text += tr("\nEmulator Data Info:\nCaches size: %0\n").arg(gui::utils::format_byte_size(caches_size)); - text += tr("Icons size: %0\n").arg(gui::utils::format_byte_size(icons_size)); - text += tr("Savestates size: %0\n").arg(gui::utils::format_byte_size(savestates_size)); - text += tr("Captures size: %0\n").arg(gui::utils::format_byte_size(captures_size)); - text += tr("Recordings size: %0\n").arg(gui::utils::format_byte_size(recordings_size)); - text += tr("Screenshots size: %0\n").arg(gui::utils::format_byte_size(screenshots_size)); - - // Retrieve disk space info on data path's drive - if (fs::device_stat stat{}; fs::statfs(rpcs3::utils::get_hdd0_dir(), stat)) - text += tr("\nCurrent free disk space: %0\n").arg(gui::utils::format_byte_size(stat.avail_free)); - - content_info.info = text; - - return content_info; -} - -void game_list_frame::ShowRemoveGameDialog(const std::vector& games) -{ - if (games.empty()) - return; - - content_info content_info = GetContentInfo(games); - QString text = content_info.info; - - QCheckBox* disc = new QCheckBox(tr("Remove title from game list (Disc Game path is not removed!)")); - QCheckBox* caches = new QCheckBox(tr("Remove caches and custom configs")); - QCheckBox* icons = new QCheckBox(tr("Remove icons and shortcuts")); - QCheckBox* savestate = new QCheckBox(tr("Remove savestates")); - QCheckBox* captures = new QCheckBox(tr("Remove captures")); - QCheckBox* recordings = new QCheckBox(tr("Remove recordings")); - QCheckBox* screenshots = new QCheckBox(tr("Remove screenshots")); - - if (content_info.disc_list.size()) - { - if (content_info.in_games_dir_count == content_info.disc_list.size()) - { - disc->setToolTip(tr("Title located under auto-detection VFS \"games\" folder cannot be removed")); - disc->setDisabled(true); - } - else - { - if (!content_info.is_single_selection) // Multi selection - disc->setToolTip(tr("Title located under auto-detection VFS \"games\" folder cannot be removed")); - - disc->setChecked(true); - } - } - else - { - disc->setChecked(false); - disc->setVisible(false); - } - - if (content_info.path_list.size()) // If a path is present - { - text += tr("\nPermanently remove %0 and selected (optional) contents from drive?\n") - .arg((content_info.disc_list.size() || !content_info.is_single_selection) - ? tr("Game Data") : games[0]->localized_category); - } - else - { - text += tr("\nPermanently remove selected (optional) contents from drive?\n"); - } - - caches->setChecked(true); - icons->setChecked(true); - - QMessageBox mb(QMessageBox::Question, tr("Confirm Removal"), text, QMessageBox::Yes | QMessageBox::No, this); - mb.setCheckBox(disc); - - QGridLayout* grid = qobject_cast(mb.layout()); - int row, column, rowSpan, columnSpan; - - grid->getItemPosition(grid->indexOf(disc), &row, &column, &rowSpan, &columnSpan); - grid->addWidget(caches, row + 3, column, rowSpan, columnSpan); - grid->addWidget(icons, row + 4, column, rowSpan, columnSpan); - grid->addWidget(savestate, row + 5, column, rowSpan, columnSpan); - grid->addWidget(captures, row + 6, column, rowSpan, columnSpan); - grid->addWidget(recordings, row + 7, column, rowSpan, columnSpan); - grid->addWidget(screenshots, row + 8, column, rowSpan, columnSpan); - - if (mb.exec() != QMessageBox::Yes) - return; - - // Remove data path in "dev_hdd0/game" folder (if any) and lock file in "dev_hdd0/game/$locks" folder (if any) - u16 content_types = DATA | LOCKS; - - // Remove serials (title id) in "games.yml" file (if any) - if (disc->isChecked()) - content_types |= DISC; - - // Remove caches in "cache" and "dev_hdd1/caches" folders (if any) and custom configs in "config/custom_config" folder (if any) - if (caches->isChecked()) - content_types |= CACHES | CUSTOM_CONFIG; - - // Remove icons in "Icons/game_icons" folder (if any) and - // shortcuts in "games/shortcuts" folder and from desktop / start menu (if any) - if (icons->isChecked()) - content_types |= ICONS | SHORTCUTS; - - if (savestate->isChecked()) - content_types |= SAVESTATES; - - if (captures->isChecked()) - content_types |= CAPTURES; - - if (recordings->isChecked()) - content_types |= RECORDINGS; - - if (screenshots->isChecked()) - content_types |= SCREENSHOTS; - - SetContentList(content_types, content_info); - - if (content_info.is_single_selection) // Single selection - { - if (!RemoveContentList(games[0]->info.serial, true)) - { - QMessageBox::critical(this, tr("Failure!"), caches->isChecked() - ? tr("Failed to remove %0 from drive!\nCaches and custom configs have been left intact.").arg(QString::fromStdString(games[0]->info.name)) - : tr("Failed to remove %0 from drive!").arg(QString::fromStdString(games[0]->info.name))); - - return; - } - } - else // Multi selection - { - BatchRemoveContentLists(games, true); - } -} - -void game_list_frame::ShowGameInfoDialog(const std::vector& games) -{ - if (games.empty()) - return; - - QMessageBox::information(this, tr("Game Info"), GetContentInfo(games).info); -} - -bool game_list_frame::IsGameRunning(const std::string& serial) -{ - return !Emu.IsStopped(true) && (serial == Emu.GetTitleID() || (serial == "vsh.self" && Emu.IsVsh())); -} - -bool game_list_frame::ValidateRemoval(const std::string& serial, const std::string& path, const std::string& desc, bool is_interactive) -{ - if (serial.empty()) - { - game_list_log.error("Removal of %s not allowed due to no title ID provided!", desc); - return false; - } - - if (path.empty() || !fs::exists(path) || (!fs::is_dir(path) && !fs::is_file(path))) - { - game_list_log.success("Could not find %s directory/file: %s (%s)", desc, path, serial); - return false; - } - - if (is_interactive) - { - if (IsGameRunning(serial)) - { - game_list_log.error("Removal of %s not allowed due to %s title is running!", desc, serial); - - QMessageBox::critical(this, tr("Removal Aborted"), - tr("Removal of %0 not allowed due to %1 title is running!") - .arg(QString::fromStdString(desc)).arg(QString::fromStdString(serial))); - - return false; - } - - if (QMessageBox::question(this, tr("Confirm Removal"), tr("Remove %0?").arg(QString::fromStdString(desc))) != QMessageBox::Yes) - return false; - } - - return true; -} - -bool game_list_frame::ValidateBatchRemoval(const std::string& desc, bool is_interactive) -{ - if (!Emu.IsStopped(true)) - { - game_list_log.error("Removal of %s not allowed due to emulator is running!", desc); - - if (is_interactive) - { - QMessageBox::critical(this, tr("Removal Aborted"), - tr("Removal of %0 not allowed due to emulator is running!").arg(QString::fromStdString(desc))); - } - - return false; - } - - if (is_interactive) - { - if (QMessageBox::question(this, tr("Confirm Removal"), tr("Remove %0?").arg(QString::fromStdString(desc))) != QMessageBox::Yes) - return false; - } - - return true; -} - -bool game_list_frame::CreateCPUCaches(const std::string& path, const std::string& serial, bool is_fast_compilation) -{ - Emu.GracefulShutdown(false); - Emu.SetForceBoot(true); - Emu.SetPrecompileCacheOption(emu_precompilation_option_t{.is_fast = is_fast_compilation}); - - if (const auto error = Emu.BootGame(fs::is_file(path) ? fs::get_parent_dir(path) : path, serial, true); error != game_boot_result::no_errors) - { - game_list_log.error("Could not create LLVM caches for %s, error: %s", path, error); - return false; - } - - game_list_log.warning("Creating LLVM Caches for %s", path); - return true; -} - -bool game_list_frame::CreateCPUCaches(const game_info& game, bool is_fast_compilation) -{ - return game && CreateCPUCaches(game->info.path, game->info.serial, is_fast_compilation); -} - -bool game_list_frame::RemoveCustomConfiguration(const std::string& serial, const game_info& game, bool is_interactive) -{ - const std::string path = rpcs3::utils::get_custom_config_path(serial); - - if (!ValidateRemoval(serial, path, "custom configuration", is_interactive)) - return true; - - bool result = true; - - if (fs::is_file(path)) - { - if (fs::remove_file(path)) - { - if (game) - { - game->has_custom_config = false; - } - game_list_log.success("Removed configuration file: %s", path); - } - else - { - game_list_log.fatal("Failed to remove configuration file: %s\nError: %s", path, fs::g_tls_error); - result = false; - } - } - - if (is_interactive && !result) - { - QMessageBox::warning(this, tr("Warning!"), tr("Failed to remove configuration file!")); - } - - return result; -} - -bool game_list_frame::RemoveCustomPadConfiguration(const std::string& serial, const game_info& game, bool is_interactive) -{ - const std::string config_dir = rpcs3::utils::get_input_config_dir(serial); - - if (!ValidateRemoval(serial, config_dir, "custom gamepad configuration", false)) // no interation needed here - return true; - - if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), (!Emu.IsStopped(true) && Emu.GetTitleID() == serial) - ? tr("Remove custom gamepad configuration?\nYour configuration will revert to the global pad settings.") - : tr("Remove custom gamepad configuration?")) != QMessageBox::Yes) - return true; - - g_cfg_input_configs.load(); - g_cfg_input_configs.active_configs.erase(serial); - g_cfg_input_configs.save(); - game_list_log.notice("Removed active input configuration entry for key '%s'", serial); - - if (QDir(QString::fromStdString(config_dir)).removeRecursively()) - { - if (game) - { - game->has_custom_pad_config = false; - } - if (!Emu.IsStopped(true) && Emu.GetTitleID() == serial) - { - pad::set_enabled(false); - pad::reset(serial); - pad::set_enabled(true); - } - game_list_log.notice("Removed gamepad configuration directory: %s", config_dir); - return true; - } - - if (is_interactive) - { - QMessageBox::warning(this, tr("Warning!"), tr("Failed to completely remove gamepad configuration directory!")); - game_list_log.fatal("Failed to completely remove gamepad configuration directory: %s\nError: %s", config_dir, fs::g_tls_error); - } - return false; -} - -bool game_list_frame::RemoveShaderCache(const std::string& serial, bool is_interactive) -{ - const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); - - if (!ValidateRemoval(serial, base_dir, "shader cache", is_interactive)) - return true; - - u32 caches_removed = 0; - u32 caches_total = 0; - - const QStringList filter{ QStringLiteral("shaders_cache") }; - const QString q_base_dir = QString::fromStdString(base_dir); - - QDirIterator dir_iter(q_base_dir, filter, QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); - - while (dir_iter.hasNext()) - { - const QString filepath = dir_iter.next(); - - if (QDir(filepath).removeRecursively()) - { - ++caches_removed; - game_list_log.notice("Removed shader cache directory: %s", filepath); - } - else - { - game_list_log.warning("Could not completely remove shader cache directory: %s", filepath); - } - - ++caches_total; - } - - const bool success = caches_total == caches_removed; - - if (success) - game_list_log.success("Removed shader cache in %s", base_dir); - else - game_list_log.fatal("Only %d/%d shader cache directories could be removed in %s", caches_removed, caches_total, base_dir); - - if (QDir(q_base_dir).isEmpty()) - { - if (fs::remove_dir(base_dir)) - game_list_log.notice("Removed empty shader cache directory: %s", base_dir); - else - game_list_log.error("Could not remove empty shader cache directory: '%s' (%s)", base_dir, fs::g_tls_error); - } - - return success; -} - -bool game_list_frame::RemovePPUCache(const std::string& serial, bool is_interactive) -{ - const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); - - if (!ValidateRemoval(serial, base_dir, "PPU cache", is_interactive)) - return true; - - u32 files_removed = 0; - u32 files_total = 0; - - const QStringList filter{ QStringLiteral("v*.obj"), QStringLiteral("v*.obj.gz") }; - const QString q_base_dir = QString::fromStdString(base_dir); - - QDirIterator dir_iter(q_base_dir, filter, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); - - while (dir_iter.hasNext()) - { - const QString filepath = dir_iter.next(); - - if (QFile::remove(filepath)) - { - ++files_removed; - game_list_log.notice("Removed PPU cache file: %s", filepath); - } - else - { - game_list_log.warning("Could not remove PPU cache file: %s", filepath); - } - - ++files_total; - } - - const bool success = files_total == files_removed; - - if (success) - game_list_log.success("Removed PPU cache in %s", base_dir); - else - game_list_log.fatal("Only %d/%d PPU cache files could be removed in %s", files_removed, files_total, base_dir); - - if (QDir(q_base_dir).isEmpty()) - { - if (fs::remove_dir(base_dir)) - game_list_log.notice("Removed empty PPU cache directory: %s", base_dir); - else - game_list_log.error("Could not remove empty PPU cache directory: '%s' (%s)", base_dir, fs::g_tls_error); - } - - return success; -} - -bool game_list_frame::RemoveSPUCache(const std::string& serial, bool is_interactive) -{ - const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); - - if (!ValidateRemoval(serial, base_dir, "SPU cache", is_interactive)) - return true; - - u32 files_removed = 0; - u32 files_total = 0; - - const QStringList filter{ QStringLiteral("spu*.dat"), QStringLiteral("spu*.dat.gz"), QStringLiteral("spu*.obj"), QStringLiteral("spu*.obj.gz") }; - const QString q_base_dir = QString::fromStdString(base_dir); - - QDirIterator dir_iter(q_base_dir, filter, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); - - while (dir_iter.hasNext()) - { - const QString filepath = dir_iter.next(); - - if (QFile::remove(filepath)) - { - ++files_removed; - game_list_log.notice("Removed SPU cache file: %s", filepath); - } - else - { - game_list_log.warning("Could not remove SPU cache file: %s", filepath); - } - - ++files_total; - } - - const bool success = files_total == files_removed; - - if (success) - game_list_log.success("Removed SPU cache in %s", base_dir); - else - game_list_log.fatal("Only %d/%d SPU cache files could be removed in %s", files_removed, files_total, base_dir); - - if (QDir(q_base_dir).isEmpty()) - { - if (fs::remove_dir(base_dir)) - game_list_log.notice("Removed empty SPU cache directory: %s", base_dir); - else - game_list_log.error("Could not remove empty SPU cache directory: '%s' (%s)", base_dir, fs::g_tls_error); - } - - return success; -} - -bool game_list_frame::RemoveHDD1Cache(const std::string& serial, bool is_interactive) -{ - const std::string base_dir = rpcs3::utils::get_hdd1_cache_dir(); - - if (!ValidateRemoval(serial, base_dir, "HDD1 cache", is_interactive)) - return true; - - u32 dirs_removed = 0; - u32 dirs_total = 0; - - const QStringList filter{ QString::fromStdString(serial + "_*") }; - const QString q_base_dir = QString::fromStdString(base_dir); - - QDirIterator dir_iter(q_base_dir, filter, QDir::Dirs | QDir::NoDotAndDotDot); - - while (dir_iter.hasNext()) - { - const QString filepath = dir_iter.next(); - - if (fs::remove_all(filepath.toStdString())) - { - ++dirs_removed; - game_list_log.notice("Removed HDD1 cache directory: %s", filepath); - } - else - { - game_list_log.warning("Could not completely remove HDD1 cache directory: %s", filepath); - } - - ++dirs_total; - } - - const bool success = dirs_removed == dirs_total; - - if (success) - game_list_log.success("Removed HDD1 cache in %s (%s)", base_dir, serial); - else - game_list_log.fatal("Only %d/%d HDD1 cache directories could be removed in %s (%s)", dirs_removed, dirs_total, base_dir, serial); - - return success; -} - -bool game_list_frame::RemoveAllCaches(const std::string& serial, bool is_interactive) -{ - // Just used for confirmation, if requested. Folder returned by fs::get_config_dir() is always present! - if (!ValidateRemoval(serial, fs::get_config_dir(), "all caches", is_interactive)) - return true; - - const std::string base_dir = rpcs3::utils::get_cache_dir_by_serial(serial); - - if (!ValidateRemoval(serial, base_dir, "main cache", false)) // no interation needed here - return true; - - bool success = false; - - if (fs::remove_all(base_dir)) - { - success = true; - game_list_log.success("Removed main cache in %s", base_dir); - - } - else - { - game_list_log.fatal("Could not completely remove main cache in %s (%s)", base_dir, serial); - } - - success |= RemoveHDD1Cache(serial); - - return success; -} - -bool game_list_frame::RemoveContentList(const std::string& serial, bool is_interactive) -{ - // Just used for confirmation, if requested. Folder returned by fs::get_config_dir() is always present! - if (!ValidateRemoval(serial, fs::get_config_dir(), "selected content", is_interactive)) - { - if (m_content_info.clear_on_finish) - ClearContentList(); // Clear only the content's info - - return true; - } - - u16 content_types = m_content_info.content_types; - - // Remove data path in "dev_hdd0/game" folder (if any) - if (content_types & DATA) - { - if (const auto it = m_content_info.path_list.find(serial); it != m_content_info.path_list.cend()) - { - if (RemoveContentPathList(it->second, "data") != it->second.size()) - { - if (m_content_info.clear_on_finish) - ClearContentList(); // Clear only the content's info - - // Skip the removal of the remaining selected contents in case some data paths could not be removed - return false; - } - } - } - - // Add serial (title id) to the list of serials to be removed in "games.yml" file (if any) - if (content_types & DISC) - { - if (const auto it = m_content_info.disc_list.find(serial); it != m_content_info.disc_list.cend()) - m_content_info.removed_disc_list.insert(serial); - } - - // Remove lock file in "dev_hdd0/game/$locks" folder (if any) - if (content_types & LOCKS) - { - if (ValidateRemoval(serial, rpcs3::utils::get_hdd0_locks_dir(), "lock")) - RemoveContentBySerial(rpcs3::utils::get_hdd0_locks_dir(), serial, "lock"); - } - - // Remove caches in "cache" and "dev_hdd1/caches" folders (if any) - if (content_types & CACHES) - { - if (ValidateRemoval(serial, rpcs3::utils::get_cache_dir_by_serial(serial), "all caches")) - RemoveAllCaches(serial); - } - - // Remove custom configs in "config/custom_config" folder (if any) - if (content_types & CUSTOM_CONFIG) - { - if (ValidateRemoval(serial, rpcs3::utils::get_custom_config_path(serial), "custom configuration")) - RemoveCustomConfiguration(serial); - - if (ValidateRemoval(serial, rpcs3::utils::get_input_config_dir(serial), "custom gamepad configuration")) - RemoveCustomPadConfiguration(serial); - } - - // Remove icons in "Icons/game_icons" folder (if any) - if (content_types & ICONS) - { - if (ValidateRemoval(serial, rpcs3::utils::get_icons_dir(serial), "icons")) - RemoveContentBySerial(rpcs3::utils::get_icons_dir(), serial, "icons"); - } - - // Remove shortcuts in "games/shortcuts" folder and from desktop / start menu (if any) - if (content_types & SHORTCUTS) - { - if (const auto it = m_content_info.name_list.find(serial); it != m_content_info.name_list.cend()) - { - const bool remove_rpcs3_links = ValidateRemoval(serial, rpcs3::utils::get_games_shortcuts_dir(), "link"); - - for (const auto& name : it->second) - { - // Remove illegal characters from name to match the link name created by gui::utils::create_shortcut() - const std::string simple_name = QString::fromStdString(vfs::escape(name, true)).simplified().toStdString(); - - // Remove rpcs3 shortcuts - if (remove_rpcs3_links) - RemoveContentBySerial(rpcs3::utils::get_games_shortcuts_dir(), simple_name + ".lnk", "link"); - - // TODO: Remove shortcuts from desktop/start menu - } - } - } - - if (content_types & SAVESTATES) - { - if (ValidateRemoval(serial, rpcs3::utils::get_savestates_dir(serial), "savestates")) - RemoveContentBySerial(rpcs3::utils::get_savestates_dir(), serial, "savestates"); - } - - if (content_types & CAPTURES) - { - if (ValidateRemoval(serial, rpcs3::utils::get_captures_dir(), "captures")) - RemoveContentBySerial(rpcs3::utils::get_captures_dir(), serial, "captures"); - } - - if (content_types & RECORDINGS) - { - if (ValidateRemoval(serial, rpcs3::utils::get_recordings_dir(serial), "recordings")) - RemoveContentBySerial(rpcs3::utils::get_recordings_dir(), serial, "recordings"); - } - - if (content_types & SCREENSHOTS) - { - if (ValidateRemoval(serial, rpcs3::utils::get_screenshots_dir(serial), "screenshots")) - RemoveContentBySerial(rpcs3::utils::get_screenshots_dir(), serial, "screenshots"); - } - - if (m_content_info.clear_on_finish) - ClearContentList(true); // Update the game list and clear the content's info once removed - - return true; -} - -void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, - QString progressLabel, std::function action, - std::function cancel_log, std::function action_on_finish, bool refresh_on_finish, - bool can_be_concurrent, std::function should_wait_cb) -{ - // Concurrent tasks should not wait (at least not in current implementation) - ensure(!should_wait_cb || !can_be_concurrent); - - g_system_progress_canceled = false; - - const std::shared_ptr> iterate_over_serial = std::make_shared>(); - - const std::shared_ptr> index = std::make_shared>(0); - - const int serials_size = ::narrow(serials.size()); - - *iterate_over_serial = [=, this, index_ptr = index](int index) - { - if (index == serials_size) - { - return false; - } - - const std::string& serial = *std::next(serials.begin(), index); - - if (pdlg->wasCanceled() || g_system_progress_canceled.exchange(false)) - { - if (cancel_log) - { - cancel_log(index, serials_size); - } - return false; - } - - if (action(serial)) - { - const int done = index_ptr->load(); - pdlg->setLabelText(progressLabel.arg(done + 1).arg(serials_size)); - pdlg->SetValue(done + 1); - } - - (*index_ptr)++; - return true; - }; - - if (can_be_concurrent) - { - // Unused currently - - QList indices; - - for (int i = 0; i < serials_size; i++) - { - indices.append(i); - } - - QFutureWatcher* future_watcher = new QFutureWatcher(this); - - future_watcher->setFuture(QtConcurrent::map(std::move(indices), *iterate_over_serial)); - - connect(future_watcher, &QFutureWatcher::finished, this, [=, this]() - { - pdlg->setLabelText(progressLabel.arg(index->load()).arg(serials_size)); - pdlg->setCancelButtonText(tr("OK")); - QApplication::beep(); - - if (action_on_finish) - { - action_on_finish(); - } - - if (refresh_on_finish && index) - { - Refresh(true); - } - - future_watcher->deleteLater(); - }); - - return; - } - - const std::shared_ptr> periodic_func = std::make_shared>(); - - *periodic_func = [=, this]() - { - if (should_wait_cb && should_wait_cb()) - { - // Conditions are not met for execution - // Check again later - QTimer::singleShot(5, this, *periodic_func); - return; - } - - if ((*iterate_over_serial)(*index)) - { - QTimer::singleShot(1, this, *periodic_func); - return; - } - - pdlg->setLabelText(progressLabel.arg(index->load()).arg(serials_size)); - pdlg->setCancelButtonText(tr("OK")); - connect(pdlg, &progress_dialog::canceled, this, [pdlg](){ pdlg->deleteLater(); }); - QApplication::beep(); - - if (action_on_finish) - { - action_on_finish(); - } - - // Signal termination back to the callback - action(""); - - if (refresh_on_finish && index) - { - Refresh(true); - } - }; - - // Invoked on the next event loop processing iteration - QTimer::singleShot(1, this, *periodic_func); -} - -void game_list_frame::BatchCreateCPUCaches(const std::vector& games, bool is_fast_compilation, bool is_interactive) -{ - if (is_interactive && QMessageBox::question(this, tr("Confirm Creation"), tr("Create LLVM cache?")) != QMessageBox::Yes) - { - return; - } - - std::set serials; - - if (games.empty()) - { - serials.emplace("vsh.self"); - } - - for (const auto& game : (games.empty() ? m_game_data : games)) - { - serials.emplace(game->info.serial); - } - - const usz total = serials.size(); - - if (total == 0) - { - QMessageBox::information(this, tr("LLVM Cache Batch Creation"), tr("No titles found"), QMessageBox::Ok); - return; - } - - if (!m_gui_settings->GetBootConfirmation(this)) - { - return; - } - - const QString main_label = tr("Creating all LLVM caches"); - - progress_dialog* pdlg = new progress_dialog(tr("LLVM Cache Batch Creation"), main_label, tr("Cancel"), 0, ::narrow(total), false, this); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - connect(pdlg, &progress_dialog::canceled, this, []() - { - if (!Emu.IsStopped()) - { - Emu.GracefulShutdown(false, true); - } - }); - - BatchActionBySerials(pdlg, serials, tr("%0\nProgress: %1/%2 caches compiled").arg(main_label), - [&, games](const std::string& serial) - { - if (serial.empty()) - { - return false; - } - - if (Emu.IsStopped(true)) - { - const auto it = std::find_if(m_game_data.begin(), m_game_data.end(), FN(x->info.serial == serial)); - - if (it != m_game_data.end()) - { - return CreateCPUCaches((*it)->info.path, serial, is_fast_compilation); - } - } - - return false; - }, - [this](u32, u32) - { - game_list_log.notice("LLVM Cache Batch Creation was canceled"); - }, nullptr, false, false, - []() - { - return !Emu.IsStopped(true); - }); -} - -void game_list_frame::BatchRemovePPUCaches(const std::vector& games, bool is_interactive) -{ - if (!ValidateBatchRemoval("PPU cache", is_interactive)) - { - return; - } - - std::set serials; - - if (games.empty()) - { - serials.emplace("vsh.self"); - } - - for (const auto& game : (games.empty() ? m_game_data : games)) - { - serials.emplace(game->info.serial); - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(this, tr("PPU Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("PPU Cache Batch Removal"), tr("Removing all PPU caches"), tr("Cancel"), 0, total, false, this); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 PPU caches cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemovePPUCache(serial); - }, - [this](u32 removed, u32 total) - { - game_list_log.notice("PPU Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); - }, nullptr, false); -} - -void game_list_frame::BatchRemoveSPUCaches(const std::vector& games, bool is_interactive) -{ - if (!ValidateBatchRemoval("SPU cache", is_interactive)) - { - return; - } - - std::set serials; - - if (games.empty()) - { - serials.emplace("vsh.self"); - } - - for (const auto& game : (games.empty() ? m_game_data : games)) - { - serials.emplace(game->info.serial); - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(this, tr("SPU Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("SPU Cache Batch Removal"), tr("Removing all SPU caches"), tr("Cancel"), 0, total, false, this); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 SPU caches cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveSPUCache(serial); - }, - [this](u32 removed, u32 total) - { - game_list_log.notice("SPU Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); - }, nullptr, false); -} - -void game_list_frame::BatchRemoveHDD1Caches(const std::vector& games, bool is_interactive) -{ - if (!ValidateBatchRemoval("HDD1 cache", is_interactive)) - { - return; - } - - std::set serials; - - if (games.empty()) - { - serials.emplace("vsh.self"); - } - - for (const auto& game : (games.empty() ? m_game_data : games)) - { - serials.emplace(game->info.serial); - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(this, tr("HDD1 Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("HDD1 Cache Batch Removal"), tr("Removing all HDD1 caches"), tr("Cancel"), 0, total, false, this); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 HDD1 caches cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveHDD1Cache(serial); - }, - [this](u32 removed, u32 total) - { - game_list_log.notice("HDD1 Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); - }, nullptr, false); -} - -void game_list_frame::BatchRemoveAllCaches(const std::vector& games, bool is_interactive) -{ - if (!ValidateBatchRemoval("all caches", is_interactive)) - { - return; - } - - std::set serials; - - if (games.empty()) - { - serials.emplace("vsh.self"); - } - - for (const auto& game : (games.empty() ? m_game_data : games)) - { - serials.emplace(game->info.serial); - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(this, tr("Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("Cache Batch Removal"), tr("Removing all caches"), tr("Cancel"), 0, total, false, this); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 caches cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveAllCaches(serial); - }, - [this](u32 removed, u32 total) - { - game_list_log.notice("Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); - }, nullptr, false); -} - -void game_list_frame::BatchRemoveContentLists(const std::vector& games, bool is_interactive) -{ - // Let the batch process (not RemoveContentList()) make cleanup when terminated - m_content_info.clear_on_finish = false; - - if (!ValidateBatchRemoval("selected content", is_interactive)) - { - ClearContentList(); // Clear only the content's info - return; - } - - std::set serials; - - if (games.empty()) - { - serials.emplace("vsh.self"); - } - - for (const auto& game : (games.empty() ? m_game_data : games)) - { - serials.emplace(game->info.serial); - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(this, tr("Content Batch Removal"), tr("No files found"), QMessageBox::Ok); - - ClearContentList(); // Clear only the content's info - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("Content Batch Removal"), tr("Removing all contents"), tr("Cancel"), 0, total, false, this); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 contents cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveContentList(serial); - }, - [this](u32 removed, u32 total) - { - game_list_log.notice("Content Batch Removal was canceled. %d/%d contents cleared", removed, total); - }, - [this]() // Make cleanup when batch process terminated - { - ClearContentList(true); // Update the game list and clear the content's info once removed - }, false); -} - -void game_list_frame::BatchRemoveCustomConfigurations(const std::vector& games, bool is_interactive) -{ - if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), tr("Remove custom configuration?")) != QMessageBox::Yes) - { - return; - } - - std::set serials; - - for (const auto& game : (games.empty() ? m_game_data : games)) - { - if (game->has_custom_config && !serials.count(game->info.serial)) - { - serials.emplace(game->info.serial); - } - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(this, tr("Custom Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("Custom Configuration Batch Removal"), tr("Removing all custom configurations"), tr("Cancel"), 0, total, false, this); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 custom configurations cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveCustomConfiguration(serial); - }, - [this](u32 removed, u32 total) - { - game_list_log.notice("Custom Configuration Batch Removal was canceled. %d/%d custom configurations cleared", removed, total); - }, nullptr, true); -} - -void game_list_frame::BatchRemoveCustomPadConfigurations(const std::vector& games, bool is_interactive) -{ - if (is_interactive && QMessageBox::question(this, tr("Confirm Removal"), tr("Remove custom gamepad configuration?")) != QMessageBox::Yes) - { - return; - } - - std::set serials; - - for (const auto& game : (games.empty() ? m_game_data : games)) - { - if (game->has_custom_pad_config && !serials.count(game->info.serial)) - { - serials.emplace(game->info.serial); - } - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(this, tr("Custom Gamepad Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("Custom Gamepad Configuration Batch Removal"), tr("Removing all custom gamepad configurations"), tr("Cancel"), 0, total, false, this); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 custom gamepad configurations cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveCustomPadConfiguration(serial); - }, - [this](u32 removed, u32 total) - { - game_list_log.notice("Custom Gamepad Configuration Batch Removal was canceled. %d/%d custom gamepad configurations cleared", removed, total); - }, nullptr, true); -} - -void game_list_frame::BatchRemoveShaderCaches(const std::vector& games, bool is_interactive) -{ - if (!ValidateBatchRemoval("shader cache", is_interactive)) - { - return; - } - - std::set serials; - - if (games.empty()) - { - serials.emplace("vsh.self"); - } - - for (const auto& game : (games.empty() ? m_game_data : games)) - { - serials.emplace(game->info.serial); - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(this, tr("Shader Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("Shader Cache Batch Removal"), tr("Removing all shader caches"), tr("Cancel"), 0, total, false, this); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 shader caches cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveShaderCache(serial); - }, - [this](u32 removed, u32 total) - { - game_list_log.notice("Shader Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); - }, nullptr, false); -} - void game_list_frame::ShowCustomConfigIcon(const game_info& game) { if (!game) @@ -3798,11 +1362,6 @@ void game_list_frame::SetPlayHoverGifs(bool play) } } -const std::vector& game_list_frame::GetGameInfo() const -{ - return m_game_data; -} - void game_list_frame::WaitAndAbortRepaintThreads() { for (const game_info& game : m_game_data) diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index 5de72360e3..332383dae5 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -1,20 +1,18 @@ #pragma once #include "game_list.h" +#include "game_list_actions.h" #include "custom_dock_widget.h" -#include "shortcut_utils.h" #include "Utilities/lockless.h" #include "Utilities/mutex.h" #include "util/auto_typemap.hpp" #include "Emu/config_mode.h" #include -#include #include #include #include #include -#include #include #include @@ -56,61 +54,34 @@ public: void SetShowHidden(bool show); game_compatibility* GetGameCompatibility() const { return m_game_compat; } - - const std::vector& GetGameInfo() const; - - void CreateShortcuts(const std::vector& games, const std::set& locations); + const std::vector& GetGameInfo() const { return m_game_data; } + std::shared_ptr actions() const { return m_game_list_actions; } + std::shared_ptr get_gui_settings() const { return m_gui_settings; } + std::shared_ptr get_emu_settings() const { return m_emu_settings; } + std::shared_ptr get_persistent_settings() const { return m_persistent_settings; } + std::map& notes() { return m_notes; } + std::map& titles() { return m_titles; } + QSet& hidden_list() { return m_hidden_list; } bool IsEntryVisible(const game_info& game, bool search_fallback = false) const; - enum content_type - { - NO_CONTENT = 0, - DISC = (1 << 0), - DATA = (1 << 1), - LOCKS = (1 << 2), - CACHES = (1 << 3), - CUSTOM_CONFIG = (1 << 4), - ICONS = (1 << 5), - SHORTCUTS = (1 << 6), - SAVESTATES = (1 << 7), - CAPTURES = (1 << 8), - RECORDINGS = (1 << 9), - SCREENSHOTS = (1 << 10) - }; + void ShowCustomConfigIcon(const game_info& game); - struct content_info + // Enqueue slot for refreshed signal + // Allowing for an individual container for each distinct use case (currently disabled and contains only one such entry) + template + void AddRefreshedSlot(Func&& func) { - u16 content_types = NO_CONTENT; // Always set by SetContentList() - bool clear_on_finish = true; // Always overridden by BatchRemoveContentLists() + // NOTE: Remove assert when the need for individual containers arises + static_assert(std::is_void_v); - bool is_single_selection = false; - u16 in_games_dir_count = 0; - QString info; - std::map> name_list; - std::map> path_list; - std::set disc_list; - std::set removed_disc_list; // Filled in by RemoveContentList() - }; + connect(this, &game_list_frame::Refreshed, this, [this, func = std::move(func)]() mutable + { + func(m_refresh_funcs_manage_type->get>().m_done_paths); + }, Qt::SingleShotConnection); + } public Q_SLOTS: - void BatchCreateCPUCaches(const std::vector& games = {}, bool is_fast_compilation = false, bool is_interactive = false); - void BatchRemoveCustomConfigurations(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveCustomPadConfigurations(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveShaderCaches(const std::vector& games = {}, bool is_interactive = false); - void BatchRemovePPUCaches(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveSPUCaches(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveHDD1Caches(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveAllCaches(const std::vector& games = {}, bool is_interactive = false); - - // NOTES: - // - SetContentList() MUST always be called to set the content's info to be removed by: - // - RemoveContentList() - // - BatchRemoveContentLists() - // - void SetContentList(u16 content_types, const content_info& content_info); - void BatchRemoveContentLists(const std::vector& games = {}, bool is_interactive = false); - void SetListMode(bool is_list); void SetSearchText(const QString& text); void SetShowCompatibilityInGrid(bool show); @@ -128,6 +99,7 @@ private Q_SLOTS: void doubleClickedSlot(QTableWidgetItem* item); void doubleClickedSlot(const game_info& game); void ItemSelectionChangedSlot(); + Q_SIGNALS: void GameListFrameClosed(); void NotifyGameSelection(const game_info& game); @@ -138,7 +110,12 @@ Q_SIGNALS: void Refreshed(); void RequestSaveStateManager(const game_info& game); -public: +protected: + /** Override inherited method from Qt to allow signalling when close happened.*/ + void closeEvent(QCloseEvent* event) override; + bool eventFilter(QObject *object, QEvent *event) override; + +private: template struct GameIdsTable { @@ -146,76 +123,13 @@ public: std::set m_done_paths; }; - // Enqueue slot for refreshed signal - // Allowing for an individual container for each distinct use case (currently disabled and contains only one such entry) - template - void AddRefreshedSlot(Func&& func) - { - // NOTE: Remove assert when the need for individual containers arises - static_assert(std::is_void_v); - - connect(this, &game_list_frame::Refreshed, this, [this, func = std::move(func)]() mutable - { - func(m_refresh_funcs_manage_type->get>().m_done_paths); - }, Qt::SingleShotConnection); - } - -protected: - /** Override inherited method from Qt to allow signalling when close happened.*/ - void closeEvent(QCloseEvent* event) override; - bool eventFilter(QObject *object, QEvent *event) override; -private: void push_path(const std::string& path, std::vector& legit_paths); QString get_header_text(int col) const; QString get_action_text(int col) const; - void ShowCustomConfigIcon(const game_info& game); bool SearchMatchesApp(const QString& name, const QString& serial, bool fallback = false) const; - void ShowSingleSelectionContextMenu(const game_info& gameinfo, QPoint& global_pos); - void ShowMultiSelectionContextMenu(const std::vector& games, QPoint& global_pos); - - // NOTE: - // m_content_info is used by: - // - SetContentList() - // - ClearContentList() - // - GetContentInfo() - // - RemoveContentList() - // - BatchRemoveContentLists() - // - content_info m_content_info; - - void ClearContentList(bool refresh = false); - content_info GetContentInfo(const std::vector& games); - - void ShowRemoveGameDialog(const std::vector& games); - void ShowGameInfoDialog(const std::vector& games); - - static bool IsGameRunning(const std::string& serial); - bool ValidateRemoval(const std::string& serial, const std::string& path, const std::string& desc, bool is_interactive = false); - bool ValidateBatchRemoval(const std::string& desc, bool is_interactive = false); - - static bool CreateCPUCaches(const std::string& path, const std::string& serial = {}, bool is_fast_compilation = false); - static bool CreateCPUCaches(const game_info& game, bool is_fast_compilation = false); - bool RemoveCustomConfiguration(const std::string& serial, const game_info& game = nullptr, bool is_interactive = false); - bool RemoveCustomPadConfiguration(const std::string& serial, const game_info& game = nullptr, bool is_interactive = false); - bool RemoveShaderCache(const std::string& serial, bool is_interactive = false); - bool RemovePPUCache(const std::string& serial, bool is_interactive = false); - bool RemoveSPUCache(const std::string& serial, bool is_interactive = false); - bool RemoveHDD1Cache(const std::string& serial, bool is_interactive = false); - bool RemoveAllCaches(const std::string& serial, bool is_interactive = false); - bool RemoveContentList(const std::string& serial, bool is_interactive = false); - - static bool RemoveContentPath(const std::string& path, const std::string& desc); - static u32 RemoveContentPathList(const std::set& path_list, const std::string& desc); - static bool RemoveContentBySerial(const std::string& base_dir, const std::string& serial, const std::string& desc); - - void BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, - QString progressLabel, std::function action, - std::function cancel_log, std::function action_on_finish, bool refresh_on_finish, - bool can_be_concurrent = false, std::function should_wait_cb = {}); - std::string CurrentSelectionPath(); game_info GetGameInfoByMode(const QTableWidgetItem* item) const; @@ -224,6 +138,8 @@ private: void WaitAndAbortRepaintThreads(); void WaitAndAbortSizeCalcThreads(); + std::shared_ptr m_game_list_actions; + // Which widget we are displaying depends on if we are in grid or list mode. QMainWindow* m_game_dock = nullptr; QStackedWidget* m_central_widget = nullptr; diff --git a/rpcs3/rpcs3qt/game_list_grid.cpp b/rpcs3/rpcs3qt/game_list_grid.cpp index ca7b07bb0f..0fc48c412e 100644 --- a/rpcs3/rpcs3qt/game_list_grid.cpp +++ b/rpcs3/rpcs3qt/game_list_grid.cpp @@ -3,10 +3,8 @@ #include "game_list_grid_item.h" #include "gui_settings.h" #include "qt_utils.h" -#include "Utilities/File.h" #include -#include game_list_grid::game_list_grid() : flow_widget(nullptr), game_list_base() diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 6132e237f8..485f7e3f22 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -2401,7 +2401,7 @@ void main_window::CreateShortCuts(const std::map& paths, b if (!game_data_shortcuts.empty() && !locations.empty()) { - m_game_list_frame->CreateShortcuts(game_data_shortcuts, locations); + m_game_list_frame->actions()->CreateShortcuts(game_data_shortcuts, locations); } } } @@ -2428,7 +2428,7 @@ void main_window::PrecompileCachesFromInstalledPackages(const std::mapBatchCreateCPUCaches(game_data, true); + m_game_list_frame->actions()->BatchCreateCPUCaches(game_data, true); } } @@ -2724,40 +2724,40 @@ void main_window::CreateConnects() connect(ui->batchCreateCPUCachesAct, &QAction::triggered, this, [this]() { - m_game_list_frame->BatchCreateCPUCaches({}, false, true); + m_game_list_frame->actions()->BatchCreateCPUCaches({}, false, true); }); connect(ui->batchRemoveCustomConfigurationsAct, &QAction::triggered, this, [this]() { - m_game_list_frame->BatchRemoveCustomConfigurations({}, true); + m_game_list_frame->actions()->BatchRemoveCustomConfigurations({}, true); }); connect(ui->batchRemoveCustomPadConfigurationsAct, &QAction::triggered, this, [this]() { - m_game_list_frame->BatchRemoveCustomPadConfigurations({}, true); + m_game_list_frame->actions()->BatchRemoveCustomPadConfigurations({}, true); }); connect(ui->batchRemoveShaderCachesAct, &QAction::triggered, this, [this]() { - m_game_list_frame->BatchRemoveShaderCaches({}, true); + m_game_list_frame->actions()->BatchRemoveShaderCaches({}, true); }); connect(ui->batchRemovePPUCachesAct, &QAction::triggered, this, [this]() { - m_game_list_frame->BatchRemovePPUCaches({}, true); + m_game_list_frame->actions()->BatchRemovePPUCaches({}, true); }); connect(ui->batchRemoveSPUCachesAct, &QAction::triggered, this, [this]() { - m_game_list_frame->BatchRemoveSPUCaches({}, true); + m_game_list_frame->actions()->BatchRemoveSPUCaches({}, true); }); connect(ui->removeHDD1CachesAct, &QAction::triggered, this, [this]() { - m_game_list_frame->BatchRemoveHDD1Caches({}, true); + m_game_list_frame->actions()->BatchRemoveHDD1Caches({}, true); }); connect(ui->removeAllCachesAct, &QAction::triggered, this, [this]() { - m_game_list_frame->BatchRemoveAllCaches({}, true); + m_game_list_frame->actions()->BatchRemoveAllCaches({}, true); }); connect(ui->removeSavestatesAct, &QAction::triggered, this, [this]() { - m_game_list_frame->SetContentList(game_list_frame::content_type::SAVESTATES, {}); - m_game_list_frame->BatchRemoveContentLists({}, true); + m_game_list_frame->actions()->SetContentList(game_list_actions::content_type::SAVESTATES, {}); + m_game_list_frame->actions()->BatchRemoveContentLists({}, true); }); connect(ui->cleanUpGameListAct, &QAction::triggered, this, &main_window::CleanUpGameList); From 90df8baa5f296120b1fa02bda6df2f3e33cbc72d Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 6 Jan 2026 15:48:44 +0100 Subject: [PATCH 072/630] Qt: Fix game list multi-selection after Refresh --- rpcs3/rpcs3qt/game_list_base.h | 2 +- rpcs3/rpcs3qt/game_list_context_menu.cpp | 2 +- rpcs3/rpcs3qt/game_list_frame.cpp | 33 ++++++++++++------------ rpcs3/rpcs3qt/game_list_frame.h | 2 +- rpcs3/rpcs3qt/game_list_grid.cpp | 4 +-- rpcs3/rpcs3qt/game_list_grid.h | 2 +- rpcs3/rpcs3qt/game_list_table.cpp | 13 ++++++---- rpcs3/rpcs3qt/game_list_table.h | 2 +- 8 files changed, 31 insertions(+), 29 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_base.h b/rpcs3/rpcs3qt/game_list_base.h index 6d25aad3b3..2af79b0b01 100644 --- a/rpcs3/rpcs3qt/game_list_base.h +++ b/rpcs3/rpcs3qt/game_list_base.h @@ -15,7 +15,7 @@ public: [[maybe_unused]] const std::vector& game_data, [[maybe_unused]] const std::map& notes_map, [[maybe_unused]] const std::map& title_map, - [[maybe_unused]] const std::string& selected_item_id, + [[maybe_unused]] const std::set& selected_item_ids, [[maybe_unused]] bool play_hover_movies){}; void set_icon_size(QSize size) { m_icon_size = std::move(size); } diff --git a/rpcs3/rpcs3qt/game_list_context_menu.cpp b/rpcs3/rpcs3qt/game_list_context_menu.cpp index a04f5b0128..bb15bc80ec 100644 --- a/rpcs3/rpcs3qt/game_list_context_menu.cpp +++ b/rpcs3/rpcs3qt/game_list_context_menu.cpp @@ -581,7 +581,7 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& Q_EMIT m_game_list_frame->RequestBoot(gameinfo, cfg_mode::global); }); - const auto configure_l = [this, current_game, gameinfo](bool create_cfg_from_global_cfg) + auto configure_l = [this, current_game, gameinfo](bool create_cfg_from_global_cfg) { settings_dialog dlg(m_gui_settings, m_emu_settings, 0, m_game_list_frame, ¤t_game, create_cfg_from_global_cfg); diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 6910012fc3..f8b48e8508 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -446,7 +446,7 @@ void game_list_frame::Refresh(const bool from_drive, const std::vector selected_items = CurrentSelectionPaths(); // Release old data for (const auto& game : m_game_data) @@ -481,7 +481,7 @@ void game_list_frame::Refresh(const bool from_drive, const std::vectorclear_list(); const int scroll_position = m_game_list->verticalScrollBar()->value(); - m_game_list->populate(matching_apps, m_notes, m_titles, selected_item, m_play_hover_movies); + m_game_list->populate(matching_apps, m_notes, m_titles, selected_items, m_play_hover_movies); m_game_list->sort(m_game_data.size(), m_sort_column, m_col_sort_order); RepaintIcons(); @@ -497,7 +497,7 @@ void game_list_frame::Refresh(const bool from_drive, const std::vectorclear_list(); - m_game_grid->populate(matching_apps, m_notes, m_titles, selected_item, m_play_hover_movies); + m_game_grid->populate(matching_apps, m_notes, m_titles, selected_items, m_play_hover_movies); RepaintIcons(); } } @@ -1257,38 +1257,37 @@ bool game_list_frame::SearchMatchesApp(const QString& name, const QString& seria return true; } -std::string game_list_frame::CurrentSelectionPath() +std::set game_list_frame::CurrentSelectionPaths() { - std::string selection; - - game_info game{}; + std::set selection; if (m_old_layout_is_list) { - if (!m_game_list->selectedItems().isEmpty()) + for (const QTableWidgetItem* selected_item : m_game_list->selectedItems()) { - if (QTableWidgetItem* item = m_game_list->item(m_game_list->currentRow(), 0)) + if (const QTableWidgetItem* item = m_game_list->item(selected_item->row(), 0)) { if (const QVariant var = item->data(gui::game_role); var.canConvert()) { - game = var.value(); + if (const game_info game = var.value()) + { + selection.insert(game->info.path + game->info.icon_path); + } } } } } else if (m_game_grid) { - if (game_list_grid_item* item = static_cast(m_game_grid->selected_item())) + if (const game_list_grid_item* item = static_cast(m_game_grid->selected_item())) { - game = item->game(); + if (const game_info& game = item->game()) + { + selection.insert(game->info.path + game->info.icon_path); + } } } - if (game) - { - selection = game->info.path + game->info.icon_path; - } - m_old_layout_is_list = m_is_list_layout; return selection; diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index 332383dae5..b8148630f9 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -130,7 +130,7 @@ private: bool SearchMatchesApp(const QString& name, const QString& serial, bool fallback = false) const; - std::string CurrentSelectionPath(); + std::set CurrentSelectionPaths(); game_info GetGameInfoByMode(const QTableWidgetItem* item) const; static game_info GetGameInfoFromItem(const QTableWidgetItem* item); diff --git a/rpcs3/rpcs3qt/game_list_grid.cpp b/rpcs3/rpcs3qt/game_list_grid.cpp index 0fc48c412e..e60a832569 100644 --- a/rpcs3/rpcs3qt/game_list_grid.cpp +++ b/rpcs3/rpcs3qt/game_list_grid.cpp @@ -40,7 +40,7 @@ void game_list_grid::populate( const std::vector& game_data, const std::map& notes_map, const std::map& title_map, - const std::string& selected_item_id, + const std::set& selected_item_ids, bool play_hover_movies) { clear_list(); @@ -110,7 +110,7 @@ void game_list_grid::populate( item->set_video_path(game->info.movie_path); } - if (selected_item_id == game->info.path + game->info.icon_path) + if (selected_item_ids.contains(game->info.path + game->info.icon_path)) { selected_item = item; } diff --git a/rpcs3/rpcs3qt/game_list_grid.h b/rpcs3/rpcs3qt/game_list_grid.h index 6116ff1d8c..e9e5890e81 100644 --- a/rpcs3/rpcs3qt/game_list_grid.h +++ b/rpcs3/rpcs3qt/game_list_grid.h @@ -18,7 +18,7 @@ public: const std::vector& game_data, const std::map& notes_map, const std::map& title_map, - const std::string& selected_item_id, + const std::set& selected_item_ids, bool play_hover_movies) override; void repaint_icons(std::vector& game_data, const QColor& icon_color, const QSize& icon_size, qreal device_pixel_ratio) override; diff --git a/rpcs3/rpcs3qt/game_list_table.cpp b/rpcs3/rpcs3qt/game_list_table.cpp index 3d010c7689..c3069ef67e 100644 --- a/rpcs3/rpcs3qt/game_list_table.cpp +++ b/rpcs3/rpcs3qt/game_list_table.cpp @@ -204,7 +204,7 @@ void game_list_table::populate( const std::vector& game_data, const std::map& notes_map, const std::map& title_map, - const std::string& selected_item_id, + const std::set& selected_item_ids, bool play_hover_movies) { clear_list(); @@ -219,7 +219,7 @@ void game_list_table::populate( int row = 0; int index = -1; - int selected_row = -1; + std::set selected_rows; const auto get_title = [&title_map](const QString& serial, const std::string& name) -> QString { @@ -378,15 +378,18 @@ void game_list_table::populate( setItem(row, static_cast(gui::game_list_columns::compat), compat_item); setItem(row, static_cast(gui::game_list_columns::dir_size), new custom_table_widget_item(game_size != umax ? gui::utils::format_byte_size(game_size) : tr("Unknown"), Qt::UserRole, QVariant::fromValue(game_size))); - if (selected_item_id == game->info.path + game->info.icon_path) + if (selected_item_ids.contains(game->info.path + game->info.icon_path)) { - selected_row = row; + selected_rows.insert(row); } row++; } - selectRow(selected_row); + for (int selected_row : selected_rows) + { + selectionModel()->select(model()->index(selected_row, 0), QItemSelectionModel::Select | QItemSelectionModel::Rows); + } } void game_list_table::repaint_icons(std::vector& game_data, const QColor& icon_color, const QSize& icon_size, qreal device_pixel_ratio) diff --git a/rpcs3/rpcs3qt/game_list_table.h b/rpcs3/rpcs3qt/game_list_table.h index 4c185fcc61..ac9bff64e5 100644 --- a/rpcs3/rpcs3qt/game_list_table.h +++ b/rpcs3/rpcs3qt/game_list_table.h @@ -28,7 +28,7 @@ public: const std::vector& game_data, const std::map& notes_map, const std::map& title_map, - const std::string& selected_item_id, + const std::set& selected_item_ids, bool play_hover_movies) override; void repaint_icons(std::vector& game_data, const QColor& icon_color, const QSize& icon_size, qreal device_pixel_ratio) override; From 27033ee0cb55197fdaa5bc580f0fc7796d6a540c Mon Sep 17 00:00:00 2001 From: Antonino Di Guardo <64427768+digant73@users.noreply.github.com> Date: Wed, 7 Jan 2026 08:22:40 +0100 Subject: [PATCH 073/630] move disk usage dialog box to game list's context menu (#17977) --- rpcs3/rpcs3qt/game_list_actions.cpp | 287 +++++++++++++---------- rpcs3/rpcs3qt/game_list_actions.h | 24 +- rpcs3/rpcs3qt/game_list_context_menu.cpp | 44 +++- rpcs3/rpcs3qt/log_frame.cpp | 50 ---- rpcs3/rpcs3qt/log_frame.h | 4 - 5 files changed, 207 insertions(+), 202 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp index 3e8a57d703..8e53a94df1 100644 --- a/rpcs3/rpcs3qt/game_list_actions.cpp +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -25,6 +25,7 @@ #include LOG_CHANNEL(game_list_log, "GameList"); +LOG_CHANNEL(sys_log, "SYS"); extern atomic_t g_system_progress_canceled; @@ -340,7 +341,7 @@ void game_list_actions::ShowRemoveGameDialog(const std::vector& games if (content_info.is_single_selection) // Single selection { - if (!RemoveContentList(games[0]->info.serial, true)) + if (!RemoveContentList(games[0]->info.serial)) { QMessageBox::critical(m_game_list_frame, tr("Failure!"), caches->isChecked() ? tr("Failed to remove %0 from drive!\nCaches and custom configs have been left intact.").arg(QString::fromStdString(games[0]->info.name)) @@ -351,7 +352,7 @@ void game_list_actions::ShowRemoveGameDialog(const std::vector& games } else // Multi selection { - BatchRemoveContentLists(games, true); + BatchRemoveContentLists(games); } } @@ -363,6 +364,41 @@ void game_list_actions::ShowGameInfoDialog(const std::vector& games) QMessageBox::information(m_game_list_frame, tr("Game Info"), GetContentInfo(games).info); } +void game_list_actions::ShowDiskUsageDialog() +{ + if (m_disk_usage_future.isRunning()) // Still running the last request + return; + + // Disk usage calculation can take a while (in particular on non ssd/m.2 disks) + // so run it on a concurrent thread avoiding to block the entire GUI + m_disk_usage_future = QtConcurrent::run([this]() + { + const std::vector> vfs_disk_usage = rpcs3::utils::get_vfs_disk_usage(); + const u64 cache_disk_usage = rpcs3::utils::get_cache_disk_usage(); + + QString text; + u64 tot_data_size = 0; + + for (const auto& [dev, data_size] : vfs_disk_usage) + { + text += tr("\n %0: %1").arg(QString::fromStdString(dev)).arg(gui::utils::format_byte_size(data_size)); + tot_data_size += data_size; + } + + if (!text.isEmpty()) + text = tr("\n VFS disk usage: %0%1").arg(gui::utils::format_byte_size(tot_data_size)).arg(text); + + text += tr("\n Cache disk usage: %0").arg(gui::utils::format_byte_size(cache_disk_usage)); + + sys_log.success("%s", text); + + Emu.CallFromMainThread([this, text]() + { + QMessageBox::information(m_game_list_frame, tr("Disk usage"), text); + }, nullptr, false); + }); +} + bool game_list_actions::IsGameRunning(const std::string& serial) { return !Emu.IsStopped(true) && (serial == Emu.GetTitleID() || (serial == "vsh.self" && Emu.IsVsh())); @@ -1063,6 +1099,128 @@ void game_list_actions::BatchCreateCPUCaches(const std::vector& games }); } +void game_list_actions::BatchRemoveCustomConfigurations(const std::vector& games, bool is_interactive) +{ + if (is_interactive && QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), tr("Remove custom configuration?")) != QMessageBox::Yes) + { + return; + } + + std::set serials; + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + if (game->has_custom_config && !serials.count(game->info.serial)) + { + serials.emplace(game->info.serial); + } + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("Custom Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Custom Configuration Batch Removal"), tr("Removing all custom configurations"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 custom configurations cleared"), [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveCustomConfiguration(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("Custom Configuration Batch Removal was canceled. %d/%d custom configurations cleared", removed, total); + }, nullptr, true); +} + +void game_list_actions::BatchRemoveCustomPadConfigurations(const std::vector& games, bool is_interactive) +{ + if (is_interactive && QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), tr("Remove custom gamepad configuration?")) != QMessageBox::Yes) + { + return; + } + + std::set serials; + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + if (game->has_custom_pad_config && !serials.count(game->info.serial)) + { + serials.emplace(game->info.serial); + } + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("Custom Gamepad Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Custom Gamepad Configuration Batch Removal"), tr("Removing all custom gamepad configurations"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 custom gamepad configurations cleared"), [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveCustomPadConfiguration(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("Custom Gamepad Configuration Batch Removal was canceled. %d/%d custom gamepad configurations cleared", removed, total); + }, nullptr, true); +} + +void game_list_actions::BatchRemoveShaderCaches(const std::vector& games, bool is_interactive) +{ + if (!ValidateBatchRemoval("shader cache", is_interactive)) + { + return; + } + + std::set serials; + + if (games.empty()) + { + serials.emplace("vsh.self"); + } + + for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) + { + serials.emplace(game->info.serial); + } + + const u32 total = ::size32(serials); + + if (total == 0) + { + QMessageBox::information(m_game_list_frame, tr("Shader Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); + return; + } + + progress_dialog* pdlg = new progress_dialog(tr("Shader Cache Batch Removal"), tr("Removing all shader caches"), tr("Cancel"), 0, total, false, m_game_list_frame); + pdlg->setAutoClose(false); + pdlg->setAutoReset(false); + pdlg->open(); + + BatchActionBySerials(pdlg, serials, tr("%0/%1 shader caches cleared"), [this](const std::string& serial) + { + return !serial.empty() && Emu.IsStopped(true) && RemoveShaderCache(serial); + }, + [](u32 removed, u32 total) + { + game_list_log.notice("Shader Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); + }, nullptr, false); +} + void game_list_actions::BatchRemovePPUCaches(const std::vector& games, bool is_interactive) { if (!ValidateBatchRemoval("PPU cache", is_interactive)) @@ -1288,131 +1446,6 @@ void game_list_actions::BatchRemoveContentLists(const std::vector& ga }, false); } -void game_list_actions::BatchRemoveCustomConfigurations(const std::vector& games, bool is_interactive) -{ - if (is_interactive && QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), tr("Remove custom configuration?")) != QMessageBox::Yes) - { - return; - } - - std::set serials; - - for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) - { - if (game->has_custom_config && !serials.count(game->info.serial)) - { - serials.emplace(game->info.serial); - } - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(m_game_list_frame, tr("Custom Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("Custom Configuration Batch Removal"), tr("Removing all custom configurations"), tr("Cancel"), 0, total, false, m_game_list_frame); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 custom configurations cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveCustomConfiguration(serial); - }, - [](u32 removed, u32 total) - { - game_list_log.notice("Custom Configuration Batch Removal was canceled. %d/%d custom configurations cleared", removed, total); - }, nullptr, true); -} - -void game_list_actions::BatchRemoveCustomPadConfigurations(const std::vector& games, bool is_interactive) -{ - if (is_interactive && QMessageBox::question(m_game_list_frame, tr("Confirm Removal"), tr("Remove custom gamepad configuration?")) != QMessageBox::Yes) - { - return; - } - - std::set serials; - - for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) - { - if (game->has_custom_pad_config && !serials.count(game->info.serial)) - { - serials.emplace(game->info.serial); - } - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(m_game_list_frame, tr("Custom Gamepad Configuration Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("Custom Gamepad Configuration Batch Removal"), tr("Removing all custom gamepad configurations"), tr("Cancel"), 0, total, false, m_game_list_frame); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 custom gamepad configurations cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveCustomPadConfiguration(serial); - }, - [](u32 removed, u32 total) - { - game_list_log.notice("Custom Gamepad Configuration Batch Removal was canceled. %d/%d custom gamepad configurations cleared", removed, total); - }, nullptr, true); -} - -void game_list_actions::BatchRemoveShaderCaches(const std::vector& games, bool is_interactive) -{ - if (!ValidateBatchRemoval("shader cache", is_interactive)) - { - return; - } - - std::set serials; - - if (games.empty()) - { - serials.emplace("vsh.self"); - } - - for (const auto& game : (games.empty() ? m_game_list_frame->GetGameInfo() : games)) - { - serials.emplace(game->info.serial); - } - - const u32 total = ::size32(serials); - - if (total == 0) - { - QMessageBox::information(m_game_list_frame, tr("Shader Cache Batch Removal"), tr("No files found"), QMessageBox::Ok); - return; - } - - progress_dialog* pdlg = new progress_dialog(tr("Shader Cache Batch Removal"), tr("Removing all shader caches"), tr("Cancel"), 0, total, false, m_game_list_frame); - pdlg->setAutoClose(false); - pdlg->setAutoReset(false); - pdlg->open(); - - BatchActionBySerials(pdlg, serials, tr("%0/%1 shader caches cleared"), - [this](const std::string& serial) - { - return !serial.empty() && Emu.IsStopped(true) && RemoveShaderCache(serial); - }, - [](u32 removed, u32 total) - { - game_list_log.notice("Shader Cache Batch Removal was canceled. %d/%d caches cleared", removed, total); - }, nullptr, false); -} - void game_list_actions::CreateShortcuts(const std::vector& games, const std::set& locations) { if (games.empty()) diff --git a/rpcs3/rpcs3qt/game_list_actions.h b/rpcs3/rpcs3qt/game_list_actions.h index 7c5f603337..ccb97ff89a 100644 --- a/rpcs3/rpcs3qt/game_list_actions.h +++ b/rpcs3/rpcs3qt/game_list_actions.h @@ -3,6 +3,7 @@ #include "gui_game_info.h" #include "shortcut_utils.h" +#include #include class progress_dialog; @@ -53,15 +54,7 @@ public: void ShowRemoveGameDialog(const std::vector& games); void ShowGameInfoDialog(const std::vector& games); - - void BatchCreateCPUCaches(const std::vector& games = {}, bool is_fast_compilation = false, bool is_interactive = false); - void BatchRemoveCustomConfigurations(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveCustomPadConfigurations(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveShaderCaches(const std::vector& games = {}, bool is_interactive = false); - void BatchRemovePPUCaches(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveSPUCaches(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveHDD1Caches(const std::vector& games = {}, bool is_interactive = false); - void BatchRemoveAllCaches(const std::vector& games = {}, bool is_interactive = false); + void ShowDiskUsageDialog(); // NOTES: // - SetContentList() MUST always be called to set the content's info to be removed by: @@ -69,8 +62,6 @@ public: // - BatchRemoveContentLists() // void SetContentList(u16 content_types, const content_info& content_info); - void BatchRemoveContentLists(const std::vector& games = {}, bool is_interactive = false); - void ClearContentList(bool refresh = false); content_info GetContentInfo(const std::vector& games); @@ -88,6 +79,16 @@ public: bool RemoveAllCaches(const std::string& serial, bool is_interactive = false); bool RemoveContentList(const std::string& serial, bool is_interactive = false); + void BatchCreateCPUCaches(const std::vector& games = {}, bool is_fast_compilation = false, bool is_interactive = false); + void BatchRemoveCustomConfigurations(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveCustomPadConfigurations(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveShaderCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemovePPUCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveSPUCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveHDD1Caches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveAllCaches(const std::vector& games = {}, bool is_interactive = false); + void BatchRemoveContentLists(const std::vector& games = {}, bool is_interactive = false); + static bool RemoveContentPath(const std::string& path, const std::string& desc); static u32 RemoveContentPathList(const std::set& path_list, const std::string& desc); static bool RemoveContentBySerial(const std::string& base_dir, const std::string& serial, const std::string& desc); @@ -95,6 +96,7 @@ public: private: game_list_frame* m_game_list_frame = nullptr; std::shared_ptr m_gui_settings; + QFuture m_disk_usage_future; // NOTE: // m_content_info is used by: diff --git a/rpcs3/rpcs3qt/game_list_context_menu.cpp b/rpcs3/rpcs3qt/game_list_context_menu.cpp index bb15bc80ec..720aac8596 100644 --- a/rpcs3/rpcs3qt/game_list_context_menu.cpp +++ b/rpcs3/rpcs3qt/game_list_context_menu.cpp @@ -303,13 +303,6 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& QAction* remove_game = manage_game_menu->addAction(tr("&Remove %1").arg(gameinfo->localized_category)); remove_game->setEnabled(!is_current_running_game); - // Game info - QAction* game_info = manage_game_menu->addAction(tr("&Game Info")); - connect(game_info, &QAction::triggered, this, [this, gameinfo]() - { - m_game_list_actions->ShowGameInfoDialog({gameinfo}); - }); - // Custom Images menu QMenu* icon_menu = addMenu(tr("&Custom Images")); const std::array custom_icon_actions = @@ -457,8 +450,6 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& icon_menu->setEnabled(false); } - addSeparator(); - // Open Folder menu QMenu* open_folder_menu = addMenu(tr("&Open Folder")); @@ -575,6 +566,22 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& QAction* check_compat = addAction(tr("&Check Game Compatibility")); QAction* download_compat = addAction(tr("&Download Compatibility Database")); + addSeparator(); + + // Disk usage + QAction* disk_usage = addAction(tr("&Disk Usage")); + connect(disk_usage, &QAction::triggered, this, [this]() + { + m_game_list_actions->ShowDiskUsageDialog(); + }); + + // Game info + QAction* game_info = addAction(tr("&Game Info")); + connect(game_info, &QAction::triggered, this, [this, gameinfo]() + { + m_game_list_actions->ShowGameInfoDialog({gameinfo}); + }); + connect(boot, &QAction::triggered, m_game_list_frame, [this, gameinfo]() { sys_log.notice("Booting from gamelist per context menu..."); @@ -896,8 +903,25 @@ void game_list_context_menu::show_multi_selection_context_menu(const std::vector m_game_list_actions->ShowRemoveGameDialog(games); }); + addSeparator(); + + QAction* download_compat = addAction(tr("&Download Compatibility Database")); + connect(download_compat, &QAction::triggered, m_game_list_frame, [this] + { + ensure(m_game_list_frame->GetGameCompatibility())->RequestCompatibility(true); + }); + + addSeparator(); + + // Disk usage + QAction* disk_usage = addAction(tr("&Disk Usage")); + connect(disk_usage, &QAction::triggered, this, [this]() + { + m_game_list_actions->ShowDiskUsageDialog(); + }); + // Game info - QAction* game_info = manage_game_menu->addAction(tr("&Game Info")); + QAction* game_info = addAction(tr("&Game Info")); connect(game_info, &QAction::triggered, this, [this, games]() { m_game_list_actions->ShowGameInfoDialog(games); diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index 1d2739608d..bbc6fe6145 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -4,14 +4,10 @@ #include "hex_validator.h" #include "memory_viewer_panel.h" -#include "Emu/System.h" -#include "Emu/system_utils.hpp" #include "Utilities/lockless.h" #include "util/asm.hpp" -#include #include -#include #include #include #include @@ -21,8 +17,6 @@ #include #include -LOG_CHANNEL(sys_log, "SYS"); - extern fs::file g_tty; extern atomic_t g_tty_size; extern std::array, 16> g_tty_input; @@ -171,28 +165,6 @@ log_frame::log_frame(std::shared_ptr _gui_settings, QWidget* paren connect(m_timer, &QTimer::timeout, this, &log_frame::UpdateUI); } -void log_frame::show_disk_usage(const std::vector>& vfs_disk_usage, u64 cache_disk_usage) -{ - QString text; - u64 tot_data_size = 0; - - for (const auto& [dev, data_size] : vfs_disk_usage) - { - text += tr("\n %0: %1").arg(QString::fromStdString(dev)).arg(gui::utils::format_byte_size(data_size)); - tot_data_size += data_size; - } - - if (!text.isEmpty()) - { - text = tr("\n VFS disk usage: %0%1").arg(gui::utils::format_byte_size(tot_data_size)).arg(text); - } - - text += tr("\n Cache disk usage: %0").arg(gui::utils::format_byte_size(cache_disk_usage)); - - sys_log.success("%s", text); - QMessageBox::information(this, tr("Disk usage"), text); -} - void log_frame::SetLogLevel(logs::level lev) const { switch (lev) @@ -273,26 +245,6 @@ void log_frame::CreateAndConnectActions() m_tty->clear(); }); - m_show_disk_usage_act = new QAction(tr("Show Disk Usage"), this); - connect(m_show_disk_usage_act, &QAction::triggered, [this]() - { - if (m_disk_usage_future.isRunning()) - { - return; // Still running the last request - } - - m_disk_usage_future = QtConcurrent::run([this]() - { - const std::vector> vfs_disk_usage = rpcs3::utils::get_vfs_disk_usage(); - const u64 cache_disk_usage = rpcs3::utils::get_cache_disk_usage(); - - Emu.CallFromMainThread([this, vfs_disk_usage, cache_disk_usage]() - { - show_disk_usage(vfs_disk_usage, cache_disk_usage); - }, nullptr, false); - }); - }); - m_perform_goto_on_debugger = new QAction(tr("Go-To on Debugger"), this); connect(m_perform_goto_on_debugger, &QAction::triggered, [this]() { @@ -418,8 +370,6 @@ void log_frame::CreateAndConnectActions() QMenu* menu = m_log->createStandardContextMenu(); menu->addAction(m_clear_act); menu->addSeparator(); - menu->addAction(m_show_disk_usage_act); - menu->addSeparator(); menu->addAction(m_perform_goto_on_debugger); menu->addAction(m_perform_goto_thread_on_debugger); menu->addAction(m_perform_show_in_mem_viewer); diff --git a/rpcs3/rpcs3qt/log_frame.h b/rpcs3/rpcs3qt/log_frame.h index 159fdd38aa..0de081863c 100644 --- a/rpcs3/rpcs3qt/log_frame.h +++ b/rpcs3/rpcs3qt/log_frame.h @@ -8,7 +8,6 @@ #include -#include #include #include #include @@ -39,7 +38,6 @@ protected: private Q_SLOTS: void UpdateUI(); private: - void show_disk_usage(const std::vector>& vfs_disk_usage, u64 cache_disk_usage); void SetLogLevel(logs::level lev) const; void SetTTYLogging(bool val) const; @@ -50,7 +48,6 @@ private: std::unique_ptr m_find_dialog; QTimer* m_timer = nullptr; - QFuture m_disk_usage_future; std::vector m_color; QColor m_color_stack; @@ -75,7 +72,6 @@ private: QAction* m_clear_act = nullptr; QAction* m_clear_tty_act = nullptr; - QAction* m_show_disk_usage_act = nullptr; QAction* m_perform_goto_on_debugger = nullptr; QAction* m_perform_goto_thread_on_debugger = nullptr; QAction* m_perform_show_in_mem_viewer = nullptr; From db89f55ca151b1b2f16a1767c52dc6d565eaf8d3 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Wed, 7 Jan 2026 00:03:59 -0800 Subject: [PATCH 074/630] Add Qt translations to Windows Clang --- .github/workflows/rpcs3.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 77cbf0f7d9..7f13cc83d2 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -369,6 +369,8 @@ jobs: mingw-w64-clang-x86_64-qt6-declarative mingw-w64-clang-x86_64-qt6-multimedia mingw-w64-clang-x86_64-qt6-svg + mingw-w64-clang-x86_64-qt6-tools + mingw-w64-clang-x86_64-qt6-translations base-devel curl git From e3a938fb760ef59cedb7708e14d124cb2dcdd749 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Wed, 7 Jan 2026 00:07:25 -0800 Subject: [PATCH 075/630] Embed qt.conf in RPCS3 binary --- rpcs3/rpcs3qt/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index 5b74a77a59..a8fc4c5886 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -180,7 +180,10 @@ if(HAS_MEMORY_BREAKPOINTS) endif() if(WIN32) - target_sources(rpcs3_ui PUBLIC "../windows.qrc") + target_sources(rpcs3_ui PRIVATE "../windows.qrc") + set_source_files_properties("../windows.qrc" PROPERTIES + RCC_OPTIONS "--include;${CMAKE_CURRENT_SOURCE_DIR}/../qt/etc/qt.conf" + ) target_compile_definitions(rpcs3_ui PRIVATE UNICODE _UNICODE) endif() From 0bd6aee8c8d057a85aeb49ad5e4c55063027fdc2 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 6 Jan 2026 14:20:34 +0100 Subject: [PATCH 076/630] Update SDL to 3.4.0 --- 3rdparty/libsdl-org/SDL | 2 +- 3rdparty/libsdl-org/SDL.vcxproj | 36 ++++-- 3rdparty/libsdl-org/SDL.vcxproj.filters | 147 +++++++++++++++++++----- rpcs3/Emu/Io/LogitechG27.cpp | 6 +- rpcs3/Input/sdl_instance.cpp | 5 + 5 files changed, 155 insertions(+), 41 deletions(-) diff --git a/3rdparty/libsdl-org/SDL b/3rdparty/libsdl-org/SDL index f5e5f65889..a962f40bbb 160000 --- a/3rdparty/libsdl-org/SDL +++ b/3rdparty/libsdl-org/SDL @@ -1 +1 @@ -Subproject commit f5e5f6588921eed3d7d048ce43d9eb1ff0da0ffc +Subproject commit a962f40bbba175e9716557a25d5d7965f134a3d3 diff --git a/3rdparty/libsdl-org/SDL.vcxproj b/3rdparty/libsdl-org/SDL.vcxproj index f0b38ca09f..fd2bcf2f03 100644 --- a/3rdparty/libsdl-org/SDL.vcxproj +++ b/3rdparty/libsdl-org/SDL.vcxproj @@ -23,6 +23,7 @@ + @@ -102,6 +103,7 @@ + @@ -130,6 +132,8 @@ + + @@ -140,7 +144,11 @@ + + + + @@ -156,6 +164,7 @@ + @@ -175,7 +184,6 @@ - @@ -184,20 +192,35 @@ + + + + + + + + + + + + + + + @@ -241,6 +264,7 @@ + @@ -256,13 +280,14 @@ + + - @@ -303,7 +328,6 @@ - @@ -333,7 +357,6 @@ - @@ -393,7 +416,6 @@ - @@ -464,6 +486,7 @@ + @@ -471,12 +494,11 @@ - + - diff --git a/3rdparty/libsdl-org/SDL.vcxproj.filters b/3rdparty/libsdl-org/SDL.vcxproj.filters index 5839899c0d..8b7f293ef3 100644 --- a/3rdparty/libsdl-org/SDL.vcxproj.filters +++ b/3rdparty/libsdl-org/SDL.vcxproj.filters @@ -214,6 +214,9 @@ {000028b2ea36d7190d13777a4dc70000} + + {695ffc61-5497-4227-b415-15e9bdd5b6bf} + @@ -699,9 +702,6 @@ video\yuv2rgb - - video\windows - video\windows @@ -831,9 +831,6 @@ render\software - - render\software - render\software @@ -911,12 +908,6 @@ - - - - - - render\vulkan @@ -950,6 +941,60 @@ + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video + + + video + + + video + + + misc + + + haptic\hidapi + + + haptic\hidapi + + + core + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + API Headers + @@ -1037,9 +1082,6 @@ core - - core\windows - core\windows @@ -1166,9 +1208,6 @@ joystick\dummy - - joystick\gdk - joystick\hidapi @@ -1328,9 +1367,6 @@ video\dummy - - video\windows - video\windows @@ -1343,9 +1379,6 @@ video\windows - - video\windows - video\windows @@ -1508,9 +1541,6 @@ render\software - - render\software - render\software @@ -1535,9 +1565,6 @@ - - - render\vulkan @@ -1579,6 +1606,66 @@ + + video\windows + + + video\yuv2rgb + + + video\yuv2rgb + + + video\yuv2rgb + + + video + + + misc + + + haptic\hidapi + + + haptic\hidapi + + + core\windows + + + core\windows + + + joystick\gdk + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + + + joystick\hidapi + diff --git a/rpcs3/Emu/Io/LogitechG27.cpp b/rpcs3/Emu/Io/LogitechG27.cpp index 2eb62581bb..1f02c92d59 100644 --- a/rpcs3/Emu/Io/LogitechG27.cpp +++ b/rpcs3/Emu/Io/LogitechG27.cpp @@ -267,7 +267,7 @@ static const std::map Date: Sat, 3 Jan 2026 12:38:55 +0100 Subject: [PATCH 077/630] Update FAudio to 26.01 --- 3rdparty/FAudio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/FAudio b/3rdparty/FAudio index 4ea8afea6b..633bdb772a 160000 --- a/3rdparty/FAudio +++ b/3rdparty/FAudio @@ -1 +1 @@ -Subproject commit 4ea8afea6ba857c24e40877f487d000d559b196d +Subproject commit 633bdb772a593104414b4b103ec752567d57c3c1 From 72a19a87b6c1c2fd1f32e6166ac717afc3e18ea5 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 7 Jan 2026 11:37:39 +0100 Subject: [PATCH 078/630] Qt: Add mulit selection to game grid --- rpcs3/rpcs3qt/flow_layout.h | 2 + rpcs3/rpcs3qt/flow_widget.cpp | 171 +++++++++++++++++++++++++----- rpcs3/rpcs3qt/flow_widget.h | 12 ++- rpcs3/rpcs3qt/game_list_frame.cpp | 51 +++++---- rpcs3/rpcs3qt/game_list_grid.cpp | 8 +- 5 files changed, 188 insertions(+), 56 deletions(-) diff --git a/rpcs3/rpcs3qt/flow_layout.h b/rpcs3/rpcs3qt/flow_layout.h index c04fa8ab6d..ba0ec201f6 100644 --- a/rpcs3/rpcs3qt/flow_layout.h +++ b/rpcs3/rpcs3qt/flow_layout.h @@ -61,6 +61,8 @@ public: { int row{}; int col{}; + + operator bool() const { return row >= 0 && col >= 0; } }; explicit flow_layout(QWidget* parent, int margin = -1, bool dynamic_spacing = false, int hSpacing = -1, int vSpacing = -1); diff --git a/rpcs3/rpcs3qt/flow_widget.cpp b/rpcs3/rpcs3qt/flow_widget.cpp index 13754f6c66..bf00b3fa4e 100644 --- a/rpcs3/rpcs3qt/flow_widget.cpp +++ b/rpcs3/rpcs3qt/flow_widget.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "flow_widget.h" +#include #include #include #include @@ -48,14 +49,24 @@ void flow_widget::clear() m_flow_layout->clear(); } -flow_widget_item* flow_widget::selected_item() const +std::set flow_widget::selected_items() const { - if (m_selected_index >= 0 && static_cast(m_selected_index) < m_widgets.size()) + std::set items; + + for (s64 index : m_selected_items) { - return ::at32(m_widgets, m_selected_index); + if (index >= 0 && static_cast(index) < m_widgets.size()) + { + items.insert(::at32(m_widgets, index)); + + if (!m_allow_multi_selection) + { + return items; + } + } } - return nullptr; + return items; } void flow_widget::paintEvent(QPaintEvent* /*event*/) @@ -69,7 +80,7 @@ void flow_widget::paintEvent(QPaintEvent* /*event*/) s64 flow_widget::find_item(const flow_layout::position& pos) { - if (pos.row < 0 || pos.col < 0) + if (!pos) { return -1; } @@ -109,7 +120,7 @@ flow_layout::position flow_widget::find_item(flow_widget_item* item) flow_layout::position flow_widget::find_next_item(flow_layout::position current_pos, flow_navigation value) { - if (current_pos.row >= 0 && current_pos.col >= 0 && m_flow_layout->rows() > 0 && m_flow_layout->cols() > 0) + if (current_pos && m_flow_layout->rows() > 0 && m_flow_layout->cols() > 0) { switch (value) { @@ -183,54 +194,160 @@ flow_layout::position flow_widget::find_next_item(flow_layout::position current_ return current_pos; } -void flow_widget::select_item(flow_widget_item* item) +void flow_widget::select_items(const std::set& selected_items, flow_widget_item* current_item) { - const flow_layout::position selected_pos = find_item(item); - const s64 selected_index = find_item(selected_pos); + m_selected_items.clear(); - if (selected_index < 0 || static_cast(selected_index) >= items().size()) + for (flow_widget_item* item : selected_items) { - m_selected_index = -1; - return; - } + const flow_layout::position selected_pos = find_item(item); + const s64 selected_index = find_item(selected_pos); - m_selected_index = selected_index; - Q_EMIT ItemSelectionChanged(m_selected_index); + if (selected_index < 0 || static_cast(selected_index) >= items().size()) + { + continue; + } + + m_selected_items.insert(selected_index); + + if (!m_allow_multi_selection) + { + break; + } + } for (usz i = 0; i < items().size(); i++) { if (flow_widget_item* item = items().at(i)) { // We need to polish the widgets in order to re-apply any stylesheet changes for the selected property. - item->selected = m_selected_index >= 0 && i == static_cast(m_selected_index); + item->selected = m_selected_items.contains(i); item->polish_style(); } } - // Make sure we see the focused widget - m_scroll_area->ensureWidgetVisible(::at32(items(), m_selected_index)); + if (m_selected_items.empty()) + { + m_last_selected_item = -1; + } + else + { + if (!m_selected_items.contains(m_last_selected_item)) + { + m_last_selected_item = *m_selected_items.cbegin(); + } + + s64 selected_item = m_last_selected_item; + s64 focused_item = selected_item; + + if (current_item) + { + if (const flow_layout::position selected_pos = find_item(current_item)) + { + focused_item = find_item(selected_pos); + + if (current_item->selected) + { + selected_item = focused_item; + } + } + } + + // Make sure we see the focused widget + m_scroll_area->ensureWidgetVisible(::at32(items(), focused_item)); + + Q_EMIT ItemSelectionChanged(selected_item); + } +} + +void flow_widget::update_selection(flow_widget_item* current_item) +{ + std::set selected_items; + const Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers(); + + if (current_item) + { + if (!m_allow_multi_selection || !current_item->selected || modifiers != Qt::ControlModifier) + { + selected_items.insert(current_item); + } + } + + if (m_allow_multi_selection) + { + flow_layout::position selected_pos; + flow_layout::position last_selected_pos; + + if (modifiers == Qt::ShiftModifier && m_last_selected_item >= 0 && static_cast(m_last_selected_item) < items().size()) + { + selected_pos = find_item(current_item); + last_selected_pos = find_item(::at32(m_widgets, m_last_selected_item)); + } + + flow_layout::position pos_min = last_selected_pos; + flow_layout::position pos_max = selected_pos; + + if (pos_min.row > pos_max.row) + { + std::swap(pos_min, pos_max); + } + + // Check if the item is between the last and the current selection + const auto item_between = [this, &pos_min, &pos_max](flow_widget_item* item) + { + if (!pos_min || !pos_max) return false; + + const flow_layout::position pos = find_item(item); + if (!pos) return false; // pos invalid + if (pos.row < pos_min.row || pos.row > pos_max.row) return false; // not in any relevant row + if (pos.row > pos_min.row && pos.row < pos_max.row) return true; // in a row between the items -> match + + const bool in_min_row = pos.row == pos_min.row && pos.col >= pos_min.col; + const bool in_max_row = pos.row == pos_max.row && pos.col <= pos_max.col; + + if (pos_min.row == pos_max.row) return in_min_row && in_max_row; // in the only row at a relevant col -> match + + return in_min_row || in_max_row; // in either min or max row at a relevant col -> match + }; + + for (usz i = 0; i < items().size(); i++) + { + if (flow_widget_item* item = items().at(i)) + { + if (item == current_item) continue; + + if (modifiers == Qt::ControlModifier && item->selected) + { + selected_items.insert(item); + } + else if (modifiers == Qt::ShiftModifier && item_between(item)) + { + selected_items.insert(item); + } + } + } + } + + select_items(selected_items, current_item); } void flow_widget::on_item_focus() { - select_item(static_cast(QObject::sender())); + update_selection(static_cast(QObject::sender())); } void flow_widget::on_navigate(flow_navigation value) { const flow_layout::position selected_pos = find_next_item(find_item(static_cast(QObject::sender())), value); const s64 selected_index = find_item(selected_pos); - if (selected_index < 0 || static_cast(selected_index) >= items().size()) - { - return; - } - if (flow_widget_item* item = items().at(selected_index)) + if (selected_index >= 0 && static_cast(selected_index) < items().size()) { - item->setFocus(); + if (flow_widget_item* item = items().at(selected_index)) + { + item->setFocus(); + } } - - m_selected_index = selected_index; } void flow_widget::mouseDoubleClickEvent(QMouseEvent* ev) diff --git a/rpcs3/rpcs3qt/flow_widget.h b/rpcs3/rpcs3qt/flow_widget.h index 433d05ad0e..4f0a7dd453 100644 --- a/rpcs3/rpcs3qt/flow_widget.h +++ b/rpcs3/rpcs3qt/flow_widget.h @@ -19,8 +19,10 @@ public: void add_widget(flow_widget_item* widget); void clear(); + void set_multi_selection_enabled(bool enabled) { m_allow_multi_selection = enabled; } + std::vector& items() { return m_widgets; } - flow_widget_item* selected_item() const; + std::set selected_items() const; QScrollArea* scroll_area() const { return m_scroll_area; } void paintEvent(QPaintEvent* event) override; @@ -33,7 +35,7 @@ private Q_SLOTS: void on_navigate(flow_navigation value); protected: - void select_item(flow_widget_item* item); + void select_items(const std::set& selected_items, flow_widget_item* current_item = nullptr); void mouseDoubleClickEvent(QMouseEvent* event) override; private: @@ -41,8 +43,12 @@ private: flow_layout::position find_item(flow_widget_item* item); flow_layout::position find_next_item(flow_layout::position current_pos, flow_navigation value); + void update_selection(flow_widget_item* current_item); + flow_layout* m_flow_layout{}; QScrollArea* m_scroll_area{}; std::vector m_widgets; - s64 m_selected_index = -1; + std::set m_selected_items; + s64 m_last_selected_item = -1; + bool m_allow_multi_selection = false; }; diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index f8b48e8508..9563c46fb5 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -961,32 +961,31 @@ void game_list_frame::ShowContextMenu(const QPoint& pos) QPoint global_pos; std::vector games; - // NOTE: Currently, only m_game_list supports rows multi selection! - // - // TODO: Add support to rows multi selection to m_game_grid - if (m_is_list_layout) { global_pos = m_game_list->viewport()->mapToGlobal(pos); - const auto item_list = m_game_list->selectedItems(); - game_info gameinfo; - - for (const auto& item : item_list) + for (const QTableWidgetItem* item : m_game_list->selectedItems()) { - if (item->column() != static_cast(gui::game_list_columns::icon)) + if (!item || item->column() != static_cast(gui::game_list_columns::icon)) continue; - if (gameinfo = GetGameInfoFromItem(item); gameinfo) + if (game_info gameinfo = GetGameInfoFromItem(item)) games.push_back(gameinfo); } } - else if (game_list_grid_item* item = static_cast(m_game_grid->selected_item())) + else if (m_game_grid) { global_pos = m_game_grid->mapToGlobal(pos); - if (game_info gameinfo = item->game(); gameinfo) - games.push_back(gameinfo); + for (const flow_widget_item* selected_item : m_game_grid->selected_items()) + { + if (const game_list_grid_item* item = static_cast(selected_item)) + { + if (game_info gameinfo = item->game()) + games.push_back(gameinfo); + } + } } if (!games.empty()) @@ -1154,16 +1153,19 @@ bool game_list_frame::eventFilter(QObject *object, QEvent *event) if (object == m_game_list) { - QTableWidgetItem* item = m_game_list->item(m_game_list->currentRow(), static_cast(gui::game_list_columns::icon)); + const QTableWidgetItem* item = m_game_list->item(m_game_list->currentRow(), static_cast(gui::game_list_columns::icon)); - if (!item || !item->isSelected()) - return false; - - gameinfo = GetGameInfoFromItem(item); + if (item && item->isSelected()) + { + gameinfo = GetGameInfoFromItem(item); + } } - else if (game_list_grid_item* item = static_cast(m_game_grid->selected_item())) + else if (const auto items = m_game_grid->selected_items(); !items.empty()) { - gameinfo = item->game(); + if (const game_list_grid_item* item = static_cast(*items.begin())) + { + gameinfo = item->game(); + } } if (!gameinfo) @@ -1279,11 +1281,14 @@ std::set game_list_frame::CurrentSelectionPaths() } else if (m_game_grid) { - if (const game_list_grid_item* item = static_cast(m_game_grid->selected_item())) + for (const flow_widget_item* selected_item : m_game_grid->selected_items()) { - if (const game_info& game = item->game()) + if (const game_list_grid_item* item = static_cast(selected_item)) { - selection.insert(game->info.path + game->info.icon_path); + if (const game_info& game = item->game()) + { + selection.insert(game->info.path + game->info.icon_path); + } } } } diff --git a/rpcs3/rpcs3qt/game_list_grid.cpp b/rpcs3/rpcs3qt/game_list_grid.cpp index e60a832569..a20e67da73 100644 --- a/rpcs3/rpcs3qt/game_list_grid.cpp +++ b/rpcs3/rpcs3qt/game_list_grid.cpp @@ -12,6 +12,8 @@ game_list_grid::game_list_grid() setObjectName("game_list_grid"); setContextMenuPolicy(Qt::CustomContextMenu); + set_multi_selection_enabled(true); + m_icon_ready_callback = [this](const game_info& game, const movie_item_base* item) { Q_EMIT IconReady(game, item); @@ -45,7 +47,7 @@ void game_list_grid::populate( { clear_list(); - game_list_grid_item* selected_item = nullptr; + std::set selected_items; blockSignals(true); @@ -112,7 +114,7 @@ void game_list_grid::populate( if (selected_item_ids.contains(game->info.path + game->info.icon_path)) { - selected_item = item; + selected_items.insert(item); } add_widget(item); @@ -125,7 +127,7 @@ void game_list_grid::populate( QApplication::processEvents(); - select_item(selected_item); + select_items(selected_items); } void game_list_grid::repaint_icons(std::vector& game_data, const QColor& icon_color, const QSize& icon_size, qreal device_pixel_ratio) From c22d2b51bbaed3d4d504fb8bf5602c6758c2827f Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 8 Jan 2026 02:32:47 +0300 Subject: [PATCH 079/630] gl: Do not overwrite texture-cache image dimensions when updating format - The code was an outdated relic from the early days. The calculated pitch was wrong as it did not take subregions (incomplete rows) into account. --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 486087d56a..8dc2c27664 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -669,8 +669,8 @@ namespace gl } else { - //TODO: More tests on byte order - //ARGB8+native+unswizzled is confirmed with Dark Souls II character preview + // TODO: More tests on byte order + // ARGB8+native+unswizzled is confirmed with Dark Souls II character preview switch (gcm_format) { case CELL_GCM_TEXTURE_A8R8G8B8: @@ -697,8 +697,7 @@ namespace gl fmt::throw_exception("Unexpected gcm format 0x%X", gcm_format); } - //NOTE: Protection is handled by the caller - cached.set_dimensions(width, height, depth, (rsx_range.length() / height)); + // NOTE: Protection is handled by the caller no_access_range = cached.get_min_max(no_access_range, rsx::section_bounds::locked_range); } From ef5a4bf7e4cd6dddc3dbf10782eba5925b8bd981 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 7 Jan 2026 21:46:05 +0100 Subject: [PATCH 080/630] Qt/input: fix pressure intensity button availability --- rpcs3/Emu/Io/PadHandler.cpp | 2 +- rpcs3/Emu/Io/PadHandler.h | 2 +- rpcs3/Input/sdl_pad_handler.cpp | 2 +- rpcs3/rpcs3qt/pad_settings_dialog.cpp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index d25ba1379c..9110687a9c 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -219,7 +219,7 @@ pad_capabilities PadHandlerBase::get_capabilities(const std::string& /*pad_id*/) .has_rumble = b_has_rumble, .has_accel = b_has_motion, .has_gyro = b_has_motion, - .has_pressure_sensitivity = b_has_pressure_intensity_button + .has_pressure_intensity_button = b_has_pressure_intensity_button }; } diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index a27e0bcc50..98cca72a7d 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -90,7 +90,7 @@ struct pad_capabilities bool has_rumble = false; bool has_accel = false; bool has_gyro = false; - bool has_pressure_sensitivity = false; + bool has_pressure_intensity_button = true; }; using pad_preview_values = std::array; diff --git a/rpcs3/Input/sdl_pad_handler.cpp b/rpcs3/Input/sdl_pad_handler.cpp index 1b6ddbc40c..c47514f6ae 100644 --- a/rpcs3/Input/sdl_pad_handler.cpp +++ b/rpcs3/Input/sdl_pad_handler.cpp @@ -738,7 +738,7 @@ pad_capabilities sdl_pad_handler::get_capabilities(const std::string& pad_id) capabilities.has_rumble &= dev->sdl.has_rumble; capabilities.has_accel &= dev->sdl.has_accel; capabilities.has_gyro &= dev->sdl.has_gyro; - capabilities.has_pressure_sensitivity &= dev->sdl.is_ds3_with_pressure_buttons; + capabilities.has_pressure_intensity_button &= !dev->sdl.is_ds3_with_pressure_buttons; // Only allow if there's not pressure sensitivity return capabilities; } diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.cpp b/rpcs3/rpcs3qt/pad_settings_dialog.cpp index 36ece3b0ec..2940143a27 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/pad_settings_dialog.cpp @@ -482,7 +482,7 @@ void pad_settings_dialog::InitButtons() if ((!is_connected || !m_remap_timer.isActive()) && ( is_connected != m_enable_buttons || (is_connected && ( - !capabilities.has_pressure_sensitivity != m_enable_pressure_intensity_button || + capabilities.has_pressure_intensity_button != m_enable_pressure_intensity_button || capabilities.has_rumble != m_enable_rumble || capabilities.has_battery_led != m_enable_battery_led || (capabilities.has_led || capabilities.has_mono_led) != m_enable_led || @@ -490,7 +490,7 @@ void pad_settings_dialog::InitButtons() { if (is_connected) { - m_enable_pressure_intensity_button = !capabilities.has_pressure_sensitivity; + m_enable_pressure_intensity_button = capabilities.has_pressure_intensity_button; m_enable_rumble = capabilities.has_rumble; m_enable_battery_led = capabilities.has_battery_led; m_enable_led = capabilities.has_led || capabilities.has_mono_led; From 6c083d6184c77b8643afa9b6c49aac97bc00f1a4 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Sun, 7 Dec 2025 05:36:22 +0000 Subject: [PATCH 081/630] ISO: Add ISO reader code and ISO device Adds infrastructure to read files/data from ISOs. Also adds classes extending fs::device_base and fs::file_base in order to allow reading files through fs namespace functions. This approach should allow ISO data to be read by the emulator with the least changes to existing code. --- Utilities/File.h | 2 +- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Loader/ISO.cpp | 600 +++++++++++++++++++++++++++++++++++++++ rpcs3/Loader/ISO.h | 112 ++++++++ rpcs3/emucore.vcxproj | 4 +- 5 files changed, 717 insertions(+), 2 deletions(-) create mode 100644 rpcs3/Loader/ISO.cpp create mode 100644 rpcs3/Loader/ISO.h diff --git a/Utilities/File.h b/Utilities/File.h index 90453f16f0..f7765507e8 100644 --- a/Utilities/File.h +++ b/Utilities/File.h @@ -155,7 +155,7 @@ namespace fs // Virtual device struct device_base { - const std::string fs_prefix; + std::string fs_prefix; device_base(); virtual ~device_base(); diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 8754df84c1..a96ddfa2b3 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -125,6 +125,7 @@ target_sources(rpcs3_emu PRIVATE ../Loader/PSF.cpp ../Loader/PUP.cpp ../Loader/TAR.cpp + ../Loader/ISO.cpp ../Loader/TROPUSR.cpp ../Loader/TRP.cpp ) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp new file mode 100644 index 0000000000..db11f14c84 --- /dev/null +++ b/rpcs3/Loader/ISO.cpp @@ -0,0 +1,600 @@ +#include "stdafx.h" + +#include "ISO.h" + +#include +#include +#include +#include + +// TODO: replace with file check for iso! +bool is_file_iso(const std::string& path) +{ + if (fs::is_dir(path)) return false; + + return is_file_iso(fs::file(path)); +} + +bool is_file_iso(const fs::file& file) +{ + if (!file) return false; + if (file.size() < 32768 + 6) return false; + + file.seek(32768); + + char magic[5]; + file.read_at(32768 + 1, magic, 5); + + return magic[0] == 'C' && magic[1] == 'D' + && magic[2] == '0' && magic[3] == '0' + && magic[4] == '1'; +} + +const int ISO_BLOCK_SIZE = 2048; + +template +inline T read_both_endian_int(fs::file& file) +{ + T out; + + if (std::endian::little == std::endian::native) + { + out = file.read(); + file.seek(sizeof(T), fs::seek_cur); + } + else + { + file.seek(sizeof(T), fs::seek_cur); + out = file.read(); + } + + return out; +} + +// assumed that directory_entry is at file head +std::optional iso_read_directory_entry(fs::file& file, bool names_in_ucs2 = false) +{ + auto start_pos = file.pos(); + u8 entry_length = file.read(); + + if (entry_length == 0) return std::nullopt; + + file.seek(1, fs::seek_cur); + u32 start_sector = read_both_endian_int(file); + u32 file_size = read_both_endian_int(file); + + std::tm file_date = {}; + file_date.tm_year = file.read(); + file_date.tm_mon = file.read() - 1; + file_date.tm_mday = file.read(); + file_date.tm_hour = file.read(); + file_date.tm_min = file.read(); + file_date.tm_sec = file.read(); + s16 timezone_value = file.read(); + s16 timezone_offset = (timezone_value - 50) * 15 * 60; + + std::time_t date_time = std::mktime(&file_date) + timezone_offset; + + u8 flags = file.read(); + + // 2nd flag bit indicates whether a given fs node is a directory + bool is_directory = flags & 0b00000010; + bool has_more_extents = flags & 0b10000000; + + file.seek(6, fs::seek_cur); + + u8 file_name_length = file.read(); + + std::string file_name; + file.read(file_name, file_name_length); + + if (file_name_length == 1 && file_name[0] == 0) + { + file_name = "."; + } + else if (file_name == "\1") + { + file_name = ".."; + } + else if (names_in_ucs2) // for strings in joliet descriptor + { + std::string new_file_name = ""; + int read = 0; + const u8* raw_str = reinterpret_cast(file_name.c_str()); + while(read < file_name_length) + { + // characters are stored in big endian format. + const u16 upper = raw_str[read]; + const u8 lower = raw_str[read + 1]; + + const u16 code_point = (upper << 8) + lower; + + std::wstring_convert, char16_t> convert; + new_file_name += convert.to_bytes(code_point); + + read += 2; + } + + file_name = new_file_name; + } + + if (file_name.ends_with(";1")) + { + file_name.erase(file_name.end() - 2, file_name.end()); + } + + if (file_name_length > 1 && file_name.ends_with(".")) + { + file_name.pop_back(); + } + + // skip the rest of the entry. + file.seek(entry_length + start_pos); + + return iso_fs_metadata + { + .name = file_name, + .time = date_time, + .is_directory = is_directory, + .has_multiple_extents = has_more_extents, + .extents = + { + iso_extent_info + { + .start = start_sector, + .size = file_size + } + } + }; +} + +void iso_form_hierarchy(fs::file& file, iso_fs_node& node, + bool use_ucs2_decoding = false, std::string parent_path = "") +{ + if (!node.metadata.is_directory) return; + + std::vector multi_extent_node_indices; + + // assuming the directory spans a single extent + const auto& directory_extent = node.metadata.extents[0]; + + file.seek(directory_extent.start * ISO_BLOCK_SIZE); + + u64 end_pos = directory_extent.size + (directory_extent.start * ISO_BLOCK_SIZE); + + while(file.pos() < end_pos) + { + auto entry = iso_read_directory_entry(file, use_ucs2_decoding); + if (!entry) + { + float block_size = ISO_BLOCK_SIZE; + float t = std::floor(file.pos() / block_size); + u64 new_sector = t+1; + file.seek(new_sector * ISO_BLOCK_SIZE); + continue; + } + + bool extent_added = false; + + // find previous extent and merge into it, otherwise we push this node's index + for (int index : multi_extent_node_indices) + { + auto& selected_node = node.children.at(index); + if (selected_node->metadata.name.compare(entry->name) == 0) + { + // merge into selected_node + selected_node->metadata.extents.push_back(entry->extents[0]); + + extent_added = true; + } + } + + if (extent_added) continue; + + if (entry->has_multiple_extents) + { + // haven't pushed entry to node.children yet so node.children::size() == entry_index + multi_extent_node_indices.push_back(node.children.size()); + } + + node.children.push_back(std::make_unique(iso_fs_node{ + .metadata = *entry + })); + } + + for (auto& child_node : node.children) + { + if (child_node->metadata.name != "." && child_node->metadata.name != "..") + { + iso_form_hierarchy(file, *child_node, use_ucs2_decoding, parent_path + "/" + node.metadata.name); + } + } +} + +u64 iso_fs_metadata::size() const +{ + u64 total_size = 0; + for (const auto& extent : extents) + { + total_size += extent.size; + } + + return total_size; +} + +iso_archive::iso_archive(const std::string& path) +{ + m_path = path; + m_file = fs::file(path); + + if (!is_file_iso(m_file)) + { + // not iso... TODO: throw something?? + return; + } + + u8 descriptor_type = -2; + bool use_ucs2_decoding = false; + + do + { + auto descriptor_start = m_file.pos(); + + descriptor_type = m_file.read(); + + // 1 = primary vol descriptor, 2 = joliet SVD + if (descriptor_type == 1 || descriptor_type == 2) + { + use_ucs2_decoding = descriptor_type == 2; + + // skip the rest of descriptor's data + m_file.seek(155, fs::seek_cur); + + m_root = iso_fs_node + { + .metadata = iso_read_directory_entry(m_file, use_ucs2_decoding).value(), + }; + + m_file.seek(descriptor_start); + } + + m_file.seek(descriptor_start + ISO_BLOCK_SIZE); + } + while(descriptor_type != 255); + + iso_form_hierarchy(m_file, m_root, use_ucs2_decoding); +} + +iso_fs_node* iso_archive::retrieve(const std::string& passed_path) +{ + std::string path = std::filesystem::path(passed_path).lexically_normal().string(); + + size_t start = 0; + size_t end = path.find_first_of(fs::delim); + + auto dir_entry = &m_root; + + do + { + if (end == std::string::npos) + { + end = path.size(); + } + + auto path_component = path.substr(start, end-start); + + bool found = false; + for (const auto& entry : dir_entry->children) + { + if (entry->metadata.name.compare(path_component) == 0) + { + dir_entry = entry.get(); + + start = end + 1; + end = path.find_first_of(fs::delim, start); + found = true; + break; + } + } + + if (!found) + { + return nullptr; + } + } + while(start < path.size()); + + return dir_entry; +} + +bool iso_archive::exists(const std::string& path) +{ + return retrieve(path) != nullptr; +} + +bool iso_archive::is_file(const std::string& path) +{ + auto file_node = retrieve(path); + if (!file_node) return false; + + return !file_node->metadata.is_directory; +} + +iso_file iso_archive::open(const std::string& path) +{ + return iso_file(fs::file(m_path), *retrieve(path)); +} + +iso_file::iso_file(fs::file&& iso_handle, const iso_fs_node& node) + : m_file(std::move(iso_handle)), m_meta(node.metadata), m_pos(0) +{ + m_file.seek(ISO_BLOCK_SIZE * node.metadata.extents[0].start); +} + +fs::stat_t iso_file::get_stat() +{ + return fs::stat_t + { + .is_directory = false, + .is_symlink = false, + .is_writable = false, + .size = size(), + .atime = m_meta.time, + .mtime = m_meta.time, + .ctime = m_meta.time + }; +} + +bool iso_file::trunc(u64) +{ + fs::g_tls_error = fs::error::readonly; + return false; +} + +std::pair iso_file::get_extent_pos(u64 pos) const +{ + auto it = m_meta.extents.begin(); + + while(pos >= it->size && it < m_meta.extents.end() - 1) + { + pos -= it->size; + + it++; + } + + return {pos, *it}; +} + +// assumed valid and in bounds. +u64 iso_file::file_offset(u64 pos) const +{ + auto [local_pos, extent] = get_extent_pos(pos); + + return (extent.start * ISO_BLOCK_SIZE) + local_pos; +} + +u64 iso_file::local_extent_remaining(u64 pos) const +{ + auto [local_pos, extent] = get_extent_pos(pos); + + return extent.size - local_pos; +} + +u64 iso_file::local_extent_size(u64 pos) const +{ + return get_extent_pos(pos).second.size; +} + +u64 iso_file::read(void* buffer, u64 size) +{ + auto r = read_at(m_pos, buffer, size); + m_pos += r; + return r; +} + +u64 iso_file::read_at(u64 offset, void* buffer, u64 size) +{ + const u64 bad_res = -1; + u64 local_remaining = local_extent_remaining(offset); + + u64 total_read = m_file.read_at(file_offset(offset), buffer, std::min(size, local_remaining)); + if (total_read == bad_res) return -1; + + auto total_size = this->size(); + + if (size > total_read && (offset + total_read) < total_size) + { + u64 second_total_read = read_at(offset + total_read, + static_cast(buffer) + total_read, + size - total_read + ); + + if (second_total_read == bad_res) return -1; + + return total_read + second_total_read; + } + + return total_read; +} + +u64 iso_file::write(const void*, u64) +{ + fs::g_tls_error = fs::error::readonly; + return 0; +} + +u64 iso_file::seek(s64 offset, fs::seek_mode whence) +{ + const s64 total_size = size(); + const s64 new_pos = + whence == fs::seek_set ? offset : + whence == fs::seek_cur ? offset + m_pos : + whence == fs::seek_end ? offset + total_size : -1; + + if (new_pos < 0) + { + fs::g_tls_error = fs::error::inval; + return -1; + } + + const u64 bad_res = -1; + + u64 result = m_file.seek(file_offset(m_pos)); + if (result == bad_res) return -1; + + m_pos = new_pos; + return m_pos; +} + +u64 iso_file::size() +{ + u64 extent_sizes = 0; + for (const auto& extent : m_meta.extents) + { + extent_sizes += extent.size; + } + + return extent_sizes; +} + +void iso_file::release() +{ + m_file.release(); +} + +bool iso_dir::read(fs::dir_entry& entry) +{ + if (m_pos < m_node.children.size()) + { + auto& selected = m_node.children[m_pos].get()->metadata; + u64 size = selected.size(); + + entry.name = selected.name; + entry.atime = selected.time; + entry.mtime = selected.time; + entry.ctime = selected.time; + entry.is_directory = selected.is_directory; + entry.is_symlink = false; + entry.is_writable = false; + entry.size = size; + + m_pos++; + + return true; + } + + return false; +} + +bool iso_device::stat(const std::string& path, fs::stat_t& info) +{ + auto relative_path = std::filesystem::relative(std::filesystem::path(path), + std::filesystem::path(fs_prefix)).string(); + + auto node = m_archive.retrieve(relative_path); + if (!node) + { + fs::g_tls_error = fs::error::noent; + return false; + } + + auto& meta = node->metadata; + u64 size = meta.size(); + + info = fs::stat_t + { + .is_directory = meta.is_directory, + .is_symlink = false, + .is_writable = false, + .size = size, + .atime = meta.time, + .mtime = meta.time, + .ctime = meta.time + }; + + return true; +} + +bool iso_device::statfs(const std::string& path, fs::device_stat& info) +{ + auto relative_path = std::filesystem::relative(std::filesystem::path(path), + std::filesystem::path(fs_prefix)).string(); + + auto node = m_archive.retrieve(relative_path); + if (!node) + { + fs::g_tls_error = fs::error::noent; + return false; + } + + auto& meta = node->metadata; + u64 size = meta.size(); + + info = fs::device_stat + { + .block_size=size, + .total_size=size, + .total_free=0, + .avail_free=0 + }; + + return false; +} + +std::unique_ptr iso_device::open(const std::string& path, bs_t mode) +{ + auto relative_path = std::filesystem::relative(std::filesystem::path(path), + std::filesystem::path(fs_prefix)).string(); + + auto node = m_archive.retrieve(relative_path); + if (!node) + { + fs::g_tls_error = fs::error::noent; + return nullptr; + } + + if (node->metadata.is_directory) + { + fs::g_tls_error = fs::error::isdir; + return nullptr; + } + + return std::make_unique(fs::file(iso_path), *node); +} + +std::unique_ptr iso_device::open_dir(const std::string& path) +{ + auto relative_path = std::filesystem::relative(std::filesystem::path(path), + std::filesystem::path(fs_prefix)).string(); + + auto node = m_archive.retrieve(relative_path); + if (!node) + { + fs::g_tls_error = fs::error::noent; + return nullptr; + } + + if (!node->metadata.is_directory) + { + // fs::dir::open -> ::readdir should return ENOTDIR when path is + // pointing to a file instead of a folder, which translates to error::unknown. + // doing the same here. + fs::g_tls_error = fs::error::unknown; + } + + return std::make_unique(*node); +} + +void iso_dir::rewind() +{ + m_pos = 0; +} + +void load_iso(const std::string& path) +{ + fs::set_virtual_device("iso_overlay_fs_dev", + stx::shared_ptr()); + + fs::set_virtual_device("iso_overlay_fs_dev", + stx::make_shared(path)); +} diff --git a/rpcs3/Loader/ISO.h b/rpcs3/Loader/ISO.h new file mode 100644 index 0000000000..bc3d1faa2b --- /dev/null +++ b/rpcs3/Loader/ISO.h @@ -0,0 +1,112 @@ +#pragma once + +#include "Utilities/File.h" +#include "util/types.hpp" + +bool is_file_iso(const std::string& path); +bool is_file_iso(const fs::file& path); + +void load_iso(const std::string& path); + +struct iso_extent_info +{ + u64 start; + u64 size; +}; + +struct iso_fs_metadata +{ + std::string name; + s64 time; + bool is_directory; + bool has_multiple_extents; + std::vector extents; + + u64 size() const; +}; + +struct iso_fs_node +{ + iso_fs_metadata metadata; + std::vector> children; +}; + +class iso_file : public fs::file_base +{ + fs::file m_file; + iso_fs_metadata m_meta; + u64 m_pos; + + std::pair get_extent_pos(u64 pos) const; + u64 file_offset(u64 pos) const; + u64 local_extent_remaining(u64 pos) const; + u64 local_extent_size(u64 pos) const; + + public: + iso_file(fs::file&& iso_handle, const iso_fs_node& node); + + fs::stat_t get_stat() override; + bool trunc(u64 length) override; + u64 read(void* buffer, u64 size) override; + u64 read_at(u64 offset, void* buffer, u64 size) override; + u64 write(const void* buffer, u64 size) override; + u64 seek(s64 offset, fs::seek_mode whence) override; + u64 size() override; + + void release() override; +}; + +class iso_dir : public fs::dir_base +{ + const iso_fs_node& m_node; + u64 m_pos; + + public: + iso_dir(const iso_fs_node& node) + : m_node(node), m_pos(0) + {} + + bool read(fs::dir_entry&) override; + void rewind() override; +}; + +// represents the .iso file itself. +class iso_archive +{ + std::string m_path; + iso_fs_node m_root; + fs::file m_file; + + public: + iso_archive(const std::string& path); + + iso_fs_node* retrieve(const std::string& path); + bool exists(const std::string& path); + bool is_file(const std::string& path); + + iso_file open(const std::string& path); +}; + +class iso_device : public fs::device_base +{ + iso_archive m_archive; + std::string iso_path; + + public: + inline static std::string virtual_device_name = "/vfsv0_virtual_iso_overlay_fs_dev"; + + iso_device(const std::string& iso_path, const std::string& device_name = virtual_device_name) + : m_archive(iso_path), iso_path(iso_path) + { + fs_prefix = device_name; + } + ~iso_device() override = default; + + const std::string& get_loaded_iso() const { return iso_path; } + + bool stat(const std::string& path, fs::stat_t& info) override; + bool statfs(const std::string& path, fs::device_stat& info) override; + + std::unique_ptr open(const std::string& path, bs_t mode) override; + std::unique_ptr open_dir(const std::string& path) override; +}; diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 357dfe238d..7f3be85a13 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -540,6 +540,7 @@ + @@ -1021,6 +1022,7 @@ + @@ -1096,4 +1098,4 @@ - \ No newline at end of file + From 990e0027829b9a5a4742fa363bb3a10cac4576b6 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:33:05 +0000 Subject: [PATCH 082/630] ISO: Modify game boot for ISOs This commit modifies code in System.cpp to allow games to boot from ISO images. Game data is loaded by leveraging fs::set_virtual_device, and setting the m_path to the ISO device location. This commit also modifies the resolve_path callback to return the path it was given if it wasn't found in the OS. This is necessary as Emulator::GetFakeCat will return "HG" on disc games, making games unplayable through ISO. --- rpcs3/Emu/System.cpp | 39 +++++++++++++++++++++++++++++++++++++- rpcs3/main_application.cpp | 3 ++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 651c220b60..006c0264c3 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -34,6 +34,7 @@ #include "Loader/PSF.h" #include "Loader/TAR.h" +#include "Loader/ISO.h" #include "Loader/ELF.h" #include "Loader/disc.h" @@ -1078,6 +1079,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, sys_log.notice("Path: %s", m_path); std::string inherited_ps3_game_path; + bool launching_from_disc_archive = false; { Init(); @@ -1421,6 +1423,28 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, } const std::string resolved_path = GetCallbacks().resolve_path(m_path); + if (is_file_iso(m_path)) + { + load_iso(m_path); + + std::string path = iso_device::virtual_device_name + "/"; + + vfs::mount("/dev_bdvd/"sv, path); + + // ISOs that are install discs will error if set to EBOOT.BIN + // so this should cover both of them + if (fs::exists(path + "PS3_GAME/USRDIR/EBOOT.BIN")) + { + path = path + "PS3_GAME/USRDIR/EBOOT.BIN"; + } + + m_path = path; + + m_dir = "/dev_bdvd/PS3_GAME/"; + m_cat = "DG"sv; + + launching_from_disc_archive = true; + } const std::string elf_dir = fs::get_parent_dir(m_path); @@ -1595,8 +1619,14 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, } } + // ISO PKG INSTALL HACK! + if (!m_path.ends_with("EBOOT.BIN") && launching_from_disc_archive) + { + bdvd_dir = m_path; + } + // Special boot mode (directory scan) - if (fs::is_dir(m_path)) + if (fs::is_dir(m_path) && !launching_from_disc_archive) { m_state = system_state::ready; GetCallbacks().on_ready(); @@ -2076,6 +2106,13 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, } } + // ISO has no USRDIR/EBOOT.BIN, and we've examined its PKGDIR and extras. + // time to wrap up + if (!m_path.ends_with("EBOOT.BIN") && launching_from_disc_archive) + { + return game_boot_result::nothing_to_boot; + } + // Check firmware version if (const std::string_view game_fw_version = psf::get_string(_psf, "PS3_SYSTEM_VER", ""); !game_fw_version.empty()) { diff --git a/rpcs3/main_application.cpp b/rpcs3/main_application.cpp index ff3b70f952..aa4d035f27 100644 --- a/rpcs3/main_application.cpp +++ b/rpcs3/main_application.cpp @@ -345,7 +345,8 @@ EmuCallbacks main_application::CreateCallbacks() callbacks.resolve_path = [](std::string_view sv) { // May result in an empty string if path does not exist - return QFileInfo(QString::fromUtf8(sv.data(), static_cast(sv.size()))).canonicalFilePath().toStdString(); + std::string result = QFileInfo(QString::fromUtf8(sv.data(), static_cast(sv.size()))).canonicalFilePath().toStdString(); + return !result.empty() ? result : std::string(sv); }; callbacks.get_font_dirs = []() From d6d7ae35f87dd1b0838851fd3310e609dfb2a8c7 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:41:36 +0000 Subject: [PATCH 083/630] ISO: Add games to games list --- rpcs3/Emu/games_config.cpp | 11 ++++++ rpcs3/rpcs3qt/game_list_frame.cpp | 66 ++++++++++++++++++++++++++++--- 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/games_config.cpp b/rpcs3/Emu/games_config.cpp index cfa43f6e15..ad6daff193 100644 --- a/rpcs3/Emu/games_config.cpp +++ b/rpcs3/Emu/games_config.cpp @@ -4,6 +4,8 @@ #include "util/yaml.hpp" #include "Utilities/File.h" +#include "Loader/ISO.h" + LOG_CHANNEL(cfg_log, "CFG"); games_config::games_config() @@ -44,6 +46,15 @@ std::string games_config::get_path(const std::string& title_id) const games_config::result games_config::add_game(const std::string& key, const std::string& path) { + if (path == iso_device::virtual_device_name + "/") + { + auto device = fs::get_virtual_device(iso_device::virtual_device_name + "/"); + if (!device) return result::failure; + + auto iso_device = dynamic_cast(device.get()); + return add_game(key, iso_device->get_loaded_iso()); + } + std::lock_guard lock(m_mutex); // Access or create node if does not exist diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 9563c46fb5..219b4075b8 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -15,6 +15,7 @@ #include "Emu/vfs_config.h" #include "Emu/system_utils.hpp" #include "Loader/PSF.h" +#include "Loader/ISO.h" #include "util/types.hpp" #include "Utilities/File.h" #include "util/sysinfo.hpp" @@ -522,13 +523,46 @@ void game_list_frame::OnParsingFinished() const auto add_game = [this, localized_title, localized_icon, localized_movie, dev_flash, cat_unknown_localized = localized.category.unknown.toStdString(), cat_unknown = cat::cat_unknown.toStdString(), game_icon_path, _hdd, play_hover_movies = m_play_hover_movies, show_custom_icons = m_show_custom_icons](const std::string& dir_or_elf) { + const auto load_game_psf = [&dir_or_elf](const std::string& sfo_path, const std::unique_ptr& archive) + { + if (!archive) return psf::load_object(sfo_path); + + // HACK: psf does not accept a file_base argument, + // so we are creating a dummy fs:file and replacing the internal file_base handle with an iso_file + // instead. + fs::file psf_file(sfo_path); + psf_file.reset(std::make_unique(fs::file(dir_or_elf), *archive->retrieve(sfo_path))); + + return psf::load_object(psf_file, sfo_path); + }; + + std::unique_ptr archive; + if (is_file_iso(dir_or_elf)) + { + archive = std::make_unique(dir_or_elf); + } + + const auto file_exists = [&archive](const std::string& path) + { + if (!archive) return fs::is_file(path); + return archive->is_file(path); + }; + gui_game_info game{}; game.info.path = dir_or_elf; + if (archive) + { + fs::stat_t iso_stat; + fs::get_stat(game.info.path, iso_stat); + + game.info.size_on_disk = iso_stat.size; + } + const Localized thread_localized; - const std::string sfo_dir = rpcs3::utils::get_sfo_dir_from_game_path(dir_or_elf); - const psf::registry psf = psf::load_object(sfo_dir + "/PARAM.SFO"); + const std::string sfo_dir = !archive ? rpcs3::utils::get_sfo_dir_from_game_path(dir_or_elf) : "PS3_GAME"; + const psf::registry psf = load_game_psf(sfo_dir + "/PARAM.SFO", archive); const std::string_view title_id = psf::get_string(psf, "TITLE_ID", ""); if (title_id.empty()) @@ -596,7 +630,7 @@ void game_list_frame::OnParsingFinished() if (game.info.icon_path.empty()) { - if (std::string icon_path = sfo_dir + "/" + localized_icon; fs::is_file(icon_path)) + if (std::string icon_path = sfo_dir + "/" + localized_icon; file_exists(icon_path)) { game.info.icon_path = std::move(icon_path); } @@ -604,19 +638,35 @@ void game_list_frame::OnParsingFinished() { game.info.icon_path = sfo_dir + "/ICON0.PNG"; } + + if (!game.info.icon_path.empty() && archive) + { + if (!archive->exists(game.info.icon_path)) return; + + auto icon_file = archive->open(game.info.icon_path); + auto icon_size = icon_file.size(); + QByteArray data(icon_size, 0); + icon_file.read(data.data(), icon_size); + QImage iconImage; + if (iconImage.loadFromData(data)) + { + game.icon = QPixmap::fromImage(iconImage); + } + game.info.icon_path.clear(); + } } - if (std::string movie_path = game_icon_path + game.info.serial + "/hover.gif"; fs::is_file(movie_path)) + if (std::string movie_path = game_icon_path + game.info.serial + "/hover.gif"; file_exists(movie_path)) { game.info.movie_path = std::move(movie_path); game.has_hover_gif = true; } - else if (std::string movie_path = sfo_dir + "/" + localized_movie; fs::is_file(movie_path)) + else if (std::string movie_path = sfo_dir + "/" + localized_movie; file_exists(movie_path)) { game.info.movie_path = std::move(movie_path); game.has_hover_pam = true; } - else if (std::string movie_path = sfo_dir + "/ICON1.PAM"; fs::is_file(movie_path)) + else if (std::string movie_path = sfo_dir + "/ICON1.PAM"; file_exists(movie_path)) { game.info.movie_path = std::move(movie_path); game.has_hover_pam = true; @@ -741,6 +791,10 @@ void game_list_frame::OnParsingFinished() add_disc_dir(entry.path, legit_paths); } + else if (is_file_iso(entry.path)) + { + push_path(entry.path, legit_paths); + } else { game_list_log.trace("Invalid game path registered: %s", entry.path); From 1d2f6404c6eb086d1ceb52aca9ce31296b5647f4 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:36:43 +0000 Subject: [PATCH 084/630] ISO: Fix for save states --- rpcs3/Emu/System.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 006c0264c3..f7659af23a 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -783,7 +783,7 @@ bool Emulator::BootRsxCapture(const std::string& path) std::unique_ptr frame = std::make_unique(); utils::serial load; load.set_reading_state(); - + const std::string lower = fmt::to_lower(path); if (lower.ends_with(".gz") || lower.ends_with(".zst")) @@ -1408,6 +1408,10 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, m_path = rpcs3::utils::get_hdd1_dir(); m_path += std::string_view(argv[0]).substr(9); } + else if (is_file_iso(argv[0])) + { + m_path = argv[0]; + } else { sys_log.error("Unknown source for path redirection: %s", argv[0]); @@ -1818,6 +1822,10 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, sys_log.error("Failed to move disc game %s to '%s' (%s)", m_title_id, dst_dir, fs::g_tls_error); return game_boot_result::wrong_disc_location; } + else if (launching_from_disc_archive) + { + bdvd_dir = iso_device::virtual_device_name + "/"; + } } if (bdvd_dir.empty() && disc.empty() && !is_disc_patch) @@ -3405,7 +3413,7 @@ void Emulator::Kill(bool allow_autoexit, bool savestate, savestate_stage* save_s { if (spu.first->pc != spu.second || spu.first->unsavable) { - std::string dump; + std::string dump; spu.first->dump_all(dump); sys_log.error("SPU thread continued after being paused. (old_pc=0x%x, pc=0x%x, unsavable=%d)", spu.second, spu.first->pc, spu.first->unsavable); @@ -3583,7 +3591,17 @@ void Emulator::Kill(bool allow_autoexit, bool savestate, savestate_stage* save_s ar(std::array{}); // Reserved for future use - if (auto dir = vfs::get("/dev_bdvd/PS3_GAME"); fs::is_dir(dir) && !fs::is_file(fs::get_parent_dir(dir) + "/PS3_DISC.SFB")) + // Game mounted from archive + if (m_path.starts_with(iso_device::virtual_device_name + "/")) + { + auto device = fs::get_virtual_device(iso_device::virtual_device_name + "/"); + ensure(device); + + auto iso_device = dynamic_cast(device.get()); + ar(iso_device->get_loaded_iso()); + ar(m_title_id); + } + else if (auto dir = vfs::get("/dev_bdvd/PS3_GAME"); fs::is_dir(dir) && !fs::is_file(fs::get_parent_dir(dir) + "/PS3_DISC.SFB")) { // Fake /dev_bdvd/PS3_GAME detected, use HDD0 for m_path restoration ensure(vfs::unmount("/dev_bdvd/PS3_GAME")); From ab45b1bf6176f48192b2f7ea4b580921ff8dcd6a Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:38:54 +0000 Subject: [PATCH 085/630] ISO: Fix icons in savestate_manager_dialog --- rpcs3/rpcs3qt/savestate_manager_dialog.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp index ed664e1b65..7df0e235ca 100644 --- a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp @@ -208,7 +208,7 @@ savestate_manager_dialog::savestate_manager_dialog(std::shared_ptr m_savestate_table->create_header_actions(m_savestate_column_acts, [this](int col) { return m_gui_settings->GetSavestateListColVisibility(static_cast(col)); }, [this](int col, bool visible) { m_gui_settings->SetSavestateListColVisibility(static_cast(col), visible); }); - + m_game_table->create_header_actions(m_game_column_acts, [this](int col) { return m_gui_settings->GetSavestateGamelistColVisibility(static_cast(col)); }, [this](int col, bool visible) { m_gui_settings->SetSavestateGamelistColVisibility(static_cast(col), visible); }); @@ -445,6 +445,18 @@ void savestate_manager_dialog::ResizeGameIcons() } } + if (icon.isNull()) + { + for (const game_info& gameinfo : m_game_info) + { + if (gameinfo && gameinfo->info.serial == m_savestate_db[savestate_index]->title_id) + { + icon = gameinfo->icon; + break; + } + } + } + if (cancel && cancel->load()) { return; From eff25ed0aaf491db6f676dd4cdd842cd28b077f8 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:42:01 +0000 Subject: [PATCH 086/630] ISO: Fix game movie icons --- rpcs3/rpcs3qt/game_list_table.cpp | 8 +++++ rpcs3/rpcs3qt/qt_video_source.cpp | 59 +++++++++++++++++++++++++------ rpcs3/rpcs3qt/qt_video_source.h | 2 ++ 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_table.cpp b/rpcs3/rpcs3qt/game_list_table.cpp index c3069ef67e..a91141eb57 100644 --- a/rpcs3/rpcs3qt/game_list_table.cpp +++ b/rpcs3/rpcs3qt/game_list_table.cpp @@ -11,6 +11,8 @@ #include "Emu/vfs_config.h" #include "Utilities/StrUtil.h" +#include "Loader/ISO.h" + #include #include #include @@ -242,6 +244,12 @@ void game_list_table::populate( custom_table_widget_item* icon_item = new custom_table_widget_item; game->item = icon_item; + if (is_file_iso(game->info.path) && !game->info.movie_path.empty() + && !fs::exists(game->info.movie_path)) + { + icon_item->set_source_path(game->info.path); + } + icon_item->set_image_change_callback([this, icon_item, game](const QVideoFrame& frame) { if (!icon_item || !game) diff --git a/rpcs3/rpcs3qt/qt_video_source.cpp b/rpcs3/rpcs3qt/qt_video_source.cpp index 107e5ef850..81e6d98e55 100644 --- a/rpcs3/rpcs3qt/qt_video_source.cpp +++ b/rpcs3/rpcs3qt/qt_video_source.cpp @@ -2,6 +2,8 @@ #include "Emu/System.h" #include "qt_video_source.h" +#include "Loader/ISO.h" + #include qt_video_source::qt_video_source() @@ -19,6 +21,11 @@ void qt_video_source::set_video_path(const std::string& video_path) m_video_path = QString::fromStdString(video_path); } +void qt_video_source::set_source_path(const std::string& source_path) +{ + m_source_path = QString::fromStdString(source_path); +} + void qt_video_source::set_active(bool active) { if (m_active.exchange(active) == active) return; @@ -55,7 +62,7 @@ void qt_video_source::init_movie() return; } - if (!m_image_change_callback || m_video_path.isEmpty() || !QFile::exists(m_video_path)) + if (!m_image_change_callback || m_video_path.isEmpty() || (!QFile::exists(m_video_path) && m_source_path.isEmpty())) { m_video_path.clear(); return; @@ -65,8 +72,25 @@ void qt_video_source::init_movie() if (lower.endsWith(".gif")) { - m_movie = std::make_unique(m_video_path); - m_video_path.clear(); + if (m_source_path.isEmpty()) + { + m_movie = std::make_unique(m_video_path); + m_video_path.clear(); + } + else + { + iso_archive archive(m_source_path.toStdString()); + auto movie_file = archive.open(m_video_path.toStdString()); + auto movie_size = movie_file.size(); + m_video_data = QByteArray(movie_size, 0); + movie_file.read(m_video_data.data(), movie_size); + + QBuffer buffer(&m_video_data); + buffer.open(QIODevice::ReadOnly); + m_movie = std::make_unique(&buffer); + + m_video_path.clear(); + } if (!m_movie->isValid()) { @@ -85,17 +109,30 @@ void qt_video_source::init_movie() if (lower.endsWith(".pam")) { // We can't set PAM files as source of the video player, so we have to feed them as raw data. - QFile file(m_video_path); - if (!file.open(QFile::OpenModeFlag::ReadOnly)) + if (m_source_path.isEmpty()) { - return; - } + QFile file(m_video_path); + if (!file.open(QFile::OpenModeFlag::ReadOnly)) + { + return; + } - // TODO: Decode the pam properly before pushing it to the player - m_video_data = file.readAll(); - if (m_video_data.isEmpty()) + // TODO: Decode the pam properly before pushing it to the player + m_video_data = file.readAll(); + if (m_video_data.isEmpty()) + { + return; + } + } + else { - return; + auto source_path = m_source_path.toStdString(); + auto video_path = m_video_path.toStdString(); + iso_archive archive(source_path.c_str()); + auto movie_file = archive.open(video_path); + auto movie_size = movie_file.size(); + m_video_data = QByteArray(movie_size, 0); + movie_file.read(m_video_data.data(), movie_size); } m_video_buffer = std::make_unique(&m_video_data); diff --git a/rpcs3/rpcs3qt/qt_video_source.h b/rpcs3/rpcs3qt/qt_video_source.h index a2710eea33..1f195def02 100644 --- a/rpcs3/rpcs3qt/qt_video_source.h +++ b/rpcs3/rpcs3qt/qt_video_source.h @@ -17,6 +17,7 @@ public: qt_video_source(); virtual ~qt_video_source(); + void set_source_path(const std::string& source_path); void set_video_path(const std::string& video_path) override; const QString& video_path() const { return m_video_path; } @@ -43,6 +44,7 @@ protected: atomic_t m_has_new = false; QString m_video_path; + QString m_source_path; // path of the source archive QByteArray m_video_data{}; QImage m_image{}; std::vector m_image_path; From 673cc040faff80ae6607f9e91ec2add128df86b1 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Mon, 8 Dec 2025 21:19:09 +0000 Subject: [PATCH 087/630] ISO: Add UI support Adds ISO file type to load dialog and allows launching ISO games via drag and drop. --- rpcs3/rpcs3qt/main_window.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 485f7e3f22..0456da3502 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -569,6 +569,7 @@ void main_window::BootElf() "SELF files (EBOOT.BIN *.self);;" "BOOT files (*BOOT.BIN);;" "BIN files (*.bin);;" + "ISO files (*.iso);;" "All executable files (*.SAVESTAT.zst *.SAVESTAT.gz *.SAVESTAT *.sprx *.SPRX *.self *.SELF *.bin *.BIN *.prx *.PRX *.elf *.ELF *.o *.O);;" "All files (*.*)"), Q_NULLPTR, QFileDialog::DontResolveSymlinks); @@ -4019,7 +4020,7 @@ main_window::drop_type main_window::IsValidFile(const QMimeData& md, QStringList type = drop_type::drop_rrc; } // The emulator allows to execute ANY filetype, just not from drag-and-drop because it is confusing to users - else if (path.toLower().endsWith(".savestat.gz") || path.toLower().endsWith(".savestat.zst") || suffix_lo == "savestat" || suffix_lo == "sprx" || suffix_lo == "self" || suffix_lo == "bin" || suffix_lo == "prx" || suffix_lo == "elf" || suffix_lo == "o") + else if (path.toLower().endsWith(".savestat.gz") || path.toLower().endsWith(".savestat.zst") || suffix_lo == "savestat" || suffix_lo == "sprx" || suffix_lo == "self" || suffix_lo == "bin" || suffix_lo == "prx" || suffix_lo == "elf" || suffix_lo == "o" || suffix_lo == "iso") { type = drop_type::drop_game; } From acdb0ee72922a82d24a3d568b3bbd23802269980 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Tue, 9 Dec 2025 23:53:57 +0000 Subject: [PATCH 088/630] ISO: Small clean up Cleaning up old comments and fixing small mistakes in ISO.cpp --- rpcs3/Loader/ISO.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index db11f14c84..4ba55fae78 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -7,7 +7,6 @@ #include #include -// TODO: replace with file check for iso! bool is_file_iso(const std::string& path) { if (fs::is_dir(path)) return false; @@ -355,7 +354,7 @@ std::pair iso_file::get_extent_pos(u64 pos) const { auto it = m_meta.extents.begin(); - while(pos >= it->size && it < m_meta.extents.end() - 1) + while(pos >= it->size && it != m_meta.extents.end() - 1) { pos -= it->size; @@ -405,7 +404,7 @@ u64 iso_file::read_at(u64 offset, void* buffer, u64 size) if (size > total_read && (offset + total_read) < total_size) { u64 second_total_read = read_at(offset + total_read, - static_cast(buffer) + total_read, + reinterpret_cast(buffer) + total_read, size - total_read ); @@ -580,6 +579,7 @@ std::unique_ptr iso_device::open_dir(const std::string& path) // pointing to a file instead of a folder, which translates to error::unknown. // doing the same here. fs::g_tls_error = fs::error::unknown; + return nullptr; } return std::make_unique(*node); From 27510f5fa87a60b83dd16ec7cfe57782bf7b3f97 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Sat, 13 Dec 2025 12:05:34 +0000 Subject: [PATCH 089/630] ISO: Move game image loading to game_list_base::IconLoadFunction --- rpcs3/rpcs3qt/game_list_base.cpp | 17 ++++++++++++++++- rpcs3/rpcs3qt/game_list_frame.cpp | 11 +---------- rpcs3/rpcs3qt/gui_game_info.h | 1 + 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_base.cpp b/rpcs3/rpcs3qt/game_list_base.cpp index 51e43c95bf..e4fb012b17 100644 --- a/rpcs3/rpcs3qt/game_list_base.cpp +++ b/rpcs3/rpcs3qt/game_list_base.cpp @@ -1,6 +1,8 @@ #include "stdafx.h" #include "game_list_base.h" +#include "Loader/ISO.h" + #include #include @@ -50,7 +52,20 @@ void game_list_base::IconLoadFunction(game_info game, qreal device_pixel_ratio, if (game->icon.isNull() && (game->info.icon_path.empty() || !game->icon.load(QString::fromStdString(game->info.icon_path)))) { - if (game_list_log.warning) + if (game->icon_in_archive) + { + iso_archive archive(game->info.path); + auto icon_file = archive.open(game->info.icon_path); + auto icon_size = icon_file.size(); + QByteArray data(icon_size, 0); + icon_file.read(data.data(), icon_size); + QImage iconImage; + if (iconImage.loadFromData(data)) + { + game->icon = QPixmap::fromImage(iconImage); + } + } + else if (game_list_log.warning) { bool logged = false; { diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 219b4075b8..6c8dee2a15 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -643,16 +643,7 @@ void game_list_frame::OnParsingFinished() { if (!archive->exists(game.info.icon_path)) return; - auto icon_file = archive->open(game.info.icon_path); - auto icon_size = icon_file.size(); - QByteArray data(icon_size, 0); - icon_file.read(data.data(), icon_size); - QImage iconImage; - if (iconImage.loadFromData(data)) - { - game.icon = QPixmap::fromImage(iconImage); - } - game.info.icon_path.clear(); + game.icon_in_archive = true; } } diff --git a/rpcs3/rpcs3qt/gui_game_info.h b/rpcs3/rpcs3qt/gui_game_info.h index 984f8eb7bf..3b19d27458 100644 --- a/rpcs3/rpcs3qt/gui_game_info.h +++ b/rpcs3/rpcs3qt/gui_game_info.h @@ -20,6 +20,7 @@ struct gui_game_info bool has_custom_icon = false; bool has_hover_gif = false; bool has_hover_pam = false; + bool icon_in_archive = false; movie_item_base* item = nullptr; // Returns the visible version string in the game list From 2533aa02d01269487d09cdbc03a299c200562162 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Sat, 13 Dec 2025 12:51:38 +0000 Subject: [PATCH 090/630] ISO: Don't access m_game_info from icon_load_func --- rpcs3/rpcs3qt/savestate_manager_dialog.cpp | 26 +++++++++++++++------- rpcs3/rpcs3qt/savestate_manager_dialog.h | 1 + 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp index 7df0e235ca..1af19a197c 100644 --- a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp @@ -7,6 +7,8 @@ #include "gui_settings.h" #include "progress_dialog.h" +#include "Loader/ISO.h" + #include #include #include @@ -417,8 +419,9 @@ void savestate_manager_dialog::ResizeGameIcons() const qreal dpr = devicePixelRatioF(); const int savestate_index = item->data(GameUserRole::GameIndex).toInt(); const std::string icon_path = m_savestate_db[savestate_index]->game_icon_path; + const std::string archive_path = m_savestate_db[savestate_index]->archive_path; - item->set_icon_load_func([this, icon_path, savestate_index, cancel = item->icon_loading_aborted(), dpr](int index) + item->set_icon_load_func([this, icon_path, archive_path, savestate_index, cancel = item->icon_loading_aborted(), dpr](int index) { if (cancel && cancel->load()) { @@ -445,15 +448,17 @@ void savestate_manager_dialog::ResizeGameIcons() } } - if (icon.isNull()) + if (!archive_path.empty()) { - for (const game_info& gameinfo : m_game_info) + iso_archive archive(archive_path); + auto icon_file = archive.open(icon_path); + auto icon_size = icon_file.size(); + QByteArray data(icon_size, 0); + icon_file.read(data.data(), icon_size); + QImage iconImage; + if (iconImage.loadFromData(data)) { - if (gameinfo && gameinfo->info.serial == m_savestate_db[savestate_index]->title_id) - { - icon = gameinfo->icon; - break; - } + icon = QPixmap::fromImage(iconImage); } } @@ -629,6 +634,11 @@ void savestate_manager_dialog::StartSavestateLoadThreads() { game_data_ptr->game_name = gameinfo->info.name; game_data_ptr->game_icon_path = gameinfo->info.icon_path; + if (gameinfo->icon_in_archive) + { + game_data_ptr->archive_path = gameinfo->info.path; + } + break; } } diff --git a/rpcs3/rpcs3qt/savestate_manager_dialog.h b/rpcs3/rpcs3qt/savestate_manager_dialog.h index 28c3eddc8c..7a6a39a700 100644 --- a/rpcs3/rpcs3qt/savestate_manager_dialog.h +++ b/rpcs3/rpcs3qt/savestate_manager_dialog.h @@ -48,6 +48,7 @@ private: std::string game_name; std::string game_icon_path; std::string dir_path; + std::string archive_path; }; bool LoadSavestateFolderToDB(std::unique_ptr&& game_savestates); From 257043529ae264fa2f4815aa3aace83199ebd6a7 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Sat, 13 Dec 2025 13:17:13 +0000 Subject: [PATCH 091/630] ISO: Loader improvements - Don't use floating point when advancing sectors - Remove redudndant seek in iso_archive constructor - Drop error code checks in iso_file::read_at - Don't use lexically_normal for handling path in iso_archive::retrieve. More complete directory search implementation. --- rpcs3/Loader/ISO.cpp | 60 ++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index 4ba55fae78..f97d7fd026 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -6,6 +6,7 @@ #include #include #include +#include bool is_file_iso(const std::string& path) { @@ -166,9 +167,7 @@ void iso_form_hierarchy(fs::file& file, iso_fs_node& node, auto entry = iso_read_directory_entry(file, use_ucs2_decoding); if (!entry) { - float block_size = ISO_BLOCK_SIZE; - float t = std::floor(file.pos() / block_size); - u64 new_sector = t+1; + u64 new_sector = (file.pos() / ISO_BLOCK_SIZE) + 1; file.seek(new_sector * ISO_BLOCK_SIZE); continue; } @@ -253,8 +252,6 @@ iso_archive::iso_archive(const std::string& path) { .metadata = iso_read_directory_entry(m_file, use_ucs2_decoding).value(), }; - - m_file.seek(descriptor_start); } m_file.seek(descriptor_start + ISO_BLOCK_SIZE); @@ -266,15 +263,19 @@ iso_archive::iso_archive(const std::string& path) iso_fs_node* iso_archive::retrieve(const std::string& passed_path) { - std::string path = std::filesystem::path(passed_path).lexically_normal().string(); + std::string path = std::filesystem::path(passed_path).string(); size_t start = 0; size_t end = path.find_first_of(fs::delim); - auto dir_entry = &m_root; + std::stack search_stack; + search_stack.push(&m_root); do { + if (search_stack.empty()) return nullptr; + auto* top_entry = search_stack.top(); + if (end == std::string::npos) { end = path.size(); @@ -283,27 +284,40 @@ iso_fs_node* iso_archive::retrieve(const std::string& passed_path) auto path_component = path.substr(start, end-start); bool found = false; - for (const auto& entry : dir_entry->children) - { - if (entry->metadata.name.compare(path_component) == 0) - { - dir_entry = entry.get(); - start = end + 1; - end = path.find_first_of(fs::delim, start); - found = true; - break; + if (path_component == ".") + { + found = true; + } + else if (path_component == "..") + { + search_stack.pop(); + found = true; + } + else + { + for (const auto& entry : top_entry->children) + { + if (entry->metadata.name.compare(path_component) == 0) + { + search_stack.push(entry.get()); + + found = true; + break; + } } } - if (!found) - { - return nullptr; - } + if (!found) return nullptr; + + start = end + 1; + end = path.find_first_of(fs::delim, start); } while(start < path.size()); - return dir_entry; + if (search_stack.empty()) return nullptr; + + return search_stack.top(); } bool iso_archive::exists(const std::string& path) @@ -393,11 +407,9 @@ u64 iso_file::read(void* buffer, u64 size) u64 iso_file::read_at(u64 offset, void* buffer, u64 size) { - const u64 bad_res = -1; u64 local_remaining = local_extent_remaining(offset); u64 total_read = m_file.read_at(file_offset(offset), buffer, std::min(size, local_remaining)); - if (total_read == bad_res) return -1; auto total_size = this->size(); @@ -408,8 +420,6 @@ u64 iso_file::read_at(u64 offset, void* buffer, u64 size) size - total_read ); - if (second_total_read == bad_res) return -1; - return total_read + second_total_read; } From 48f39acac7e68a260c265224def79e810eac94f3 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Sat, 13 Dec 2025 14:02:09 +0000 Subject: [PATCH 092/630] ISO: Unload the iso_device on shutdown --- rpcs3/Emu/System.cpp | 1 + rpcs3/Loader/ISO.cpp | 9 ++++++--- rpcs3/Loader/ISO.h | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index f7659af23a..0325807e1e 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -3886,6 +3886,7 @@ void Emulator::Kill(bool allow_autoexit, bool savestate, savestate_stage* save_s disc.clear(); klic.clear(); hdd1.clear(); + unload_iso(); init_mem_containers = nullptr; m_config_path.clear(); m_config_mode = cfg_mode::custom; diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index f97d7fd026..bee017a59d 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -602,9 +602,12 @@ void iso_dir::rewind() void load_iso(const std::string& path) { - fs::set_virtual_device("iso_overlay_fs_dev", - stx::shared_ptr()); - fs::set_virtual_device("iso_overlay_fs_dev", stx::make_shared(path)); } + +void unload_iso() +{ + fs::set_virtual_device("iso_overlay_fs_dev", + stx::shared_ptr()); +} diff --git a/rpcs3/Loader/ISO.h b/rpcs3/Loader/ISO.h index bc3d1faa2b..f986899db8 100644 --- a/rpcs3/Loader/ISO.h +++ b/rpcs3/Loader/ISO.h @@ -7,6 +7,7 @@ bool is_file_iso(const std::string& path); bool is_file_iso(const fs::file& path); void load_iso(const std::string& path); +void unload_iso(); struct iso_extent_info { From fa11af1cbab32855bfdc034f3f6725dd4a901e6f Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Sun, 14 Dec 2025 13:08:34 +0000 Subject: [PATCH 093/630] ISO: Remove resolve_path hack - Modify Emulator::GetFakeCat to return "DG" for mounted ISO games like expected. - Undo changes to main_application resolve_path callback --- rpcs3/Emu/System.cpp | 2 +- rpcs3/main_application.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 0325807e1e..8cd25fdf35 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -4387,7 +4387,7 @@ const std::string& Emulator::GetFakeCat() const { const std::string mount_point = vfs::get("/dev_bdvd"); - if (mount_point.empty() || !IsPathInsideDir(m_path, mount_point)) + if (mount_point.empty() || (!IsPathInsideDir(m_path, mount_point) && !m_path.starts_with(iso_device::virtual_device_name))) { static const std::string s_hg = "HG"; return s_hg; diff --git a/rpcs3/main_application.cpp b/rpcs3/main_application.cpp index aa4d035f27..ff3b70f952 100644 --- a/rpcs3/main_application.cpp +++ b/rpcs3/main_application.cpp @@ -345,8 +345,7 @@ EmuCallbacks main_application::CreateCallbacks() callbacks.resolve_path = [](std::string_view sv) { // May result in an empty string if path does not exist - std::string result = QFileInfo(QString::fromUtf8(sv.data(), static_cast(sv.size()))).canonicalFilePath().toStdString(); - return !result.empty() ? result : std::string(sv); + return QFileInfo(QString::fromUtf8(sv.data(), static_cast(sv.size()))).canonicalFilePath().toStdString(); }; callbacks.get_font_dirs = []() From 095f433f8ee51e0cd4e625f27d83836844d223e0 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 18:18:14 +0000 Subject: [PATCH 094/630] ISO: Fix loading games in continuous mode Some games will load into another game and continuous mode will be set. Currently, if this happens the ISO will get unloaded in the shutdown function. This commit adds an additional check before calling the unload function to fix this. --- rpcs3/Emu/System.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 8cd25fdf35..f0addb4be1 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -3886,7 +3886,6 @@ void Emulator::Kill(bool allow_autoexit, bool savestate, savestate_stage* save_s disc.clear(); klic.clear(); hdd1.clear(); - unload_iso(); init_mem_containers = nullptr; m_config_path.clear(); m_config_mode = cfg_mode::custom; @@ -3896,6 +3895,11 @@ void Emulator::Kill(bool allow_autoexit, bool savestate, savestate_stage* save_s m_emu_state_close_pending = false; m_precompilation_option = {}; + if (!m_continuous_mode) + { + unload_iso(); + } + initialize_timebased_time(0, true); // Complete the operation From 38daf8d325f606df89edbe478d1c09760485901f Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 18:36:25 +0000 Subject: [PATCH 095/630] ISO: Add empty path check to iso_archive::retrieve --- rpcs3/Loader/ISO.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index bee017a59d..9804407767 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -263,6 +263,8 @@ iso_archive::iso_archive(const std::string& path) iso_fs_node* iso_archive::retrieve(const std::string& passed_path) { + if (passed_path.empty()) return nullptr; + std::string path = std::filesystem::path(passed_path).string(); size_t start = 0; From 4cd75971f0024199de44d5b055d4a0eec9afb502 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 18:39:05 +0000 Subject: [PATCH 096/630] ISO: Move code to load psf::registry into iso_archive - Multiple places end up needing to retrieve a psf::registry from an is o archive. - Added a safety check along with this --- rpcs3/Loader/ISO.cpp | 13 +++++++++++++ rpcs3/Loader/ISO.h | 4 ++++ rpcs3/rpcs3qt/game_list_frame.cpp | 17 +++-------------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index 9804407767..3c3a0a8c20 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -340,6 +340,19 @@ iso_file iso_archive::open(const std::string& path) return iso_file(fs::file(m_path), *retrieve(path)); } +psf::registry iso_archive::open_psf(const std::string& path) +{ + auto* archive_file = retrieve(path); + if (!archive_file) return psf::registry(); + + // HACK: psf does not accept a file_base argument, + // instead we are creating a dummy fs::file and replacing the internal file_base handle with an iso_file + fs::file psf_file(path); + psf_file.reset(std::make_unique(fs::file(m_path), *archive_file)); + + return psf::load_object(psf_file, path); +} + iso_file::iso_file(fs::file&& iso_handle, const iso_fs_node& node) : m_file(std::move(iso_handle)), m_meta(node.metadata), m_pos(0) { diff --git a/rpcs3/Loader/ISO.h b/rpcs3/Loader/ISO.h index f986899db8..55c8b99f16 100644 --- a/rpcs3/Loader/ISO.h +++ b/rpcs3/Loader/ISO.h @@ -1,5 +1,7 @@ #pragma once +#include "Loader/PSF.h" + #include "Utilities/File.h" #include "util/types.hpp" @@ -86,6 +88,8 @@ class iso_archive bool is_file(const std::string& path); iso_file open(const std::string& path); + + psf::registry open_psf(const std::string& path); }; class iso_device : public fs::device_base diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 6c8dee2a15..34aa4147f2 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -523,19 +523,6 @@ void game_list_frame::OnParsingFinished() const auto add_game = [this, localized_title, localized_icon, localized_movie, dev_flash, cat_unknown_localized = localized.category.unknown.toStdString(), cat_unknown = cat::cat_unknown.toStdString(), game_icon_path, _hdd, play_hover_movies = m_play_hover_movies, show_custom_icons = m_show_custom_icons](const std::string& dir_or_elf) { - const auto load_game_psf = [&dir_or_elf](const std::string& sfo_path, const std::unique_ptr& archive) - { - if (!archive) return psf::load_object(sfo_path); - - // HACK: psf does not accept a file_base argument, - // so we are creating a dummy fs:file and replacing the internal file_base handle with an iso_file - // instead. - fs::file psf_file(sfo_path); - psf_file.reset(std::make_unique(fs::file(dir_or_elf), *archive->retrieve(sfo_path))); - - return psf::load_object(psf_file, sfo_path); - }; - std::unique_ptr archive; if (is_file_iso(dir_or_elf)) { @@ -562,7 +549,9 @@ void game_list_frame::OnParsingFinished() const Localized thread_localized; const std::string sfo_dir = !archive ? rpcs3::utils::get_sfo_dir_from_game_path(dir_or_elf) : "PS3_GAME"; - const psf::registry psf = load_game_psf(sfo_dir + "/PARAM.SFO", archive); + const std::string sfo_path = sfo_dir + "/PARAM.SFO"; + + const psf::registry psf = !archive ? psf::load_object(sfo_path) : archive->open_psf(sfo_path); const std::string_view title_id = psf::get_string(psf, "TITLE_ID", ""); if (title_id.empty()) From 407cbf9690f55d54ef73b3496891fa8e339b2ea6 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 18:47:12 +0000 Subject: [PATCH 097/630] ISO: Add ISO games through Emulator::AddGamesFromDir - When dragging and dropping ISO files, they will be treated the same as game directories currently are and added to the game list rather than immediately being opened. --- rpcs3/Emu/System.cpp | 35 ++++++++++++++++++++++++++++++++--- rpcs3/rpcs3qt/main_window.cpp | 5 +++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index f0addb4be1..2608de03e3 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -4099,13 +4099,18 @@ u32 Emulator::AddGamesFromDir(const std::string& path) { auto dir_entry = std::move(*path_it); - if (!dir_entry.is_directory || dir_entry.name == "." || dir_entry.name == "..") + if (dir_entry.name == "." || dir_entry.name == "..") { continue; } const std::string dir_path = path + '/' + dir_entry.name; + if (!dir_entry.is_directory && !is_file_iso(dir_path)) + { + continue; + } + if (const game_boot_result error = AddGame(dir_path); error == game_boot_result::no_errors) { games_added++; @@ -4203,10 +4208,17 @@ game_boot_result Emulator::AddGameToYml(const std::string& path) return error; } + std::unique_ptr archive; + if (is_file_iso(path)) + { + archive = std::make_unique(path); + } + // Load PARAM.SFO const std::string elf_dir = fs::get_parent_dir(path); - std::string sfo_dir = rpcs3::utils::get_sfo_dir_from_game_path(fs::get_parent_dir(elf_dir)); - const psf::registry _psf = psf::load_object(sfo_dir + "/PARAM.SFO"); + std::string sfo_dir = !archive ? rpcs3::utils::get_sfo_dir_from_game_path(fs::get_parent_dir(elf_dir)) : "PS3_GAME"; + const std::string sfo_path = sfo_dir + "/PARAM.SFO"; + const psf::registry _psf = !archive ? psf::load_object(sfo_path) : archive->open_psf(sfo_path); const std::string title_id = std::string(psf::get_string(_psf, "TITLE_ID")); const std::string cat = std::string(psf::get_string(_psf, "CATEGORY")); @@ -4229,6 +4241,23 @@ game_boot_result Emulator::AddGameToYml(const std::string& path) return game_boot_result::invalid_file_or_folder; } + // Add ISO game + if (archive) + { + if (cat == "DG") + { + std::string iso_path = path; + switch (m_games_config.add_external_hdd_game(title_id, iso_path)) + { + case games_config::result::failure: return game_boot_result::generic_error; + case games_config::result::success: return game_boot_result::no_errors; + case games_config::result::exists: return game_boot_result::already_added; + } + + return game_boot_result::generic_error; + } + } + // Set bdvd_dir std::string bdvd_dir; std::string game_dir; diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 0456da3502..b32e2ded34 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -78,6 +78,7 @@ #include "Loader/PUP.h" #include "Loader/TAR.h" #include "Loader/PSF.h" +#include "Loader/ISO.h" #include "Loader/mself.hpp" #include "Utilities/Thread.h" @@ -3959,7 +3960,7 @@ main_window::drop_type main_window::IsValidFile(const QMimeData& md, QStringList const QString suffix_lo = info.suffix().toLower(); // check for directories first, only valid if all other paths led to directories until now. - if (info.isDir()) + if (info.isDir() || is_file_iso(path.toStdString())) { if (type != drop_type::drop_dir && type != drop_type::drop_error) { @@ -4020,7 +4021,7 @@ main_window::drop_type main_window::IsValidFile(const QMimeData& md, QStringList type = drop_type::drop_rrc; } // The emulator allows to execute ANY filetype, just not from drag-and-drop because it is confusing to users - else if (path.toLower().endsWith(".savestat.gz") || path.toLower().endsWith(".savestat.zst") || suffix_lo == "savestat" || suffix_lo == "sprx" || suffix_lo == "self" || suffix_lo == "bin" || suffix_lo == "prx" || suffix_lo == "elf" || suffix_lo == "o" || suffix_lo == "iso") + else if (path.toLower().endsWith(".savestat.gz") || path.toLower().endsWith(".savestat.zst") || suffix_lo == "savestat" || suffix_lo == "sprx" || suffix_lo == "self" || suffix_lo == "bin" || suffix_lo == "prx" || suffix_lo == "elf" || suffix_lo == "o") { type = drop_type::drop_game; } From bc1d0b9e6548c09d1f0d612d894146dc3604bbe1 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 18:51:01 +0000 Subject: [PATCH 098/630] ISO: Move game size assignment to size_calc_func in game_list_table.cpp --- rpcs3/rpcs3qt/game_list_frame.cpp | 8 -------- rpcs3/rpcs3qt/game_list_table.cpp | 7 +++++++ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 34aa4147f2..35790c016f 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -538,14 +538,6 @@ void game_list_frame::OnParsingFinished() gui_game_info game{}; game.info.path = dir_or_elf; - if (archive) - { - fs::stat_t iso_stat; - fs::get_stat(game.info.path, iso_stat); - - game.info.size_on_disk = iso_stat.size; - } - const Localized thread_localized; const std::string sfo_dir = !archive ? rpcs3::utils::get_sfo_dir_from_game_path(dir_or_elf) : "PS3_GAME"; diff --git a/rpcs3/rpcs3qt/game_list_table.cpp b/rpcs3/rpcs3qt/game_list_table.cpp index a91141eb57..2ab2013b19 100644 --- a/rpcs3/rpcs3qt/game_list_table.cpp +++ b/rpcs3/rpcs3qt/game_list_table.cpp @@ -285,6 +285,13 @@ void game_list_table::populate( // Do not report size of apps inside /dev_flash (it does not make sense to do so) game->info.size_on_disk = 0; } + else if(is_file_iso(game->info.path)) + { + fs::stat_t iso_stat; + fs::get_stat(game->info.path, iso_stat); + + game->info.size_on_disk = iso_stat.size; + } else { game->info.size_on_disk = fs::get_dir_size(game->info.path, 1, cancel.get()); From 714359b5445935e8fc34deee6a098475ae31b622 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 19:02:27 +0000 Subject: [PATCH 099/630] ISO: Move icon loading to a common function in qt_utils.h --- rpcs3/rpcs3qt/game_list_base.cpp | 17 ++++----------- rpcs3/rpcs3qt/qt_utils.cpp | 24 ++++++++++++++++++++++ rpcs3/rpcs3qt/qt_utils.h | 3 +++ rpcs3/rpcs3qt/savestate_manager_dialog.cpp | 11 +--------- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_base.cpp b/rpcs3/rpcs3qt/game_list_base.cpp index e4fb012b17..4105d754b0 100644 --- a/rpcs3/rpcs3qt/game_list_base.cpp +++ b/rpcs3/rpcs3qt/game_list_base.cpp @@ -1,8 +1,7 @@ #include "stdafx.h" +#include "qt_utils.h" #include "game_list_base.h" -#include "Loader/ISO.h" - #include #include @@ -54,18 +53,10 @@ void game_list_base::IconLoadFunction(game_info game, qreal device_pixel_ratio, { if (game->icon_in_archive) { - iso_archive archive(game->info.path); - auto icon_file = archive.open(game->info.icon_path); - auto icon_size = icon_file.size(); - QByteArray data(icon_size, 0); - icon_file.read(data.data(), icon_size); - QImage iconImage; - if (iconImage.loadFromData(data)) - { - game->icon = QPixmap::fromImage(iconImage); - } + game->icon_in_archive = gui::utils::load_icon(game->icon, game->info.icon_path, game->info.path); } - else if (game_list_log.warning) + + if (!game->icon_in_archive && game_list_log.warning) { bool logged = false; { diff --git a/rpcs3/rpcs3qt/qt_utils.cpp b/rpcs3/rpcs3qt/qt_utils.cpp index fc53dc542a..b10799a453 100644 --- a/rpcs3/rpcs3qt/qt_utils.cpp +++ b/rpcs3/rpcs3qt/qt_utils.cpp @@ -12,6 +12,7 @@ #include "Emu/system_utils.hpp" #include "Utilities/File.h" +#include "Loader/ISO.h" #include LOG_CHANNEL(gui_log, "GUI"); @@ -682,6 +683,29 @@ namespace gui return QString("%1 days ago %2").arg(current_date - exctrated_date).arg(date.toString(fmt_relative)); } + bool load_icon(QPixmap& icon, const std::string& icon_path, + const std::string& archive_path) + { + if (!is_file_iso(archive_path)) return false; + + iso_archive archive(archive_path); + if (!archive.exists(icon_path)) return false; + + auto icon_file = archive.open(icon_path); + auto icon_size = icon_file.size(); + + QByteArray data(icon_size, 0); + icon_file.read(data.data(), icon_size); + QImage iconImage; + + if (iconImage.loadFromData(data)) + { + icon = QPixmap::fromImage(iconImage); + } + + return true; + } + QString format_timestamp(s64 time, const QString& fmt) { return format_datetime(datetime(time), fmt); diff --git a/rpcs3/rpcs3qt/qt_utils.h b/rpcs3/rpcs3qt/qt_utils.h index dc15385923..de2473c083 100644 --- a/rpcs3/rpcs3qt/qt_utils.h +++ b/rpcs3/rpcs3qt/qt_utils.h @@ -178,6 +178,9 @@ namespace gui return color_scheme() == Qt::ColorScheme::Dark; } + // Loads an icon from an (ISO) archive file. + bool load_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path); + template void stop_future_watcher(QFutureWatcher& watcher, bool cancel, std::shared_ptr> cancel_flag = nullptr) { diff --git a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp index 1af19a197c..9e871800e2 100644 --- a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp @@ -450,16 +450,7 @@ void savestate_manager_dialog::ResizeGameIcons() if (!archive_path.empty()) { - iso_archive archive(archive_path); - auto icon_file = archive.open(icon_path); - auto icon_size = icon_file.size(); - QByteArray data(icon_size, 0); - icon_file.read(data.data(), icon_size); - QImage iconImage; - if (iconImage.loadFromData(data)) - { - icon = QPixmap::fromImage(iconImage); - } + gui::utils::load_icon(icon, icon_path, archive_path); } if (cancel && cancel->load()) From 59f9a7c080ac3b55df5ba61857ecf61ab5933370 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 19:45:19 +0000 Subject: [PATCH 100/630] ISO: Use clearer code to set game.icon_in_archive - Suggested change from PR review --- rpcs3/rpcs3qt/game_list_frame.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 35790c016f..4a695c9828 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -619,13 +619,7 @@ void game_list_frame::OnParsingFinished() { game.info.icon_path = sfo_dir + "/ICON0.PNG"; } - - if (!game.info.icon_path.empty() && archive) - { - if (!archive->exists(game.info.icon_path)) return; - - game.icon_in_archive = true; - } + game.icon_in_archive = archive && archive->exists(game.info.icon_path); } if (std::string movie_path = game_icon_path + game.info.serial + "/hover.gif"; file_exists(movie_path)) From a2d76aedaa16edafb033daec4de5c001b27b6a7a Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 20:07:57 +0000 Subject: [PATCH 101/630] ISO: Fix recent actions created when launching ISO games --- rpcs3/rpcs3qt/main_window.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index b32e2ded34..331e25e2fc 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -543,8 +543,16 @@ void main_window::Boot(const std::string& path, const std::string& title_id, boo } else { + std::string game_path = Emu.GetBoot(); + if (game_path.starts_with(iso_device::virtual_device_name)) + { + auto device = fs::get_virtual_device(iso_device::virtual_device_name + "/"); + auto iso_device = dynamic_cast(device.get()); + game_path = iso_device->get_loaded_iso(); + } + gui_log.success("Boot successful."); - AddRecentAction(gui::Recent_Game(QString::fromStdString(Emu.GetBoot()), QString::fromStdString(Emu.GetTitleAndTitleID())), false); + AddRecentAction(gui::Recent_Game(QString::fromStdString(game_path), QString::fromStdString(Emu.GetTitleAndTitleID())), false); } if (refresh_list) From 59a1f81e86fc1424c8ec2ec3263891422fd2c912 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 20:58:13 +0000 Subject: [PATCH 102/630] ISO: Game loading fixes - After undoing the changes to do with resolve_path, loading game updates was broken. This required the condition to be changed to check for launching_from_disc_archive. - When attempting to load an update for an ISO game, inherited_ps3_game_path needs to be set otherwise launching the updated game will fail. - An additional check was added to ensure that the inherited vitual game directory isn't saved as the game path in games.yml. - Fixed attempting to load an updated ISO game by launching its updated executable, which can happen when loading a savestate for a game with updates, the emulator would crash before. - Unload ISO file when Load() fails, otherwise ISO loading might be stuck in a broken state. --- rpcs3/Emu/System.cpp | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 2608de03e3..4f6a4eb680 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -932,6 +932,7 @@ game_boot_result Emulator::BootGame(const std::string& path, const std::string& if (result != game_boot_result::no_errors) { + unload_iso(); GetCallbacks().close_gs_frame(); } } @@ -1184,6 +1185,11 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, // Load /dev_bdvd/ from game list if available if (std::string game_path = m_games_config.get_path(m_title_id); !game_path.empty()) { + if (is_file_iso(game_path)) + { + game_path = iso_device::virtual_device_name + "/PS3_GAME/./"; + } + if (game_path.ends_with("/./")) { // Marked as PS3_GAME directory @@ -1840,6 +1846,13 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, // Load /dev_bdvd/ from game list if available if (std::string game_path = m_games_config.get_path(m_title_id); !game_path.empty()) { + if (is_file_iso(game_path)) + { + load_iso(game_path); + launching_from_disc_archive = true; + game_path = iso_device::virtual_device_name + "/PS3_GAME/./"; + } + if (game_path.ends_with("/./")) { // Marked as PS3_GAME directory @@ -1967,21 +1980,28 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, } // TODO: Verify timestamps and error codes with sys_fs - vfs::mount("/dev_bdvd", bdvd_dir); - vfs::mount("/dev_bdvd/PS3_GAME", inherited_ps3_game_path.empty() ? hdd0_game + m_path.substr(hdd0_game.size(), 10) : inherited_ps3_game_path); const std::string new_ps3_game = vfs::get("/dev_bdvd/PS3_GAME"); sys_log.notice("Game: %s", new_ps3_game); - // Store /dev_bdvd/PS3_GAME location - if (games_config::result res = m_games_config.add_game(m_title_id, new_ps3_game + "/./"); res == games_config::result::success) + if (!new_ps3_game.starts_with(iso_device::virtual_device_name)) { - sys_log.notice("Registered BDVD/PS3_GAME game directory for title '%s': %s", m_title_id, new_ps3_game); + // Store /dev_bdvd/PS3_GAME location + if (games_config::result res = m_games_config.add_game(m_title_id, new_ps3_game + "/./"); res == games_config::result::success) + { + sys_log.notice("Registered BDVD/PS3_GAME game directory for title '%s': %s", m_title_id, new_ps3_game); + } + else if (res == games_config::result::failure) + { + sys_log.error("Failed to save BDVD/PS3_GAME location of title '%s' (error=%s)", m_title_id, fs::g_tls_error); + } + + vfs::mount("/dev_bdvd", bdvd_dir); } - else if (res == games_config::result::failure) + else { - sys_log.error("Failed to save BDVD/PS3_GAME location of title '%s' (error=%s)", m_title_id, fs::g_tls_error); + vfs::mount("/dev_bdvd", iso_device::virtual_device_name + "/"); } } else if (disc.empty()) @@ -2229,7 +2249,8 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, // Check game updates if (const std::string hdd0_boot = hdd0_game + m_title_id + "/USRDIR/EBOOT.BIN"; !m_ar && recursion_count == 0 && disc.empty() && !bdvd_dir.empty() && !m_title_id.empty() - && resolved_path == GetCallbacks().resolve_path(vfs::get("/dev_bdvd/PS3_GAME/USRDIR/EBOOT.BIN")) + && (resolved_path == GetCallbacks().resolve_path(vfs::get("/dev_bdvd/PS3_GAME/USRDIR/EBOOT.BIN")) + || launching_from_disc_archive) && resolved_path != GetCallbacks().resolve_path(hdd0_boot) && fs::is_file(hdd0_boot) && ppu_exec == elf_error::ok) { From f4dffd985b95c37aff5994110ddfce42fb0d0894 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Wed, 7 Jan 2026 22:51:14 +0000 Subject: [PATCH 103/630] ISO: Fix argv[0] being set to a garbage value - Due to GetCallbacks().resolve_path behaviour being reverted in a prior commit, resolved_path will not have the path to the game executable. This causes issues when setting argv[0] to the game executable path and apparently breaks some games which may rely on this value. --- rpcs3/Emu/System.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 4f6a4eb680..bff86636e7 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -2361,8 +2361,9 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, else if (!bdvd_dir.empty() && fs::is_dir(bdvd_dir)) { // Disc games are on /dev_bdvd/ - const usz pos = resolved_path.rfind(m_game_dir); - argv[0] = "/dev_bdvd/PS3_GAME/" + unescape(resolved_path.substr(pos + m_game_dir.size() + 1)); + std::string disc_path = !launching_from_disc_archive ? resolved_path : m_path; + const usz pos = disc_path.rfind(m_game_dir); + argv[0] = "/dev_bdvd/PS3_GAME/" + unescape(disc_path.substr(pos + m_game_dir.size() + 1)); m_dir = "/dev_bdvd/PS3_GAME/"; } else if (from_dev_flash) From a53f2fc7b96b29348cbd6183a26df3a0a0eec672 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Thu, 8 Jan 2026 01:07:40 +0000 Subject: [PATCH 104/630] ISO: Fix save states in games with multiple executables - Some games will load into a different executable from EBOOT.BIN, and attempting to restore those games from savestate causes the game to crash immediately. - This commit repurposes the disc_info field in a savestate generated from an ISO game to store the running game executable at the time of the save state. --- rpcs3/Emu/System.cpp | 33 ++++++++++++++++++++------------- rpcs3/Loader/ISO.cpp | 3 +++ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index bff86636e7..c8e8630219 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -1172,12 +1172,14 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, std::string disc_info; m_ar->serialize(argv.emplace_back(), disc_info, klic.emplace_back(), m_game_dir, hdd1); + launching_from_disc_archive = is_file_iso(disc_info); + if (!klic[0]) { klic.clear(); } - if (!disc_info.empty() && disc_info[0] != '/') + if (!launching_from_disc_archive && !disc_info.empty() && disc_info[0] != '/') { // Restore disc path for disc games (must exist in games.yml i.e. your game library) m_title_id = disc_info; @@ -1294,6 +1296,13 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, m_path_old = m_path; resolve_path_as_vfs_path = true; + if (launching_from_disc_archive) + { + load_iso(disc_info); + m_path = iso_device::virtual_device_name + "/" + argv[0]; + + resolve_path_as_vfs_path = false; + } } else if (m_path.starts_with(vfs_boot_prefix)) { @@ -1414,10 +1423,6 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, m_path = rpcs3::utils::get_hdd1_dir(); m_path += std::string_view(argv[0]).substr(9); } - else if (is_file_iso(argv[0])) - { - m_path = argv[0]; - } else { sys_log.error("Unknown source for path redirection: %s", argv[0]); @@ -1433,13 +1438,13 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, } const std::string resolved_path = GetCallbacks().resolve_path(m_path); - if (is_file_iso(m_path)) + if (!launching_from_disc_archive && is_file_iso(m_path)) { load_iso(m_path); - std::string path = iso_device::virtual_device_name + "/"; + launching_from_disc_archive = true; - vfs::mount("/dev_bdvd/"sv, path); + std::string path = iso_device::virtual_device_name + "/"; // ISOs that are install discs will error if set to EBOOT.BIN // so this should cover both of them @@ -1449,11 +1454,12 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, } m_path = path; + } + if (launching_from_disc_archive) + { m_dir = "/dev_bdvd/PS3_GAME/"; m_cat = "DG"sv; - - launching_from_disc_archive = true; } const std::string elf_dir = fs::get_parent_dir(m_path); @@ -1630,7 +1636,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, } // ISO PKG INSTALL HACK! - if (!m_path.ends_with("EBOOT.BIN") && launching_from_disc_archive) + if (fs::is_dir(m_path) && launching_from_disc_archive) { bdvd_dir = m_path; } @@ -2136,7 +2142,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, // ISO has no USRDIR/EBOOT.BIN, and we've examined its PKGDIR and extras. // time to wrap up - if (!m_path.ends_with("EBOOT.BIN") && launching_from_disc_archive) + if (fs::is_dir(m_path) && launching_from_disc_archive) { return game_boot_result::nothing_to_boot; } @@ -3620,8 +3626,9 @@ void Emulator::Kill(bool allow_autoexit, bool savestate, savestate_stage* save_s ensure(device); auto iso_device = dynamic_cast(device.get()); + + ar(m_path.substr(iso_device::virtual_device_name.size() + 1)); ar(iso_device->get_loaded_iso()); - ar(m_title_id); } else if (auto dir = vfs::get("/dev_bdvd/PS3_GAME"); fs::is_dir(dir) && !fs::is_file(fs::get_parent_dir(dir) + "/PS3_DISC.SFB")) { diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index 3c3a0a8c20..7c3cb2dd07 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "ISO.h" +#include "Emu/VFS.h" #include #include @@ -619,6 +620,8 @@ void load_iso(const std::string& path) { fs::set_virtual_device("iso_overlay_fs_dev", stx::make_shared(path)); + + vfs::mount("/dev_bdvd/"sv, iso_device::virtual_device_name + "/"); } void unload_iso() From 49bcc930727ced0ea935155f8ef8bf4a4ce4e6e1 Mon Sep 17 00:00:00 2001 From: Functionable <40835042+Functionable@users.noreply.github.com> Date: Fri, 9 Jan 2026 01:28:36 +0000 Subject: [PATCH 105/630] ISO: Move load_icon --- rpcs3/rpcs3qt/savestate_manager_dialog.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp index 9e871800e2..7a341ff0af 100644 --- a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp @@ -434,6 +434,11 @@ void savestate_manager_dialog::ResizeGameIcons() { if (!item->data(GameUserRole::GamePixmapLoaded).toBool()) { + if (!archive_path.empty()) + { + gui::utils::load_icon(icon, icon_path, archive_path); + } + // Load game icon if (!icon.load(QString::fromStdString(icon_path))) { @@ -448,11 +453,6 @@ void savestate_manager_dialog::ResizeGameIcons() } } - if (!archive_path.empty()) - { - gui::utils::load_icon(icon, icon_path, archive_path); - } - if (cancel && cancel->load()) { return; From be77083a2b9f734f316312f9a406228b5152951c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 9 Jan 2026 18:56:27 +0100 Subject: [PATCH 106/630] Qt: some cleanup --- rpcs3/rpcs3qt/syntax_highlighter.cpp | 12 ++++++------ rpcs3/rpcs3qt/syntax_highlighter.h | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/rpcs3/rpcs3qt/syntax_highlighter.cpp b/rpcs3/rpcs3qt/syntax_highlighter.cpp index 412271eb6a..33d49e678d 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.cpp +++ b/rpcs3/rpcs3qt/syntax_highlighter.cpp @@ -1,11 +1,11 @@ #include "syntax_highlighter.h" #include "qt_utils.h" -Highlighter::Highlighter(QTextDocument *parent) : QSyntaxHighlighter(parent) +Highlighter::Highlighter(QTextDocument* parent) : QSyntaxHighlighter(parent) { } -void Highlighter::addRule(const QString &pattern, const QBrush &brush) +void Highlighter::addRule(const QString& pattern, const QBrush& brush) { HighlightingRule rule; rule.pattern = QRegularExpression(pattern); @@ -13,14 +13,14 @@ void Highlighter::addRule(const QString &pattern, const QBrush &brush) highlightingRules.append(rule); } -void Highlighter::highlightBlock(const QString &text) +void Highlighter::highlightBlock(const QString& text) { for (const HighlightingRule& rule : highlightingRules) { QRegularExpressionMatchIterator matchIterator = rule.pattern.globalMatch(text); while (matchIterator.hasNext()) { - QRegularExpressionMatch match = matchIterator.next(); + const QRegularExpressionMatch match = matchIterator.next(); setFormat(match.capturedStart(), match.capturedLength(), rule.format); } } @@ -67,7 +67,7 @@ LogHighlighter::LogHighlighter(QTextDocument* parent) : Highlighter(parent) addRule("^·T.*$", gui::utils::get_label_color("log_level_trace", color, color)); } -AsmHighlighter::AsmHighlighter(QTextDocument *parent) : Highlighter(parent) +AsmHighlighter::AsmHighlighter(QTextDocument* parent) : Highlighter(parent) { addRule("^\\b[A-Z0-9]+\\b", Qt::darkBlue); // Instructions addRule("-?R\\d[^,;\\s]*", Qt::darkRed); // -R0.* @@ -78,7 +78,7 @@ AsmHighlighter::AsmHighlighter(QTextDocument *parent) : Highlighter(parent) addRule("#[^\\n]*", Qt::darkGreen); // Single line comment } -GlslHighlighter::GlslHighlighter(QTextDocument *parent) : Highlighter(parent) +GlslHighlighter::GlslHighlighter(QTextDocument* parent) : Highlighter(parent) { const QStringList keywordPatterns = QStringList() // Selection-Iteration-Jump Statements: diff --git a/rpcs3/rpcs3qt/syntax_highlighter.h b/rpcs3/rpcs3qt/syntax_highlighter.h index 3e701ffb0e..8179cd2257 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.h +++ b/rpcs3/rpcs3qt/syntax_highlighter.h @@ -10,11 +10,11 @@ class Highlighter : public QSyntaxHighlighter Q_OBJECT public: - explicit Highlighter(QTextDocument *parent = nullptr); + explicit Highlighter(QTextDocument* parent = nullptr); protected: - void highlightBlock(const QString &text) override; - void addRule(const QString &pattern, const QBrush &brush); + void highlightBlock(const QString& text) override; + void addRule(const QString& pattern, const QBrush& brush); struct HighlightingRule { @@ -42,7 +42,7 @@ class AsmHighlighter : public Highlighter Q_OBJECT public: - explicit AsmHighlighter(QTextDocument *parent = nullptr); + explicit AsmHighlighter(QTextDocument* parent = nullptr); }; class GlslHighlighter : public Highlighter @@ -50,5 +50,5 @@ class GlslHighlighter : public Highlighter Q_OBJECT public: - explicit GlslHighlighter(QTextDocument *parent = nullptr); + explicit GlslHighlighter(QTextDocument* parent = nullptr); }; From 19129eddd770ac7083630990bd925469f44722cc Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 16 Dec 2025 21:08:08 +0100 Subject: [PATCH 107/630] Qt: ISO clean up Should fix some potential Qt bugs as well --- rpcs3/Emu/System.cpp | 23 ++-- rpcs3/Emu/games_config.cpp | 6 +- rpcs3/Loader/ISO.cpp | 147 ++++++++++----------- rpcs3/Loader/ISO.h | 80 +++++------ rpcs3/rpcs3qt/game_list_base.cpp | 9 +- rpcs3/rpcs3qt/game_list_frame.cpp | 7 +- rpcs3/rpcs3qt/game_list_grid.cpp | 7 + rpcs3/rpcs3qt/game_list_table.cpp | 13 +- rpcs3/rpcs3qt/main_window.cpp | 6 +- rpcs3/rpcs3qt/qt_utils.cpp | 21 +-- rpcs3/rpcs3qt/qt_video_source.cpp | 47 ++++--- rpcs3/rpcs3qt/qt_video_source.h | 4 +- rpcs3/rpcs3qt/savestate_manager_dialog.cpp | 13 +- rpcs3/rpcs3qt/trophy_manager_dialog.cpp | 4 +- 14 files changed, 191 insertions(+), 196 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index c8e8630219..6db05a21ea 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -1296,6 +1296,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, m_path_old = m_path; resolve_path_as_vfs_path = true; + if (launching_from_disc_archive) { load_iso(disc_info); @@ -1636,13 +1637,13 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, } // ISO PKG INSTALL HACK! - if (fs::is_dir(m_path) && launching_from_disc_archive) + if (launching_from_disc_archive && fs::is_dir(m_path)) { bdvd_dir = m_path; } // Special boot mode (directory scan) - if (fs::is_dir(m_path) && !launching_from_disc_archive) + if (!launching_from_disc_archive && fs::is_dir(m_path)) { m_state = system_state::ready; GetCallbacks().on_ready(); @@ -2142,7 +2143,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, // ISO has no USRDIR/EBOOT.BIN, and we've examined its PKGDIR and extras. // time to wrap up - if (fs::is_dir(m_path) && launching_from_disc_archive) + if (launching_from_disc_archive && fs::is_dir(m_path)) { return game_boot_result::nothing_to_boot; } @@ -2255,8 +2256,8 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, // Check game updates if (const std::string hdd0_boot = hdd0_game + m_title_id + "/USRDIR/EBOOT.BIN"; !m_ar && recursion_count == 0 && disc.empty() && !bdvd_dir.empty() && !m_title_id.empty() - && (resolved_path == GetCallbacks().resolve_path(vfs::get("/dev_bdvd/PS3_GAME/USRDIR/EBOOT.BIN")) - || launching_from_disc_archive) + && (launching_from_disc_archive || + resolved_path == GetCallbacks().resolve_path(vfs::get("/dev_bdvd/PS3_GAME/USRDIR/EBOOT.BIN"))) && resolved_path != GetCallbacks().resolve_path(hdd0_boot) && fs::is_file(hdd0_boot) && ppu_exec == elf_error::ok) { @@ -2367,7 +2368,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, else if (!bdvd_dir.empty() && fs::is_dir(bdvd_dir)) { // Disc games are on /dev_bdvd/ - std::string disc_path = !launching_from_disc_archive ? resolved_path : m_path; + const std::string& disc_path = !launching_from_disc_archive ? resolved_path : m_path; const usz pos = disc_path.rfind(m_game_dir); argv[0] = "/dev_bdvd/PS3_GAME/" + unescape(disc_path.substr(pos + m_game_dir.size() + 1)); m_dir = "/dev_bdvd/PS3_GAME/"; @@ -3622,13 +3623,13 @@ void Emulator::Kill(bool allow_autoexit, bool savestate, savestate_stage* save_s // Game mounted from archive if (m_path.starts_with(iso_device::virtual_device_name + "/")) { - auto device = fs::get_virtual_device(iso_device::virtual_device_name + "/"); + const auto device = fs::get_virtual_device(iso_device::virtual_device_name + "/"); ensure(device); - auto iso_device = dynamic_cast(device.get()); + const auto iso_dev = dynamic_cast(device.get()); ar(m_path.substr(iso_device::virtual_device_name.size() + 1)); - ar(iso_device->get_loaded_iso()); + ar(iso_dev->get_loaded_iso()); } else if (auto dir = vfs::get("/dev_bdvd/PS3_GAME"); fs::is_dir(dir) && !fs::is_file(fs::get_parent_dir(dir) + "/PS3_DISC.SFB")) { @@ -4245,9 +4246,9 @@ game_boot_result Emulator::AddGameToYml(const std::string& path) // Load PARAM.SFO const std::string elf_dir = fs::get_parent_dir(path); - std::string sfo_dir = !archive ? rpcs3::utils::get_sfo_dir_from_game_path(fs::get_parent_dir(elf_dir)) : "PS3_GAME"; + std::string sfo_dir = archive ? "PS3_GAME" : rpcs3::utils::get_sfo_dir_from_game_path(fs::get_parent_dir(elf_dir)); const std::string sfo_path = sfo_dir + "/PARAM.SFO"; - const psf::registry _psf = !archive ? psf::load_object(sfo_path) : archive->open_psf(sfo_path); + const psf::registry _psf = archive ? archive->open_psf(sfo_path) : psf::load_object(sfo_path); const std::string title_id = std::string(psf::get_string(_psf, "TITLE_ID")); const std::string cat = std::string(psf::get_string(_psf, "CATEGORY")); diff --git a/rpcs3/Emu/games_config.cpp b/rpcs3/Emu/games_config.cpp index ad6daff193..ae0fad8084 100644 --- a/rpcs3/Emu/games_config.cpp +++ b/rpcs3/Emu/games_config.cpp @@ -48,11 +48,11 @@ games_config::result games_config::add_game(const std::string& key, const std::s { if (path == iso_device::virtual_device_name + "/") { - auto device = fs::get_virtual_device(iso_device::virtual_device_name + "/"); + const auto device = fs::get_virtual_device(iso_device::virtual_device_name + "/"); if (!device) return result::failure; - auto iso_device = dynamic_cast(device.get()); - return add_game(key, iso_device->get_loaded_iso()); + const auto iso_dev = dynamic_cast(device.get()); + return add_game(key, iso_dev->get_loaded_iso()); } std::lock_guard lock(m_mutex); diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index 7c3cb2dd07..0f9772cd8f 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -11,6 +11,7 @@ bool is_file_iso(const std::string& path) { + if (path.empty()) return false; if (fs::is_dir(path)) return false; return is_file_iso(fs::file(path)); @@ -55,14 +56,14 @@ inline T read_both_endian_int(fs::file& file) // assumed that directory_entry is at file head std::optional iso_read_directory_entry(fs::file& file, bool names_in_ucs2 = false) { - auto start_pos = file.pos(); - u8 entry_length = file.read(); + const auto start_pos = file.pos(); + const u8 entry_length = file.read(); if (entry_length == 0) return std::nullopt; file.seek(1, fs::seek_cur); - u32 start_sector = read_both_endian_int(file); - u32 file_size = read_both_endian_int(file); + const u32 start_sector = read_both_endian_int(file); + const u32 file_size = read_both_endian_int(file); std::tm file_date = {}; file_date.tm_year = file.read(); @@ -71,20 +72,20 @@ std::optional iso_read_directory_entry(fs::file& file, bool nam file_date.tm_hour = file.read(); file_date.tm_min = file.read(); file_date.tm_sec = file.read(); - s16 timezone_value = file.read(); - s16 timezone_offset = (timezone_value - 50) * 15 * 60; + const s16 timezone_value = file.read(); + const s16 timezone_offset = (timezone_value - 50) * 15 * 60; - std::time_t date_time = std::mktime(&file_date) + timezone_offset; + const std::time_t date_time = std::mktime(&file_date) + timezone_offset; - u8 flags = file.read(); + const u8 flags = file.read(); // 2nd flag bit indicates whether a given fs node is a directory - bool is_directory = flags & 0b00000010; - bool has_more_extents = flags & 0b10000000; + const bool is_directory = flags & 0b00000010; + const bool has_more_extents = flags & 0b10000000; file.seek(6, fs::seek_cur); - u8 file_name_length = file.read(); + const u8 file_name_length = file.read(); std::string file_name; file.read(file_name, file_name_length); @@ -99,10 +100,10 @@ std::optional iso_read_directory_entry(fs::file& file, bool nam } else if (names_in_ucs2) // for strings in joliet descriptor { - std::string new_file_name = ""; + std::string new_file_name; int read = 0; const u8* raw_str = reinterpret_cast(file_name.c_str()); - while(read < file_name_length) + while (read < file_name_length) { // characters are stored in big endian format. const u16 upper = raw_str[read]; @@ -134,7 +135,7 @@ std::optional iso_read_directory_entry(fs::file& file, bool nam return iso_fs_metadata { - .name = file_name, + .name = std::move(file_name), .time = date_time, .is_directory = is_directory, .has_multiple_extents = has_more_extents, @@ -149,26 +150,25 @@ std::optional iso_read_directory_entry(fs::file& file, bool nam }; } -void iso_form_hierarchy(fs::file& file, iso_fs_node& node, - bool use_ucs2_decoding = false, std::string parent_path = "") +void iso_form_hierarchy(fs::file& file, iso_fs_node& node, bool use_ucs2_decoding = false, const std::string& parent_path = "") { if (!node.metadata.is_directory) return; - std::vector multi_extent_node_indices; + std::vector multi_extent_node_indices; // assuming the directory spans a single extent const auto& directory_extent = node.metadata.extents[0]; file.seek(directory_extent.start * ISO_BLOCK_SIZE); - u64 end_pos = directory_extent.size + (directory_extent.start * ISO_BLOCK_SIZE); + const u64 end_pos = directory_extent.size + (directory_extent.start * ISO_BLOCK_SIZE); while(file.pos() < end_pos) { auto entry = iso_read_directory_entry(file, use_ucs2_decoding); if (!entry) { - u64 new_sector = (file.pos() / ISO_BLOCK_SIZE) + 1; + const u64 new_sector = (file.pos() / ISO_BLOCK_SIZE) + 1; file.seek(new_sector * ISO_BLOCK_SIZE); continue; } @@ -176,10 +176,10 @@ void iso_form_hierarchy(fs::file& file, iso_fs_node& node, bool extent_added = false; // find previous extent and merge into it, otherwise we push this node's index - for (int index : multi_extent_node_indices) + for (usz index : multi_extent_node_indices) { - auto& selected_node = node.children.at(index); - if (selected_node->metadata.name.compare(entry->name) == 0) + auto& selected_node = ::at32(node.children, index); + if (selected_node->metadata.name == entry->name) { // merge into selected_node selected_node->metadata.extents.push_back(entry->extents[0]); @@ -197,7 +197,7 @@ void iso_form_hierarchy(fs::file& file, iso_fs_node& node, } node.children.push_back(std::make_unique(iso_fs_node{ - .metadata = *entry + .metadata = std::move(*entry) })); } @@ -237,7 +237,7 @@ iso_archive::iso_archive(const std::string& path) do { - auto descriptor_start = m_file.pos(); + const auto descriptor_start = m_file.pos(); descriptor_type = m_file.read(); @@ -257,7 +257,7 @@ iso_archive::iso_archive(const std::string& path) m_file.seek(descriptor_start + ISO_BLOCK_SIZE); } - while(descriptor_type != 255); + while (descriptor_type != 255); iso_form_hierarchy(m_file, m_root, use_ucs2_decoding); } @@ -266,7 +266,7 @@ iso_fs_node* iso_archive::retrieve(const std::string& passed_path) { if (passed_path.empty()) return nullptr; - std::string path = std::filesystem::path(passed_path).string(); + const std::string path = std::filesystem::path(passed_path).string(); size_t start = 0; size_t end = path.find_first_of(fs::delim); @@ -277,14 +277,14 @@ iso_fs_node* iso_archive::retrieve(const std::string& passed_path) do { if (search_stack.empty()) return nullptr; - auto* top_entry = search_stack.top(); + const auto* top_entry = search_stack.top(); - if (end == std::string::npos) + if (end == umax) { end = path.size(); } - auto path_component = path.substr(start, end-start); + const auto path_component = path.substr(start, end-start); bool found = false; @@ -301,7 +301,7 @@ iso_fs_node* iso_archive::retrieve(const std::string& passed_path) { for (const auto& entry : top_entry->children) { - if (entry->metadata.name.compare(path_component) == 0) + if (entry->metadata.name == path_component) { search_stack.push(entry.get()); @@ -316,7 +316,7 @@ iso_fs_node* iso_archive::retrieve(const std::string& passed_path) start = end + 1; end = path.find_first_of(fs::delim, start); } - while(start < path.size()); + while (start < path.size()); if (search_stack.empty()) return nullptr; @@ -330,7 +330,7 @@ bool iso_archive::exists(const std::string& path) bool iso_archive::is_file(const std::string& path) { - auto file_node = retrieve(path); + const auto file_node = retrieve(path); if (!file_node) return false; return !file_node->metadata.is_directory; @@ -338,7 +338,7 @@ bool iso_archive::is_file(const std::string& path) iso_file iso_archive::open(const std::string& path) { - return iso_file(fs::file(m_path), *retrieve(path)); + return iso_file(fs::file(m_path), *ensure(retrieve(path))); } psf::registry iso_archive::open_psf(const std::string& path) @@ -355,7 +355,7 @@ psf::registry iso_archive::open_psf(const std::string& path) } iso_file::iso_file(fs::file&& iso_handle, const iso_fs_node& node) - : m_file(std::move(iso_handle)), m_meta(node.metadata), m_pos(0) + : m_file(std::move(iso_handle)), m_meta(node.metadata) { m_file.seek(ISO_BLOCK_SIZE * node.metadata.extents[0].start); } @@ -374,7 +374,7 @@ fs::stat_t iso_file::get_stat() }; } -bool iso_file::trunc(u64) +bool iso_file::trunc(u64 /*length*/) { fs::g_tls_error = fs::error::readonly; return false; @@ -382,9 +382,11 @@ bool iso_file::trunc(u64) std::pair iso_file::get_extent_pos(u64 pos) const { + ensure(!m_meta.extents.empty()); + auto it = m_meta.extents.begin(); - while(pos >= it->size && it != m_meta.extents.end() - 1) + while (pos >= it->size && it != m_meta.extents.end() - 1) { pos -= it->size; @@ -397,14 +399,14 @@ std::pair iso_file::get_extent_pos(u64 pos) const // assumed valid and in bounds. u64 iso_file::file_offset(u64 pos) const { - auto [local_pos, extent] = get_extent_pos(pos); + const auto [local_pos, extent] = get_extent_pos(pos); return (extent.start * ISO_BLOCK_SIZE) + local_pos; } u64 iso_file::local_extent_remaining(u64 pos) const { - auto [local_pos, extent] = get_extent_pos(pos); + const auto [local_pos, extent] = get_extent_pos(pos); return extent.size - local_pos; } @@ -416,25 +418,22 @@ u64 iso_file::local_extent_size(u64 pos) const u64 iso_file::read(void* buffer, u64 size) { - auto r = read_at(m_pos, buffer, size); + const auto r = read_at(m_pos, buffer, size); m_pos += r; return r; } u64 iso_file::read_at(u64 offset, void* buffer, u64 size) { - u64 local_remaining = local_extent_remaining(offset); + const u64 local_remaining = local_extent_remaining(offset); - u64 total_read = m_file.read_at(file_offset(offset), buffer, std::min(size, local_remaining)); + const u64 total_read = m_file.read_at(file_offset(offset), buffer, std::min(size, local_remaining)); - auto total_size = this->size(); + const auto total_size = this->size(); if (size > total_read && (offset + total_read) < total_size) { - u64 second_total_read = read_at(offset + total_read, - reinterpret_cast(buffer) + total_read, - size - total_read - ); + const u64 second_total_read = read_at(offset + total_read, reinterpret_cast(buffer) + total_read, size - total_read); return total_read + second_total_read; } @@ -442,7 +441,7 @@ u64 iso_file::read_at(u64 offset, void* buffer, u64 size) return total_read; } -u64 iso_file::write(const void*, u64) +u64 iso_file::write(const void* /*buffer*/, u64 /*size*/) { fs::g_tls_error = fs::error::readonly; return 0; @@ -462,10 +461,8 @@ u64 iso_file::seek(s64 offset, fs::seek_mode whence) return -1; } - const u64 bad_res = -1; - - u64 result = m_file.seek(file_offset(m_pos)); - if (result == bad_res) return -1; + const u64 result = m_file.seek(file_offset(m_pos)); + if (result == umax) return umax; m_pos = new_pos; return m_pos; @@ -491,8 +488,7 @@ bool iso_dir::read(fs::dir_entry& entry) { if (m_pos < m_node.children.size()) { - auto& selected = m_node.children[m_pos].get()->metadata; - u64 size = selected.size(); + const auto& selected = m_node.children[m_pos].get()->metadata; entry.name = selected.name; entry.atime = selected.time; @@ -501,7 +497,7 @@ bool iso_dir::read(fs::dir_entry& entry) entry.is_directory = selected.is_directory; entry.is_symlink = false; entry.is_writable = false; - entry.size = size; + entry.size = selected.size(); m_pos++; @@ -513,25 +509,23 @@ bool iso_dir::read(fs::dir_entry& entry) bool iso_device::stat(const std::string& path, fs::stat_t& info) { - auto relative_path = std::filesystem::relative(std::filesystem::path(path), - std::filesystem::path(fs_prefix)).string(); + const auto relative_path = std::filesystem::relative(std::filesystem::path(path), std::filesystem::path(fs_prefix)).string(); - auto node = m_archive.retrieve(relative_path); + const auto node = m_archive.retrieve(relative_path); if (!node) { fs::g_tls_error = fs::error::noent; return false; } - auto& meta = node->metadata; - u64 size = meta.size(); + const auto& meta = node->metadata; info = fs::stat_t { .is_directory = meta.is_directory, .is_symlink = false, .is_writable = false, - .size = size, + .size = meta.size(), .atime = meta.time, .mtime = meta.time, .ctime = meta.time @@ -542,25 +536,24 @@ bool iso_device::stat(const std::string& path, fs::stat_t& info) bool iso_device::statfs(const std::string& path, fs::device_stat& info) { - auto relative_path = std::filesystem::relative(std::filesystem::path(path), - std::filesystem::path(fs_prefix)).string(); + const auto relative_path = std::filesystem::relative(std::filesystem::path(path), std::filesystem::path(fs_prefix)).string(); - auto node = m_archive.retrieve(relative_path); + const auto node = m_archive.retrieve(relative_path); if (!node) { fs::g_tls_error = fs::error::noent; return false; } - auto& meta = node->metadata; - u64 size = meta.size(); + const auto& meta = node->metadata; + const u64 size = meta.size(); info = fs::device_stat { - .block_size=size, - .total_size=size, - .total_free=0, - .avail_free=0 + .block_size = size, + .total_size = size, + .total_free = 0, + .avail_free = 0 }; return false; @@ -568,10 +561,9 @@ bool iso_device::statfs(const std::string& path, fs::device_stat& info) std::unique_ptr iso_device::open(const std::string& path, bs_t mode) { - auto relative_path = std::filesystem::relative(std::filesystem::path(path), - std::filesystem::path(fs_prefix)).string(); + const auto relative_path = std::filesystem::relative(std::filesystem::path(path), std::filesystem::path(fs_prefix)).string(); - auto node = m_archive.retrieve(relative_path); + const auto node = m_archive.retrieve(relative_path); if (!node) { fs::g_tls_error = fs::error::noent; @@ -589,10 +581,9 @@ std::unique_ptr iso_device::open(const std::string& path, bs_t iso_device::open_dir(const std::string& path) { - auto relative_path = std::filesystem::relative(std::filesystem::path(path), - std::filesystem::path(fs_prefix)).string(); + const auto relative_path = std::filesystem::relative(std::filesystem::path(path), std::filesystem::path(fs_prefix)).string(); - auto node = m_archive.retrieve(relative_path); + const auto node = m_archive.retrieve(relative_path); if (!node) { fs::g_tls_error = fs::error::noent; @@ -618,14 +609,12 @@ void iso_dir::rewind() void load_iso(const std::string& path) { - fs::set_virtual_device("iso_overlay_fs_dev", - stx::make_shared(path)); + fs::set_virtual_device("iso_overlay_fs_dev", stx::make_shared(path)); vfs::mount("/dev_bdvd/"sv, iso_device::virtual_device_name + "/"); } void unload_iso() { - fs::set_virtual_device("iso_overlay_fs_dev", - stx::shared_ptr()); + fs::set_virtual_device("iso_overlay_fs_dev", stx::shared_ptr()); } diff --git a/rpcs3/Loader/ISO.h b/rpcs3/Loader/ISO.h index 55c8b99f16..3af4732aad 100644 --- a/rpcs3/Loader/ISO.h +++ b/rpcs3/Loader/ISO.h @@ -36,82 +36,86 @@ struct iso_fs_node class iso_file : public fs::file_base { +private: fs::file m_file; iso_fs_metadata m_meta; - u64 m_pos; + u64 m_pos = 0; std::pair get_extent_pos(u64 pos) const; u64 file_offset(u64 pos) const; u64 local_extent_remaining(u64 pos) const; u64 local_extent_size(u64 pos) const; - public: - iso_file(fs::file&& iso_handle, const iso_fs_node& node); +public: + iso_file(fs::file&& iso_handle, const iso_fs_node& node); - fs::stat_t get_stat() override; - bool trunc(u64 length) override; - u64 read(void* buffer, u64 size) override; - u64 read_at(u64 offset, void* buffer, u64 size) override; - u64 write(const void* buffer, u64 size) override; - u64 seek(s64 offset, fs::seek_mode whence) override; - u64 size() override; + fs::stat_t get_stat() override; + bool trunc(u64 length) override; + u64 read(void* buffer, u64 size) override; + u64 read_at(u64 offset, void* buffer, u64 size) override; + u64 write(const void* buffer, u64 size) override; + u64 seek(s64 offset, fs::seek_mode whence) override; + u64 size() override; - void release() override; + void release() override; }; class iso_dir : public fs::dir_base { +private: const iso_fs_node& m_node; - u64 m_pos; + u64 m_pos = 0; - public: - iso_dir(const iso_fs_node& node) - : m_node(node), m_pos(0) - {} +public: + iso_dir(const iso_fs_node& node) + : m_node(node) + {} - bool read(fs::dir_entry&) override; - void rewind() override; + bool read(fs::dir_entry&) override; + void rewind() override; }; // represents the .iso file itself. class iso_archive { +private: std::string m_path; iso_fs_node m_root; fs::file m_file; - public: - iso_archive(const std::string& path); +public: + iso_archive(const std::string& path); - iso_fs_node* retrieve(const std::string& path); - bool exists(const std::string& path); - bool is_file(const std::string& path); + iso_fs_node* retrieve(const std::string& path); + bool exists(const std::string& path); + bool is_file(const std::string& path); - iso_file open(const std::string& path); + iso_file open(const std::string& path); - psf::registry open_psf(const std::string& path); + psf::registry open_psf(const std::string& path); }; class iso_device : public fs::device_base { +private: iso_archive m_archive; std::string iso_path; - public: - inline static std::string virtual_device_name = "/vfsv0_virtual_iso_overlay_fs_dev"; +public: + inline static std::string virtual_device_name = "/vfsv0_virtual_iso_overlay_fs_dev"; - iso_device(const std::string& iso_path, const std::string& device_name = virtual_device_name) - : m_archive(iso_path), iso_path(iso_path) - { - fs_prefix = device_name; - } - ~iso_device() override = default; + iso_device(const std::string& iso_path, const std::string& device_name = virtual_device_name) + : m_archive(iso_path), iso_path(iso_path) + { + fs_prefix = device_name; + } + ~iso_device() override = default; - const std::string& get_loaded_iso() const { return iso_path; } + const std::string& get_loaded_iso() const { return iso_path; } - bool stat(const std::string& path, fs::stat_t& info) override; - bool statfs(const std::string& path, fs::device_stat& info) override; + bool stat(const std::string& path, fs::stat_t& info) override; + bool statfs(const std::string& path, fs::device_stat& info) override; - std::unique_ptr open(const std::string& path, bs_t mode) override; - std::unique_ptr open_dir(const std::string& path) override; + std::unique_ptr open(const std::string& path, bs_t mode) override; + std::unique_ptr open_dir(const std::string& path) override; }; diff --git a/rpcs3/rpcs3qt/game_list_base.cpp b/rpcs3/rpcs3qt/game_list_base.cpp index 4105d754b0..edae4e51f6 100644 --- a/rpcs3/rpcs3qt/game_list_base.cpp +++ b/rpcs3/rpcs3qt/game_list_base.cpp @@ -49,14 +49,9 @@ void game_list_base::IconLoadFunction(game_info game, qreal device_pixel_ratio, static std::unordered_set warn_once_list; static shared_mutex s_mtx; - if (game->icon.isNull() && (game->info.icon_path.empty() || !game->icon.load(QString::fromStdString(game->info.icon_path)))) + if (game->icon.isNull() && !gui::utils::load_icon(game->icon, game->info.icon_path, game->icon_in_archive ? game->info.path : "")) { - if (game->icon_in_archive) - { - game->icon_in_archive = gui::utils::load_icon(game->icon, game->info.icon_path, game->info.path); - } - - if (!game->icon_in_archive && game_list_log.warning) + if (game_list_log.warning) { bool logged = false; { diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 4a695c9828..ea7b87ff6d 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -531,8 +531,7 @@ void game_list_frame::OnParsingFinished() const auto file_exists = [&archive](const std::string& path) { - if (!archive) return fs::is_file(path); - return archive->is_file(path); + return archive ? archive->is_file(path) : fs::is_file(path); }; gui_game_info game{}; @@ -540,10 +539,10 @@ void game_list_frame::OnParsingFinished() const Localized thread_localized; - const std::string sfo_dir = !archive ? rpcs3::utils::get_sfo_dir_from_game_path(dir_or_elf) : "PS3_GAME"; + const std::string sfo_dir = archive ? "PS3_GAME" : rpcs3::utils::get_sfo_dir_from_game_path(dir_or_elf); const std::string sfo_path = sfo_dir + "/PARAM.SFO"; - const psf::registry psf = !archive ? psf::load_object(sfo_path) : archive->open_psf(sfo_path); + const psf::registry psf = archive ? archive->open_psf(sfo_path) : psf::load_object(sfo_path); const std::string_view title_id = psf::get_string(psf, "TITLE_ID", ""); if (title_id.empty()) diff --git a/rpcs3/rpcs3qt/game_list_grid.cpp b/rpcs3/rpcs3qt/game_list_grid.cpp index a20e67da73..a33755ff54 100644 --- a/rpcs3/rpcs3qt/game_list_grid.cpp +++ b/rpcs3/rpcs3qt/game_list_grid.cpp @@ -4,6 +4,8 @@ #include "gui_settings.h" #include "qt_utils.h" +#include "Loader/ISO.h" + #include game_list_grid::game_list_grid() @@ -110,6 +112,11 @@ void game_list_grid::populate( if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam)) { item->set_video_path(game->info.movie_path); + + if (!fs::exists(game->info.movie_path) && is_file_iso(game->info.path)) + { + item->set_iso_path(game->info.path); + } } if (selected_item_ids.contains(game->info.path + game->info.icon_path)) diff --git a/rpcs3/rpcs3qt/game_list_table.cpp b/rpcs3/rpcs3qt/game_list_table.cpp index 2ab2013b19..98b9ef344d 100644 --- a/rpcs3/rpcs3qt/game_list_table.cpp +++ b/rpcs3/rpcs3qt/game_list_table.cpp @@ -244,12 +244,6 @@ void game_list_table::populate( custom_table_widget_item* icon_item = new custom_table_widget_item; game->item = icon_item; - if (is_file_iso(game->info.path) && !game->info.movie_path.empty() - && !fs::exists(game->info.movie_path)) - { - icon_item->set_source_path(game->info.path); - } - icon_item->set_image_change_callback([this, icon_item, game](const QVideoFrame& frame) { if (!icon_item || !game) @@ -285,7 +279,7 @@ void game_list_table::populate( // Do not report size of apps inside /dev_flash (it does not make sense to do so) game->info.size_on_disk = 0; } - else if(is_file_iso(game->info.path)) + else if (is_file_iso(game->info.path)) { fs::stat_t iso_stat; fs::get_stat(game->info.path, iso_stat); @@ -308,6 +302,11 @@ void game_list_table::populate( if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam)) { icon_item->set_video_path(game->info.movie_path); + + if (!fs::exists(game->info.movie_path) && is_file_iso(game->info.path)) + { + icon_item->set_iso_path(game->info.path); + } } icon_item->setData(Qt::UserRole, index, true); diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 331e25e2fc..98d3ceefb3 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -546,9 +546,9 @@ void main_window::Boot(const std::string& path, const std::string& title_id, boo std::string game_path = Emu.GetBoot(); if (game_path.starts_with(iso_device::virtual_device_name)) { - auto device = fs::get_virtual_device(iso_device::virtual_device_name + "/"); - auto iso_device = dynamic_cast(device.get()); - game_path = iso_device->get_loaded_iso(); + const auto device = fs::get_virtual_device(iso_device::virtual_device_name + "/"); + const auto iso_dev = ensure(dynamic_cast(device.get())); + game_path = iso_dev->get_loaded_iso(); } gui_log.success("Boot successful."); diff --git a/rpcs3/rpcs3qt/qt_utils.cpp b/rpcs3/rpcs3qt/qt_utils.cpp index b10799a453..0f53ee0f86 100644 --- a/rpcs3/rpcs3qt/qt_utils.cpp +++ b/rpcs3/rpcs3qt/qt_utils.cpp @@ -683,27 +683,28 @@ namespace gui return QString("%1 days ago %2").arg(current_date - exctrated_date).arg(date.toString(fmt_relative)); } - bool load_icon(QPixmap& icon, const std::string& icon_path, - const std::string& archive_path) + bool load_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path) { + if (icon_path.empty()) return false; + + if (archive_path.empty()) + { + return icon.load(QString::fromStdString(icon_path)); + } + if (!is_file_iso(archive_path)) return false; iso_archive archive(archive_path); if (!archive.exists(icon_path)) return false; auto icon_file = archive.open(icon_path); - auto icon_size = icon_file.size(); + const auto icon_size = icon_file.size(); + if (icon_size == 0) return false; QByteArray data(icon_size, 0); icon_file.read(data.data(), icon_size); - QImage iconImage; - if (iconImage.loadFromData(data)) - { - icon = QPixmap::fromImage(iconImage); - } - - return true; + return icon.loadFromData(data); } QString format_timestamp(s64 time, const QString& fmt) diff --git a/rpcs3/rpcs3qt/qt_video_source.cpp b/rpcs3/rpcs3qt/qt_video_source.cpp index 81e6d98e55..d74d395c58 100644 --- a/rpcs3/rpcs3qt/qt_video_source.cpp +++ b/rpcs3/rpcs3qt/qt_video_source.cpp @@ -21,9 +21,9 @@ void qt_video_source::set_video_path(const std::string& video_path) m_video_path = QString::fromStdString(video_path); } -void qt_video_source::set_source_path(const std::string& source_path) +void qt_video_source::set_iso_path(const std::string& iso_path) { - m_source_path = QString::fromStdString(source_path); + m_iso_path = iso_path; } void qt_video_source::set_active(bool active) @@ -62,7 +62,7 @@ void qt_video_source::init_movie() return; } - if (!m_image_change_callback || m_video_path.isEmpty() || (!QFile::exists(m_video_path) && m_source_path.isEmpty())) + if (!m_image_change_callback || m_video_path.isEmpty() || (m_iso_path.empty() && !QFile::exists(m_video_path))) { m_video_path.clear(); return; @@ -72,24 +72,24 @@ void qt_video_source::init_movie() if (lower.endsWith(".gif")) { - if (m_source_path.isEmpty()) + if (m_iso_path.empty()) { m_movie = std::make_unique(m_video_path); - m_video_path.clear(); } else { - iso_archive archive(m_source_path.toStdString()); + iso_archive archive(m_iso_path); auto movie_file = archive.open(m_video_path.toStdString()); - auto movie_size = movie_file.size(); + const auto movie_size = movie_file.size(); + if (movie_size == 0) return; + m_video_data = QByteArray(movie_size, 0); movie_file.read(m_video_data.data(), movie_size); - QBuffer buffer(&m_video_data); - buffer.open(QIODevice::ReadOnly); - m_movie = std::make_unique(&buffer); + m_video_buffer = std::make_unique(&m_video_data); + m_video_buffer->open(QIODevice::ReadOnly); + m_movie = std::make_unique(m_video_buffer.get()); - m_video_path.clear(); } if (!m_movie->isValid()) @@ -109,7 +109,7 @@ void qt_video_source::init_movie() if (lower.endsWith(".pam")) { // We can't set PAM files as source of the video player, so we have to feed them as raw data. - if (m_source_path.isEmpty()) + if (m_iso_path.empty()) { QFile file(m_video_path); if (!file.open(QFile::OpenModeFlag::ReadOnly)) @@ -119,22 +119,26 @@ void qt_video_source::init_movie() // TODO: Decode the pam properly before pushing it to the player m_video_data = file.readAll(); - if (m_video_data.isEmpty()) - { - return; - } } else { - auto source_path = m_source_path.toStdString(); - auto video_path = m_video_path.toStdString(); - iso_archive archive(source_path.c_str()); - auto movie_file = archive.open(video_path); - auto movie_size = movie_file.size(); + iso_archive archive(m_iso_path); + auto movie_file = archive.open(m_video_path.toStdString()); + const auto movie_size = movie_file.size(); + if (movie_size == 0) + { + return; + } + m_video_data = QByteArray(movie_size, 0); movie_file.read(m_video_data.data(), movie_size); } + if (m_video_data.isEmpty()) + { + return; + } + m_video_buffer = std::make_unique(&m_video_data); m_video_buffer->open(QIODevice::ReadOnly); } @@ -185,6 +189,7 @@ void qt_video_source::stop_movie() if (m_movie) { m_movie->stop(); + m_movie.reset(); } m_video_sink.reset(); diff --git a/rpcs3/rpcs3qt/qt_video_source.h b/rpcs3/rpcs3qt/qt_video_source.h index 1f195def02..ce43d593d7 100644 --- a/rpcs3/rpcs3qt/qt_video_source.h +++ b/rpcs3/rpcs3qt/qt_video_source.h @@ -17,7 +17,7 @@ public: qt_video_source(); virtual ~qt_video_source(); - void set_source_path(const std::string& source_path); + void set_iso_path(const std::string& iso_path); void set_video_path(const std::string& video_path) override; const QString& video_path() const { return m_video_path; } @@ -44,7 +44,7 @@ protected: atomic_t m_has_new = false; QString m_video_path; - QString m_source_path; // path of the source archive + std::string m_iso_path; // path of the source archive QByteArray m_video_data{}; QImage m_image{}; std::vector m_image_path; diff --git a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp index 7a341ff0af..2898c9b170 100644 --- a/rpcs3/rpcs3qt/savestate_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/savestate_manager_dialog.cpp @@ -418,10 +418,10 @@ void savestate_manager_dialog::ResizeGameIcons() { const qreal dpr = devicePixelRatioF(); const int savestate_index = item->data(GameUserRole::GameIndex).toInt(); - const std::string icon_path = m_savestate_db[savestate_index]->game_icon_path; - const std::string archive_path = m_savestate_db[savestate_index]->archive_path; + std::string game_icon_path = m_savestate_db[savestate_index]->game_icon_path; + std::string game_archive_path = m_savestate_db[savestate_index]->archive_path; - item->set_icon_load_func([this, icon_path, archive_path, savestate_index, cancel = item->icon_loading_aborted(), dpr](int index) + item->set_icon_load_func([this, icon_path = std::move(game_icon_path), archive_path = std::move(game_archive_path), savestate_index, cancel = item->icon_loading_aborted(), dpr](int index) { if (cancel && cancel->load()) { @@ -434,13 +434,8 @@ void savestate_manager_dialog::ResizeGameIcons() { if (!item->data(GameUserRole::GamePixmapLoaded).toBool()) { - if (!archive_path.empty()) - { - gui::utils::load_icon(icon, icon_path, archive_path); - } - // Load game icon - if (!icon.load(QString::fromStdString(icon_path))) + if (!gui::utils::load_icon(icon, icon_path, archive_path)) { gui_log.warning("Could not load savestate game icon from path %s", icon_path); } diff --git a/rpcs3/rpcs3qt/trophy_manager_dialog.cpp b/rpcs3/rpcs3qt/trophy_manager_dialog.cpp index d784f16f6e..51ef2d2e9f 100644 --- a/rpcs3/rpcs3qt/trophy_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/trophy_manager_dialog.cpp @@ -649,9 +649,9 @@ void trophy_manager_dialog::ResizeGameIcons() { const qreal dpr = devicePixelRatioF(); const int trophy_index = item->data(GameUserRole::GameIndex).toInt(); - const QString icon_path = QString::fromStdString(m_trophies_db[trophy_index]->path); + QString trophy_icon_path = QString::fromStdString(m_trophies_db[trophy_index]->path); - item->set_icon_load_func([this, icon_path, localized_icon, trophy_index, cancel = item->icon_loading_aborted(), dpr](int index) + item->set_icon_load_func([this, icon_path = std::move(trophy_icon_path), localized_icon, trophy_index, cancel = item->icon_loading_aborted(), dpr](int index) { if (cancel && cancel->load()) { From f2afdee40c4507c2df40ca37f9ca314c12b9f314 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 06:52:49 +0100 Subject: [PATCH 108/630] Qt: fix missing mice menu --- rpcs3/rpcs3qt/main_window.ui | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index bf75029d38..5876bfeead 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -242,17 +242,17 @@ Configuration - - - Mice - - - - Devices + + + Mice + + + + @@ -296,9 +296,6 @@ Manage - - - Network Services @@ -307,7 +304,6 @@ - Portals and Gates @@ -317,6 +313,10 @@ + + + + @@ -1046,7 +1046,7 @@ - + :/Icons/rpcn.png:/Icons/rpcn.png From 41a5c69db4c9ff4b9943b35701f427618a0b37e3 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 06:58:59 +0100 Subject: [PATCH 109/630] Qt: Allow to add iso files from menu --- rpcs3/rpcs3qt/main_window.cpp | 16 ++++++++++++++++ rpcs3/rpcs3qt/main_window.ui | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 98d3ceefb3..bd910e0698 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -2531,6 +2531,22 @@ void main_window::CreateConnects() AddGamesFromDirs(std::move(paths)); }); + connect(ui->addIsoGamesAct, &QAction::triggered, this, [this]() + { + if (!m_gui_settings->GetBootConfirmation(this)) + { + return; + } + + QStringList paths = QFileDialog::getOpenFileNames(this, tr("Select ISO files to add"), QString::fromStdString(fs::get_config_dir()), tr("ISO files (*.iso);;All files (*.*)")); + if (paths.isEmpty()) + { + return; + } + + AddGamesFromDirs(std::move(paths)); + }); + connect(ui->bootRecentMenu, &QMenu::aboutToShow, this, [this]() { // Enable/Disable Recent Games List diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index 5876bfeead..9b9853d315 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -218,6 +218,7 @@ + @@ -1513,6 +1514,11 @@ Download Update + + + Add ISO Games + + From 6bd4f52173cf3bbb98f3fa139868d75071f6c2b2 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 07:06:09 +0100 Subject: [PATCH 110/630] Qt: Allow to boot iso files from menu --- rpcs3/rpcs3qt/main_window.cpp | 29 +++++++++++++++++++++++++++++ rpcs3/rpcs3qt/main_window.h | 1 + rpcs3/rpcs3qt/main_window.ui | 7 ++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index bd910e0698..56e125ab11 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -700,6 +700,34 @@ void main_window::BootGame() Boot(dir_path.toStdString(), "", false, true); } +void main_window::BootISO() +{ + bool stopped = false; + + if (Emu.IsRunning()) + { + Emu.Pause(); + stopped = true; + } + + const QString path_last_game = m_gui_settings->GetValue(gui::fd_boot_game).toString(); + const QString path = QFileDialog::getOpenFileName(this, tr("Select ISO"), path_last_game, tr("ISO files (*.iso);;All files (*.*)")); + + if (path.isEmpty()) + { + if (stopped) + { + Emu.Resume(); + } + return; + } + + m_gui_settings->SetValue(gui::fd_boot_game, QFileInfo(path).dir().path()); + + gui_log.notice("Booting from BootISO..."); + Boot(path.toStdString(), "", true, true); +} + void main_window::BootVSH() { gui_log.notice("Booting from BootVSH..."); @@ -2479,6 +2507,7 @@ void main_window::CreateConnects() connect(ui->bootElfAct, &QAction::triggered, this, &main_window::BootElf); connect(ui->bootTestAct, &QAction::triggered, this, &main_window::BootTest); connect(ui->bootGameAct, &QAction::triggered, this, &main_window::BootGame); + connect(ui->bootIsoAct, &QAction::triggered, this, &main_window::BootISO); connect(ui->bootVSHAct, &QAction::triggered, this, &main_window::BootVSH); connect(ui->actionopen_rsx_capture, &QAction::triggered, this, [this](){ BootRsxCapture(); }); connect(ui->actionCreate_RSX_Capture, &QAction::triggered, this, []() diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index ada8f01cad..588c6e6918 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -104,6 +104,7 @@ private Q_SLOTS: void BootElf(); void BootTest(); void BootGame(); + void BootISO(); void BootVSH(); void BootSavestate(); void BootRsxCapture(std::string path = ""); diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index 9b9853d315..1f6a75c6f7 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -62,7 +62,6 @@ 10 - 50 false @@ -211,6 +210,7 @@ + @@ -1519,6 +1519,11 @@ Add ISO Games + + + Boot ISO + + From 98e64d7821472a61fc11cf40aa72f1481e86ddc8 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 07:40:35 +0100 Subject: [PATCH 111/630] Qt: fix appicon for ISO --- rpcs3/rpcs3qt/qt_utils.cpp | 67 ++++++++++++++++++++++++++------------ rpcs3/rpcs3qt/qt_utils.h | 3 ++ 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/rpcs3/rpcs3qt/qt_utils.cpp b/rpcs3/rpcs3qt/qt_utils.cpp index 0f53ee0f86..a957dba11c 100644 --- a/rpcs3/rpcs3qt/qt_utils.cpp +++ b/rpcs3/rpcs3qt/qt_utils.cpp @@ -393,27 +393,46 @@ namespace gui std::string icon_path = fs::get_config_dir() + "/Icons/game_icons/" + title_id + "/ICON0.PNG"; bool found_file = fs::is_file(icon_path); + std::unique_ptr pixmap; + if (!found_file) { // Get Icon for the gs_frame from path. this handles presumably all possible use cases - const QString qpath = QString::fromStdString(path); - const std::string path_list[] = { path, qpath.section("/", 0, -2, QString::SectionIncludeTrailingSep).toStdString(), - qpath.section("/", 0, -3, QString::SectionIncludeTrailingSep).toStdString() }; + std::vector path_list; - for (const std::string& pth : path_list) + const bool is_archive = is_file_iso(path); + if (is_archive) { - if (!fs::is_dir(pth)) + icon_path = "PS3_GAME/ICON0.PNG"; + + QPixmap px; + if (load_iso_icon(px, icon_path, path)) { - continue; + found_file = true; + pixmap = std::make_unique(std::move(px)); } + } + else + { + const QString qpath = QString::fromStdString(path); + path_list = { path, qpath.section("/", 0, -2, QString::SectionIncludeTrailingSep).toStdString(), + qpath.section("/", 0, -3, QString::SectionIncludeTrailingSep).toStdString() }; - const std::string sfo_dir = rpcs3::utils::get_sfo_dir_from_game_path(pth, title_id); - icon_path = sfo_dir + "/ICON0.PNG"; - found_file = fs::is_file(icon_path); - - if (found_file) + for (const std::string& pth : path_list) { - break; + if (!fs::is_dir(pth)) + { + continue; + } + + const std::string sfo_dir = rpcs3::utils::get_sfo_dir_from_game_path(pth, title_id); + icon_path = sfo_dir + "/ICON0.PNG"; + found_file = fs::is_file(icon_path); + + if (found_file) + { + break; + } } } } @@ -421,7 +440,7 @@ namespace gui if (found_file) { // load the image from path. It will most likely be a rectangle - const QImage source = QImage(QString::fromStdString(icon_path)); + const QImage source = pixmap ? pixmap->toImage() : QImage(QString::fromStdString(icon_path)); const int edge_max = std::max(source.width(), source.height()); // create a new transparent image with square size and same format as source (maybe handle other formats than RGB32 as well?) @@ -683,15 +702,9 @@ namespace gui return QString("%1 days ago %2").arg(current_date - exctrated_date).arg(date.toString(fmt_relative)); } - bool load_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path) + bool load_iso_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path) { - if (icon_path.empty()) return false; - - if (archive_path.empty()) - { - return icon.load(QString::fromStdString(icon_path)); - } - + if (icon_path.empty() || archive_path.empty()) return false; if (!is_file_iso(archive_path)) return false; iso_archive archive(archive_path); @@ -707,6 +720,18 @@ namespace gui return icon.loadFromData(data); } + bool load_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path) + { + if (icon_path.empty()) return false; + + if (archive_path.empty()) + { + return icon.load(QString::fromStdString(icon_path)); + } + + return load_iso_icon(icon, icon_path, archive_path); + } + QString format_timestamp(s64 time, const QString& fmt) { return format_datetime(datetime(time), fmt); diff --git a/rpcs3/rpcs3qt/qt_utils.h b/rpcs3/rpcs3qt/qt_utils.h index de2473c083..c08c5665a7 100644 --- a/rpcs3/rpcs3qt/qt_utils.h +++ b/rpcs3/rpcs3qt/qt_utils.h @@ -179,6 +179,9 @@ namespace gui } // Loads an icon from an (ISO) archive file. + bool load_iso_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path); + + // Loads an icon (optionally from an (ISO) archive file). bool load_icon(QPixmap& icon, const std::string& icon_path, const std::string& archive_path); template From 4dc994833d3ae766392135f475ab2bc04242a1ce Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 07:53:17 +0100 Subject: [PATCH 112/630] Qt: fix shortcut creation for ISO --- rpcs3/rpcs3qt/game_list_actions.cpp | 2 +- rpcs3/rpcs3qt/shortcut_utils.cpp | 20 +++++++++++++++----- rpcs3/rpcs3qt/shortcut_utils.h | 1 + rpcs3/rpcs3qt/welcome_dialog.cpp | 4 ++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp index 8e53a94df1..8cc4f767ef 100644 --- a/rpcs3/rpcs3qt/game_list_actions.cpp +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -1534,7 +1534,7 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con #endif } - if (!gameid_token_value.empty() && gui::utils::create_shortcut(gameinfo->info.name, gameinfo->info.serial, target_cli_args, gameinfo->info.name, gameinfo->info.icon_path, target_icon_dir, location)) + if (!gameid_token_value.empty() && gui::utils::create_shortcut(gameinfo->info.name, gameinfo->icon_in_archive ? gameinfo->info.path : "", gameinfo->info.serial, target_cli_args, gameinfo->info.name, gameinfo->info.icon_path, target_icon_dir, location)) { game_list_log.success("Created %s shortcut for %s", destination, QString::fromStdString(gameinfo->info.name).simplified()); } diff --git a/rpcs3/rpcs3qt/shortcut_utils.cpp b/rpcs3/rpcs3qt/shortcut_utils.cpp index 98f72d2872..00bec65f13 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.cpp +++ b/rpcs3/rpcs3qt/shortcut_utils.cpp @@ -4,6 +4,7 @@ #include "Emu/VFS.h" #include "Utilities/File.h" #include "Utilities/StrUtil.h" +#include "Loader/ISO.h" #ifdef _WIN32 #include @@ -31,7 +32,7 @@ LOG_CHANNEL(sys_log, "SYS"); namespace gui::utils { - bool create_square_shortcut_icon_file(const std::string& src_icon_path, const std::string& target_icon_dir, std::string& target_icon_path, const std::string& extension, int size) + bool create_square_shortcut_icon_file(const std::string& path, const std::string& src_icon_path, const std::string& target_icon_dir, std::string& target_icon_path, const std::string& extension, int size) { if (src_icon_path.empty() || target_icon_dir.empty() || extension.empty()) { @@ -39,7 +40,15 @@ namespace gui::utils return false; } - QPixmap icon(QString::fromStdString(src_icon_path)); + const bool is_archive = is_file_iso(path); + + QPixmap icon; + if (!load_icon(icon, src_icon_path, is_archive ? path : "")) + { + sys_log.error("Failed to create shortcut. Failed to load %sicon: '%s'", is_archive ? "iso " : "", src_icon_path); + return false; + } + if (!gui::utils::create_square_pixmap(icon, size)) { sys_log.error("Failed to create shortcut. Icon empty."); @@ -67,6 +76,7 @@ namespace gui::utils } bool create_shortcut(const std::string& name, + const std::string& path, [[maybe_unused]] const std::string& serial, [[maybe_unused]] const std::string& target_cli_args, [[maybe_unused]] const std::string& description, @@ -189,7 +199,7 @@ namespace gui::utils if (!src_icon_path.empty() && !target_icon_dir.empty()) { std::string target_icon_path; - if (!create_square_shortcut_icon_file(src_icon_path, target_icon_dir, target_icon_path, "ico", 512)) + if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, "ico", 512)) return cleanup(false, ".ico creation failed"); const std::wstring w_icon_path = utf8_to_wchar(target_icon_path); @@ -301,7 +311,7 @@ namespace gui::utils if (!src_icon_path.empty()) { std::string target_icon_path = resources_dir; - if (!create_square_shortcut_icon_file(src_icon_path, resources_dir, target_icon_path, "icns", 512)) + if (!create_square_shortcut_icon_file(path, src_icon_path, resources_dir, target_icon_path, "icns", 512)) { // Error is logged in create_square_shortcut_icon_file return false; @@ -339,7 +349,7 @@ namespace gui::utils if (!src_icon_path.empty() && !target_icon_dir.empty()) { std::string target_icon_path; - if (!create_square_shortcut_icon_file(src_icon_path, target_icon_dir, target_icon_path, "png", 512)) + if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, "png", 512)) { // Error is logged in create_square_shortcut_icon_file return false; diff --git a/rpcs3/rpcs3qt/shortcut_utils.h b/rpcs3/rpcs3qt/shortcut_utils.h index 1b47182cbb..11208a2bf0 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.h +++ b/rpcs3/rpcs3qt/shortcut_utils.h @@ -12,6 +12,7 @@ namespace gui::utils }; bool create_shortcut(const std::string& name, + const std::string& path, const std::string& serial, const std::string& target_cli_args, const std::string& description, diff --git a/rpcs3/rpcs3qt/welcome_dialog.cpp b/rpcs3/rpcs3qt/welcome_dialog.cpp index cbe2433bfd..e20415594d 100644 --- a/rpcs3/rpcs3qt/welcome_dialog.cpp +++ b/rpcs3/rpcs3qt/welcome_dialog.cpp @@ -83,12 +83,12 @@ welcome_dialog::welcome_dialog(std::shared_ptr gui_settings, bool { if (ui->create_desktop_shortcut->isChecked()) { - gui::utils::create_shortcut("RPCS3", "", "", "RPCS3", ":/rpcs3.svg", fs::get_temp_dir(), gui::utils::shortcut_location::desktop); + gui::utils::create_shortcut("RPCS3", "", "", "", "RPCS3", ":/rpcs3.svg", fs::get_temp_dir(), gui::utils::shortcut_location::desktop); } if (ui->create_applications_menu_shortcut->isChecked()) { - gui::utils::create_shortcut("RPCS3", "", "", "RPCS3", ":/rpcs3.svg", fs::get_temp_dir(), gui::utils::shortcut_location::applications); + gui::utils::create_shortcut("RPCS3", "", "", "", "RPCS3", ":/rpcs3.svg", fs::get_temp_dir(), gui::utils::shortcut_location::applications); } if (ui->use_dark_theme->isChecked() && ui->use_dark_theme->isEnabled()) // if checked and also on initial welcome dialog From a8624682a770738ffb7d6b0c1ff48dc9c3e6df5b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 08:20:55 +0100 Subject: [PATCH 113/630] ISO: add some logging --- rpcs3/Emu/System.cpp | 12 +++++++++++- rpcs3/Loader/ISO.cpp | 6 ++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 6db05a21ea..7c0fa19c93 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -1174,6 +1174,8 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, launching_from_disc_archive = is_file_iso(disc_info); + sys_log.notice("Savestate: is iso archive = %d ('%s')", launching_from_disc_archive, disc_info); + if (!klic[0]) { klic.clear(); @@ -1299,6 +1301,8 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, if (launching_from_disc_archive) { + sys_log.notice("Savestate: Loading iso archive"); + load_iso(disc_info); m_path = iso_device::virtual_device_name + "/" + argv[0]; @@ -1441,6 +1445,8 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, const std::string resolved_path = GetCallbacks().resolve_path(m_path); if (!launching_from_disc_archive && is_file_iso(m_path)) { + sys_log.notice("Loading iso archive '%s'", m_path); + load_iso(m_path); launching_from_disc_archive = true; @@ -1457,6 +1463,8 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, m_path = path; } + sys_log.notice("Load: is iso archive = %d (m_path='%s')", launching_from_disc_archive, m_path); + if (launching_from_disc_archive) { m_dir = "/dev_bdvd/PS3_GAME/"; @@ -1855,6 +1863,8 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, { if (is_file_iso(game_path)) { + sys_log.notice("Loading iso archive for patch ('%s')", game_path); + load_iso(game_path); launching_from_disc_archive = true; game_path = iso_device::virtual_device_name + "/PS3_GAME/./"; @@ -2368,7 +2378,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, else if (!bdvd_dir.empty() && fs::is_dir(bdvd_dir)) { // Disc games are on /dev_bdvd/ - const std::string& disc_path = !launching_from_disc_archive ? resolved_path : m_path; + const std::string& disc_path = launching_from_disc_archive ? m_path : resolved_path; const usz pos = disc_path.rfind(m_game_dir); argv[0] = "/dev_bdvd/PS3_GAME/" + unescape(disc_path.substr(pos + m_game_dir.size() + 1)); m_dir = "/dev_bdvd/PS3_GAME/"; diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index 0f9772cd8f..064bc48e61 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -9,6 +9,8 @@ #include #include +LOG_CHANNEL(sys_log, "SYS"); + bool is_file_iso(const std::string& path) { if (path.empty()) return false; @@ -609,6 +611,8 @@ void iso_dir::rewind() void load_iso(const std::string& path) { + sys_log.notice("Loading iso '%s'", path); + fs::set_virtual_device("iso_overlay_fs_dev", stx::make_shared(path)); vfs::mount("/dev_bdvd/"sv, iso_device::virtual_device_name + "/"); @@ -616,5 +620,7 @@ void load_iso(const std::string& path) void unload_iso() { + sys_log.notice("Unoading iso"); + fs::set_virtual_device("iso_overlay_fs_dev", stx::shared_ptr()); } From f712de0c917658c206649a0b6c2a71978e6038f2 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 12:35:19 +0100 Subject: [PATCH 114/630] ISO: Remove psf hack --- Utilities/File.h | 2 ++ rpcs3/Loader/ISO.cpp | 5 +---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Utilities/File.h b/Utilities/File.h index f7765507e8..7e6356da7b 100644 --- a/Utilities/File.h +++ b/Utilities/File.h @@ -257,6 +257,8 @@ namespace fs // Open file with specified mode explicit file(const std::string& path, bs_t mode = ::fs::read); + file(std::unique_ptr&& ptr) : m_file(std::move(ptr)) {} + static file from_native_handle(native_handle handle); // Open memory for read diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index 064bc48e61..7e3351cb0e 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -348,10 +348,7 @@ psf::registry iso_archive::open_psf(const std::string& path) auto* archive_file = retrieve(path); if (!archive_file) return psf::registry(); - // HACK: psf does not accept a file_base argument, - // instead we are creating a dummy fs::file and replacing the internal file_base handle with an iso_file - fs::file psf_file(path); - psf_file.reset(std::make_unique(fs::file(m_path), *archive_file)); + const fs::file psf_file(std::make_unique(fs::file(m_path), *archive_file)); return psf::load_object(psf_file, path); } From 36bce336844614001ccbd35a5a6153c3cb7f9483 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 12:35:52 +0100 Subject: [PATCH 115/630] ISO: use string_view in retrieve --- rpcs3/Loader/ISO.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index 7e3351cb0e..b3f9ccb8cf 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -269,9 +269,10 @@ iso_fs_node* iso_archive::retrieve(const std::string& passed_path) if (passed_path.empty()) return nullptr; const std::string path = std::filesystem::path(passed_path).string(); + const std::string_view path_sv = path; size_t start = 0; - size_t end = path.find_first_of(fs::delim); + size_t end = path_sv.find_first_of(fs::delim); std::stack search_stack; search_stack.push(&m_root); @@ -286,7 +287,7 @@ iso_fs_node* iso_archive::retrieve(const std::string& passed_path) end = path.size(); } - const auto path_component = path.substr(start, end-start); + const std::string_view path_component = path_sv.substr(start, end-start); bool found = false; @@ -316,7 +317,7 @@ iso_fs_node* iso_archive::retrieve(const std::string& passed_path) if (!found) return nullptr; start = end + 1; - end = path.find_first_of(fs::delim, start); + end = path_sv.find_first_of(fs::delim, start); } while (start < path.size()); From 9faf9a6145367043cce0123fb41e624a992f58d4 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 12:36:33 +0100 Subject: [PATCH 116/630] ISO: optimize byteswap and utf16 string conversion --- rpcs3/Loader/ISO.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index b3f9ccb8cf..e46a1a6b82 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -102,24 +102,17 @@ std::optional iso_read_directory_entry(fs::file& file, bool nam } else if (names_in_ucs2) // for strings in joliet descriptor { - std::string new_file_name; - int read = 0; - const u8* raw_str = reinterpret_cast(file_name.c_str()); - while (read < file_name_length) + // characters are stored in big endian format. + std::u16string utf16; + utf16.resize(file_name_length / 2); + + const u16* raw = reinterpret_cast(file_name.data()); + for (size_t i = 0; i < utf16.size(); ++i, raw++) { - // characters are stored in big endian format. - const u16 upper = raw_str[read]; - const u8 lower = raw_str[read + 1]; - - const u16 code_point = (upper << 8) + lower; - - std::wstring_convert, char16_t> convert; - new_file_name += convert.to_bytes(code_point); - - read += 2; + utf16[i] = *reinterpret_cast*>(raw); } - file_name = new_file_name; + file_name = utf16_to_utf8(utf16); } if (file_name.ends_with(";1")) From b2768bbd61f70bdb4ca57815e64809c21a82670d Mon Sep 17 00:00:00 2001 From: zeph Date: Fri, 9 Jan 2026 02:02:51 +0100 Subject: [PATCH 117/630] UI: colored ANSI logs --- rpcs3/rpcs3qt/log_frame.cpp | 14 +++- rpcs3/rpcs3qt/log_frame.h | 2 + rpcs3/rpcs3qt/log_viewer.h | 2 + rpcs3/rpcs3qt/syntax_highlighter.cpp | 101 +++++++++++++++++++++++++++ rpcs3/rpcs3qt/syntax_highlighter.h | 11 +++ 5 files changed, 128 insertions(+), 2 deletions(-) diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index bbc6fe6145..7689aa8f9c 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -3,6 +3,7 @@ #include "gui_settings.h" #include "hex_validator.h" #include "memory_viewer_panel.h" +#include "syntax_highlighter.h" #include "Utilities/lockless.h" #include "util/asm.hpp" @@ -131,6 +132,8 @@ log_frame::log_frame(std::shared_ptr _gui_settings, QWidget* paren m_tty->setContextMenuPolicy(Qt::CustomContextMenu); m_tty->document()->setMaximumBlockCount(max_block_count_tty); m_tty->installEventFilter(this); + + m_tty_ansi_highlighter = new AnsiHighlighter(m_tty->document()); m_tty_input = new QLineEdit(); if (m_tty_channel >= 0) @@ -599,8 +602,15 @@ void log_frame::UpdateUI() buf_line.assign(std::string_view(m_tty_buf).substr(str_index, m_tty_buf.find_first_of('\n', str_index) - str_index)); str_index += buf_line.size() + 1; - // Ignore control characters and greater/equal to 0x80 - buf_line.erase(std::remove_if(buf_line.begin(), buf_line.end(), [](s8 c) { return c <= 0x8 || c == 0x7F || (c >= 0xE && c <= 0x1F); }), buf_line.end()); + // Ignore control characters and greater/equal to 0x80, but preserve ESC (0x1B) if ANSI mode is enabled + buf_line.erase(std::remove_if(buf_line.begin(), buf_line.end(), [this](s8 c) { + if (m_ansi_tty) + { + // Keep ESC (0x1B) so ANSI sequences remain intact + return c <= 0x8 || c == 0x7F || (c >= 0xE && c <= 0x1F && c != 0x1B); + } + return c <= 0x8 || c == 0x7F || (c >= 0xE && c <= 0x1F); + }), buf_line.end()); // save old scroll bar state QScrollBar* sb = m_tty->verticalScrollBar(); diff --git a/rpcs3/rpcs3qt/log_frame.h b/rpcs3/rpcs3qt/log_frame.h index 0de081863c..f8dd57605f 100644 --- a/rpcs3/rpcs3qt/log_frame.h +++ b/rpcs3/rpcs3qt/log_frame.h @@ -5,6 +5,7 @@ #include "custom_dock_widget.h" #include "find_dialog.h" +#include "syntax_highlighter.h" #include @@ -69,6 +70,7 @@ private: QPlainTextEdit* m_tty = nullptr; QLineEdit* m_tty_input = nullptr; int m_tty_channel = -1; + AnsiHighlighter* m_tty_ansi_highlighter = nullptr; QAction* m_clear_act = nullptr; QAction* m_clear_tty_act = nullptr; diff --git a/rpcs3/rpcs3qt/log_viewer.h b/rpcs3/rpcs3qt/log_viewer.h index 85ece2688b..8f9e14f833 100644 --- a/rpcs3/rpcs3qt/log_viewer.h +++ b/rpcs3/rpcs3qt/log_viewer.h @@ -9,6 +9,7 @@ #include class LogHighlighter; +class AnsiHighlighter; class gui_settings; class log_viewer : public QWidget @@ -33,6 +34,7 @@ private: QString m_full_log; QPlainTextEdit* m_log_text; LogHighlighter* m_log_highlighter; + AnsiHighlighter* m_ansi_highlighter; std::unique_ptr m_find_dialog; std::bitset<32> m_log_levels = std::bitset<32>(0b11111111u); bool m_show_timestamps = true; diff --git a/rpcs3/rpcs3qt/syntax_highlighter.cpp b/rpcs3/rpcs3qt/syntax_highlighter.cpp index 33d49e678d..0cc16bc30e 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.cpp +++ b/rpcs3/rpcs3qt/syntax_highlighter.cpp @@ -183,3 +183,104 @@ GlslHighlighter::GlslHighlighter(QTextDocument* parent) : Highlighter(parent) commentStartExpression = QRegularExpression("/\\*"); commentEndExpression = QRegularExpression("\\*/"); } + +AnsiHighlighter::AnsiHighlighter(QTextDocument* parent) : Highlighter(parent) +{ +} + +void AnsiHighlighter::highlightBlock(const QString &text) +{ + // Match ANSI SGR sequences, e.g. "\x1b[31m" or "\x1b[1;32m" + const QRegularExpression ansi_re("\x1b\\[[0-9;]*m"); + const QRegularExpression param_re("\x1b\\[([0-9;]*)m"); + + QTextCharFormat escapeFormat; + escapeFormat.setForeground(Qt::darkGray); + escapeFormat.setFontItalic(true); + + QTextCharFormat currentFormat; + currentFormat.setForeground(gui::utils::get_foreground_color()); + + int pos = 0; + auto it = ansi_re.globalMatch(text); + while (it.hasNext()) + { + auto match = it.next(); + int start = match.capturedStart(); + int length = match.capturedLength(); + + // Apply current format to the chunk before this escape sequence + if (start > pos) + { + setFormat(pos, start - pos, currentFormat); + } + + // Highlight the escape sequence itself + setFormat(start, length, escapeFormat); + + // Parse SGR parameters and update currentFormat + QRegularExpressionMatch pm = param_re.match(match.captured()); + if (pm.hasMatch()) + { + QString params = pm.captured(1); + if (params.isEmpty()) + { + // empty or just \x1b[m = reset + currentFormat = QTextCharFormat(); + currentFormat.setForeground(gui::utils::get_foreground_color()); + } + else + { + const QStringList codes = params.split(';', Qt::SkipEmptyParts); + for (const QString& c : codes) + { + bool ok = false; + const int code = c.toInt(&ok); + if (!ok) continue; + switch (code) + { + case 0: + currentFormat = QTextCharFormat(); + currentFormat.setForeground(gui::utils::get_foreground_color()); + break; + case 1: + currentFormat.setFontWeight(QFont::Bold); + break; + case 3: + currentFormat.setFontItalic(true); + break; + case 4: + currentFormat.setFontUnderline(true); + break; + case 30: currentFormat.setForeground(Qt::black); break; + case 31: currentFormat.setForeground(Qt::red); break; + case 32: currentFormat.setForeground(Qt::darkGreen); break; + case 33: currentFormat.setForeground(Qt::darkYellow); break; + case 34: currentFormat.setForeground(Qt::darkBlue); break; + case 35: currentFormat.setForeground(Qt::darkMagenta); break; + case 36: currentFormat.setForeground(Qt::darkCyan); break; + case 37: currentFormat.setForeground(Qt::lightGray); break; + case 39: currentFormat.setForeground(gui::utils::get_foreground_color()); break; + case 90: currentFormat.setForeground(Qt::darkGray); break; + case 91: currentFormat.setForeground(Qt::red); break; + case 92: currentFormat.setForeground(Qt::green); break; + case 93: currentFormat.setForeground(Qt::yellow); break; + case 94: currentFormat.setForeground(Qt::blue); break; + case 95: currentFormat.setForeground(Qt::magenta); break; + case 96: currentFormat.setForeground(Qt::cyan); break; + case 97: currentFormat.setForeground(Qt::white); break; + // Background and extended colors not yet handled + default: + break; + } + } + } + } + + pos = start + length; + } + + // Apply remaining format + if (pos < text.length()) + setFormat(pos, text.length() - pos, currentFormat); +} diff --git a/rpcs3/rpcs3qt/syntax_highlighter.h b/rpcs3/rpcs3qt/syntax_highlighter.h index 8179cd2257..d5ba800e3b 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.h +++ b/rpcs3/rpcs3qt/syntax_highlighter.h @@ -52,3 +52,14 @@ class GlslHighlighter : public Highlighter public: explicit GlslHighlighter(QTextDocument* parent = nullptr); }; + +class AnsiHighlighter : public Highlighter +{ + Q_OBJECT + +public: + explicit AnsiHighlighter(QTextDocument* parent = nullptr); + +protected: + void highlightBlock(const QString &text) override; +}; From 484d97caf172c5ab2133d177f067ddbb3a0150c3 Mon Sep 17 00:00:00 2001 From: zeph Date: Fri, 9 Jan 2026 18:33:16 +0100 Subject: [PATCH 118/630] UI: colored ANSI logs fix-ups --- rpcs3/rpcs3qt/log_frame.cpp | 25 +++++++-- rpcs3/rpcs3qt/log_frame.h | 4 +- rpcs3/rpcs3qt/log_viewer.h | 1 - rpcs3/rpcs3qt/syntax_highlighter.cpp | 81 ++++++++++++++-------------- rpcs3/rpcs3qt/syntax_highlighter.h | 5 +- 5 files changed, 68 insertions(+), 48 deletions(-) diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index 7689aa8f9c..e77a847c78 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -132,8 +132,6 @@ log_frame::log_frame(std::shared_ptr _gui_settings, QWidget* paren m_tty->setContextMenuPolicy(Qt::CustomContextMenu); m_tty->document()->setMaximumBlockCount(max_block_count_tty); m_tty->installEventFilter(this); - - m_tty_ansi_highlighter = new AnsiHighlighter(m_tty->document()); m_tty_input = new QLineEdit(); if (m_tty_channel >= 0) @@ -164,6 +162,11 @@ log_frame::log_frame(std::shared_ptr _gui_settings, QWidget* paren CreateAndConnectActions(); LoadSettings(); + if (m_ansi_tty) + { + m_tty_ansi_highlighter = new AnsiHighlighter(m_tty->document()); + } + m_timer = new QTimer(this); connect(m_timer, &QTimer::timeout, this, &log_frame::UpdateUI); } @@ -291,6 +294,16 @@ void log_frame::CreateAndConnectActions() { m_gui_settings->SetValue(gui::l_ansi_code, checked); m_ansi_tty = checked; + + if (!m_tty_ansi_highlighter) + { + m_tty_ansi_highlighter = new AnsiHighlighter(m_tty->document()); + } + else + { + delete m_tty_ansi_highlighter; + m_tty_ansi_highlighter = nullptr; + } }); m_tty_channel_acts = new QActionGroup(this); @@ -602,13 +615,15 @@ void log_frame::UpdateUI() buf_line.assign(std::string_view(m_tty_buf).substr(str_index, m_tty_buf.find_first_of('\n', str_index) - str_index)); str_index += buf_line.size() + 1; - // Ignore control characters and greater/equal to 0x80, but preserve ESC (0x1B) if ANSI mode is enabled - buf_line.erase(std::remove_if(buf_line.begin(), buf_line.end(), [this](s8 c) { + buf_line.erase(std::remove_if(buf_line.begin(), buf_line.end(), [this](s8 c) + { + // If ANSI TTY is enabled, preserve ESC (0x1B) for ANSI sequences if (m_ansi_tty) { - // Keep ESC (0x1B) so ANSI sequences remain intact return c <= 0x8 || c == 0x7F || (c >= 0xE && c <= 0x1F && c != 0x1B); } + + // Remove all control characters so output is clean return c <= 0x8 || c == 0x7F || (c >= 0xE && c <= 0x1F); }), buf_line.end()); diff --git a/rpcs3/rpcs3qt/log_frame.h b/rpcs3/rpcs3qt/log_frame.h index f8dd57605f..35ee672ffc 100644 --- a/rpcs3/rpcs3qt/log_frame.h +++ b/rpcs3/rpcs3qt/log_frame.h @@ -1,11 +1,11 @@ #pragma once #include "Utilities/File.h" +#include "rpcs3qt/syntax_highlighter.h" #include "util/logs.hpp" #include "custom_dock_widget.h" #include "find_dialog.h" -#include "syntax_highlighter.h" #include @@ -13,6 +13,8 @@ #include #include +class AnsiHighlighter; + class gui_settings; class log_frame : public custom_dock_widget diff --git a/rpcs3/rpcs3qt/log_viewer.h b/rpcs3/rpcs3qt/log_viewer.h index 8f9e14f833..a2e8242f89 100644 --- a/rpcs3/rpcs3qt/log_viewer.h +++ b/rpcs3/rpcs3qt/log_viewer.h @@ -34,7 +34,6 @@ private: QString m_full_log; QPlainTextEdit* m_log_text; LogHighlighter* m_log_highlighter; - AnsiHighlighter* m_ansi_highlighter; std::unique_ptr m_find_dialog; std::bitset<32> m_log_levels = std::bitset<32>(0b11111111u); bool m_show_timestamps = true; diff --git a/rpcs3/rpcs3qt/syntax_highlighter.cpp b/rpcs3/rpcs3qt/syntax_highlighter.cpp index 0cc16bc30e..4cc44b6d8b 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.cpp +++ b/rpcs3/rpcs3qt/syntax_highlighter.cpp @@ -186,48 +186,49 @@ GlslHighlighter::GlslHighlighter(QTextDocument* parent) : Highlighter(parent) AnsiHighlighter::AnsiHighlighter(QTextDocument* parent) : Highlighter(parent) { + m_foreground_color = gui::utils::get_foreground_color(); } -void AnsiHighlighter::highlightBlock(const QString &text) +void AnsiHighlighter::highlightBlock(const QString& text) { // Match ANSI SGR sequences, e.g. "\x1b[31m" or "\x1b[1;32m" - const QRegularExpression ansi_re("\x1b\\[[0-9;]*m"); - const QRegularExpression param_re("\x1b\\[([0-9;]*)m"); + static const QRegularExpression ansi_re("\x1b\\[[0-9;]*m"); + static const QRegularExpression param_re("\x1b\\[([0-9;]*)m"); - QTextCharFormat escapeFormat; - escapeFormat.setForeground(Qt::darkGray); - escapeFormat.setFontItalic(true); + static QTextCharFormat escape_format; + escape_format.setForeground(Qt::darkGray); + escape_format.setFontItalic(true); - QTextCharFormat currentFormat; - currentFormat.setForeground(gui::utils::get_foreground_color()); + static QTextCharFormat current_format; + current_format.setForeground(m_foreground_color); int pos = 0; auto it = ansi_re.globalMatch(text); while (it.hasNext()) { - auto match = it.next(); - int start = match.capturedStart(); - int length = match.capturedLength(); + const auto match = it.next(); + const int start = match.capturedStart(); + const int length = match.capturedLength(); // Apply current format to the chunk before this escape sequence if (start > pos) { - setFormat(pos, start - pos, currentFormat); + setFormat(pos, start - pos, current_format); } // Highlight the escape sequence itself - setFormat(start, length, escapeFormat); + setFormat(start, length, escape_format); // Parse SGR parameters and update currentFormat - QRegularExpressionMatch pm = param_re.match(match.captured()); + const QRegularExpressionMatch pm = param_re.match(match.captured()); if (pm.hasMatch()) { - QString params = pm.captured(1); + const QString params = pm.captured(1); if (params.isEmpty()) { // empty or just \x1b[m = reset - currentFormat = QTextCharFormat(); - currentFormat.setForeground(gui::utils::get_foreground_color()); + current_format = QTextCharFormat(); + current_format.setForeground(m_foreground_color); } else { @@ -240,35 +241,35 @@ void AnsiHighlighter::highlightBlock(const QString &text) switch (code) { case 0: - currentFormat = QTextCharFormat(); - currentFormat.setForeground(gui::utils::get_foreground_color()); + current_format = QTextCharFormat(); + current_format.setForeground(m_foreground_color); break; case 1: - currentFormat.setFontWeight(QFont::Bold); + current_format.setFontWeight(QFont::Bold); break; case 3: - currentFormat.setFontItalic(true); + current_format.setFontItalic(true); break; case 4: - currentFormat.setFontUnderline(true); + current_format.setFontUnderline(true); break; - case 30: currentFormat.setForeground(Qt::black); break; - case 31: currentFormat.setForeground(Qt::red); break; - case 32: currentFormat.setForeground(Qt::darkGreen); break; - case 33: currentFormat.setForeground(Qt::darkYellow); break; - case 34: currentFormat.setForeground(Qt::darkBlue); break; - case 35: currentFormat.setForeground(Qt::darkMagenta); break; - case 36: currentFormat.setForeground(Qt::darkCyan); break; - case 37: currentFormat.setForeground(Qt::lightGray); break; - case 39: currentFormat.setForeground(gui::utils::get_foreground_color()); break; - case 90: currentFormat.setForeground(Qt::darkGray); break; - case 91: currentFormat.setForeground(Qt::red); break; - case 92: currentFormat.setForeground(Qt::green); break; - case 93: currentFormat.setForeground(Qt::yellow); break; - case 94: currentFormat.setForeground(Qt::blue); break; - case 95: currentFormat.setForeground(Qt::magenta); break; - case 96: currentFormat.setForeground(Qt::cyan); break; - case 97: currentFormat.setForeground(Qt::white); break; + case 30: current_format.setForeground(Qt::black); break; + case 31: current_format.setForeground(Qt::red); break; + case 32: current_format.setForeground(Qt::darkGreen); break; + case 33: current_format.setForeground(Qt::darkYellow); break; + case 34: current_format.setForeground(Qt::darkBlue); break; + case 35: current_format.setForeground(Qt::darkMagenta); break; + case 36: current_format.setForeground(Qt::darkCyan); break; + case 37: current_format.setForeground(Qt::lightGray); break; + case 39: current_format.setForeground(m_foreground_color); break; + case 90: current_format.setForeground(Qt::darkGray); break; + case 91: current_format.setForeground(Qt::red); break; + case 92: current_format.setForeground(Qt::green); break; + case 93: current_format.setForeground(Qt::yellow); break; + case 94: current_format.setForeground(Qt::blue); break; + case 95: current_format.setForeground(Qt::magenta); break; + case 96: current_format.setForeground(Qt::cyan); break; + case 97: current_format.setForeground(Qt::white); break; // Background and extended colors not yet handled default: break; @@ -282,5 +283,5 @@ void AnsiHighlighter::highlightBlock(const QString &text) // Apply remaining format if (pos < text.length()) - setFormat(pos, text.length() - pos, currentFormat); + setFormat(pos, text.length() - pos, current_format); } diff --git a/rpcs3/rpcs3qt/syntax_highlighter.h b/rpcs3/rpcs3qt/syntax_highlighter.h index d5ba800e3b..f8577333dd 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.h +++ b/rpcs3/rpcs3qt/syntax_highlighter.h @@ -2,6 +2,7 @@ #include #include +#include // Inspired by https://doc.qt.io/qt-5/qtwidgets-richtext-syntaxhighlighter-example.html @@ -61,5 +62,7 @@ public: explicit AnsiHighlighter(QTextDocument* parent = nullptr); protected: - void highlightBlock(const QString &text) override; + QColor m_foreground_color; + + void highlightBlock(const QString& text) override; }; From 6eeca69c56e7ee27d5a0489968751006fc2d8ce3 Mon Sep 17 00:00:00 2001 From: zeph Date: Fri, 9 Jan 2026 18:56:15 +0100 Subject: [PATCH 119/630] UI: ANSI colors, further fix-ups --- rpcs3/rpcs3qt/log_frame.cpp | 4 ++-- rpcs3/rpcs3qt/log_frame.h | 1 - rpcs3/rpcs3qt/log_viewer.h | 1 - rpcs3/rpcs3qt/syntax_highlighter.cpp | 15 +++++---------- rpcs3/rpcs3qt/syntax_highlighter.h | 4 ++++ 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index e77a847c78..a97e2b6231 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -295,13 +295,13 @@ void log_frame::CreateAndConnectActions() m_gui_settings->SetValue(gui::l_ansi_code, checked); m_ansi_tty = checked; - if (!m_tty_ansi_highlighter) + if (m_ansi_tty) { m_tty_ansi_highlighter = new AnsiHighlighter(m_tty->document()); } else { - delete m_tty_ansi_highlighter; + m_tty_ansi_highlighter->deleteLater(); m_tty_ansi_highlighter = nullptr; } }); diff --git a/rpcs3/rpcs3qt/log_frame.h b/rpcs3/rpcs3qt/log_frame.h index 35ee672ffc..35bd3a7ab1 100644 --- a/rpcs3/rpcs3qt/log_frame.h +++ b/rpcs3/rpcs3qt/log_frame.h @@ -1,7 +1,6 @@ #pragma once #include "Utilities/File.h" -#include "rpcs3qt/syntax_highlighter.h" #include "util/logs.hpp" #include "custom_dock_widget.h" diff --git a/rpcs3/rpcs3qt/log_viewer.h b/rpcs3/rpcs3qt/log_viewer.h index a2e8242f89..85ece2688b 100644 --- a/rpcs3/rpcs3qt/log_viewer.h +++ b/rpcs3/rpcs3qt/log_viewer.h @@ -9,7 +9,6 @@ #include class LogHighlighter; -class AnsiHighlighter; class gui_settings; class log_viewer : public QWidget diff --git a/rpcs3/rpcs3qt/syntax_highlighter.cpp b/rpcs3/rpcs3qt/syntax_highlighter.cpp index 4cc44b6d8b..2fd43033d5 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.cpp +++ b/rpcs3/rpcs3qt/syntax_highlighter.cpp @@ -186,20 +186,15 @@ GlslHighlighter::GlslHighlighter(QTextDocument* parent) : Highlighter(parent) AnsiHighlighter::AnsiHighlighter(QTextDocument* parent) : Highlighter(parent) { + m_escape_format.setForeground(Qt::darkGray); + m_escape_format.setFontItalic(true); + m_foreground_color = gui::utils::get_foreground_color(); } void AnsiHighlighter::highlightBlock(const QString& text) { - // Match ANSI SGR sequences, e.g. "\x1b[31m" or "\x1b[1;32m" - static const QRegularExpression ansi_re("\x1b\\[[0-9;]*m"); - static const QRegularExpression param_re("\x1b\\[([0-9;]*)m"); - - static QTextCharFormat escape_format; - escape_format.setForeground(Qt::darkGray); - escape_format.setFontItalic(true); - - static QTextCharFormat current_format; + QTextCharFormat current_format; current_format.setForeground(m_foreground_color); int pos = 0; @@ -217,7 +212,7 @@ void AnsiHighlighter::highlightBlock(const QString& text) } // Highlight the escape sequence itself - setFormat(start, length, escape_format); + setFormat(start, length, m_escape_format); // Parse SGR parameters and update currentFormat const QRegularExpressionMatch pm = param_re.match(match.captured()); diff --git a/rpcs3/rpcs3qt/syntax_highlighter.h b/rpcs3/rpcs3qt/syntax_highlighter.h index f8577333dd..82745ed36f 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.h +++ b/rpcs3/rpcs3qt/syntax_highlighter.h @@ -62,6 +62,10 @@ public: explicit AnsiHighlighter(QTextDocument* parent = nullptr); protected: + const QRegularExpression ansi_re = QRegularExpression("\x1b\\[[0-9;]*m"); + const QRegularExpression param_re = QRegularExpression("\x1b\\[([0-9;]*)m"); + + QTextCharFormat m_escape_format; QColor m_foreground_color; void highlightBlock(const QString& text) override; From 84ddcea45aaae8f98887a23d74e220ad341e8f17 Mon Sep 17 00:00:00 2001 From: zeph Date: Fri, 9 Jan 2026 18:58:57 +0100 Subject: [PATCH 120/630] UI: ANSI colors, more explicit `erase` check --- rpcs3/rpcs3qt/log_frame.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index a97e2b6231..6e6c216ebf 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -615,17 +615,22 @@ void log_frame::UpdateUI() buf_line.assign(std::string_view(m_tty_buf).substr(str_index, m_tty_buf.find_first_of('\n', str_index) - str_index)); str_index += buf_line.size() + 1; - buf_line.erase(std::remove_if(buf_line.begin(), buf_line.end(), [this](s8 c) + // If ANSI TTY is enabled, remove all control characters except for ESC (0x1B) for ANSI sequences + if (m_ansi_tty) { - // If ANSI TTY is enabled, preserve ESC (0x1B) for ANSI sequences - if (m_ansi_tty) + buf_line.erase(std::remove_if(buf_line.begin(), buf_line.end(), [](s8 c) { return c <= 0x8 || c == 0x7F || (c >= 0xE && c <= 0x1F && c != 0x1B); - } - - // Remove all control characters so output is clean - return c <= 0x8 || c == 0x7F || (c >= 0xE && c <= 0x1F); - }), buf_line.end()); + }), buf_line.end()); + } + // Otherwise, remove all control characters to keep the output clean + else + { + buf_line.erase(std::remove_if(buf_line.begin(), buf_line.end(), [](s8 c) + { + return c <= 0x8 || c == 0x7F || (c >= 0xE && c <= 0x1F); + }), buf_line.end()); + } // save old scroll bar state QScrollBar* sb = m_tty->verticalScrollBar(); From 4431f6b3d9822c9fedc6bf8cff7fddd0077a4ee6 Mon Sep 17 00:00:00 2001 From: zeph Date: Fri, 9 Jan 2026 19:21:31 +0100 Subject: [PATCH 121/630] UI: ANSI TTY colors, fix git submodule versions and correct include --- rpcs3/rpcs3qt/syntax_highlighter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/syntax_highlighter.h b/rpcs3/rpcs3qt/syntax_highlighter.h index 82745ed36f..3854059dd7 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.h +++ b/rpcs3/rpcs3qt/syntax_highlighter.h @@ -2,7 +2,7 @@ #include #include -#include +#include // Inspired by https://doc.qt.io/qt-5/qtwidgets-richtext-syntaxhighlighter-example.html From 50fcee6fe04fee4539ff2aaa52de0098248556f9 Mon Sep 17 00:00:00 2001 From: zeph <35661622+ZephyrCodesStuff@users.noreply.github.com> Date: Fri, 9 Jan 2026 20:38:36 +0100 Subject: [PATCH 122/630] UI: ANSI colors, code fix suggestion Co-authored-by: Megamouse --- rpcs3/rpcs3qt/log_frame.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index 6e6c216ebf..2080cdabcf 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -295,11 +295,11 @@ void log_frame::CreateAndConnectActions() m_gui_settings->SetValue(gui::l_ansi_code, checked); m_ansi_tty = checked; - if (m_ansi_tty) + if (m_ansi_tty && !m_tty_ansi_highlighter) { m_tty_ansi_highlighter = new AnsiHighlighter(m_tty->document()); } - else + else if (!m_ansi_tty && m_tty_ansi_highlighter) { m_tty_ansi_highlighter->deleteLater(); m_tty_ansi_highlighter = nullptr; From ad65878c0c637cacb51bfcede8857826caa69c19 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 1 Sep 2025 19:57:38 +0200 Subject: [PATCH 123/630] gl: fix some cppcheck issues --- rpcs3/Emu/RSX/Common/texture_cache_utils.h | 6 +++--- rpcs3/Emu/RSX/GL/GLRenderTargets.cpp | 4 +++- rpcs3/Emu/RSX/GL/GLTexture.cpp | 2 ++ rpcs3/Emu/RSX/GL/glutils/program.h | 2 +- rpcs3/Emu/RSX/GL/glutils/state_tracker.hpp | 7 ++----- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/texture_cache_utils.h b/rpcs3/Emu/RSX/Common/texture_cache_utils.h index c34b73f7ba..a180a1a8d1 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache_utils.h +++ b/rpcs3/Emu/RSX/Common/texture_cache_utils.h @@ -79,7 +79,7 @@ namespace rsx private: // Members - block_list *block; + block_list* block = nullptr; list_iterator list_it = {}; size_type idx = u32{umax}; size_type array_idx = 0; @@ -705,9 +705,9 @@ namespace rsx private: // Members address_range32 range; - section_bounds bounds; + section_bounds bounds {}; - block_type *block = nullptr; + block_type* block = nullptr; bool needs_overlap_check = true; bool unowned_remaining = false; unowned_iterator unowned_it = {}; diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index 4e5e61dcba..18058842aa 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -218,7 +218,7 @@ void GLGSRender::init_buffers(rsx::framebuffer_creation_context context, bool /* static_cast(m_draw_fbo)->release(); } - for (auto &fbo : m_framebuffer_cache) + for (auto& fbo : m_framebuffer_cache) { if (fbo.matches(color_targets, depth_stencil_target)) { @@ -264,6 +264,8 @@ void GLGSRender::init_buffers(rsx::framebuffer_creation_context context, bool /* } } + ensure(m_draw_fbo); + switch (rsx::method_registers.surface_color_target()) { case rsx::surface_target::none: break; diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 7b43cfc0a7..9a439177f4 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -289,6 +289,8 @@ namespace gl void* copy_image_to_buffer(gl::command_context& cmd, const pixel_buffer_layout& pack_info, const gl::texture* src, gl::buffer* dst, u32 dst_offset, const int src_level, const coord3u& src_region, image_memory_requirements* mem_info) { + ensure(src && dst); + auto initialize_scratch_mem = [&]() -> bool // skip_transform { const u64 max_mem = (mem_info->memory_required) ? mem_info->memory_required : mem_info->image_size_in_bytes; diff --git a/rpcs3/Emu/RSX/GL/glutils/program.h b/rpcs3/Emu/RSX/GL/glutils/program.h index 72daef2523..5caca0ed98 100644 --- a/rpcs3/Emu/RSX/GL/glutils/program.h +++ b/rpcs3/Emu/RSX/GL/glutils/program.h @@ -14,7 +14,7 @@ namespace gl class shader { std::string source; - ::glsl::program_domain type; + ::glsl::program_domain type {}; GLuint m_id = GL_NONE; fence m_compiled_fence; diff --git a/rpcs3/Emu/RSX/GL/glutils/state_tracker.hpp b/rpcs3/Emu/RSX/GL/glutils/state_tracker.hpp index 9835a5891f..694ed28cac 100644 --- a/rpcs3/Emu/RSX/GL/glutils/state_tracker.hpp +++ b/rpcs3/Emu/RSX/GL/glutils/state_tracker.hpp @@ -376,15 +376,12 @@ namespace gl GLuint get_bound_texture(GLuint layer, GLenum target) { - ensure(layer < 48); - return bound_textures[layer][target]; + return ::at32(bound_textures, layer)[target]; } void bind_texture(GLuint layer, GLenum target, GLuint name, GLboolean force = GL_FALSE) { - ensure(layer < 48); - - auto& bound = bound_textures[layer][target]; + auto& bound = ::at32(bound_textures, layer)[target]; if (bound != name || force) { glActiveTexture(GL_TEXTURE0 + layer); From ae6bdf84f17db0e52fccb38c60d52f06d628a4d4 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 8 Apr 2025 08:58:35 +0200 Subject: [PATCH 124/630] Update ffmpeg to 7.1.2 --- 3rdparty/ffmpeg | 2 +- rpcs3/util/media_utils.cpp | 65 +++++++++++++++++++++++++++++++------- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/3rdparty/ffmpeg b/3rdparty/ffmpeg index ec6367d3ba..ce81114ed9 160000 --- a/3rdparty/ffmpeg +++ b/3rdparty/ffmpeg @@ -1 +1 @@ -Subproject commit ec6367d3ba9d0d57b9d22d4b87da8144acaf428f +Subproject commit ce81114ed99e5510f6cd983f59a1eac9f33bb73c diff --git a/rpcs3/util/media_utils.cpp b/rpcs3/util/media_utils.cpp index 60a337e750..571eaa74fd 100644 --- a/rpcs3/util/media_utils.cpp +++ b/rpcs3/util/media_utils.cpp @@ -347,9 +347,22 @@ namespace utils { if (!codec) return false; - for (const AVSampleFormat* p = codec->sample_fmts; p && *p != AV_SAMPLE_FMT_NONE; p++) + const void* sample_formats = nullptr; + int num = 0; + + if (const int err = avcodec_get_supported_config(nullptr, codec, AVCodecConfig::AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, &sample_formats, &num)) { - if (*p == sample_fmt) + media_log.error("check_sample_fmt: avcodec_get_supported_config error: %d='%s'", err, av_error_to_string(err)); + return false; + } + + if (!sample_formats) + return true; // All supported + + int i = 0; + for (const AVSampleFormat* fmt = static_cast(sample_formats); fmt && *fmt != AV_SAMPLE_FMT_NONE && i < num; fmt++, i++) + { + if (*fmt == sample_fmt) { return true; } @@ -360,18 +373,33 @@ namespace utils // just pick the highest supported samplerate static int select_sample_rate(const AVCodec* codec) { - if (!codec || !codec->supported_samplerates) - return 48000; + constexpr int default_sample_rate = 48000; - int best_samplerate = 0; - for (const int* samplerate = codec->supported_samplerates; samplerate && *samplerate != 0; samplerate++) + if (!codec) + return default_sample_rate; + + const void* sample_rates = nullptr; + int num = 0; + + if (const int err = avcodec_get_supported_config(nullptr, codec, AVCodecConfig::AV_CODEC_CONFIG_SAMPLE_RATE, 0, &sample_rates, &num)) { - if (!best_samplerate || abs(48000 - *samplerate) < abs(48000 - best_samplerate)) + media_log.error("select_sample_rate: avcodec_get_supported_config error: %d='%s'", err, av_error_to_string(err)); + return default_sample_rate; + } + + if (!sample_rates) + return default_sample_rate; + + int i = 0; + int best_sample_rate = 0; + for (const int* sample_rate = static_cast(sample_rates); sample_rate && *sample_rate != 0 && i < num; sample_rate++, i++) + { + if (!best_sample_rate || abs(default_sample_rate - *sample_rate) < abs(default_sample_rate - best_sample_rate)) { - best_samplerate = *samplerate; + best_sample_rate = *sample_rate; } } - return best_samplerate; + return best_sample_rate; } AVChannelLayout get_preferred_channel_layout(int channels) @@ -397,12 +425,25 @@ namespace utils { if (!codec) return nullptr; + const void* ch_layouts = nullptr; + int num = 0; + + if (const int err = avcodec_get_supported_config(nullptr, codec, AVCodecConfig::AV_CODEC_CONFIG_CHANNEL_LAYOUT, 0, &ch_layouts, &num)) + { + media_log.error("select_channel_layout: avcodec_get_supported_config error: %d='%s'", err, av_error_to_string(err)); + return nullptr; + } + + if (!ch_layouts) + return nullptr; + const AVChannelLayout preferred_ch_layout = get_preferred_channel_layout(channels); const AVChannelLayout* found_ch_layout = nullptr; - for (const AVChannelLayout* ch_layout = codec->ch_layouts; - ch_layout && memcmp(ch_layout, &empty_ch_layout, sizeof(AVChannelLayout)) != 0; - ch_layout++) + int i = 0; + for (const AVChannelLayout* ch_layout = static_cast(ch_layouts); + i < num && ch_layout && memcmp(ch_layout, &empty_ch_layout, sizeof(AVChannelLayout)) != 0; + ch_layout++, i++) { media_log.notice("select_channel_layout: listing channel layout '%s' with %d channels", channel_layout_name(*ch_layout), ch_layout->nb_channels); From cd6dfc82a27844860d3596f5e031214ef354d849 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 01:43:24 +0100 Subject: [PATCH 125/630] cellVdec: also use ctx->framerate to calculate the timestamps ffmpeg 7 doesn't seem to guess the time_base parameter anymore --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 92 ++++++++++++++--------------- 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index 84bb74ad28..c8c902540c 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -211,6 +211,7 @@ struct vdec_context final lf_queue in_cmd; AVRational log_time_base{}; // Used to reduce log spam + AVRational log_framerate{}; // Used to reduce log spam vdec_context(s32 type, u32 /*profile*/, u32 addr, u32 size, vm::ptr func, u32 arg) : type(type) @@ -292,6 +293,19 @@ struct vdec_context final sws_freeContext(sws); } + static u32 freq_to_framerate_code(f64 freq) + { + if (std::abs(freq - 23.976) < 0.002) return CELL_VDEC_FRC_24000DIV1001; + if (std::abs(freq - 24.000) < 0.001) return CELL_VDEC_FRC_24; + if (std::abs(freq - 25.000) < 0.001) return CELL_VDEC_FRC_25; + if (std::abs(freq - 29.970) < 0.002) return CELL_VDEC_FRC_30000DIV1001; + if (std::abs(freq - 30.000) < 0.001) return CELL_VDEC_FRC_30; + if (std::abs(freq - 50.000) < 0.001) return CELL_VDEC_FRC_50; + if (std::abs(freq - 59.940) < 0.002) return CELL_VDEC_FRC_60000DIV1001; + if (std::abs(freq - 60.000) < 0.001) return CELL_VDEC_FRC_60; + return 0; + } + void exec(ppu_thread& ppu, u32 vid) { perf_meter<"VDEC"_u32> perf0; @@ -341,6 +355,7 @@ struct vdec_context final out_queue.clear(); // Flush image queue log_time_base = {}; + log_framerate = {}; frc_set = 0; // TODO: ??? next_pts = 0; @@ -471,10 +486,10 @@ struct vdec_context final frame.userdata = au_usrd; frame.attr = attr; + u64 amend = 0; + if (frc_set) { - u64 amend = 0; - switch (frc_set) { case CELL_VDEC_FRC_24000DIV1001: amend = 1001 * 90000 / 24000; break; @@ -491,62 +506,45 @@ struct vdec_context final } } - next_pts += amend; - next_dts += amend; frame.frc = frc_set; } - else if (ctx->time_base.num == 0) + else if (ctx->time_base.den && ctx->time_base.num) { - if (log_time_base.den != ctx->time_base.den || log_time_base.num != ctx->time_base.num) + const auto freq = 1. * ctx->time_base.den / ctx->time_base.num / ticks_per_frame; + + frame.frc = freq_to_framerate_code(freq); + if (frame.frc) { - cellVdec.error("time_base.num is 0 (handle=0x%x, seq_id=%d, cmd_id=%d, %d/%d, tpf=%d framerate=%d/%d)", handle, cmd->seq_id, cmd->id, ctx->time_base.num, ctx->time_base.den, ticks_per_frame, ctx->framerate.num, ctx->framerate.den); + amend = u64{90000} * ctx->time_base.num * ticks_per_frame / ctx->time_base.den; + } + } + else if (ctx->framerate.den && ctx->framerate.num) + { + const auto freq = ctx->framerate.num / static_cast(ctx->framerate.den); + + frame.frc = freq_to_framerate_code(freq); + if (frame.frc) + { + amend = u64{90000} * ctx->framerate.den / ctx->framerate.num; + } + } + + if (amend == 0 || frame.frc == 0) + { + if (log_time_base.den != ctx->time_base.den || log_time_base.num != ctx->time_base.num || log_framerate.den != ctx->framerate.den || log_framerate.num != ctx->framerate.num) + { + cellVdec.error("Invalid frequency (handle=0x%x, seq_id=%d, cmd_id=%d, timebase=%d/%d, tpf=%d framerate=%d/%d)", handle, cmd->seq_id, cmd->id, ctx->time_base.num, ctx->time_base.den, ticks_per_frame, ctx->framerate.num, ctx->framerate.den); log_time_base = ctx->time_base; + log_framerate = ctx->framerate; } // Hack - const u64 amend = u64{90000} / 30; + amend = u64{90000} / 30; frame.frc = CELL_VDEC_FRC_30; - next_pts += amend; - next_dts += amend; } - else - { - u64 amend = u64{90000} * ctx->time_base.num * ticks_per_frame / ctx->time_base.den; - const auto freq = 1. * ctx->time_base.den / ctx->time_base.num / ticks_per_frame; - if (std::abs(freq - 23.976) < 0.002) - frame.frc = CELL_VDEC_FRC_24000DIV1001; - else if (std::abs(freq - 24.000) < 0.001) - frame.frc = CELL_VDEC_FRC_24; - else if (std::abs(freq - 25.000) < 0.001) - frame.frc = CELL_VDEC_FRC_25; - else if (std::abs(freq - 29.970) < 0.002) - frame.frc = CELL_VDEC_FRC_30000DIV1001; - else if (std::abs(freq - 30.000) < 0.001) - frame.frc = CELL_VDEC_FRC_30; - else if (std::abs(freq - 50.000) < 0.001) - frame.frc = CELL_VDEC_FRC_50; - else if (std::abs(freq - 59.940) < 0.002) - frame.frc = CELL_VDEC_FRC_60000DIV1001; - else if (std::abs(freq - 60.000) < 0.001) - frame.frc = CELL_VDEC_FRC_60; - else - { - if (log_time_base.den != ctx->time_base.den || log_time_base.num != ctx->time_base.num) - { - // 1/1000 usually means that the time stamps are written in 1ms units and that the frame rate may vary. - cellVdec.error("Unsupported time_base (handle=0x%x, seq_id=%d, cmd_id=%d, %d/%d, tpf=%d framerate=%d/%d)", handle, cmd->seq_id, cmd->id, ctx->time_base.num, ctx->time_base.den, ticks_per_frame, ctx->framerate.num, ctx->framerate.den); - log_time_base = ctx->time_base; - } - - // Hack - amend = u64{90000} / 30; - frame.frc = CELL_VDEC_FRC_30; - } - - next_pts += amend; - next_dts += amend; - } + next_pts += amend; + next_dts += amend; cellVdec.trace("Got picture (handle=0x%x, seq_id=%d, cmd_id=%d, pts=0x%llx[0x%llx], dts=0x%llx[0x%llx])", handle, cmd->seq_id, cmd->id, frame.pts, frame->pts, frame.dts, frame->pkt_dts); From 9781690918e5e8fffb8d1af7d999239dd8aa0d59 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Sun, 11 Jan 2026 13:25:36 +0200 Subject: [PATCH 126/630] Fixed SingStar previews --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 5 ++++- rpcs3/Emu/Cell/Modules/cellVdec.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index c8c902540c..c87bfee25c 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -232,6 +232,7 @@ struct vdec_context final codec = avcodec_find_decoder(AV_CODEC_ID_H264); break; } + case CELL_VDEC_CODEC_TYPE_MPEG4: case CELL_VDEC_CODEC_TYPE_DIVX: { codec = avcodec_find_decoder(AV_CODEC_ID_MPEG4); @@ -770,6 +771,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 decoderVerLower = 0x1030000; break; } + case CELL_VDEC_CODEC_TYPE_MPEG4: case CELL_VDEC_CODEC_TYPE_DIVX: { cellVdec.warning("cellVdecQueryAttr: DivX (profile=%d)", profile); @@ -812,6 +814,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { case CELL_VDEC_DIVX_QMOBILE : memSize = new_sdk ? 0x11B720 : 0x1DEF30; break; case CELL_VDEC_DIVX_MOBILE : memSize = new_sdk ? 0x19A740 : 0x26DED0; break; + case CELL_VDEC_MPEG4_SIMPLE_PROFILE: // just a guess based on the profile used by singstar before and after update case CELL_VDEC_DIVX_HOME_THEATER: memSize = new_sdk ? 0x386A60 : 0x498060; break; case CELL_VDEC_DIVX_HD_720 : memSize = new_sdk ? 0x692070 : 0x805690; break; case CELL_VDEC_DIVX_HD_1080 : memSize = new_sdk ? 0xD78100 : 0xFC9870; break; @@ -1508,7 +1511,7 @@ error_code cellVdecGetPicItem(ppu_thread& ppu, u32 handle, vm::pptrreserved[0] = 0; avc->reserved[1] = 0; } - else if (vdec->type == CELL_VDEC_CODEC_TYPE_DIVX) + else if (vdec->type == CELL_VDEC_CODEC_TYPE_MPEG4 || vdec->type == CELL_VDEC_CODEC_TYPE_DIVX) { const vm::ptr dvx = picinfo_addr; diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.h b/rpcs3/Emu/Cell/Modules/cellVdec.h index 9f30b7d1b0..8cf9a0b1de 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.h +++ b/rpcs3/Emu/Cell/Modules/cellVdec.h @@ -16,6 +16,7 @@ enum CellVdecCodecType : s32 { CELL_VDEC_CODEC_TYPE_MPEG2 = 0, CELL_VDEC_CODEC_TYPE_AVC = 1, + CELL_VDEC_CODEC_TYPE_MPEG4 = 2, CELL_VDEC_CODEC_TYPE_DIVX = 5, CELL_VDEC_CODEC_TYPE_MAX }; @@ -388,6 +389,7 @@ struct CellVdecAvcInfo // DIVX Profile enum DIVX_level : u8 { + CELL_VDEC_MPEG4_SIMPLE_PROFILE = 4, CELL_VDEC_DIVX_QMOBILE = 10, CELL_VDEC_DIVX_MOBILE = 11, CELL_VDEC_DIVX_HOME_THEATER = 12, From 1f731afbd9b37d5ce65d0326ae47c7cf7793158b Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sun, 11 Jan 2026 16:22:03 +0200 Subject: [PATCH 127/630] sys_fs: Add PPU sleep --- rpcs3/Emu/Cell/lv2/sys_fs.cpp | 50 +++++++++++++++++------------------ 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.cpp b/rpcs3/Emu/Cell/lv2/sys_fs.cpp index 92fc21b747..961d0d6ad3 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_fs.cpp @@ -1035,7 +1035,7 @@ lv2_file::open_result_t lv2_file::open(std::string_view vpath, s32 flags, s32 mo error_code sys_fs_open(ppu_thread& ppu, vm::cptr path, s32 flags, vm::ptr fd, s32 mode, vm::cptr arg, u64 size) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_open(path=%s, flags=%#o, fd=*0x%x, mode=%#o, arg=*0x%x, size=0x%llx)", path, flags, fd, mode, arg, size); @@ -1083,7 +1083,7 @@ error_code sys_fs_open(ppu_thread& ppu, vm::cptr path, s32 flags, vm::ptr< error_code sys_fs_read(ppu_thread& ppu, u32 fd, vm::ptr buf, u64 nbytes, vm::ptr nread) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.trace("sys_fs_read(fd=%d, buf=*0x%x, nbytes=0x%llx, nread=*0x%x)", fd, buf, nbytes, nread); @@ -1156,7 +1156,7 @@ error_code sys_fs_read(ppu_thread& ppu, u32 fd, vm::ptr buf, u64 nbytes, v error_code sys_fs_write(ppu_thread& ppu, u32 fd, vm::cptr buf, u64 nbytes, vm::ptr nwrite) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.trace("sys_fs_write(fd=%d, buf=*0x%x, nbytes=0x%llx, nwrite=*0x%x)", fd, buf, nbytes, nwrite); @@ -1238,7 +1238,7 @@ error_code sys_fs_write(ppu_thread& ppu, u32 fd, vm::cptr buf, u64 nbytes, error_code sys_fs_close(ppu_thread& ppu, u32 fd) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); const auto file = idm::get_unlocked(fd); @@ -1314,7 +1314,7 @@ error_code sys_fs_close(ppu_thread& ppu, u32 fd) error_code sys_fs_opendir(ppu_thread& ppu, vm::cptr path, vm::ptr fd) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_opendir(path=%s, fd=*0x%x)", path, fd); @@ -1433,7 +1433,7 @@ error_code sys_fs_opendir(ppu_thread& ppu, vm::cptr path, vm::ptr fd) error_code sys_fs_readdir(ppu_thread& ppu, u32 fd, vm::ptr dir, vm::ptr nread) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_readdir(fd=%d, dir=*0x%x, nread=*0x%x)", fd, dir, nread); @@ -1490,7 +1490,7 @@ error_code sys_fs_readdir(ppu_thread& ppu, u32 fd, vm::ptr dir, vm error_code sys_fs_closedir(ppu_thread& ppu, u32 fd) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_closedir(fd=%d)", fd); @@ -1504,7 +1504,6 @@ error_code sys_fs_closedir(ppu_thread& ppu, u32 fd) error_code sys_fs_stat(ppu_thread& ppu, vm::cptr path, vm::ptr sb) { - ppu.state += cpu_flag::wait; lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_stat(path=%s, sb=*0x%x)", path, sb); @@ -1618,7 +1617,7 @@ error_code sys_fs_stat(ppu_thread& ppu, vm::cptr path, vm::ptr error_code sys_fs_fstat(ppu_thread& ppu, u32 fd, vm::ptr sb) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_fstat(fd=%d, sb=*0x%x)", fd, sb); @@ -1673,7 +1672,7 @@ error_code sys_fs_link(ppu_thread&, vm::cptr from, vm::cptr to) error_code sys_fs_mkdir(ppu_thread& ppu, vm::cptr path, s32 mode) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_mkdir(path=%s, mode=%#o)", path, mode); @@ -1734,7 +1733,7 @@ error_code sys_fs_mkdir(ppu_thread& ppu, vm::cptr path, s32 mode) error_code sys_fs_rename(ppu_thread& ppu, vm::cptr from, vm::cptr to) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_rename(from=%s, to=%s)", from, to); @@ -1799,7 +1798,7 @@ error_code sys_fs_rename(ppu_thread& ppu, vm::cptr from, vm::cptr to error_code sys_fs_rmdir(ppu_thread& ppu, vm::cptr path) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_rmdir(path=%s)", path); @@ -1854,7 +1853,7 @@ error_code sys_fs_rmdir(ppu_thread& ppu, vm::cptr path) error_code sys_fs_unlink(ppu_thread& ppu, vm::cptr path) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_unlink(path=%s)", path); @@ -1919,7 +1918,7 @@ error_code sys_fs_access(ppu_thread&, vm::cptr path, s32 mode) error_code sys_fs_fcntl(ppu_thread& ppu, u32 fd, u32 op, vm::ptr _arg, u32 _size) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.trace("sys_fs_fcntl(fd=%d, op=0x%x, arg=*0x%x, size=0x%x)", fd, op, _arg, _size); @@ -2591,7 +2590,7 @@ error_code sys_fs_fcntl(ppu_thread& ppu, u32 fd, u32 op, vm::ptr _arg, u32 error_code sys_fs_lseek(ppu_thread& ppu, u32 fd, s64 offset, s32 whence, vm::ptr pos) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.trace("sys_fs_lseek(fd=%d, offset=0x%llx, whence=0x%x, pos=*0x%x)", fd, offset, whence, pos); @@ -2636,7 +2635,7 @@ error_code sys_fs_lseek(ppu_thread& ppu, u32 fd, s64 offset, s32 whence, vm::ptr error_code sys_fs_fdatasync(ppu_thread& ppu, u32 fd) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.trace("sys_fs_fdadasync(fd=%d)", fd); @@ -2662,7 +2661,7 @@ error_code sys_fs_fdatasync(ppu_thread& ppu, u32 fd) error_code sys_fs_fsync(ppu_thread& ppu, u32 fd) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.trace("sys_fs_fsync(fd=%d)", fd); @@ -2688,7 +2687,7 @@ error_code sys_fs_fsync(ppu_thread& ppu, u32 fd) error_code sys_fs_fget_block_size(ppu_thread& ppu, u32 fd, vm::ptr sector_size, vm::ptr block_size, vm::ptr arg4, vm::ptr out_flags) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_fget_block_size(fd=%d, sector_size=*0x%x, block_size=*0x%x, arg4=*0x%x, out_flags=*0x%x)", fd, sector_size, block_size, arg4, out_flags); @@ -2712,7 +2711,7 @@ error_code sys_fs_fget_block_size(ppu_thread& ppu, u32 fd, vm::ptr sector_s error_code sys_fs_get_block_size(ppu_thread& ppu, vm::cptr path, vm::ptr sector_size, vm::ptr block_size, vm::ptr arg4) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_get_block_size(path=%s, sector_size=*0x%x, block_size=*0x%x, arg4=*0x%x)", path, sector_size, block_size, arg4); @@ -2762,7 +2761,7 @@ error_code sys_fs_get_block_size(ppu_thread& ppu, vm::cptr path, vm::ptr path, u64 size) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_truncate(path=%s, size=0x%llx)", path, size); @@ -2813,7 +2812,7 @@ error_code sys_fs_truncate(ppu_thread& ppu, vm::cptr path, u64 size) error_code sys_fs_ftruncate(ppu_thread& ppu, u32 fd, u64 size) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_ftruncate(fd=%d, size=0x%llx)", fd, size); @@ -2939,7 +2938,6 @@ error_code sys_fs_chown(ppu_thread&, vm::cptr path, s32 uid, s32 gid) error_code sys_fs_disk_free(ppu_thread& ppu, vm::cptr path, vm::ptr total_free, vm::ptr avail_free) { - ppu.state += cpu_flag::wait; lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_disk_free(path=%s total_free=*0x%x avail_free=*0x%x)", path, total_free, avail_free); @@ -3018,7 +3016,7 @@ error_code sys_fs_disk_free(ppu_thread& ppu, vm::cptr path, vm::ptr t error_code sys_fs_utime(ppu_thread& ppu, vm::cptr path, vm::cptr timep) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_utime(path=%s, timep=*0x%x)", path, timep); sys_fs.warning("** actime=%u, modtime=%u", timep->actime, timep->modtime); @@ -3215,7 +3213,7 @@ error_code sys_fs_get_mount_info(ppu_thread&, vm::ptr info, u64 error_code sys_fs_newfs(ppu_thread& ppu, vm::cptr dev_name, vm::cptr file_system, s32 unk1, vm::cptr str1) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_newfs(dev_name=%s, file_system=%s, unk1=0x%x, str1=%s)", dev_name, file_system, unk1, str1); @@ -3263,7 +3261,7 @@ error_code sys_fs_newfs(ppu_thread& ppu, vm::cptr dev_name, vm::cptr error_code sys_fs_mount(ppu_thread& ppu, vm::cptr dev_name, vm::cptr file_system, vm::cptr path, s32 unk1, s32 prot, s32 unk2, vm::cptr str1, u32 str_len) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_mount(dev_name=%s, file_system=%s, path=%s, unk1=0x%x, prot=%d, unk3=0x%x, str1=%s, str_len=%d)", dev_name, file_system, path, unk1, prot, unk2, str1, str_len); @@ -3366,7 +3364,7 @@ error_code sys_fs_mount(ppu_thread& ppu, vm::cptr dev_name, vm::cptr error_code sys_fs_unmount(ppu_thread& ppu, vm::cptr path, s32 unk1, s32 force) { - ppu.state += cpu_flag::wait; + lv2_obj::sleep(ppu); sys_fs.warning("sys_fs_unmount(path=%s, unk1=0x%x, force=%d)", path, unk1, force); From 8188c45b9dd46e717ac86b8238e6a44214ffacbe Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sun, 11 Jan 2026 16:27:21 +0200 Subject: [PATCH 128/630] Cut sceNpDrmIsAvailable sleep time --- rpcs3/Emu/Cell/Modules/sceNp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index beb6c2da91..4b4c3cfd01 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -745,7 +745,7 @@ error_code sceNpDrmIsAvailable(ppu_thread& ppu, vm::cptr k_licensee_addr, vm lv2_obj::sleep(ppu); const auto ret = npDrmIsAvailable(k_licensee_addr, drm_path); - lv2_sleep(25'000, &ppu); + lv2_sleep(5'000, &ppu); return ret; } From 7e9e0f56fbf3058a7675ee41818cbd04535cce19 Mon Sep 17 00:00:00 2001 From: Live session user Date: Sun, 11 Jan 2026 07:07:44 -0800 Subject: [PATCH 129/630] Windows ARM build --- .ci/build-windows-clang.sh | 11 ++++--- .ci/deploy-windows-clang.sh | 3 +- .github/workflows/rpcs3.yml | 60 +++++++++++++++++++++---------------- 3 files changed, 43 insertions(+), 31 deletions(-) diff --git a/.ci/build-windows-clang.sh b/.ci/build-windows-clang.sh index 0880e7f5ed..4f07688ee5 100644 --- a/.ci/build-windows-clang.sh +++ b/.ci/build-windows-clang.sh @@ -2,6 +2,9 @@ git config --global --add safe.directory '*' +CPU_ARCH="${1:-x86_64}" +MSYS2="${2:-clang64}" + # Pull all the submodules except some # Note: Tried to use git submodule status, but it takes over 20 seconds # shellcheck disable=SC2046 @@ -23,7 +26,7 @@ else fi cmake .. \ - -DCMAKE_PREFIX_PATH=/clang64 \ + -DCMAKE_PREFIX_PATH=/"${MSYS2}" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DUSE_NATIVE_INSTRUCTIONS=OFF \ -DUSE_PRECOMPILED_HEADERS=OFF \ @@ -44,8 +47,8 @@ cmake .. \ -DUSE_DISCORD_RPC=ON \ -DOpenGL_GL_PREFERENCE=LEGACY \ -DWITH_LLVM=ON \ - -DLLVM_DIR=/clang64/lib/cmake/llvm \ - -DVulkan_LIBRARY=/clang64/lib/libvulkan-1.dll.a \ + -DLLVM_DIR=/"${MSYS2}"/lib/cmake/llvm \ + -DVulkan_LIBRARY=/"${MSYS2}"/lib/libvulkan-1.dll.a \ -DSTATIC_LINK_LLVM=ON \ -DBUILD_RPCS3_TESTS=OFF \ -DRUN_RPCS3_TESTS=OFF \ @@ -57,5 +60,5 @@ cd .. # If it compiled succesfully let's deploy. if [ "$build_status" -eq 0 ]; then - .ci/deploy-windows-clang.sh "x86_64" + .ci/deploy-windows-clang.sh "${CPU_ARCH}" "${MSYS2}" fi diff --git a/.ci/deploy-windows-clang.sh b/.ci/deploy-windows-clang.sh index 0bf731e7c8..32c6f24808 100644 --- a/.ci/deploy-windows-clang.sh +++ b/.ci/deploy-windows-clang.sh @@ -7,12 +7,13 @@ cd build || exit 1 CPU_ARCH="${1:-x86_64}" +MSYS2="${2:-clang64}" echo "Deploying rpcs3 windows clang $CPU_ARCH" # BUILD_blablabla is CI specific, so we wrap it for portability ARTIFACT_DIR=$(cygpath -u "$BUILD_ARTIFACTSTAGINGDIRECTORY") -MSYS2_CLANG_BIN=$(cygpath -w /clang64/bin) +MSYS2_CLANG_BIN=$(cygpath -w /"${MSYS2}"/bin) MSYS2_USR_BIN=$(cygpath -w /usr/bin) echo "Installing dependencies of: ./bin/rpcs3.exe (MSYS2 dir is '$MSYS2_CLANG_BIN', usr dir is '$MSYS2_USR_BIN')" diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 7f13cc83d2..175f5a589c 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -329,16 +329,24 @@ jobs: Windows_Build_Clang: # Only run push event on master branch of main repo, but run all PRs if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master') - name: RPCS3 Windows Clang - runs-on: windows-2025 strategy: + fail-fast: false matrix: include: - msys2: clang64 compiler: clang - arch: win64 + arch: x86_64 + os: windows-2025 + name: X64 + - msys2: clangarm64 + compiler: clang + arch: aarch64 + os: windows-11-arm + name: ARM64 env: CCACHE_DIR: 'C:\ccache' + name: RPCS3 Windows Clang ${{ matrix.arch }} + runs-on: ${{ matrix.os }} steps: - name: Checkout repository uses: actions/checkout@main @@ -352,25 +360,25 @@ jobs: update: true cache: true install: | - mingw-w64-clang-x86_64-clang - mingw-w64-clang-x86_64-ccache - mingw-w64-clang-x86_64-cmake - mingw-w64-clang-x86_64-lld - mingw-w64-clang-x86_64-ninja - mingw-w64-clang-x86_64-llvm - mingw-w64-clang-x86_64-ffmpeg - mingw-w64-clang-x86_64-opencv - mingw-w64-clang-x86_64-glew - mingw-w64-clang-x86_64-vulkan - mingw-w64-clang-x86_64-vulkan-headers - mingw-w64-clang-x86_64-vulkan-loader - mingw-w64-clang-x86_64-gtest - mingw-w64-clang-x86_64-qt6-base - mingw-w64-clang-x86_64-qt6-declarative - mingw-w64-clang-x86_64-qt6-multimedia - mingw-w64-clang-x86_64-qt6-svg - mingw-w64-clang-x86_64-qt6-tools - mingw-w64-clang-x86_64-qt6-translations + mingw-w64-clang-${{ matrix.arch }}-clang + mingw-w64-clang-${{ matrix.arch }}-ccache + mingw-w64-clang-${{ matrix.arch }}-cmake + mingw-w64-clang-${{ matrix.arch }}-lld + mingw-w64-clang-${{ matrix.arch }}-ninja + mingw-w64-clang-${{ matrix.arch }}-llvm + mingw-w64-clang-${{ matrix.arch }}-ffmpeg + mingw-w64-clang-${{ matrix.arch }}-opencv + mingw-w64-clang-${{ matrix.arch }}-glew + mingw-w64-clang-${{ matrix.arch }}-vulkan + mingw-w64-clang-${{ matrix.arch }}-vulkan-headers + mingw-w64-clang-${{ matrix.arch }}-vulkan-loader + mingw-w64-clang-${{ matrix.arch }}-gtest + mingw-w64-clang-${{ matrix.arch }}-qt6-base + mingw-w64-clang-${{ matrix.arch }}-qt6-declarative + mingw-w64-clang-${{ matrix.arch }}-qt6-multimedia + mingw-w64-clang-${{ matrix.arch }}-qt6-svg + mingw-w64-clang-${{ matrix.arch }}-qt6-tools + mingw-w64-clang-${{ matrix.arch }}-qt6-translations base-devel curl git @@ -381,8 +389,8 @@ jobs: id: restore-build-ccache with: path: ${{ env.CCACHE_DIR }} - key: ${{ runner.os }}-ccache-${{ matrix.compiler }}-${{ runner.arch }}-${{ github.run_id }} - restore-keys: ${{ runner.os }}-ccache-${{ matrix.compiler }}-${{ runner.arch }}- + key: ${{ runner.os }}-ccache-${{ matrix.compiler }}-${{ matrix.arch }}-${{ github.run_id }} + restore-keys: ${{ runner.os }}-ccache-${{ matrix.compiler }}-${{ matrix.arch }}- - name: Build RPCS3 shell: msys2 {0} @@ -390,7 +398,7 @@ jobs: export CCACHE_DIR=$(cygpath -u "$CCACHE_DIR") echo "CCACHE_DIR=$CCACHE_DIR" .ci/setup-windows-ci-vars.sh ${{ matrix.arch }} ${{ matrix.compiler }} - .ci/build-windows-clang.sh + .ci/build-windows-clang.sh ${{ matrix.arch }} ${{ matrix.msys2 }} - name: Save build Ccache if: github.ref == 'refs/heads/master' @@ -402,7 +410,7 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@main with: - name: RPCS3 for Windows (${{ runner.arch }}, ${{ matrix.compiler }}) + name: RPCS3 for Windows (${{ matrix.name }}, clang) path: ${{ env.BUILD_ARTIFACTSTAGINGDIRECTORY }} compression-level: 0 if-no-files-found: error From d584575984645476e34c23c1a1f33098741e4c4b Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Sun, 11 Jan 2026 17:11:51 +0200 Subject: [PATCH 130/630] Fixed more SingStar previews, this time for v05.00 --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 4 ++-- rpcs3/rpcs3qt/flow_widget.h | 1 + rpcs3/rpcs3qt/gui_game_info.h | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index c87bfee25c..e8587fd2eb 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -780,7 +780,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 if (sinfo) { - if (sinfo->thisSize != sizeof(CellVdecDivxSpecificInfo2)) + if (sinfo->thisSize != sizeof(CellVdecDivxSpecificInfo) && sinfo->thisSize != sizeof(CellVdecDivxSpecificInfo2)) { return CELL_VDEC_ERROR_ARG; } @@ -790,7 +790,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 //const u32 maxDecH = sinfo ? +sinfo->maxDecodedFrameHeight : 0; //const u32 maxDecW = sinfo ? +sinfo->maxDecodedFrameWidth : 0; - u32 nrOfBuf = sinfo ? +sinfo->numberOfDecodedFrameBuffer : 0; + u32 nrOfBuf = sinfo && sinfo->thisSize == sizeof(CellVdecDivxSpecificInfo2) ? +sinfo->numberOfDecodedFrameBuffer : 0; if (nrOfBuf == 0) { diff --git a/rpcs3/rpcs3qt/flow_widget.h b/rpcs3/rpcs3qt/flow_widget.h index 4f0a7dd453..1a4bcfb90d 100644 --- a/rpcs3/rpcs3qt/flow_widget.h +++ b/rpcs3/rpcs3qt/flow_widget.h @@ -4,6 +4,7 @@ #include "flow_widget_item.h" #include "flow_layout.h" +#include #include #include #include diff --git a/rpcs3/rpcs3qt/gui_game_info.h b/rpcs3/rpcs3qt/gui_game_info.h index 3b19d27458..08483fa7fb 100644 --- a/rpcs3/rpcs3qt/gui_game_info.h +++ b/rpcs3/rpcs3qt/gui_game_info.h @@ -5,6 +5,7 @@ #include "Emu/GameInfo.h" +#include #include /* Having the icons associated with the game info simplifies logic internally */ From 25b412a90f462efb9d409150f61f2941d42be305 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 11 Jan 2026 17:18:43 +0100 Subject: [PATCH 131/630] cellVdec: impove error logging --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 80 +++++++++++++++++------------ 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index e8587fd2eb..df638670ba 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -679,7 +679,15 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { cellVdec.warning("cellVdecQueryAttr: AVC (profile=%d)", profile); - //const vm::ptr sinfo = vm::cast(spec_addr); + const vm::ptr sinfo = vm::cast(spec_addr); + + if (sinfo) + { + if (sinfo->thisSize != sizeof(CellVdecAvcSpecificInfo)) + { + return { CELL_VDEC_ERROR_ARG, "Invalid AVC specific info size %d", sinfo->thisSize }; + } + } // TODO: sinfo @@ -698,7 +706,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 case CELL_VDEC_AVC_LEVEL_4P0: memSize = new_sdk ? 0x33A5FFD : 0x36A527D; break; case CELL_VDEC_AVC_LEVEL_4P1: memSize = new_sdk ? 0x33A5FFD : 0x36A527D; break; case CELL_VDEC_AVC_LEVEL_4P2: memSize = new_sdk ? 0x33A5FFD : 0x36A527D; break; - default: return CELL_VDEC_ERROR_ARG; + default: return { CELL_VDEC_ERROR_ARG, "Invalid AVC profile level %d", profile }; } decoderVerLower = 0x11300; @@ -714,7 +722,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { if (sinfo->thisSize != sizeof(CellVdecMpeg2SpecificInfo)) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "Invalid MPEG2 specific info size %d", sinfo->thisSize }; } } @@ -729,7 +737,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { if (maxDecW > 352 || maxDecH > 288) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "Invalid max decoded frame size %dx%d for profile %d", maxDecH, maxDecW, profile }; } memSize = new_sdk ? 0x11290B : 0x2A610B; @@ -739,7 +747,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { if (maxDecW > 720 || maxDecH > 576) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "Invalid max decoded frame size %dx%d for profile %d", maxDecH, maxDecW, profile }; } memSize = new_sdk ? 0x2DFB8B : 0x47110B; @@ -749,7 +757,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { if (maxDecW > 1440 || maxDecH > 1152) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "Invalid max decoded frame size %dx%d for profile %d", maxDecH, maxDecW, profile }; } memSize = new_sdk ? 0xA0270B : 0xB8F90B; @@ -759,13 +767,13 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { if (maxDecW > 1920 || maxDecH > 1152) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "Invalid max decoded frame size %dx%d for profile %d", maxDecH, maxDecW, profile }; } memSize = new_sdk ? 0xD2F40B : 0xEB990B; break; } - default: return CELL_VDEC_ERROR_ARG; + default: return { CELL_VDEC_ERROR_ARG, "Invalid MPEG2 profile %d", profile }; } decoderVerLower = 0x1030000; @@ -782,7 +790,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { if (sinfo->thisSize != sizeof(CellVdecDivxSpecificInfo) && sinfo->thisSize != sizeof(CellVdecDivxSpecificInfo2)) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "Invalid DIVX specific info size %d", sinfo->thisSize }; } } @@ -800,12 +808,12 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { if (profile != CELL_VDEC_DIVX_QMOBILE && profile != CELL_VDEC_DIVX_MOBILE) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "Invalid number of decoded frame buffers %d for DIVX profile %d", nrOfBuf, profile }; } } else if (nrOfBuf != 4 && nrOfBuf != 3) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "Invalid number of decoded frame buffers %d for DIVX", nrOfBuf }; } // TODO: change memSize based on buffercount. @@ -818,13 +826,13 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 case CELL_VDEC_DIVX_HOME_THEATER: memSize = new_sdk ? 0x386A60 : 0x498060; break; case CELL_VDEC_DIVX_HD_720 : memSize = new_sdk ? 0x692070 : 0x805690; break; case CELL_VDEC_DIVX_HD_1080 : memSize = new_sdk ? 0xD78100 : 0xFC9870; break; - default: return CELL_VDEC_ERROR_ARG; + default: return { CELL_VDEC_ERROR_ARG, "Invalid DIVX profile %d", profile }; } decoderVerLower = 0x30806; break; } - default: return CELL_VDEC_ERROR_ARG; + default: return { CELL_VDEC_ERROR_ARG, "Invalid codec type %d", type }; } attr->decoderVerLower = decoderVerLower; @@ -840,7 +848,7 @@ error_code cellVdecQueryAttr(vm::cptr type, vm::ptr if (!type || !attr) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "type=%d, attr=%d", !!type, !!attr }; } return vdecQueryAttr(type->codecType, type->profileLevel, 0, attr.get_ptr()); @@ -852,7 +860,7 @@ error_code cellVdecQueryAttrEx(vm::cptr type, vm::ptrcodecType, type->profileLevel, type->codecSpecificInfo_addr, attr.get_ptr()); @@ -863,13 +871,14 @@ static error_code vdecOpen(ppu_thread& ppu, T type, U res, vm::cptr { if (!type || !res || !cb || !handle || !cb->cbFunc) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "type=%d, res=%d, cb=%d, handle=%d, cbFunc=%d", !!type, !!res, !!cb, !!handle, cb && cb->cbFunc }; } if (!res->memAddr || res->ppuThreadPriority + 0u >= 3072 || res->spuThreadPriority + 0u >= 256 || res->ppuThreadStackSize < 4096 || type->codecType + 0u >= 0xe) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "memAddr=%d, ppuThreadPriority=%d, spuThreadPriority=%d, ppuThreadStackSize=%d, codecType=%d", + res->memAddr, res->ppuThreadPriority, res->spuThreadPriority, res->ppuThreadStackSize, type->codecType }; } u32 spec_addr = 0; @@ -879,11 +888,16 @@ static error_code vdecOpen(ppu_thread& ppu, T type, U res, vm::cptr spec_addr = type->codecSpecificInfo_addr; } - if (CellVdecAttr attr{}; - vdecQueryAttr(type->codecType, type->profileLevel, spec_addr, &attr) != CELL_OK || - attr.memSize > res->memSize) + CellVdecAttr attr{}; + const error_code err = vdecQueryAttr(type->codecType, type->profileLevel, spec_addr, &attr); + if (err != CELL_OK) { - return CELL_VDEC_ERROR_ARG; + return err; + } + + if (attr.memSize > res->memSize) + { + return { CELL_VDEC_ERROR_ARG, "attr.memSize=%d, res->memSize=%d", attr.memSize, res->memSize }; } // Create decoder context @@ -954,7 +968,7 @@ error_code cellVdecClose(ppu_thread& ppu, u32 handle) if (!vdec) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "vdec is nullptr" }; } { @@ -992,7 +1006,7 @@ error_code cellVdecClose(ppu_thread& ppu, u32 handle) if (!idm::remove_verify(handle, std::move(vdec))) { // Other thread removed it beforehead - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "remove_verify failed" }; } return CELL_OK; @@ -1008,7 +1022,7 @@ error_code cellVdecStartSeq(ppu_thread& ppu, u32 handle) if (!vdec) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "vdec is nullptr" }; } sequence_state old_state{}; @@ -1060,7 +1074,7 @@ error_code cellVdecEndSeq(ppu_thread& ppu, u32 handle) if (!vdec) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "vdec is nullptr" }; } { @@ -1197,7 +1211,7 @@ error_code cellVdecGetPictureExt(ppu_thread& ppu, u32 handle, vm::cptrformatType > 4 || (format->formatType <= CELL_VDEC_PICFMT_RGBA32_ILV && format->colorMatrixType > CELL_VDEC_COLOR_MATRIX_TYPE_BT709)) { - return CELL_VDEC_ERROR_ARG; + return {CELL_VDEC_ERROR_ARG, "formatType=%d, colorMatrixType=%d", +format->formatType, +format->colorMatrixType}; } if (arg4 && arg4 != 8 && arg4 != 0xc) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "arg4=0x%x", arg4 }; } if (arg4 || format->unk0 || format->unk1) @@ -1336,7 +1350,7 @@ error_code cellVdecGetPicture(ppu_thread& ppu, u32 handle, vm::cptr format2; @@ -1359,7 +1373,7 @@ error_code cellVdecGetPicItem(ppu_thread& ppu, u32 handle, vm::pptrmutex}; @@ -1626,7 +1640,7 @@ error_code cellVdecOpenExt(ppu_thread& ppu, vm::cptr type, vm::cpt if (!res) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "res is nullptr" }; } vm::var tmp = vm::make_var({}); @@ -1679,7 +1693,7 @@ error_code cellVdecSetPts(u32 handle, vm::ptr unk) if (!vdec || !unk) { - return CELL_VDEC_ERROR_ARG; + return { CELL_VDEC_ERROR_ARG, "vdec=%d, unk=%d", !!vdec, !!unk }; } std::lock_guard lock{vdec->mutex}; From cf6aaaa74f124439d1f56ce81a651662a0c974e8 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 11 Jan 2026 18:52:29 +0100 Subject: [PATCH 132/630] VS: update googletest package This fixes building the test project in VS 2026 --- buildfiles/msvc/rpcs3_default.props | 2 +- rpcs3/tests/packages.config | 2 +- rpcs3/tests/rpcs3_test.vcxproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildfiles/msvc/rpcs3_default.props b/buildfiles/msvc/rpcs3_default.props index d8df69d503..3cd3d25a94 100644 --- a/buildfiles/msvc/rpcs3_default.props +++ b/buildfiles/msvc/rpcs3_default.props @@ -7,7 +7,7 @@ $(SolutionDir)build\lib\$(Configuration)-$(Platform)\ $(SolutionDir)build\lib\$(Configuration)-$(Platform)\;$(UniversalCRT_LibraryPath_x64);$(LibraryPath) $(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\ - $(SolutionDir)packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-static.1.8.1.7\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-static.targets + $(SolutionDir)packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-static.1.8.1.8\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-static.targets true diff --git a/rpcs3/tests/packages.config b/rpcs3/tests/packages.config index a71561e644..011e648cec 100644 --- a/rpcs3/tests/packages.config +++ b/rpcs3/tests/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/rpcs3/tests/rpcs3_test.vcxproj b/rpcs3/tests/rpcs3_test.vcxproj index 2851f2faa6..867a6e651f 100644 --- a/rpcs3/tests/rpcs3_test.vcxproj +++ b/rpcs3/tests/rpcs3_test.vcxproj @@ -98,7 +98,7 @@ - + From d9edf98d55e6bdf466a29a01379456de3dc4f6c7 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Fri, 9 Jan 2026 14:31:09 +0200 Subject: [PATCH 133/630] USB: Usbd support for microphones --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 39 +- rpcs3/Emu/Cell/lv2/sys_usbd.h | 2 +- rpcs3/Emu/Io/usb_device.cpp | 9 +- rpcs3/Emu/Io/usb_device.h | 53 ++- rpcs3/Emu/Io/usb_microphone.cpp | 690 ++++++++++++++++++++++++++++++++ rpcs3/Emu/Io/usb_microphone.h | 40 ++ rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 + 9 files changed, 831 insertions(+), 11 deletions(-) create mode 100644 rpcs3/Emu/Io/usb_microphone.cpp create mode 100644 rpcs3/Emu/Io/usb_microphone.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index a96ddfa2b3..a4e1ae5d64 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -423,6 +423,7 @@ target_sources(rpcs3_emu PRIVATE Io/TopShotFearmaster.cpp Io/Turntable.cpp Io/usb_device.cpp + Io/usb_microphone.cpp Io/usb_vfs.cpp Io/usio.cpp Io/LogitechG27.cpp diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index 3afa2a9e06..dffd211aed 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -14,6 +14,7 @@ #include "Emu/Cell/timers.hpp" #include "Emu/Io/usb_device.h" +#include "Emu/Io/usb_microphone.h" #include "Emu/Io/usb_vfs.h" #include "Emu/Io/Skylander.h" #include "Emu/Io/Infinity.h" @@ -185,6 +186,9 @@ private: // Music devices {0x1415, 0x0000, 0x0000, "Singstar Microphone", nullptr, nullptr}, // {0x1415, 0x0020, 0x0020, "SingStar Microphone Wireless", nullptr, nullptr}, // TODO: verifiy + // {0x12ba, 0x00f0, 0x00f0, "Bandfuse USB Guitar Adapter", nullptr, nullptr}, + // {0x28aa, 0x0001, 0x0001, "Bandfuse USB Microphone", nullptr, nullptr}, + // {0x046d, 0x0a03, 0x0a03, "Logitech Microphone", nullptr, nullptr}, {0x12BA, 0x00FF, 0x00FF, "Rocksmith Guitar Adapter", nullptr, nullptr}, {0x12BA, 0x0100, 0x0100, "Guitar Hero Guitar", nullptr, nullptr}, @@ -549,6 +553,20 @@ usb_handler_thread::usb_handler_thread() } } + switch (g_cfg.audio.microphone_type) + { + case microphone_handler::standard: + usb_devices.push_back(std::make_shared(0, get_new_location(), MicType::Logitech)); + break; + case microphone_handler::real_singstar: + case microphone_handler::singstar: + usb_devices.push_back(std::make_shared(0, get_new_location(), MicType::SingStar)); + break; + case microphone_handler::rocksmith: + usb_devices.push_back(std::make_shared(0, get_new_location(), MicType::Rocksmith)); + break; + } + for (int i = 0; i < 8; i++) // Add VFS USB mass storage devices (/dev_usbXXX) to the USB device list { const auto usb_info = g_cfg_vfs.get_device(g_cfg_vfs.dev_usb, fmt::format("/dev_usb%03d", i)); @@ -1128,7 +1146,7 @@ error_code sys_usbd_finalize(ppu_thread& ppu, u32 handle) // Forcefully awake all waiters while (auto cpu = lv2_obj::schedule(usbh.sq, SYS_SYNC_FIFO)) { - // Special ternimation signal value + // Special termination signal value cpu->gpr[4] = 4; cpu->gpr[5] = 0; cpu->gpr[6] = 0; @@ -1480,7 +1498,7 @@ error_code sys_usbd_transfer_data(ppu_thread& ppu, u32 handle, u32 id_pipe, vm:: case LIBUSB_REQUEST_SET_CONFIGURATION: { pipe.device->set_configuration(static_cast(+request->wValue)); - pipe.device->set_interface(0); + pipe.device->set_interface(0, 0); break; } default: break; @@ -1523,7 +1541,7 @@ error_code sys_usbd_isochronous_transfer_data(ppu_thread& ppu, u32 handle, u32 i { ppu.state += cpu_flag::wait; - sys_usbd.todo("sys_usbd_isochronous_transfer_data(handle=0x%x, id_pipe=0x%x, iso_request=*0x%x)", handle, id_pipe, iso_request); + sys_usbd.trace("sys_usbd_isochronous_transfer_data(handle=0x%x, id_pipe=0x%x, iso_request=*0x%x)", handle, id_pipe, iso_request); auto& usbh = g_fxo->get>(); @@ -1537,8 +1555,21 @@ error_code sys_usbd_isochronous_transfer_data(ppu_thread& ppu, u32 handle, u32 i const auto& pipe = usbh.get_pipe(id_pipe); auto&& [transfer_id, transfer] = usbh.get_free_transfer(); + transfer.iso_request.buf = iso_request->buf; + transfer.iso_request.start_frame = iso_request->start_frame; + transfer.iso_request.num_packets = iso_request->num_packets; + for (u32 index = 0; index < iso_request->num_packets; index++) + { + transfer.iso_request.packets[index] = iso_request->packets[index]; + } + pipe.device->isochronous_transfer(&transfer); + if (transfer.fake) + { + usbh.push_fake_transfer(&transfer); + } + // returns an identifier specific to the transfer return not_an_error(transfer_id); } @@ -1567,7 +1598,7 @@ error_code sys_usbd_get_isochronous_transfer_status(ppu_thread& ppu, u32 handle, { ppu.state += cpu_flag::wait; - sys_usbd.todo("sys_usbd_get_isochronous_transfer_status(handle=0x%x, id_transfer=0x%x, unk1=0x%x, request=*0x%x, result=*0x%x)", handle, id_transfer, unk1, request, result); + sys_usbd.trace("sys_usbd_get_isochronous_transfer_status(handle=0x%x, id_transfer=0x%x, unk1=0x%x, request=*0x%x, result=*0x%x)", handle, id_transfer, unk1, request, result); auto& usbh = g_fxo->get>(); diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.h b/rpcs3/Emu/Cell/lv2/sys_usbd.h index 76f5f0b061..45e9214e82 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.h +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.h @@ -56,7 +56,7 @@ struct UsbDeviceRequest struct UsbDeviceIsoRequest { - vm::ptr buf; + vm::bptr buf; be_t start_frame; be_t num_packets; be_t packets[8]; diff --git a/rpcs3/Emu/Io/usb_device.cpp b/rpcs3/Emu/Io/usb_device.cpp index 9291805a8c..e78b836595 100644 --- a/rpcs3/Emu/Io/usb_device.cpp +++ b/rpcs3/Emu/Io/usb_device.cpp @@ -40,9 +40,10 @@ bool usb_device::set_configuration(u8 cfg_num) return true; } -bool usb_device::set_interface(u8 int_num) +bool usb_device::set_interface(u8 int_num, u8 alt_num) { current_interface = int_num; + current_altsetting = alt_num; return true; } @@ -141,9 +142,9 @@ bool usb_device_passthrough::set_configuration(u8 cfg_num) return (libusb_set_configuration(lusb_handle, cfg_num) == LIBUSB_SUCCESS); }; -bool usb_device_passthrough::set_interface(u8 int_num) +bool usb_device_passthrough::set_interface(u8 int_num, u8 alt_num) { - usb_device::set_interface(int_num); + usb_device::set_interface(int_num, alt_num); return (libusb_claim_interface(lusb_handle, int_num) == LIBUSB_SUCCESS); } @@ -290,7 +291,7 @@ void usb_device_emulated::control_transfer(u8 bmRequestType, u8 bRequest, u16 wV case 0U /*silences warning*/ | LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_RECIPIENT_INTERFACE: // 0x01 switch (bRequest) { - case LIBUSB_REQUEST_SET_INTERFACE: usb_device::set_interface(::narrow(wIndex)); break; + case LIBUSB_REQUEST_SET_INTERFACE: usb_device::set_interface(::narrow(wIndex), ::narrow(wValue)); break; default: sys_usbd.error("Unhandled control transfer(0x%02x): 0x%02x", bmRequestType, bRequest); break; } break; diff --git a/rpcs3/Emu/Io/usb_device.h b/rpcs3/Emu/Io/usb_device.h index 3d60bd36b0..8cd053efe2 100644 --- a/rpcs3/Emu/Io/usb_device.h +++ b/rpcs3/Emu/Io/usb_device.h @@ -86,6 +86,54 @@ struct UsbDeviceHID le_t wDescriptorLength; }; +struct UsbAudioInputTerminal +{ + u8 bDescriptorSubtype; + u8 bTerminalID; + le_t wTerminalType; + u8 bAssocTerminal; + u8 bNrChannels; + le_t wChannelConfig; + u8 iChannelNames; + u8 iTerminal; +}; + +struct UsbAudioOutputTerminal +{ + u8 bDescriptorSubtype; + u8 bTerminalID; + le_t wTerminalType; + u8 bAssocTerminal; + u8 bSourceID; + u8 iTerminal; +}; + +struct UsbAudioInterface +{ + u8 bDescriptorSubtype; + u8 bTerminalLink; + u8 bDelay; + le_t wFormatTag; +}; + +struct UsbAudioEndpoint +{ + u8 bEndpointAddress; + u8 bmAttributes; + le_t wMaxPacketSize; + u8 bInterval; + u8 bRefresh; + u8 bSynchAddress; +}; + +struct UsbAudioStreamingEndpoint +{ + u8 bDescriptorSubtype; + u8 bmAttributes; + u8 bLockDelayUnits; + le_t wLockDelay; +}; + struct UsbTransfer { u32 assigned_number = 0; @@ -183,7 +231,7 @@ public: virtual u32 get_configuration(u8* buf); virtual bool set_configuration(u8 cfg_num); - virtual bool set_interface(u8 int_num); + virtual bool set_interface(u8 int_num, u8 alt_num); virtual void control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) = 0; virtual void interrupt_transfer(u32 buf_size, u8* buf, u32 endpoint, UsbTransfer* transfer) = 0; @@ -198,6 +246,7 @@ public: protected: u8 current_config = 1; u8 current_interface = 0; + u8 current_altsetting = 0; std::array location{}; protected: @@ -214,7 +263,7 @@ public: void read_descriptors() override; u32 get_configuration(u8* buf) override; bool set_configuration(u8 cfg_num) override; - bool set_interface(u8 int_num) override; + bool set_interface(u8 int_num, u8 alt_num) override; void control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) override; void interrupt_transfer(u32 buf_size, u8* buf, u32 endpoint, UsbTransfer* transfer) override; void isochronous_transfer(UsbTransfer* transfer) override; diff --git a/rpcs3/Emu/Io/usb_microphone.cpp b/rpcs3/Emu/Io/usb_microphone.cpp new file mode 100644 index 0000000000..743fadb66a --- /dev/null +++ b/rpcs3/Emu/Io/usb_microphone.cpp @@ -0,0 +1,690 @@ +#include "stdafx.h" +#include "Emu/system_config.h" +#include "Emu/IdManager.h" +#include "Emu/Io/usb_microphone.h" +#include "Emu/Cell/lv2/sys_usbd.h" +#include "Emu/Cell/Modules/cellMic.h" +#include "Input/pad_thread.h" + +LOG_CHANNEL(usb_mic_log); + +usb_device_mic::usb_device_mic(u32 controller_index, const std::array& location, MicType mic_type) + : usb_device_emulated(location) + , m_controller_index(controller_index) + , m_mic_type(mic_type) + , m_sample_rate(8000) + , m_volume(0, 0) +{ + switch (mic_type) + { + case MicType::SingStar: + { + device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, + UsbDeviceDescriptor { + .bcdUSB = 0x0110, + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = 0x08, + .idVendor = 0x1415, + .idProduct = 0x0000, + .bcdDevice = 0x0001, + .iManufacturer = 0x01, + .iProduct = 0x02, + .iSerialNumber = 0x00, + .bNumConfigurations = 0x01}); + auto& config0 = device.add_node(UsbDescriptorNode(USB_DESCRIPTOR_CONFIG, + UsbDeviceConfiguration { + .wTotalLength = 0x00b1, + .bNumInterfaces = 0x02, + .bConfigurationValue = 0x01, + .iConfiguration = 0x00, + .bmAttributes = 0x80, + .bMaxPower = 0x2d})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x00, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x01, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + + static constexpr u8 audio_if0_header[] = { + 0x09, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x01, // bDescriptorSubtype (CS_INTERFACE -> HEADER) + 0x00, 0x01, // bcdADC 1.00 + 0x28, 0x00, // wTotalLength 36 + 0x01, // binCollection 0x01 + 0x01, // baInterfaceNr 1 + }; + config0.add_node(UsbDescriptorNode(audio_if0_header[0], audio_if0_header[1], &audio_if0_header[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioInputTerminal { + .bDescriptorSubtype = 0x02, // INPUT_TERMINAL + .bTerminalID = 0x01, + .wTerminalType = 0x0201, // Microphone + .bAssocTerminal = 0x02, + .bNrChannels = 0x02, + .wChannelConfig = 0x0003, + .iChannelNames = 0x00, + .iTerminal = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioOutputTerminal { + .bDescriptorSubtype = 0x03, // OUTPUT_TERMINAL + .bTerminalID = 0x02, + .wTerminalType = 0x0101, // USB Streaming + .bAssocTerminal = 0x01, + .bSourceID = 0x03, + .iTerminal = 0x00})); + + static constexpr u8 audio_if0_feature[] = { + 0x0A, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x06, // bDescriptorSubtype (CS_INTERFACE -> FEATURE_UNIT) + 0x03, // bUnitID + 0x01, // bSourceID + 0x01, // bControlSize 1 + 0x01, 0x02, // bmaControls[0] (Mute,Volume) + 0x02, 0x00, // bmaControls[1] (Volume,None) + }; + config0.add_node(UsbDescriptorNode(audio_if0_feature[0], audio_if0_feature[1], &audio_if0_feature[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x01, + .bNumEndpoints = 0x01, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioInterface { + .bDescriptorSubtype = 0x01, // AS_GENERAL + .bTerminalLink = 0x02, + .bDelay = 0x01, + .wFormatTag = 0x0001})); + + static constexpr u8 audio_if1_alt1_type[] = { + 0x17, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x02, // bDescriptorSubtype (CS_INTERFACE -> FORMAT_TYPE) + 0x01, // bFormatType 1 + 0x01, // bNrChannels (Mono) + 0x02, // bSubFrameSize 2 + 0x10, // bBitResolution 16 + 0x05, // bSamFreqType 5 + 0x40, 0x1F, 0x00, // tSamFreq[1] 8000 Hz + 0x11, 0x2B, 0x00, // tSamFreq[2] 11025 Hz + 0x22, 0x56, 0x00, // tSamFreq[3] 22050 Hz + 0x44, 0xAC, 0x00, // tSamFreq[4] 44100 Hz + 0x80, 0xBB, 0x00, // tSamFreq[5] 48000 Hz + }; + config0.add_node(UsbDescriptorNode(audio_if1_alt1_type[0], audio_if1_alt1_type[1], &audio_if1_alt1_type[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT, + UsbAudioEndpoint { + .bEndpointAddress = 0x81, + .bmAttributes = 0x05, + .wMaxPacketSize = 0x0064, + .bInterval = 0x01, + .bRefresh = 0x00, + .bSynchAddress = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT_ASI, + UsbAudioStreamingEndpoint { + .bDescriptorSubtype = 0x01, // EP_GENERAL + .bmAttributes = 0x01, // Sampling Freq Control + .bLockDelayUnits = 0x00, + .wLockDelay = 0x0000})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x02, + .bNumEndpoints = 0x01, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioInterface { + .bDescriptorSubtype = 0x01, // AS_GENERAL + .bTerminalLink = 0x02, + .bDelay = 0x01, + .wFormatTag = 0x0001})); + + static constexpr u8 audio_if1_alt2_type[] = { + 0x17, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x02, // bDescriptorSubtype (CS_INTERFACE -> FORMAT_TYPE) + 0x01, // bFormatType 1 + 0x02, // bNrChannels (Stereo) + 0x02, // bSubFrameSize 2 + 0x10, // bBitResolution 16 + 0x05, // bSamFreqType 5 + 0x40, 0x1F, 0x00, // tSamFreq[1] 8000 Hz + 0x11, 0x2B, 0x00, // tSamFreq[2] 11025 Hz + 0x22, 0x56, 0x00, // tSamFreq[3] 22050 Hz + 0x44, 0xAC, 0x00, // tSamFreq[4] 44100 Hz + 0x80, 0xBB, 0x00, // tSamFreq[5] 48000 Hz + }; + config0.add_node(UsbDescriptorNode(audio_if1_alt2_type[0], audio_if1_alt2_type[1], &audio_if1_alt2_type[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT, + UsbAudioEndpoint { + .bEndpointAddress = 0x81, + .bmAttributes = 0x05, + .wMaxPacketSize = 0x00c8, + .bInterval = 0x01, + .bRefresh = 0x00, + .bSynchAddress = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT_ASI, + UsbAudioStreamingEndpoint { + .bDescriptorSubtype = 0x01, // EP_GENERAL + .bmAttributes = 0x01, // Sampling Freq Control + .bLockDelayUnits = 0x00, + .wLockDelay = 0x0000})); + + add_string("Nam Tai E&E Products Ltd."); + add_string("USBMIC Serial# 012345678"); + break; + } + case MicType::Logitech: + { + device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, + UsbDeviceDescriptor { + .bcdUSB = 0x0200, + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = 0x08, + .idVendor = 0x046d, + .idProduct = 0x0a03, + .bcdDevice = 0x0102, + .iManufacturer = 0x01, + .iProduct = 0x02, + .iSerialNumber = 0x00, + .bNumConfigurations = 0x01}); + auto& config0 = device.add_node(UsbDescriptorNode(USB_DESCRIPTOR_CONFIG, + UsbDeviceConfiguration { + .wTotalLength = 0x0079, + .bNumInterfaces = 0x02, + .bConfigurationValue = 0x01, + .iConfiguration = 0x03, + .bmAttributes = 0x80, + .bMaxPower = 0x1e})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x00, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x01, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + + static constexpr u8 audio_if0_header[] = { + 0x09, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x01, // bDescriptorSubtype (CS_INTERFACE -> HEADER) + 0x00, 0x01, // bcdADC 1.00 + 0x27, 0x00, // wTotalLength 39 + 0x01, // binCollection 0x01 + 0x01, // baInterfaceNr 1 + }; + config0.add_node(UsbDescriptorNode(audio_if0_header[0], audio_if0_header[1], &audio_if0_header[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioInputTerminal { + .bDescriptorSubtype = 0x02, // INPUT_TERMINAL + .bTerminalID = 0x0d, + .wTerminalType = 0x0201, // Microphone + .bAssocTerminal = 0x00, + .bNrChannels = 0x01, + .wChannelConfig = 0x0000, + .iChannelNames = 0x00, + .iTerminal = 0x00})); + static constexpr u8 audio_if0_feature[] = { + 0x09, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x06, // bDescriptorSubtype (CS_INTERFACE -> FEATURE_UNIT) + 0x02, // bUnitID + 0x0d, // bSourceID + 0x01, // bControlSize 1 + 0x03, // bmaControls[0] (Mute,Volume) + 0x00, // bmaControls[1] (None) + 0x00, // iFeature + }; + config0.add_node(UsbDescriptorNode(audio_if0_feature[0], audio_if0_feature[1], &audio_if0_feature[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioOutputTerminal { + .bDescriptorSubtype = 0x03, // OUTPUT_TERMINAL + .bTerminalID = 0x0a, + .wTerminalType = 0x0101, // USB Streaming + .bAssocTerminal = 0x00, + .bSourceID = 0x02, + .iTerminal = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x01, + .bNumEndpoints = 0x01, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioInterface { + .bDescriptorSubtype = 0x01, // AS_GENERAL + .bTerminalLink = 0x0a, + .bDelay = 0x00, + .wFormatTag = 0x0001})); + + static constexpr u8 audio_if1_alt1_type[] = { + 0x17, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x02, // bDescriptorSubtype (CS_INTERFACE -> FORMAT_TYPE) + 0x01, // bFormatType 1 + 0x01, // bNrChannels (Mono) + 0x02, // bSubFrameSize 2 + 0x10, // bBitResolution 16 + 0x05, // bSamFreqType 5 + 0x40, 0x1F, 0x00, // tSamFreq[1] 8000 Hz + 0x11, 0x2B, 0x00, // tSamFreq[2] 11025 Hz + 0x22, 0x56, 0x00, // tSamFreq[4] 22050 Hz + 0x44, 0xAC, 0x00, // tSamFreq[6] 44100 Hz + 0x80, 0xBB, 0x00, // tSamFreq[7] 48000 Hz + }; + config0.add_node(UsbDescriptorNode(audio_if1_alt1_type[0], audio_if1_alt1_type[1], &audio_if1_alt1_type[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT, + UsbAudioEndpoint { + .bEndpointAddress = 0x84, + .bmAttributes = 0x0d, + .wMaxPacketSize = 0x0060, + .bInterval = 0x01, + .bRefresh = 0x00, + .bSynchAddress = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT_ASI, + UsbAudioStreamingEndpoint { + .bDescriptorSubtype = 0x01, // EP_GENERAL + .bmAttributes = 0x01, // Sampling Freq Control + .bLockDelayUnits = 0x02, + .wLockDelay = 0x0001})); + + add_string("Logitech"); + add_string("Logitech USB Microphone"); + break; + } + case MicType::Rocksmith: + { + device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, + UsbDeviceDescriptor { + .bcdUSB = 0x0110, + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = 0x10, + .idVendor = 0x12ba, + .idProduct = 0x00ff, + .bcdDevice = 0x0100, + .iManufacturer = 0x01, + .iProduct = 0x02, + .iSerialNumber = 0x00, + .bNumConfigurations = 0x01}); + auto& config0 = device.add_node(UsbDescriptorNode(USB_DESCRIPTOR_CONFIG, + UsbDeviceConfiguration { + .wTotalLength = 0x0098, + .bNumInterfaces = 0x03, + .bConfigurationValue = 0x01, + .iConfiguration = 0x00, + .bmAttributes = 0x80, + .bMaxPower = 0x32})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x00, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x01, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + + static constexpr u8 audio_if0_header[] = { + 0x09, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x01, // bDescriptorSubtype (CS_INTERFACE -> HEADER) + 0x00, 0x01, // bcdADC 1.00 + 0x27, 0x00, // wTotalLength 39 + 0x01, // binCollection 0x01 + 0x01, // baInterfaceNr 1 + }; + config0.add_node(UsbDescriptorNode(audio_if0_header[0], audio_if0_header[1], &audio_if0_header[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioInputTerminal { + .bDescriptorSubtype = 0x02, // INPUT_TERMINAL + .bTerminalID = 0x02, + .wTerminalType = 0x0201, // Microphone + .bAssocTerminal = 0x00, + .bNrChannels = 0x01, + .wChannelConfig = 0x0001, + .iChannelNames = 0x00, + .iTerminal = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioOutputTerminal { + .bDescriptorSubtype = 0x03, // OUTPUT_TERMINAL + .bTerminalID = 0x07, + .wTerminalType = 0x0101, // USB Streaming + .bAssocTerminal = 0x00, + .bSourceID = 0x0a, + .iTerminal = 0x00})); + + static constexpr u8 audio_if0_feature[] = { + 0x09, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x06, // bDescriptorSubtype (CS_INTERFACE -> FEATURE_UNIT) + 0x0a, // bUnitID + 0x02, // bSourceID + 0x01, // bControlSize 1 + 0x03, // bmaControls[0] (Mute,Volume) + 0x00, // bmaControls[1] (None) + 0x00, // iFeature + }; + config0.add_node(UsbDescriptorNode(audio_if0_feature[0], audio_if0_feature[1], &audio_if0_feature[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x01, + .bNumEndpoints = 0x01, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ACI, + UsbAudioInterface { + .bDescriptorSubtype = 0x01, // AS_GENERAL + .bTerminalLink = 0x07, + .bDelay = 0x01, + .wFormatTag = 0x0001})); + + static constexpr u8 audio_if1_alt1_type[] = { + 0x1d, // bLength + 0x24, // bDescriptorType (See Next Line) + 0x02, // bDescriptorSubtype (CS_INTERFACE -> FORMAT_TYPE) + 0x01, // bFormatType 1 + 0x01, // bNrChannels (Mono) + 0x02, // bSubFrameSize 2 + 0x10, // bBitResolution 16 + 0x07, // bSamFreqType 5 + 0x40, 0x1F, 0x00, // tSamFreq[1] 8000 Hz + 0x11, 0x2B, 0x00, // tSamFreq[2] 11025 Hz + 0x80, 0x3e, 0x00, // tSamFreq[3] 16000 Hz + 0x22, 0x56, 0x00, // tSamFreq[4] 22050 Hz + 0x00, 0x7d, 0x00, // tSamFreq[5] 32000 Hz + 0x44, 0xAC, 0x00, // tSamFreq[6] 44100 Hz + 0x80, 0xBB, 0x00, // tSamFreq[7] 48000 Hz + }; + config0.add_node(UsbDescriptorNode(audio_if1_alt1_type[0], audio_if1_alt1_type[1], &audio_if1_alt1_type[2])); + + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT, + UsbAudioEndpoint { + .bEndpointAddress = 0x82, + .bmAttributes = 0x0d, + .wMaxPacketSize = 0x0064, + .bInterval = 0x01, + .bRefresh = 0x00, + .bSynchAddress = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT_ASI, + UsbAudioStreamingEndpoint { + .bDescriptorSubtype = 0x01, // EP_GENERAL + .bmAttributes = 0x01, // Sampling Freq Control + .bLockDelayUnits = 0x00, + .wLockDelay = 0x0000})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, + UsbDeviceInterface { + .bInterfaceNumber = 0x02, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x01, + .bInterfaceClass = 0x03, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_HID, + UsbDeviceHID { + .bcdHID = 0x0111, + .bCountryCode = 0x00, + .bNumDescriptors = 0x01, + .bDescriptorType = 0x22, + .wDescriptorLength = 0x001a})); + config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_ENDPOINT, + UsbDeviceEndpoint { + .bEndpointAddress = 0x87, + .bmAttributes = 0x03, + .wMaxPacketSize = 0x0010, + .bInterval = 0x01})); + + add_string("Hercules."); + add_string("Rocksmith USB Guitar Adapter"); + break; + } + } +} + +std::shared_ptr usb_device_mic::make_singstar(u32 controller_index, const std::array& location) +{ + return std::make_shared(controller_index, location, MicType::SingStar); +} + +std::shared_ptr usb_device_mic::make_logitech(u32 controller_index, const std::array& location) +{ + return std::make_shared(controller_index, location, MicType::Logitech); +} + +std::shared_ptr usb_device_mic::make_rocksmith(u32 controller_index, const std::array& location) +{ + return std::make_shared(controller_index, location, MicType::Rocksmith); +} + +u16 usb_device_mic::get_num_emu_devices() +{ + return 1; +} + +void usb_device_mic::control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) +{ + transfer->fake = true; + transfer->expected_count = buf_size; + transfer->expected_result = HC_CC_NOERR; + transfer->expected_time = get_timestamp() + 1000; + + switch (bmRequestType) + { + case 0U /*silences warning*/ | LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE: // 0x21 + switch (bRequest) + { + case SET_CUR: + { + ensure(buf_size >= 2); + const u8 ch = wValue & 0xff; + if (ch == 0) + { + m_volume[0] = (buf[1] << 8) | buf[0]; + m_volume[1] = (buf[1] << 8) | buf[0]; + usb_mic_log.notice("Set Cur Volume[%d]: 0x%04x (%d dB)", ch, m_volume[0], m_volume[0] / 256); + } + else if (ch == 1) + { + m_volume[0] = (buf[1] << 8) | buf[0]; + usb_mic_log.notice("Set Cur Volume[%d]: 0x%04x (%d dB)", ch, m_volume[0], m_volume[0] / 256); + } + else if (ch == 2) + { + m_volume[1] = (buf[1] << 8) | buf[0]; + usb_mic_log.notice("Set Cur Volume[%d]: 0x%04x (%d dB)", ch, m_volume[1], m_volume[1] / 256); + } + break; + } + default: + usb_mic_log.error("Unhandled Request: 0x%02X/0x%02X", bmRequestType, bRequest); + break; + } + break; + case 0U /*silences warning*/ | LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_ENDPOINT: // 0x22 + switch (bRequest) + { + case SET_CUR: + ensure(buf_size >= 3); + m_sample_rate = (buf[2] << 16) | (buf[1] << 8) | buf[0]; + usb_mic_log.notice("Set Sample Rate: %d", m_sample_rate); + break; + default: + usb_mic_log.error("Unhandled Request: 0x%02X/0x%02X", bmRequestType, bRequest); + break; + } + break; + case 0U /*silences warning*/ | LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE: // 0xa1 + switch (bRequest) + { + case GET_CUR: + { + ensure(buf_size >= 2); + const u8 ch = wValue & 0xff; + if (ch == 2) + { + buf[0] = (m_volume[1] ) & 0xff; + buf[1] = (m_volume[1] >> 8) & 0xff; + usb_mic_log.notice("Get Cur Volume[%d]: 0x%04x (%d dB)", ch, m_volume[1], m_volume[1] / 256); + } + else + { + buf[0] = (m_volume[0] ) & 0xff; + buf[1] = (m_volume[0] >> 8) & 0xff; + usb_mic_log.notice("Get Cur Volume[%d]: 0x%04x (%d dB)", ch, m_volume[0], m_volume[0] / 256); + } + break; + } + case GET_MIN: + { + ensure(buf_size >= 2); + constexpr s16 minVol = 0xff00; + buf[0] = (minVol ) & 0xff; + buf[1] = (minVol >> 8) & 0xff; + usb_mic_log.notice("Get Min Volume: 0x%04x (%d dB)", minVol, minVol / 256); + break; + } + case GET_MAX: + { + ensure(buf_size >= 2); + constexpr s16 maxVol = 0x0100; + buf[0] = (maxVol ) & 0xff; + buf[1] = (maxVol >> 8) & 0xff; + usb_mic_log.notice("Get Max Volume: 0x%04x (%d dB)", maxVol, maxVol / 256); + break; + } + default: + usb_mic_log.error("Unhandled Request: 0x%02X/0x%02X", bmRequestType, bRequest); + break; + } + break; + case 0U /*silences warning*/ | LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_ENDPOINT: // 0xa2 + switch (bRequest) + { + case GET_CUR: + ensure(buf_size >= 3); + buf[0] = (m_sample_rate ) & 0xff; + buf[1] = (m_sample_rate >> 8) & 0xff; + buf[2] = (m_sample_rate >> 16) & 0xff; + usb_mic_log.notice("Get Sample Rate: %d", m_sample_rate); + break; + default: + usb_mic_log.error("Unhandled Request: 0x%02X/0x%02X", bmRequestType, bRequest); + break; + } + break; + default: + usb_device_emulated::control_transfer(bmRequestType, bRequest, wValue, wIndex, wLength, buf_size, buf, transfer); + break; + } + + usb_mic_log.trace("control_transfer: req=0x%02X/0x%02X, val=0x%02x, idx=0x%02x, len=0x%02x, [%s]", + bmRequestType, bRequest, wValue, wIndex, wLength, fmt::buf_to_hexstring(buf, buf_size)); +} + +void usb_device_mic::isochronous_transfer(UsbTransfer* transfer) +{ + transfer->fake = true; + transfer->expected_count = 0; + transfer->expected_result = HC_CC_NOERR; + transfer->expected_time = get_timestamp() + 1000; + + const bool stereo = (m_mic_type == MicType::SingStar && current_altsetting == 2); + + auto& mic_thr = g_fxo->get(); + const std::lock_guard lock(mic_thr.mutex); + if (!mic_thr.init) + { + usb_mic_log.notice("mic init"); + mic_thr.load_config_and_init(); + mic_thr.init = 1; + } + if (!mic_thr.check_device(0)) + { + usb_mic_log.notice("mic check"); + } + microphone_device& device = ::at32(mic_thr.mic_list, 0); + if (!device.is_opened()) + { + usb_mic_log.notice("mic open"); + device.open_microphone(CELLMIC_SIGTYPE_RAW, m_sample_rate, m_sample_rate, stereo ? 2 : 1); + } + if (!device.is_started()) + { + usb_mic_log.notice("mic start"); + device.start_microphone(); + } + + u8* buf = static_cast(transfer->iso_request.buf.get_ptr()); + for (u32 index = 0; index < transfer->iso_request.num_packets; index++) + { + const u16 inlen = transfer->iso_request.packets[index] >> 4; + ensure(inlen >= (stereo ? 192 : 96)); + const u32 outlen = device.read_raw(buf, stereo ? 192 : 96); + buf += outlen; + transfer->iso_request.packets[index] = (outlen & 0xFFF) << 4; + usb_mic_log.trace(" isochronous_transfer: dev=%d, buf=0x%x, start=0x%x, pks=0x%x idx=0x%x, inlen=0x%x, outlen=0x%x", + static_cast(m_mic_type), transfer->iso_request.buf, transfer->iso_request.start_frame, transfer->iso_request.num_packets, index, inlen, outlen); + } +} diff --git a/rpcs3/Emu/Io/usb_microphone.h b/rpcs3/Emu/Io/usb_microphone.h new file mode 100644 index 0000000000..d8819a099b --- /dev/null +++ b/rpcs3/Emu/Io/usb_microphone.h @@ -0,0 +1,40 @@ +#pragma once + +#include "Emu/Io/usb_device.h" + +enum class MicType +{ + SingStar, + Logitech, + Rocksmith, +}; + +enum +{ + SET_CUR = 0x01, + GET_CUR = 0x81, + SET_MIN = 0x02, + GET_MIN = 0x82, + SET_MAX = 0x03, + GET_MAX = 0x83, +}; + +class usb_device_mic : public usb_device_emulated +{ +public: + usb_device_mic(u32 controller_index, const std::array& location, MicType mic_type); + + static std::shared_ptr make_singstar(u32 controller_index, const std::array& location); + static std::shared_ptr make_logitech(u32 controller_index, const std::array& location); + static std::shared_ptr make_rocksmith(u32 controller_index, const std::array& location); + static u16 get_num_emu_devices(); + + void control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) override; + void isochronous_transfer(UsbTransfer* transfer) override; + +private: + u32 m_controller_index; + MicType m_mic_type; + u32 m_sample_rate; + s16 m_volume[2]; +}; diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 7f3be85a13..15c4a26d81 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -459,6 +459,7 @@ + @@ -831,6 +832,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 7e2c398090..993d915586 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -924,6 +924,9 @@ Emu\Io + + Emu\Io + Emu\Io @@ -2121,6 +2124,9 @@ Emu\Io + + Emu\Io + Emu\Io From aa220d24e8d6a967bd9a13c47ac86e93b78408ce Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Sun, 11 Jan 2026 22:36:01 +0200 Subject: [PATCH 134/630] Fixed more SingStar previews --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 3 ++- rpcs3/Emu/Cell/Modules/cellVdec.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index df638670ba..62316cd1e0 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -822,7 +822,8 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { case CELL_VDEC_DIVX_QMOBILE : memSize = new_sdk ? 0x11B720 : 0x1DEF30; break; case CELL_VDEC_DIVX_MOBILE : memSize = new_sdk ? 0x19A740 : 0x26DED0; break; - case CELL_VDEC_MPEG4_SIMPLE_PROFILE: // just a guess based on the profile used by singstar before and after update + case CELL_VDEC_MPEG4_PROFILE_1: + case CELL_VDEC_MPEG4_PROFILE_4: // just a guess based on the profile used by singstar before and after update case CELL_VDEC_DIVX_HOME_THEATER: memSize = new_sdk ? 0x386A60 : 0x498060; break; case CELL_VDEC_DIVX_HD_720 : memSize = new_sdk ? 0x692070 : 0x805690; break; case CELL_VDEC_DIVX_HD_1080 : memSize = new_sdk ? 0xD78100 : 0xFC9870; break; diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.h b/rpcs3/Emu/Cell/Modules/cellVdec.h index 8cf9a0b1de..20613d5ed8 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.h +++ b/rpcs3/Emu/Cell/Modules/cellVdec.h @@ -389,7 +389,8 @@ struct CellVdecAvcInfo // DIVX Profile enum DIVX_level : u8 { - CELL_VDEC_MPEG4_SIMPLE_PROFILE = 4, + CELL_VDEC_MPEG4_PROFILE_1 = 1, // SingStar Vol.2 / Vol.3 + CELL_VDEC_MPEG4_PROFILE_4 = 4, // SingStar Pop CELL_VDEC_DIVX_QMOBILE = 10, CELL_VDEC_DIVX_MOBILE = 11, CELL_VDEC_DIVX_HOME_THEATER = 12, From 4842339f9e1cb11a77de98ba883f55f505539b92 Mon Sep 17 00:00:00 2001 From: Zion Nimchuk Date: Sun, 11 Jan 2026 18:07:42 -0800 Subject: [PATCH 135/630] Setup to deploy aarch64 binaries --- .github/workflows/rpcs3.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 175f5a589c..f9335f6265 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -400,6 +400,19 @@ jobs: .ci/setup-windows-ci-vars.sh ${{ matrix.arch }} ${{ matrix.compiler }} .ci/build-windows-clang.sh ${{ matrix.arch }} ${{ matrix.msys2 }} + - name: Deploy master build to GitHub Releases (only aarch64) + if: | + matrix.arch == 'aarch64' && + github.event_name != 'pull_request' && + github.repository == 'RPCS3/rpcs3' && + github.ref == 'refs/heads/master' + env: + RPCS3_TOKEN: ${{ secrets.RPCS3_TOKEN }} + # We specify it here since this upload is specific to arm64 + UPLOAD_COMMIT_HASH: ee05050fd1d8488148a771b526702656a10dacf0 + UPLOAD_REPO_FULL_NAME: "RPCS3/rpcs3-binaries-win-arm64" + run: .ci/github-upload.sh + - name: Save build Ccache if: github.ref == 'refs/heads/master' uses: actions/cache/save@main From a6321caaa2acfcfb238594426b2237423bd23aeb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 11 Jan 2026 18:36:47 +0300 Subject: [PATCH 136/630] rsx: Remove surface management hack breaking savestate capture --- rpcs3/Emu/RSX/Common/texture_cache_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Common/texture_cache_utils.h b/rpcs3/Emu/RSX/Common/texture_cache_utils.h index a180a1a8d1..82c52d8653 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache_utils.h +++ b/rpcs3/Emu/RSX/Common/texture_cache_utils.h @@ -1373,7 +1373,7 @@ namespace rsx set_dirty(false); } - if (context == rsx::texture_upload_context::framebuffer_storage && !Emu.IsStopped()) + if (context == rsx::texture_upload_context::framebuffer_storage) { // Lock, unlock auto surface = derived()->get_render_target(); From 578d30d3aeda52cee945f6564422539052eff0cb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 11 Jan 2026 23:23:36 +0300 Subject: [PATCH 137/630] rsx: Fix context_dma enum naming --- rpcs3/Emu/RSX/NV47/HW/common.cpp | 13 +------------ rpcs3/Emu/RSX/gcm_enums.cpp | 2 +- rpcs3/Emu/RSX/gcm_enums.h | 2 +- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/common.cpp b/rpcs3/Emu/RSX/NV47/HW/common.cpp index 45e7b001a1..e66e1703e2 100644 --- a/rpcs3/Emu/RSX/NV47/HW/common.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/common.cpp @@ -58,19 +58,8 @@ namespace rsx u32 get_report_data_impl([[maybe_unused]] rsx::context* ctx, u32 offset) { - u32 location = 0; blit_engine::context_dma report_dma = REGS(ctx)->context_dma_report(); - - switch (report_dma) - { - case blit_engine::context_dma::to_memory_get_report: location = CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_LOCAL; break; - case blit_engine::context_dma::report_location_main: location = CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_MAIN; break; - case blit_engine::context_dma::memory_host_buffer: location = CELL_GCM_CONTEXT_DMA_MEMORY_HOST_BUFFER; break; - default: - return vm::addr_t(0); - } - - return vm::cast(get_address(offset, location)); + return vm::cast(get_address(offset, static_cast(report_dma))); } void set_fragment_texture_dirty_bit(rsx::context* ctx, u32 arg, u32 index) diff --git a/rpcs3/Emu/RSX/gcm_enums.cpp b/rpcs3/Emu/RSX/gcm_enums.cpp index 5c7d88c875..1357627fb2 100644 --- a/rpcs3/Emu/RSX/gcm_enums.cpp +++ b/rpcs3/Emu/RSX/gcm_enums.cpp @@ -501,7 +501,7 @@ void fmt_class_string::format(std::string& out, u64 ar switch (value) { case blit_engine::context_dma::report_location_main: return "report location main"; - case blit_engine::context_dma::to_memory_get_report: return "to memory get report"; + case blit_engine::context_dma::report_location_local: return "report location local"; case blit_engine::context_dma::memory_host_buffer: return "memory host buffer"; } diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index 539796a531..07901aa78c 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -1820,7 +1820,7 @@ namespace rsx enum class context_dma : u32 { - to_memory_get_report = CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_LOCAL, + report_location_local = CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_LOCAL, report_location_main = CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_MAIN, memory_host_buffer = CELL_GCM_CONTEXT_DMA_MEMORY_HOST_BUFFER, }; From f45742df52b77390a7b91fa484a1e4b519d7109b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 11 Jan 2026 23:25:12 +0300 Subject: [PATCH 138/630] gcm: Implement cellGcmGetTimeStampLocation as HLE to improve timestamp reports detection - Timestamp reports don't need host GPU access and are much faster to emulate --- rpcs3/Emu/Cell/Modules/cellGcmSys.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp index a96017b16b..ac8183b689 100644 --- a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp @@ -235,10 +235,20 @@ u32 cellGcmGetReportDataLocation(u32 index, u32 location) u64 cellGcmGetTimeStampLocation(u32 index, u32 location) { - cellGcmSys.warning("cellGcmGetTimeStampLocation(index=%d, location=%d)", index, location); + cellGcmSys.trace("cellGcmGetTimeStampLocation(index=%d, location=%d)", index, location); - // NOTE: No error checkings - return cellGcmGetReportDataAddressLocation(index, location)->timer; + if (location == CELL_GCM_LOCATION_LOCAL) + { + return cellGcmGetTimeStamp(index); + } + + if (index >= 1024 * 1024) + { + cellGcmSys.error("cellGcmGetTimeStampLocation: Wrong main index (%d)", index); + } + + const auto address = gcmIoOffsetToAddress(0x0e000000 + index * 0x10); + return *vm::get_super_ptr(address); } //---------------------------------------------------------------------------- @@ -1508,8 +1518,8 @@ DECLARE(ppu_module_manager::cellGcmSys)("cellGcmSys", []() REG_FUNC(cellGcmSys, cellGcmGetReportDataAddress); REG_FUNC(cellGcmSys, cellGcmGetReportDataAddressLocation); REG_FUNC(cellGcmSys, cellGcmGetReportDataLocation); - REG_FUNC(cellGcmSys, cellGcmGetTimeStamp).flag(MFF_FORCED_HLE); // HLE-ing this allows for optimizations around reports - REG_FUNC(cellGcmSys, cellGcmGetTimeStampLocation); + REG_FUNC(cellGcmSys, cellGcmGetTimeStamp).flag(MFF_FORCED_HLE); // HLE-ing this allows for optimizations around reports + REG_FUNC(cellGcmSys, cellGcmGetTimeStampLocation).flag(MFF_FORCED_HLE); // Ditto // Command Buffer Control REG_FUNC(cellGcmSys, cellGcmGetControlRegister); From c199a96dac2f627f36bb9c43bf13dacb4c34f4e4 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 11 Jan 2026 23:26:49 +0300 Subject: [PATCH 139/630] rsx/zcull: Rename write_enabled to surface_active to make the meaning clear --- rpcs3/Emu/RSX/RSXZCULL.cpp | 8 ++++---- rpcs3/Emu/RSX/RSXZCULL.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXZCULL.cpp b/rpcs3/Emu/RSX/RSXZCULL.cpp index 3dd9d1a776..293ae5e9dd 100644 --- a/rpcs3/Emu/RSX/RSXZCULL.cpp +++ b/rpcs3/Emu/RSX/RSXZCULL.cpp @@ -82,7 +82,7 @@ namespace rsx { // NOTE: Only enable host queries if pixel count is active to save on resources // Can optionally be enabled for either stats enabled or zpass enabled for accuracy - const bool data_stream_available = zpass_count_enabled; // write_enabled && (zpass_count_enabled || stats_enabled); + const bool data_stream_available = zpass_count_enabled; // surface_active && (zpass_count_enabled || stats_enabled); if (host_queries_active && !data_stream_available) { // Stop @@ -106,7 +106,7 @@ namespace rsx void ZCULL_control::set_status(class ::rsx::thread* ptimer, bool surface_active, bool zpass_active, bool zcull_stats_active, bool flush_queue) { - write_enabled = surface_active; + surface_active = surface_active; zpass_count_enabled = zpass_active; stats_enabled = zcull_stats_active; @@ -340,14 +340,14 @@ namespace rsx } break; case CELL_GCM_ZCULL_STATS3: - value = (value || !write_enabled || !stats_enabled) ? 0 : u16{ umax }; + value = (value || !surface_active || !stats_enabled) ? 0 : u16{ umax }; break; case CELL_GCM_ZCULL_STATS2: case CELL_GCM_ZCULL_STATS1: case CELL_GCM_ZCULL_STATS: default: // Not implemented - value = (write_enabled && stats_enabled) ? -1 : 0; + value = (surface_active && stats_enabled) ? -1 : 0; break; } diff --git a/rpcs3/Emu/RSX/RSXZCULL.h b/rpcs3/Emu/RSX/RSXZCULL.h index 679357b457..d44cba5c95 100644 --- a/rpcs3/Emu/RSX/RSXZCULL.h +++ b/rpcs3/Emu/RSX/RSXZCULL.h @@ -109,7 +109,7 @@ namespace rsx protected: bool unit_enabled = false; // The ZCULL unit is on - bool write_enabled = false; // A surface in the ZCULL-monitored tile region has been loaded for rasterization + bool surface_active = false; // A surface in the ZCULL-monitored tile region has been loaded for rasterization bool stats_enabled = false; // Collecting of ZCULL statistics is enabled (not same as pixels passing Z test!) bool zpass_count_enabled = false; // Collecting of ZPASS statistics is enabled. If this is off, the counter does not increment bool host_queries_active = false; // The backend/host is gathering Z data for the ZCULL unit From 86b559ab523c616f3e09592fa27c502465aeafda Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 11 Jan 2026 23:50:27 +0300 Subject: [PATCH 140/630] rsx/zcull: Stop any running when the clear command is processed --- rpcs3/Emu/RSX/RSXZCULL.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/RSXZCULL.cpp b/rpcs3/Emu/RSX/RSXZCULL.cpp index 293ae5e9dd..63e39a8314 100644 --- a/rpcs3/Emu/RSX/RSXZCULL.cpp +++ b/rpcs3/Emu/RSX/RSXZCULL.cpp @@ -260,9 +260,20 @@ namespace rsx return; } + // Discard any running queries. The results will never be read anyway. + if (m_current_task && m_current_task->active) + { + discard_occlusion_query(m_current_task); + free_query(m_current_task); + m_current_task->active = false; + + allocate_new_query(ptimer); + begin_occlusion_query(m_current_task); + } + if (!m_pending_writes.empty()) { - //Remove any dangling/unclaimed queries as the information is lost anyway + // Remove any dangling/unclaimed queries as the information is lost anyway auto valid_size = m_pending_writes.size(); for (auto It = m_pending_writes.rbegin(); It != m_pending_writes.rend(); ++It) { From 100a402cd86059d337feed33d2b340ab1eefea88 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Mon, 12 Jan 2026 13:25:16 +0200 Subject: [PATCH 141/630] rsx/nv3089: Fix image_in source line length estimation --- rpcs3/Emu/RSX/NV47/HW/nv3089.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp b/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp index 666b4ef53a..8f35c5a860 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp @@ -187,19 +187,27 @@ namespace rsx const u32 in_offset = in_x * in_bpp + in_pitch * in_y; const u32 out_offset = out_x * out_bpp + out_pitch * out_y; - const u32 src_line_length = (in_w * in_bpp); + const u32 in_width_min = std::min(clip_h > 1 && in_pitch > 0 ? (in_pitch / in_bpp) : in_w, in_w); + const u32 src_line_length = (in_width_min * in_bpp); u32 src_address = 0; const u32 dst_address = get_address(dst_offset, dst_dma, 1); // TODO: Add size + if (!dst_address) + { + rsx_log.error("NV3089_IMAGE_IN_SIZE: Unmapped dst_address (dst_offset=0x%x, dst_dma=0x%dx)", dst_offset, dst_dma); + RSX(ctx)->recover_fifo(); + return { false, src_info, dst_info }; + } + if (is_block_transfer && (clip_h == 1 || (in_pitch == out_pitch && src_line_length == in_pitch))) { const u32 nb_lines = std::min(clip_h, in_h); const u32 data_length = nb_lines * src_line_length; - if (src_address = get_address(src_offset, src_dma, data_length); - !src_address || !dst_address) + if (src_address = get_address(src_offset, src_dma, data_length); !src_address) { + rsx_log.error("NV3089_IMAGE_IN_SIZE: Unmapped src_address for in block transfer (src_offset=0x%x, src_dma=0x%x, data_length=0x%x)", src_offset, src_dma, data_length); RSX(ctx)->recover_fifo(); return { false, src_info, dst_info }; } @@ -221,9 +229,9 @@ namespace rsx const u16 read_h = std::min(static_cast(clip_h / scale_y), in_h); const u32 data_length = in_pitch * (read_h - 1) + src_line_length; - if (src_address = get_address(src_offset, src_dma, data_length); - !src_address || !dst_address) + if (src_address = get_address(src_offset, src_dma, data_length); !src_address) { + rsx_log.error("NV3089_IMAGE_IN_SIZE: Unmapped src_address (src_offset=0x%x, src_dma=0x%x, data_length=0x%x)", src_offset, src_dma, data_length); RSX(ctx)->recover_fifo(); return { false, src_info, dst_info }; } From cf94be2aac19705cf280b6db49478397520d0ebf Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 12 Jan 2026 01:29:46 +0100 Subject: [PATCH 142/630] ISO: reset m_path to original path during Restart --- rpcs3/Emu/System.cpp | 13 ++++++++++++- rpcs3/Emu/System.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 7c0fa19c93..f5a0f6b75d 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -844,6 +844,7 @@ bool Emulator::BootRsxCapture(const std::string& path) m_path.clear(); m_path_old.clear(); m_path_original.clear(); + m_path_real.clear(); m_title_id.clear(); m_title.clear(); m_localized_title.clear(); @@ -1460,7 +1461,8 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, path = path + "PS3_GAME/USRDIR/EBOOT.BIN"; } - m_path = path; + m_path_real = m_path; + m_path = std::move(path); } sys_log.notice("Load: is iso archive = %d (m_path='%s')", launching_from_disc_archive, m_path); @@ -3980,6 +3982,15 @@ game_boot_result Emulator::Restart(bool graceful) Emu.after_kill_callback = [this] { + // Reset boot path in case of ISO + if (m_path.starts_with(iso_device::virtual_device_name)) + { + sys_log.notice("Continuous boot: Resetting boot path from '%s' to '%s'", m_path, m_path_real); + ensure(!m_path_real.empty()); + ensure(!m_path_real.starts_with(iso_device::virtual_device_name)); + m_path = m_path_real; + } + // Reload with prior configs. if (const auto error = Load(m_title_id); error != game_boot_result::no_errors) { diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 5288d72a1e..3f5d8f4f57 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -148,6 +148,7 @@ class Emulator final std::string m_path; std::string m_path_old; std::string m_path_original; + std::string m_path_real; std::string m_title_id; std::string m_title; std::string m_localized_title; From d5bf11703d133bcc590bc7fbe55269eadda9b446 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 12 Jan 2026 01:32:27 +0100 Subject: [PATCH 143/630] Qt: Restart game even if there's no savestate when using the restart shortcut --- rpcs3/rpcs3qt/gs_frame.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index 483f5affdc..db66ce68a4 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -339,6 +339,14 @@ void gs_frame::handle_shortcut(gui::shortcuts::shortcut shortcut_key, const QKey default: break; // unreachable } + if (shortcut_key == gui::shortcuts::shortcut::gw_restart && !boot_current_game_savestate(true, index)) + { + // Normal restart if there is no savestate + Emu.Restart(); + break; + } + + // Reboot with savestate boot_current_game_savestate(false, index); break; } From ec7f666c6b62ac2e08938a99de0ee19b03efd9ae Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 12 Jan 2026 01:37:54 +0100 Subject: [PATCH 144/630] Loader: Fix graceful Emu Restart This wasn't working because GracefulShutdown was guarding the boot --- rpcs3/Emu/System.cpp | 3 +++ rpcs3/Emu/System.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index f5a0f6b75d..0fa9300cc2 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -3991,6 +3991,9 @@ game_boot_result Emulator::Restart(bool graceful) m_path = m_path_real; } + // Allow Boot (guarded by GracefulShutdown, which is the scope of this callback) + m_restrict_emu_state_change = 0; + // Reload with prior configs. if (const auto error = Load(m_title_id); error != game_boot_result::no_errors) { diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 3f5d8f4f57..3bf33bcd52 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -394,7 +394,7 @@ public: { if (active) { - _this->m_restrict_emu_state_change--; + _this->m_restrict_emu_state_change.try_dec(0); } } From 5fd6d413d70b96946a83075f92f9628230c86606 Mon Sep 17 00:00:00 2001 From: Valters Date: Mon, 12 Jan 2026 00:30:10 +0200 Subject: [PATCH 145/630] Add async suffix to TODO sceNpLookupUserProfileAsync --- rpcs3/Emu/Cell/Modules/sceNp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index 4b4c3cfd01..2b49309a9b 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -3433,7 +3433,7 @@ error_code sceNpLookupUserProfile(s32 transId, vm::cptr npId, vm::ptr npId, vm::ptr userInfo, vm::ptr aboutMe, vm::ptr languages, vm::ptr countryCode, vm::ptr avatarImage, s32 prio, vm::ptr option) { - sceNp.todo("sceNpLookupUserProfile(transId=%d, npId=*0x%x, userInfo=*0x%x, aboutMe=*0x%x, languages=*0x%x, countryCode=*0x%x, avatarImage=*0x%x, prio=%d, option=*0x%x)", transId, npId, userInfo, + sceNp.todo("sceNpLookupUserProfileAsync(transId=%d, npId=*0x%x, userInfo=*0x%x, aboutMe=*0x%x, languages=*0x%x, countryCode=*0x%x, avatarImage=*0x%x, prio=%d, option=*0x%x)", transId, npId, userInfo, aboutMe, languages, countryCode, avatarImage, prio, option); auto& nph = g_fxo->get>(); From ee1886fad9e7313dd345769e4656cf5261967688 Mon Sep 17 00:00:00 2001 From: Zion Nimchuk Date: Mon, 12 Jan 2026 08:21:54 -0800 Subject: [PATCH 146/630] Fix windows aarch64 deploy --- .ci/deploy-windows-clang.sh | 2 +- .github/workflows/rpcs3.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.ci/deploy-windows-clang.sh b/.ci/deploy-windows-clang.sh index 32c6f24808..5da455282c 100644 --- a/.ci/deploy-windows-clang.sh +++ b/.ci/deploy-windows-clang.sh @@ -50,7 +50,7 @@ fi # Generate sha256 hashes # Write to file for GitHub releases sha256sum "$BUILD" | awk '{ print $1 }' | tee "$BUILD.sha256" -echo "$(cat "$BUILD.sha256");$(stat -c %s "$BUILD")B" > GitHubReleaseMessage.txt +echo "$(cat "$BUILD.sha256");$(stat -c %s "$BUILD")B" > "$RELEASE_MESSAGE" # Move files to publishing directory mkdir -p "$ARTIFACT_DIR" diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index f9335f6265..40d971210e 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -345,6 +345,7 @@ jobs: name: ARM64 env: CCACHE_DIR: 'C:\ccache' + RELEASE_MESSAGE: ../GitHubReleaseMessage.txt name: RPCS3 Windows Clang ${{ matrix.arch }} runs-on: ${{ matrix.os }} steps: From 4a12f70f2cd43ab554da60cc58681df86fe06e58 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Mon, 12 Jan 2026 17:29:45 +0100 Subject: [PATCH 147/630] Add Delete command to RPCN --- rpcs3/Emu/NP/rpcn_client.cpp | 51 +++++++-- rpcs3/Emu/NP/rpcn_client.h | 1 + rpcs3/Emu/NP/rpcn_types.h | 1 + rpcs3/rpcs3qt/rpcn_settings_dialog.cpp | 144 ++++++++++++++++++------- rpcs3/rpcs3qt/rpcn_settings_dialog.h | 9 ++ 5 files changed, 159 insertions(+), 47 deletions(-) diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 1ebbfdd14e..dc0af98f6c 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -101,6 +101,7 @@ void fmt_class_string::format(std::string& out, u64 arg) case rpcn::CommandType::Login: return "Login"; case rpcn::CommandType::Terminate: return "Terminate"; case rpcn::CommandType::Create: return "Create"; + case rpcn::CommandType::Delete: return "Delete"; case rpcn::CommandType::SendToken: return "SendToken"; case rpcn::CommandType::SendResetToken: return "SendResetToken"; case rpcn::CommandType::ResetPassword: return "ResetPassword"; @@ -255,7 +256,7 @@ namespace rpcn rpcn_log.notice("online: %s, pr_com_id: %s, pr_title: %s, pr_status: %s, pr_comment: %s, pr_data: %s", online ? "true" : "false", pr_com_id.data, pr_title, pr_status, pr_comment, fmt::buf_to_hexstring(pr_data.data(), pr_data.size())); } - constexpr u32 RPCN_PROTOCOL_VERSION = 27; + constexpr u32 RPCN_PROTOCOL_VERSION = 28; constexpr usz RPCN_HEADER_SIZE = 15; const char* error_to_explanation(rpcn::ErrorType error) @@ -656,7 +657,7 @@ namespace rpcn } // Those commands are handled synchronously and won't be forwarded to NP Handler - if (command == CommandType::Login || command == CommandType::GetServerList || command == CommandType::Create || + if (command == CommandType::Login || command == CommandType::GetServerList || command == CommandType::Create || command == CommandType::Delete || command == CommandType::AddFriend || command == CommandType::RemoveFriend || command == CommandType::AddBlock || command == CommandType::RemoveBlock || command == CommandType::SendMessage || command == CommandType::SendToken || @@ -1192,7 +1193,7 @@ namespace rpcn std::copy(token.begin(), token.end(), std::back_inserter(data)); data.push_back(0); - u64 req_id = rpcn_request_counter.fetch_add(1); + const u64 req_id = rpcn_request_counter.fetch_add(1); std::vector packet_data; @@ -1278,7 +1279,7 @@ namespace rpcn bool rpcn_client::terminate_connection() { - u64 req_id = rpcn_request_counter.fetch_add(1); + const u64 req_id = rpcn_request_counter.fetch_add(1); std::vector packet_data; std::vector data; @@ -1314,7 +1315,7 @@ namespace rpcn std::copy(email.begin(), email.end(), std::back_inserter(data)); data.push_back(0); - u64 req_id = rpcn_request_counter.fetch_add(1); + const u64 req_id = rpcn_request_counter.fetch_add(1); std::vector packet_data; if (!forge_send_reply(CommandType::Create, req_id, data, packet_data)) @@ -1348,7 +1349,7 @@ namespace rpcn std::copy(password.begin(), password.end(), std::back_inserter(data)); data.push_back(0); - u64 req_id = rpcn_request_counter.fetch_add(1); + const u64 req_id = rpcn_request_counter.fetch_add(1); std::vector packet_data; if (!forge_send_reply(CommandType::SendToken, req_id, data, packet_data)) @@ -1381,7 +1382,7 @@ namespace rpcn std::copy(email.begin(), email.end(), std::back_inserter(data)); data.push_back(0); - u64 req_id = rpcn_request_counter.fetch_add(1); + const u64 req_id = rpcn_request_counter.fetch_add(1); std::vector packet_data; if (!forge_send_reply(CommandType::SendResetToken, req_id, data, packet_data)) @@ -1416,7 +1417,7 @@ namespace rpcn std::copy(password.begin(), password.end(), std::back_inserter(data)); data.push_back(0); - u64 req_id = rpcn_request_counter.fetch_add(1); + const u64 req_id = rpcn_request_counter.fetch_add(1); std::vector packet_data; if (!forge_send_reply(CommandType::ResetPassword, req_id, data, packet_data)) @@ -1435,13 +1436,43 @@ namespace rpcn return error; } + ErrorType rpcn_client::delete_account() + { + const auto npid = g_cfg_rpcn.get_npid(); + const auto password = g_cfg_rpcn.get_password(); + + std::vector data; + std::copy(npid.begin(), npid.end(), std::back_inserter(data)); + data.push_back(0); + std::copy(password.begin(), password.end(), std::back_inserter(data)); + data.push_back(0); + + const u64 req_id = rpcn_request_counter.fetch_add(1); + + std::vector packet_data; + if (!forge_send_reply(CommandType::Delete, req_id, data, packet_data)) + { + return ErrorType::Malformed; + } + + vec_stream reply(packet_data); + auto error = static_cast(reply.get()); + + if (error == rpcn::ErrorType::NoError) + { + rpcn_log.success("Account was successfully deleted!"); + } + + return error; + } + bool rpcn_client::add_friend(const std::string& friend_username) { std::vector data; std::copy(friend_username.begin(), friend_username.end(), std::back_inserter(data)); data.push_back(0); - u64 req_id = rpcn_request_counter.fetch_add(1); + const u64 req_id = rpcn_request_counter.fetch_add(1); std::vector packet_data; if (!forge_send_reply(CommandType::AddFriend, req_id, data, packet_data)) @@ -1467,7 +1498,7 @@ namespace rpcn std::copy(friend_username.begin(), friend_username.end(), std::back_inserter(data)); data.push_back(0); - u64 req_id = rpcn_request_counter.fetch_add(1); + const u64 req_id = rpcn_request_counter.fetch_add(1); std::vector packet_data; if (!forge_send_reply(CommandType::RemoveFriend, req_id, data, packet_data)) diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index 6d7126ffa6..3781711912 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -304,6 +304,7 @@ namespace rpcn ErrorType resend_token(const std::string& npid, const std::string& password); ErrorType send_reset_token(std::string_view npid, std::string_view email); ErrorType reset_password(std::string_view npid, std::string_view token, std::string_view password); + ErrorType delete_account(); bool add_friend(const std::string& friend_username); bool remove_friend(const std::string& friend_username); diff --git a/rpcs3/Emu/NP/rpcn_types.h b/rpcs3/Emu/NP/rpcn_types.h index 684f0e65e9..15fba827d5 100644 --- a/rpcs3/Emu/NP/rpcn_types.h +++ b/rpcs3/Emu/NP/rpcn_types.h @@ -9,6 +9,7 @@ namespace rpcn Login, Terminate, Create, + Delete, SendToken, SendResetToken, ResetPassword, diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp index 74d5b14e6a..24aa0767aa 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp @@ -76,6 +76,20 @@ std::string derive_password(std::string_view user_password) return derived_password; } +std::shared_ptr get_rpcn_connection(QWidget* parent) +{ + const auto rpcn = rpcn::rpcn_client::get_instance(0); + + if (auto result = rpcn->wait_for_connection(); result != rpcn::rpcn_state::failure_no_failure) + { + const QString error_message = QObject::tr("Failed to connect to RPCN server:\n%0").arg(QString::fromStdString(rpcn::rpcn_state_to_string(result))); + QMessageBox::critical(parent, QObject::tr("Error Connecting to RPCN!"), error_message, QMessageBox::Ok); + return nullptr; + } + + return rpcn; +} + rpcn_settings_dialog::rpcn_settings_dialog(QWidget* parent) : QDialog(parent) { @@ -279,15 +293,11 @@ rpcn_account_dialog::rpcn_account_dialog(QWidget* parent) return; { - const auto rpcn = rpcn::rpcn_client::get_instance(0); const auto avatar_url = "https://rpcs3.net/cdn/netplay/DefaultAvatar.png"; + const auto rpcn = get_rpcn_connection(this); - if (auto result = rpcn->wait_for_connection(); result != rpcn::rpcn_state::failure_no_failure) - { - const QString error_message = tr("Failed to connect to RPCN server:\n%0").arg(QString::fromStdString(rpcn::rpcn_state_to_string(result))); - QMessageBox::critical(this, tr("Error Connecting"), error_message, QMessageBox::Ok); + if (!rpcn) return; - } if (auto error = rpcn->create_user(*username, *password, *username, avatar_url, *email); error != rpcn::ErrorType::NoError) { @@ -334,14 +344,11 @@ rpcn_account_dialog::rpcn_account_dialog(QWidget* parent) connect(btn_test, &QAbstractButton::clicked, this, [this]() { - auto rpcn = rpcn::rpcn_client::get_instance(0); + const auto rpcn = get_rpcn_connection(this); - if (auto res = rpcn->wait_for_connection(); res != rpcn::rpcn_state::failure_no_failure) - { - const QString error_msg = tr("Failed to connect to RPCN:\n%0").arg(QString::fromStdString(rpcn::rpcn_state_to_string(res))); - QMessageBox::warning(this, tr("Error connecting to RPCN!"), error_msg, QMessageBox::Ok); + if (!rpcn) return; - } + if (auto res = rpcn->wait_for_authentified(); res != rpcn::rpcn_state::failure_no_failure) { const QString error_msg = tr("Failed to authentify to RPCN:\n%0").arg(QString::fromStdString(rpcn::rpcn_state_to_string(res))); @@ -657,6 +664,68 @@ const std::optional& rpcn_ask_token_dialog::get_token() const return m_token; } +rpcn_confirm_delete_dialog::rpcn_confirm_delete_dialog(QWidget* parent) + : QDialog(parent) +{ + setWindowTitle(tr("Confirm Account Deletion")); + setObjectName("rpcn_confirm_delete_dialog"); + + QVBoxLayout* vbox_global = new QVBoxLayout(); + + QLabel* lbl_description = new QLabel(tr("Are you sure you want to delete RPCN account \"%1\"?\n\n" + "Important:\n" + "Deleting your account will blacklist your username and email for 3 months.\n" + "To confirm, type your username below and click \"Yes\".\n") + .arg(QString::fromStdString(g_cfg_rpcn.get_npid()))); + + QLineEdit* edit_for_delete = new QLineEdit(); + edit_for_delete->setPlaceholderText(tr("Type your username to confirm")); + + QPushButton* btn_yes = new QPushButton(tr("Yes")); + btn_yes->setEnabled(false); + QPushButton* btn_no = new QPushButton(tr("No")); + QDialogButtonBox* btn_box = new QDialogButtonBox(Qt::Horizontal); + btn_box->addButton(btn_yes, QDialogButtonBox::AcceptRole); + btn_box->addButton(btn_no, QDialogButtonBox::RejectRole); + + vbox_global->addWidget(lbl_description); + vbox_global->addWidget(edit_for_delete); + vbox_global->addWidget(btn_box); + + setLayout(vbox_global); + + connect(edit_for_delete, &QLineEdit::textChanged, this, [btn_yes](const QString& text) + { + btn_yes->setEnabled(text == g_cfg_rpcn.get_npid()); + }); + + connect(btn_box, &QDialogButtonBox::accepted, this, [this]() + { + const auto rpcn = get_rpcn_connection(this); + + if (!rpcn) + return QDialog::reject(); + + if (auto error = rpcn->delete_account(); error != rpcn::ErrorType::NoError) + { + QString error_message; + switch (error) + { + case rpcn::ErrorType::LoginError: error_message = tr("Invalid login or password."); break; + case rpcn::ErrorType::LoginAlreadyLoggedIn: error_message = tr("Cannot delete a currently logged-in account."); break; + default: error_message = tr("An unknown error occurred."); break; + } + QMessageBox::critical(this, tr("Deletion Failed"), tr("Failed to delete the account:\n%1").arg(error_message), QMessageBox::Ok); + QDialog::reject(); + return; + } + + QMessageBox::information(this, tr("Account Deleted"), tr("Your account has been successfully deleted."), QMessageBox::Ok); + QDialog::accept(); + }); + connect(btn_box, &QDialogButtonBox::rejected, this, &QDialog::reject); +} + rpcn_account_edit_dialog::rpcn_account_edit_dialog(QWidget* parent) : QDialog(parent) { @@ -682,6 +751,7 @@ rpcn_account_edit_dialog::rpcn_account_edit_dialog(QWidget* parent) QPushButton* btn_resendtoken = new QPushButton(tr("Resend Token"), this); QPushButton* btn_change_password = new QPushButton(tr("Change Password"), this); + QPushButton* btn_delete_account = new QPushButton(tr("Delete Account"), this); QPushButton* btn_save = new QPushButton(tr("Save"), this); vbox_labels->addWidget(lbl_username); @@ -694,6 +764,7 @@ rpcn_account_edit_dialog::rpcn_account_edit_dialog(QWidget* parent) hbox_buttons->addWidget(btn_resendtoken); hbox_buttons->addWidget(btn_change_password); + hbox_buttons->addWidget(btn_delete_account); hbox_buttons->addStretch(); hbox_buttons->addWidget(btn_save); @@ -727,6 +798,7 @@ rpcn_account_edit_dialog::rpcn_account_edit_dialog(QWidget* parent) }); connect(btn_resendtoken, &QAbstractButton::clicked, this, &rpcn_account_edit_dialog::resend_token); connect(btn_change_password, &QAbstractButton::clicked, this, &rpcn_account_edit_dialog::change_password); + connect(btn_delete_account, &QAbstractButton::clicked, this, &rpcn_account_edit_dialog::delete_account); g_cfg_rpcn.load(); @@ -770,17 +842,13 @@ void rpcn_account_edit_dialog::resend_token() if (!save_config()) return; - const auto rpcn = rpcn::rpcn_client::get_instance(0); - const std::string npid = g_cfg_rpcn.get_npid(); const std::string password = g_cfg_rpcn.get_password(); - if (auto result = rpcn->wait_for_connection(); result != rpcn::rpcn_state::failure_no_failure) - { - const QString error_message = tr("Failed to connect to RPCN server:\n%0").arg(QString::fromStdString(rpcn::rpcn_state_to_string(result))); - QMessageBox::critical(this, tr("Error Connecting!"), error_message, QMessageBox::Ok); + const auto rpcn = get_rpcn_connection(this); + + if (!rpcn) return; - } if (auto error = rpcn->resend_token(npid, password); error != rpcn::ErrorType::NoError) { @@ -823,13 +891,10 @@ void rpcn_account_edit_dialog::change_password() return; { - const auto rpcn = rpcn::rpcn_client::get_instance(0); - if (auto result = rpcn->wait_for_connection(); result != rpcn::rpcn_state::failure_no_failure) - { - const QString error_message = tr("Failed to connect to RPCN server:\n%0").arg(QString::fromStdString(rpcn::rpcn_state_to_string(result))); - QMessageBox::critical(this, tr("Error Connecting!"), error_message, QMessageBox::Ok); + const auto rpcn = get_rpcn_connection(this); + + if (!rpcn) return; - } if (auto error = rpcn->send_reset_token(*username, *email); error != rpcn::ErrorType::NoError) { @@ -868,13 +933,10 @@ void rpcn_account_edit_dialog::change_password() return; { - const auto rpcn = rpcn::rpcn_client::get_instance(0); - if (auto result = rpcn->wait_for_connection(); result != rpcn::rpcn_state::failure_no_failure) - { - const QString error_message = tr("Failed to connect to RPCN server:\n%0").arg(QString::fromStdString(rpcn::rpcn_state_to_string(result))); - QMessageBox::critical(this, tr("Error Connecting!"), error_message, QMessageBox::Ok); + const auto rpcn = get_rpcn_connection(this); + + if (!rpcn) return; - } if (auto error = rpcn->reset_password(*username, *token, *password); error != rpcn::ErrorType::NoError) { @@ -903,6 +965,17 @@ void rpcn_account_edit_dialog::change_password() } } +void rpcn_account_edit_dialog::delete_account() +{ + if (g_cfg_rpcn.get_npid().empty() || g_cfg_rpcn.get_password().empty()) + { + QMessageBox::warning(this, tr("Account Not Configured"), tr("Please configure your account in the settings before deleting it."), QMessageBox::Ok); + return; + } + rpcn_confirm_delete_dialog dlg_delete(this); + dlg_delete.exec(); +} + void friend_callback(void* param, rpcn::NotificationType ntype, const std::string& username, bool status) { auto* dlg = static_cast(param); @@ -1057,14 +1130,11 @@ rpcn_friends_dialog::rpcn_friends_dialog(QWidget* parent) setLayout(vbox_global); // Tries to connect to RPCN - m_rpcn = rpcn::rpcn_client::get_instance(0); + m_rpcn = get_rpcn_connection(this); - if (auto res = m_rpcn->wait_for_connection(); res != rpcn::rpcn_state::failure_no_failure) - { - const QString error_msg = tr("Failed to connect to RPCN:\n%0").arg(QString::fromStdString(rpcn::rpcn_state_to_string(res))); - QMessageBox::warning(parent, tr("Error connecting to RPCN!"), error_msg, QMessageBox::Ok); + if (!m_rpcn) return; - } + if (auto res = m_rpcn->wait_for_authentified(); res != rpcn::rpcn_state::failure_no_failure) { const QString error_msg = tr("Failed to authentify to RPCN:\n%0").arg(QString::fromStdString(rpcn::rpcn_state_to_string(res))); diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.h b/rpcs3/rpcs3qt/rpcn_settings_dialog.h index 3db92bbc7c..89d8253220 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.h +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.h @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -83,6 +84,13 @@ private: std::optional m_token; }; +class rpcn_confirm_delete_dialog : public QDialog +{ + Q_OBJECT +public: + rpcn_confirm_delete_dialog(QWidget* parent); +}; + class rpcn_account_edit_dialog : public QDialog { Q_OBJECT @@ -95,6 +103,7 @@ private: private Q_SLOTS: void resend_token(); void change_password(); + void delete_account(); protected: QLineEdit *m_edit_username, *m_edit_token; From 8f8d4687741d39bc9e2adb3d2d722f9f5f87e08b Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Tue, 13 Jan 2026 05:44:50 +0200 Subject: [PATCH 148/630] rsx/gcm: Fix cellGcmGetTimeStampLocation --- rpcs3/Emu/Cell/Modules/cellGcmSys.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp index ac8183b689..d9fc8be3d3 100644 --- a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp @@ -230,6 +230,7 @@ u32 cellGcmGetReportDataLocation(u32 index, u32 location) cellGcmSys.warning("cellGcmGetReportDataLocation(index=%d, location=%d)", index, location); vm::ptr report = cellGcmGetReportDataAddressLocation(index, location); + ensure(!!report); return report->value; } @@ -237,18 +238,9 @@ u64 cellGcmGetTimeStampLocation(u32 index, u32 location) { cellGcmSys.trace("cellGcmGetTimeStampLocation(index=%d, location=%d)", index, location); - if (location == CELL_GCM_LOCATION_LOCAL) - { - return cellGcmGetTimeStamp(index); - } - - if (index >= 1024 * 1024) - { - cellGcmSys.error("cellGcmGetTimeStampLocation: Wrong main index (%d)", index); - } - - const auto address = gcmIoOffsetToAddress(0x0e000000 + index * 0x10); - return *vm::get_super_ptr(address); + vm::ptr report = cellGcmGetReportDataAddressLocation(index, location); + ensure(!!report); + return vm::get_super_ptr(report.addr())->timer; } //---------------------------------------------------------------------------- From 2d42a4e25b25f1d2e412b5ac6f04175b90c45863 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Tue, 13 Jan 2026 13:57:00 +0200 Subject: [PATCH 149/630] rsx/gcm: Do not rely on GCM IOMAP table in HLE gcmIoOffsetToAddress --- rpcs3/Emu/Cell/Modules/cellGcmSys.cpp | 40 +++++++++++++++++---------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp index d9fc8be3d3..4c219b71b0 100644 --- a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp @@ -98,16 +98,26 @@ u32 gcmGetLocalMemorySize(u32 sdk_version) error_code gcmMapEaIoAddress(ppu_thread& ppu, u32 ea, u32 io, u32 size, bool is_strict); -u32 gcmIoOffsetToAddress(u32 ioOffset) +u32 gcmIoOffsetToAddress(u32 io_offs) { - const u32 upper12Bits = g_fxo->get().offsetTable.eaAddress[ioOffset >> 20]; + u32 upper_12bits = 0; - if (upper12Bits > 0xBFF) + if (io_offs < 0x20000000) { - return 0; + upper_12bits = rsx::get_current_renderer()->iomap_table.ea[io_offs >> 20]; + + if (upper_12bits >= rsx::constants::local_mem_base) + { + upper_12bits = 0; + } } - return (upper12Bits << 20) | (ioOffset & 0xFFFFF); + if (!upper_12bits) + { + cellGcmSys.error("Failed to convert io offset: 0x%x", io_offs); + } + + return upper_12bits | (io_offs & 0xFFFFF); } void InitOffsetTable() @@ -132,15 +142,15 @@ u32 cellGcmGetLabelAddress(u8 index) return rsx::get_current_renderer()->label_addr + 0x10 * index; } -vm::ptr cellGcmGetReportDataAddressLocation(u32 index, u32 location) +vm::ptr cellGcmGetReportDataAddressLocation(ppu_thread& ppu, u32 index, u32 location) { - cellGcmSys.warning("cellGcmGetReportDataAddressLocation(index=%d, location=%d)", index, location); + cellGcmSys.trace("cellGcmGetReportDataAddressLocation(index=%d, location=%d)", index, location); if (location == CELL_GCM_LOCATION_MAIN) { if (index >= 1024 * 1024) { - cellGcmSys.error("cellGcmGetReportDataAddressLocation: Wrong main index (%d)", index); + cellGcmSys.error("%s: Wrong main index (%d)", ppu.current_function, index); } return vm::cast(gcmIoOffsetToAddress(0x0e000000 + index * 0x10)); @@ -150,7 +160,7 @@ vm::ptr cellGcmGetReportDataAddressLocation(u32 index, u32 lo if (index >= 2048) { - cellGcmSys.error("cellGcmGetReportDataAddressLocation: Wrong local index (%d)", index); + cellGcmSys.error("%s: Wrong local index (%d)", ppu.current_function, index); } return vm::cast(rsx::get_current_renderer()->label_addr + ::offset32(&RsxReports::report) + index * 0x10); @@ -225,21 +235,21 @@ u32 cellGcmGetReportDataAddress(u32 index) return rsx::get_current_renderer()->label_addr + ::offset32(&RsxReports::report) + index * 0x10; } -u32 cellGcmGetReportDataLocation(u32 index, u32 location) +u32 cellGcmGetReportDataLocation(ppu_thread& ppu, u32 index, u32 location) { cellGcmSys.warning("cellGcmGetReportDataLocation(index=%d, location=%d)", index, location); - vm::ptr report = cellGcmGetReportDataAddressLocation(index, location); - ensure(!!report); + vm::ptr report = cellGcmGetReportDataAddressLocation(ppu, index, location); return report->value; } -u64 cellGcmGetTimeStampLocation(u32 index, u32 location) +u64 cellGcmGetTimeStampLocation(ppu_thread& ppu, u32 index, u32 location) { cellGcmSys.trace("cellGcmGetTimeStampLocation(index=%d, location=%d)", index, location); - vm::ptr report = cellGcmGetReportDataAddressLocation(index, location); - ensure(!!report); + vm::ptr report = cellGcmGetReportDataAddressLocation(ppu, index, location); + + // Timestamp reports don't need host GPU access and are much faster to emulate return vm::get_super_ptr(report.addr())->timer; } From 57f162c3c4a6a18b5cd81d766fb1ae0ab15be480 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:13:34 +0200 Subject: [PATCH 150/630] rsx/nv3089: Fix wrong suggestion --- rpcs3/Emu/RSX/NV47/HW/nv3089.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp b/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp index 8f35c5a860..111611d887 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp @@ -187,8 +187,7 @@ namespace rsx const u32 in_offset = in_x * in_bpp + in_pitch * in_y; const u32 out_offset = out_x * out_bpp + out_pitch * out_y; - const u32 in_width_min = std::min(clip_h > 1 && in_pitch > 0 ? (in_pitch / in_bpp) : in_w, in_w); - const u32 src_line_length = (in_width_min * in_bpp); + const u32 src_line_length = (std::min(in_w, in_x + static_cast(std::ceil(clip_w / scale_x))) * in_bpp); u32 src_address = 0; const u32 dst_address = get_address(dst_offset, dst_dma, 1); // TODO: Add size From 960e2a9ed8bda013558d921fc1ea72b21d0688de Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:58:48 +0200 Subject: [PATCH 151/630] rsx: Make get_address(MAIN) more strict --- rpcs3/Emu/RSX/RSXThread.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index cc7b9fff17..f95dc8ba56 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -150,11 +150,28 @@ namespace rsx case CELL_GCM_CONTEXT_DMA_MEMORY_HOST_BUFFER: case CELL_GCM_LOCATION_MAIN: { - if (const u32 ea = render->iomap_table.get_addr(offset); ea + 1) + if (const u32 ea = render->iomap_table.get_addr(offset); ea != umax) { - if (!size_to_check || vm::check_addr(ea, 0, size_to_check)) + if (size_to_check <= 1 || (offset < render->main_mem_size && render->main_mem_size - offset >= size_to_check)) { - return ea; + bool ok = true; + + for (u32 offs_index = 0x100000; offs_index < size_to_check; offs_index += 0x100000) + { + // This check does not check continuity but rather that it's mapped at all + if (render->iomap_table.get_addr(offs_index) == umax) + { + ok = false; + } + } + + if (ok) + { + if (!size_to_check || vm::check_addr(ea, 0, size_to_check)) + { + return ea; + } + } } } @@ -175,7 +192,7 @@ namespace rsx case CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_MAIN: { - if (const u32 ea = offset < 0x1000000 ? render->iomap_table.get_addr(0x0e000000 + offset) : -1; ea + 1) + if (const u32 ea = offset < 0x1000000 ? render->iomap_table.get_addr(0x0e000000 + offset) : -1; ea != umax) { if (!size_to_check || vm::check_addr(ea, 0, size_to_check)) { From df72f4abed1c838905de5526841605ced5b676ed Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Tue, 13 Jan 2026 16:14:49 +0200 Subject: [PATCH 152/630] rsx: Fixup get_address() after #18038 --- rpcs3/Emu/RSX/RSXThread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index f95dc8ba56..44e8d8fb3f 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -156,10 +156,10 @@ namespace rsx { bool ok = true; - for (u32 offs_index = 0x100000; offs_index < size_to_check; offs_index += 0x100000) + for (u32 offs_index = 0x100000; offs_index < size_to_check + (offset & 0xfffff); offs_index += 0x100000) { // This check does not check continuity but rather that it's mapped at all - if (render->iomap_table.get_addr(offs_index) == umax) + if (render->iomap_table.get_addr(offset + offs_index) == umax) { ok = false; } From d656420cc4db15fd9def2fccd0beb87de48e102d Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Tue, 13 Jan 2026 11:26:47 -0800 Subject: [PATCH 153/630] Export AVVER for Release Title name --- .github/workflows/rpcs3.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 40d971210e..9baec8fc15 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -412,7 +412,12 @@ jobs: # We specify it here since this upload is specific to arm64 UPLOAD_COMMIT_HASH: ee05050fd1d8488148a771b526702656a10dacf0 UPLOAD_REPO_FULL_NAME: "RPCS3/rpcs3-binaries-win-arm64" - run: .ci/github-upload.sh + run: | + COMM_TAG=$(awk '/version{.*}/ { printf("%d.%d.%d", $5, $6, $7) }' ./rpcs3/rpcs3_version.cpp) + COMM_COUNT=$(git rev-list --count HEAD) + COMM_HASH=$(git rev-parse --short=8 HEAD) + export AVVER="${COMM_TAG}-${COMM_COUNT}" + .ci/github-upload.sh - name: Save build Ccache if: github.ref == 'refs/heads/master' From caaee9b7cc65097a81b2d3f2b844adf5301fa826 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 20:34:16 +0100 Subject: [PATCH 154/630] Qt: remove all shortcut files if requested --- rpcs3/rpcs3qt/game_list_actions.cpp | 16 +--- rpcs3/rpcs3qt/shortcut_utils.cpp | 119 ++++++++++++++++++++++++---- rpcs3/rpcs3qt/shortcut_utils.h | 4 +- 3 files changed, 110 insertions(+), 29 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp index 8cc4f767ef..b37348f49d 100644 --- a/rpcs3/rpcs3qt/game_list_actions.cpp +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -811,7 +811,7 @@ bool game_list_actions::RemoveContentList(const std::string& serial, bool is_int // Add serial (title id) to the list of serials to be removed in "games.yml" file (if any) if (content_types & DISC) { - if (const auto it = m_content_info.disc_list.find(serial); it != m_content_info.disc_list.cend()) + if (m_content_info.disc_list.contains(serial)) m_content_info.removed_disc_list.insert(serial); } @@ -851,18 +851,10 @@ bool game_list_actions::RemoveContentList(const std::string& serial, bool is_int { if (const auto it = m_content_info.name_list.find(serial); it != m_content_info.name_list.cend()) { - const bool remove_rpcs3_links = ValidateRemoval(serial, rpcs3::utils::get_games_shortcuts_dir(), "link"); - - for (const auto& name : it->second) + for (const std::string& name : it->second) { - // Remove illegal characters from name to match the link name created by gui::utils::create_shortcut() - const std::string simple_name = QString::fromStdString(vfs::escape(name, true)).simplified().toStdString(); - - // Remove rpcs3 shortcuts - if (remove_rpcs3_links) - RemoveContentBySerial(rpcs3::utils::get_games_shortcuts_dir(), simple_name + ".lnk", "link"); - - // TODO: Remove shortcuts from desktop/start menu + // Remove all shortcuts + gui::utils::remove_shortcuts(name, serial); } } } diff --git a/rpcs3/rpcs3qt/shortcut_utils.cpp b/rpcs3/rpcs3qt/shortcut_utils.cpp index 00bec65f13..615d794f26 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.cpp +++ b/rpcs3/rpcs3qt/shortcut_utils.cpp @@ -32,9 +32,17 @@ LOG_CHANNEL(sys_log, "SYS"); namespace gui::utils { - bool create_square_shortcut_icon_file(const std::string& path, const std::string& src_icon_path, const std::string& target_icon_dir, std::string& target_icon_path, const std::string& extension, int size) +#ifdef _WIN32 + static const std::string icon_extension = "ico"; +#elif defined(__APPLE__) + static const std::string icon_extension = "icns"; +#else + static const std::string icon_extension = "png"; +#endif + + bool create_square_shortcut_icon_file(const std::string& path, const std::string& src_icon_path, const std::string& target_icon_dir, std::string& target_icon_path, int size) { - if (src_icon_path.empty() || target_icon_dir.empty() || extension.empty()) + if (src_icon_path.empty() || target_icon_dir.empty()) { sys_log.error("Failed to create shortcut. Icon parameters empty."); return false; @@ -55,7 +63,7 @@ namespace gui::utils return false; } - target_icon_path = target_icon_dir + "shortcut." + fmt::to_lower(extension); + target_icon_path = target_icon_dir + "shortcut." + fmt::to_lower(icon_extension); QFile icon_file(QString::fromStdString(target_icon_path)); if (!icon_file.open(QFile::OpenModeFlag::ReadWrite | QFile::OpenModeFlag::Truncate)) @@ -65,7 +73,7 @@ namespace gui::utils } // Use QImageWriter instead of QPixmap::save in order to be able to log errors - if (QImageWriter writer(&icon_file, fmt::to_upper(extension).c_str()); !writer.write(icon.toImage())) + if (QImageWriter writer(&icon_file, fmt::to_upper(icon_extension).c_str()); !writer.write(icon.toImage())) { sys_log.error("Failed to write icon file '%s': %s", target_icon_path, writer.errorString()); return false; @@ -100,21 +108,21 @@ namespace gui::utils std::string link_path; - if (location == shortcut_location::desktop) + switch (location) { + case shortcut_location::desktop: link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::DesktopLocation).toStdString(); - } - else if (location == shortcut_location::applications) - { + break; + case shortcut_location::applications: link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ApplicationsLocation).toStdString(); - } + break; #ifdef _WIN32 - else if (location == shortcut_location::rpcs3_shortcuts) - { - link_path = rpcs3::utils::get_games_dir() + "/shortcuts/"; + case shortcut_location::rpcs3_shortcuts: + link_path = rpcs3::utils::get_games_shortcuts_dir(); fs::create_dir(link_path); - } + break; #endif + } if (!fs::is_dir(link_path) && !fs::create_dir(link_path)) { @@ -199,7 +207,7 @@ namespace gui::utils if (!src_icon_path.empty() && !target_icon_dir.empty()) { std::string target_icon_path; - if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, "ico", 512)) + if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) return cleanup(false, ".ico creation failed"); const std::wstring w_icon_path = utf8_to_wchar(target_icon_path); @@ -311,7 +319,7 @@ namespace gui::utils if (!src_icon_path.empty()) { std::string target_icon_path = resources_dir; - if (!create_square_shortcut_icon_file(path, src_icon_path, resources_dir, target_icon_path, "icns", 512)) + if (!create_square_shortcut_icon_file(path, src_icon_path, resources_dir, target_icon_path, 512)) { // Error is logged in create_square_shortcut_icon_file return false; @@ -349,7 +357,7 @@ namespace gui::utils if (!src_icon_path.empty() && !target_icon_dir.empty()) { std::string target_icon_path; - if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, "png", 512)) + if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) { // Error is logged in create_square_shortcut_icon_file return false; @@ -381,6 +389,85 @@ namespace gui::utils } return true; +#endif + } + + void remove_shortcuts(const std::string& name, [[maybe_unused]] const std::string& serial) + { + const std::string simple_name = QString::fromStdString(vfs::escape(name, true)).simplified().toStdString(); + if (simple_name.empty() || simple_name == "." || simple_name == "..") + { + sys_log.error("Failed to remove shortcuts: Cleaned file name empty or not allowed"); + return; + } + + const auto remove_file = [](const std::string& path) + { + if (!path.empty() && fs::is_file(path)) + { + if (fs::remove_file(path)) + { + sys_log.success("Removed shortcut file '%s'", path); + } + else + { + sys_log.error("Failed to remove shortcut file '%s': error='%s'", path, fs::g_tls_error); + } + } + }; + + std::vector locations = { + shortcut_location::desktop, + shortcut_location::applications + }; +#ifdef _WIN32 + locations.push_back(shortcut_location::rpcs3_shortcuts); +#endif + + for (shortcut_location location : locations) + { + std::string link_path; + + switch (location) + { + case shortcut_location::desktop: + link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::DesktopLocation).toStdString(); + break; + case shortcut_location::applications: + link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ApplicationsLocation).toStdString(); + link_path += "/RPCS3"; + break; +#ifdef _WIN32 + case shortcut_location::rpcs3_shortcuts: + link_path = rpcs3::utils::get_games_shortcuts_dir(); + break; +#endif + } + +#ifdef _WIN32 + fmt::append(link_path, "/%s.lnk", simple_name); + remove_file(link_path); +#elif defined(__APPLE__) + fmt::append(link_path, "/%s.app", simple_name); + + const std::string contents_dir = link_path + "/Contents/"; + const std::string plist_path = contents_dir + "Info.plist"; + const std::string launcher_path = contents_dir + "MacOS/launcher"; + const std::string resources_dir = contents_dir + "Resources"; + const std::string icon_path = fmt::format("%s/shortcut.%s", resources_dir, icon_extension); + + remove_file(plist_path); + remove_file(launcher_path); + remove_file(icon_path); +#else + fmt::append(link_path, "/%s.desktop", simple_name); + remove_file(link_path); +#endif + } + +#ifndef __APPLE__ + const std::string icon_path = fmt::format("%sIcons/game_icons/%s/shortcut.%s", fs::get_config_dir(), serial, icon_extension); + remove_file(icon_path); #endif } } diff --git a/rpcs3/rpcs3qt/shortcut_utils.h b/rpcs3/rpcs3qt/shortcut_utils.h index 11208a2bf0..4e7fcdf0ce 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.h +++ b/rpcs3/rpcs3qt/shortcut_utils.h @@ -2,7 +2,7 @@ namespace gui::utils { - enum shortcut_location + enum class shortcut_location { desktop, applications, @@ -19,4 +19,6 @@ namespace gui::utils const std::string& src_icon_path, const std::string& target_icon_dir, shortcut_location shortcut_location); + + void remove_shortcuts(const std::string& name, const std::string& serial); } From 72851d7d4436cb8bd0517b3676f62ccdacadec8f Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 18:56:03 +0100 Subject: [PATCH 155/630] VS: Fix ISO filters --- rpcs3/emucore.vcxproj.filters | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 993d915586..09f4b3c2b6 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1405,6 +1405,9 @@ Emu\NP + + Loader + @@ -2824,6 +2827,9 @@ Emu\NP + + Loader + From a0f2f006b19f9727d882d92bc00446e15d40be3d Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 12 Jan 2026 18:33:01 +0100 Subject: [PATCH 156/630] Qt: just remove the entire .app dir on macOs --- rpcs3/rpcs3qt/shortcut_utils.cpp | 51 +++++++++++++++++++------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/rpcs3/rpcs3qt/shortcut_utils.cpp b/rpcs3/rpcs3qt/shortcut_utils.cpp index 615d794f26..2bc2bfc578 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.cpp +++ b/rpcs3/rpcs3qt/shortcut_utils.cpp @@ -80,6 +80,8 @@ namespace gui::utils } icon_file.close(); + + sys_log.notice("Created shortcut icon file '%s'", target_icon_path); return true; } @@ -241,6 +243,8 @@ namespace gui::utils #elif defined(__APPLE__) fmt::append(link_path, "/%s.app", simple_name); + sys_log.notice("Creating shortcut '%s' with arguments '%s'", link_path, target_cli_args); + const std::string contents_dir = link_path + "/Contents/"; const std::string macos_dir = contents_dir + "MacOS/"; const std::string resources_dir = contents_dir + "Resources/"; @@ -339,6 +343,8 @@ namespace gui::utils fmt::append(link_path, "/%s.desktop", simple_name); + sys_log.notice("Creating shortcut '%s' for '%s' with arguments '%s'", link_path, exe_path, target_cli_args); + std::string file_content; fmt::append(file_content, "[Desktop Entry]\n"); fmt::append(file_content, "Encoding=UTF-8\n"); @@ -401,17 +407,31 @@ namespace gui::utils return; } - const auto remove_file = [](const std::string& path) + const auto remove_path = [](const std::string& path, bool is_file) { - if (!path.empty() && fs::is_file(path)) + if (!path.empty()) { - if (fs::remove_file(path)) + if (is_file && fs::is_file(path)) { - sys_log.success("Removed shortcut file '%s'", path); + if (fs::remove_file(path)) + { + sys_log.success("Removed shortcut file '%s'", path); + } + else + { + sys_log.error("Failed to remove shortcut file '%s': error='%s'", path, fs::g_tls_error); + } } - else + else if (!is_file && fs::is_dir(path)) { - sys_log.error("Failed to remove shortcut file '%s': error='%s'", path, fs::g_tls_error); + if (fs::remove_all(path)) + { + sys_log.success("Removed shortcut directory '%s'", path); + } + else + { + sys_log.error("Failed to remove shortcut directory '%s': error='%s'", path, fs::g_tls_error); + } } } }; @@ -446,28 +466,17 @@ namespace gui::utils #ifdef _WIN32 fmt::append(link_path, "/%s.lnk", simple_name); - remove_file(link_path); + remove_path(link_path, true); #elif defined(__APPLE__) fmt::append(link_path, "/%s.app", simple_name); - - const std::string contents_dir = link_path + "/Contents/"; - const std::string plist_path = contents_dir + "Info.plist"; - const std::string launcher_path = contents_dir + "MacOS/launcher"; - const std::string resources_dir = contents_dir + "Resources"; - const std::string icon_path = fmt::format("%s/shortcut.%s", resources_dir, icon_extension); - - remove_file(plist_path); - remove_file(launcher_path); - remove_file(icon_path); + remove_path(link_path, false); #else fmt::append(link_path, "/%s.desktop", simple_name); - remove_file(link_path); + remove_path(link_path, true); #endif } -#ifndef __APPLE__ const std::string icon_path = fmt::format("%sIcons/game_icons/%s/shortcut.%s", fs::get_config_dir(), serial, icon_extension); - remove_file(icon_path); -#endif + remove_path(icon_path, true); } } From 7090f16ff33d28f9f87aa270bf1e1d8c4177105e Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:06:03 -0800 Subject: [PATCH 157/630] Prepend win64 on all Windows artifacts --- .ci/setup-windows-ci-vars.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.ci/setup-windows-ci-vars.sh b/.ci/setup-windows-ci-vars.sh index 11373e0716..0e7353a0ed 100644 --- a/.ci/setup-windows-ci-vars.sh +++ b/.ci/setup-windows-ci-vars.sh @@ -13,14 +13,21 @@ COMM_TAG=$(awk '/version{.*}/ { printf("%d.%d.%d", $5, $6, $7) }' ./rpcs3/rpcs3_ COMM_COUNT=$(git rev-list --count HEAD) COMM_HASH=$(git rev-parse --short=8 HEAD) +# Differentiate Windows builds +if [ "$COMPILER" == 'clang' ];then + BUILD_SUFFIX="win64_${CPU_ARCH}_${COMPILER}" +else + BUILD_SUFFIX="${CPU_ARCH}_${COMPILER}" +fi + # Format the above into filenames if [ -n "$PR_NUMBER" ]; then AVVER="${COMM_TAG}-${COMM_HASH}" - BUILD_RAW="rpcs3-v${AVVER}_${CPU_ARCH}_${COMPILER}" + BUILD_RAW="rpcs3-v${AVVER}_${BUILD_SUFFIX}" BUILD="${BUILD_RAW}.7z" else AVVER="${COMM_TAG}-${COMM_COUNT}" - BUILD_RAW="rpcs3-v${AVVER}-${COMM_HASH}_${CPU_ARCH}_${COMPILER}" + BUILD_RAW="rpcs3-v${AVVER}-${COMM_HASH}_${BUILD_SUFFIX}" BUILD="${BUILD_RAW}.7z" fi From 1591b7f5a6c121ac9cef3e02334e4b07f7d39659 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:15:17 -0800 Subject: [PATCH 158/630] Prepend _win64_ --- .ci/setup-windows-ci-vars.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/setup-windows-ci-vars.sh b/.ci/setup-windows-ci-vars.sh index 0e7353a0ed..369450972c 100644 --- a/.ci/setup-windows-ci-vars.sh +++ b/.ci/setup-windows-ci-vars.sh @@ -14,7 +14,7 @@ COMM_COUNT=$(git rev-list --count HEAD) COMM_HASH=$(git rev-parse --short=8 HEAD) # Differentiate Windows builds -if [ "$COMPILER" == 'clang' ];then +if [ "$COMPILER" = 'clang' ];then BUILD_SUFFIX="win64_${CPU_ARCH}_${COMPILER}" else BUILD_SUFFIX="${CPU_ARCH}_${COMPILER}" From d7b723cd7c5ddcc785076687772a536a4525918e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20L=C3=B3pez=20Guimaraes?= Date: Tue, 13 Jan 2026 23:01:42 +0000 Subject: [PATCH 159/630] cellVdec: Add MPEG4 profile 3 This profile is used in SingStar recordings while in a song on some versions. --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 1 + rpcs3/Emu/Cell/Modules/cellVdec.h | 1 + 2 files changed, 2 insertions(+) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index 62316cd1e0..49975b632c 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -823,6 +823,7 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 case CELL_VDEC_DIVX_QMOBILE : memSize = new_sdk ? 0x11B720 : 0x1DEF30; break; case CELL_VDEC_DIVX_MOBILE : memSize = new_sdk ? 0x19A740 : 0x26DED0; break; case CELL_VDEC_MPEG4_PROFILE_1: + case CELL_VDEC_MPEG4_PROFILE_3: case CELL_VDEC_MPEG4_PROFILE_4: // just a guess based on the profile used by singstar before and after update case CELL_VDEC_DIVX_HOME_THEATER: memSize = new_sdk ? 0x386A60 : 0x498060; break; case CELL_VDEC_DIVX_HD_720 : memSize = new_sdk ? 0x692070 : 0x805690; break; diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.h b/rpcs3/Emu/Cell/Modules/cellVdec.h index 20613d5ed8..c8d6df4ae4 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.h +++ b/rpcs3/Emu/Cell/Modules/cellVdec.h @@ -390,6 +390,7 @@ struct CellVdecAvcInfo enum DIVX_level : u8 { CELL_VDEC_MPEG4_PROFILE_1 = 1, // SingStar Vol.2 / Vol.3 + CELL_VDEC_MPEG4_PROFILE_3 = 3, // Used for SingStar recordings CELL_VDEC_MPEG4_PROFILE_4 = 4, // SingStar Pop CELL_VDEC_DIVX_QMOBILE = 10, CELL_VDEC_DIVX_MOBILE = 11, From eaebd3426e7050c35beb8f24952d6da4d6a75360 Mon Sep 17 00:00:00 2001 From: Malcolm Date: Thu, 15 Jan 2026 04:43:02 +0000 Subject: [PATCH 160/630] LLVM: enable FMA for ARM cpus unconditionally - All armv8 machines should have FMA. - Should be a speedup for snapdragon elite and apple machines. --- rpcs3/Emu/CPU/CPUTranslator.cpp | 8 -------- rpcs3/Emu/CPU/CPUTranslator.h | 11 ++++++++++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.cpp b/rpcs3/Emu/CPU/CPUTranslator.cpp index 7cb9186d4d..f799e4b6be 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.cpp +++ b/rpcs3/Emu/CPU/CPUTranslator.cpp @@ -201,14 +201,6 @@ void cpu_translator::initialize(llvm::LLVMContext& context, llvm::ExecutionEngin m_use_vnni = true; m_use_gfni = true; } - - // Aarch64 CPUs - if (cpu == "cyclone" || cpu.contains("cortex")) - { - m_use_fma = true; - // AVX does not use intrinsics so far - m_use_avx = true; - } } llvm::Value* cpu_translator::bitcast(llvm::Value* val, llvm::Type* type) const diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index c709349080..99ddafde0a 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -3081,13 +3081,22 @@ protected: // Allow PSHUFB intrinsic bool m_use_ssse3 = true; +#ifdef ARCH_ARM64 + // all arm CPUS have FMA + bool m_use_fma = true; + // Should be nonsense to set this for ARM, + // but this flag is only used in SPU verification + // For now, setting this flag will speed up SPU verification + // but I will remove this later with explicit parralelism - Whatcookie + bool m_use_avx = true; +#else // Allow FMA bool m_use_fma = false; // Allow AVX bool m_use_avx = false; - +#endif // Allow skylake-x tier AVX-512 bool m_use_avx512 = false; From 760c35eec8b5af7c98fe23a201a59c6920f8c7da Mon Sep 17 00:00:00 2001 From: Malcolm Date: Sat, 17 Jan 2026 03:47:32 +0000 Subject: [PATCH 161/630] PPU LLVM: Use arm fmax/fmin for vmaxfp/vminfp - Arm fmax/fmin match altivec behaviour regarding nan behaviour --- rpcs3/Emu/Cell/PPUTranslator.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 6d4766a947..70d34aa775 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -1327,7 +1327,11 @@ void PPUTranslator::VMADDFP(ppu_opcode_t op) void PPUTranslator::VMAXFP(ppu_opcode_t op) { const auto [a, b] = get_vrs(op.va, op.vb); +#ifdef ARCH_ARM64 + set_vr(op.vd, vec_handle_result(fmax(a, b))); +#else set_vr(op.vd, vec_handle_result(select(fcmp_ord(a < b) | fcmp_uno(b != b), b, a))); +#endif } void PPUTranslator::VMAXSB(ppu_opcode_t op) @@ -1389,7 +1393,11 @@ void PPUTranslator::VMHRADDSHS(ppu_opcode_t op) void PPUTranslator::VMINFP(ppu_opcode_t op) { const auto [a, b] = get_vrs(op.va, op.vb); +#ifdef ARCH_ARM64 + set_vr(op.vd, vec_handle_result(fmin(a, b))); +#else set_vr(op.vd, vec_handle_result(select(fcmp_ord(a > b) | fcmp_uno(b != b), b, a))); +#endif } void PPUTranslator::VMINSB(ppu_opcode_t op) From 0f85e9123e781b6ec7fa78fa1c54b1de40179a23 Mon Sep 17 00:00:00 2001 From: Malcolm Date: Thu, 15 Jan 2026 04:20:25 +0000 Subject: [PATCH 162/630] utils: Scale busy_wait according to arm timer frequency > - This is a fatal issue that was impacting arm builds, since busy_waits were written assuming an approx 3Ghz x86 machine > and most arm machines have a hardware timer that runs south of 100mhz, meaning the top items in the profiler were calls to busy_wait(); > all over the code. Fixing this is a very significant speedup, on my snapdragon 8 gen 2 device. 27->37FPS in Metal Gear Rising, but almost > all games benefit when run on ARM. --- rpcs3/rpcs3.cpp | 5 +++++ rpcs3/util/asm.hpp | 29 +++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/rpcs3/rpcs3.cpp b/rpcs3/rpcs3.cpp index 007de26bdb..6c2130eca6 100644 --- a/rpcs3/rpcs3.cpp +++ b/rpcs3/rpcs3.cpp @@ -26,6 +26,7 @@ #include "Utilities/sema.h" #include "Utilities/date_time.h" #include "util/console.h" +#include "util/asm.hpp" #include "Crypto/decrypt_binaries.h" #ifdef _WIN32 #include "module_verifier.hpp" @@ -681,6 +682,10 @@ int run_rpcs3(int argc, char** argv) logs::set_init({std::move(ver), std::move(sys), std::move(os), std::move(qt), std::move(time)}); } +#ifdef ARCH_ARM64 + utils::init_arm_timer_scale(); +#endif + #ifdef _WIN32 sys_log.notice("Initialization times before main(): %fGc", intro_cycles / 1000000000.); #elif defined(RUSAGE_THREAD) diff --git a/rpcs3/util/asm.hpp b/rpcs3/util/asm.hpp index 8942dc2a09..56aa955652 100644 --- a/rpcs3/util/asm.hpp +++ b/rpcs3/util/asm.hpp @@ -183,10 +183,35 @@ namespace utils #endif } - // Synchronization helper (cache-friendly busy waiting) - inline void busy_wait(usz cycles = 3000) + // The hardware clock on many arm timers run south of 100mhz + // and the busy waits in RPCS3 were written assuming an x86 machine + // with hardware timers that run around 3GHz. + // For instance, on the snapdragon 8 gen 2, the hardware timer runs at 19.2mhz. + // This means that a busy wait that would have taken nanoseconds on x86 will run for + // many microseconds on many arm machines. +#ifdef ARCH_ARM64 + + inline u64 arm_timer_scale = 1; + + inline void init_arm_timer_scale() { + u64 freq = 0; + asm volatile("mrs %0, cntfrq_el0" : "=r"(freq)); + + // Try to scale hardware timer to match 3GHz + u64 timer_scale = freq / 30000000; + if (timer_scale) + arm_timer_scale = timer_scale; + } +#endif + + inline void busy_wait(u64 cycles = 3000) + { +#ifdef ARCH_ARM64 + const u64 stop = get_tsc() + ((cycles / 100) * arm_timer_scale); +#else const u64 stop = get_tsc() + cycles; +#endif do pause(); while (get_tsc() < stop); } From 2ef8dce8cf27acf2c7aeb40bdc81d3589f228408 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Sat, 17 Jan 2026 10:10:40 -0800 Subject: [PATCH 163/630] Explicitly install iconv --- .github/workflows/rpcs3.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 9baec8fc15..1cd5bfbfd8 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -369,6 +369,7 @@ jobs: mingw-w64-clang-${{ matrix.arch }}-llvm mingw-w64-clang-${{ matrix.arch }}-ffmpeg mingw-w64-clang-${{ matrix.arch }}-opencv + mingw-w64-clang-${{ matrix.arch }}-iconv mingw-w64-clang-${{ matrix.arch }}-glew mingw-w64-clang-${{ matrix.arch }}-vulkan mingw-w64-clang-${{ matrix.arch }}-vulkan-headers From d91c11deb06cceab775ec2d6008c682581b553ff Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Sat, 17 Jan 2026 10:11:50 -0800 Subject: [PATCH 164/630] Define source encoding for iconv --- .ci/deploy-windows-clang.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/deploy-windows-clang.sh b/.ci/deploy-windows-clang.sh index 5da455282c..07b4866fc4 100644 --- a/.ci/deploy-windows-clang.sh +++ b/.ci/deploy-windows-clang.sh @@ -23,7 +23,7 @@ cmake -DMSYS2_CLANG_BIN="$MSYS2_CLANG_BIN" -DMSYS2_USR_BIN="$MSYS2_USR_BIN" -Dex mkdir ./bin/config mkdir ./bin/config/input_configs curl -fsSL 'https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt' 1> ./bin/config/input_configs/gamecontrollerdb.txt -curl -fsSL 'https://rpcs3.net/compatibility?api=v1&export' | iconv -t UTF-8 1> ./bin/GuiConfigs/compat_database.dat +curl -fsSL 'https://rpcs3.net/compatibility?api=v1&export' | iconv -f ISO-8859-1 -t UTF-8 1> ./bin/GuiConfigs/compat_database.dat # Download translations mkdir -p ./bin/share/qt6/translations From 3e49c32c9c59b2bdf6bb29ec7d1e44074ffad4e5 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Sun, 18 Jan 2026 10:19:28 +0200 Subject: [PATCH 165/630] USB: Summonride updates --- rpcs3/rpcs3qt/kamen_rider_dialog.cpp | 180 ++++++++++++++++++--------- rpcs3/rpcs3qt/kamen_rider_dialog.h | 2 +- 2 files changed, 123 insertions(+), 59 deletions(-) diff --git a/rpcs3/rpcs3qt/kamen_rider_dialog.cpp b/rpcs3/rpcs3qt/kamen_rider_dialog.cpp index 8a4ef3e930..53fd2e07e0 100644 --- a/rpcs3/rpcs3qt/kamen_rider_dialog.cpp +++ b/rpcs3/rpcs3qt/kamen_rider_dialog.cpp @@ -16,36 +16,85 @@ #include kamen_rider_dialog* kamen_rider_dialog::inst = nullptr; -std::array>, UI_FIG_NUM> kamen_rider_dialog::figure_slots = {}; +std::array>, UI_FIG_NUM> kamen_rider_dialog::figure_slots = {}; QString last_kamen_rider_path; -static const std::map, const std::string> list_kamen_riders = { - {{0x10, 0x10}, "Kamen Rider Drive Wind"}, - {{0x10, 0x20}, "Kamen Rider Drive Water"}, - {{0x10, 0x30}, "Kamen Rider Drive Fire"}, - {{0x10, 0x40}, "Kamen Rider Drive Light"}, - {{0x10, 0x50}, "Kamen Rider Drive Dark"}, - {{0x11, 0x10}, "Kamen Rider Gaim Wind"}, - {{0x11, 0x20}, "Kamen Rider Gaim Water"}, - {{0x12, 0x20}, "Kamen Rider Wizard Water"}, - {{0x12, 0x30}, "Kamen Rider Wizard Fire"}, - {{0x13, 0x40}, "Kamen Rider Fourze Light"}, - {{0x14, 0x20}, "Kamen Rider 000 Water"}, - {{0x15, 0x10}, "Kamen Rider W (Double) Wind"}, - {{0x16, 0x50}, "Kamen Rider Decade Dark"}, - {{0x17, 0x50}, "Kamen Rider Kiva Dark"}, - {{0x18, 0x40}, "Kamen Rider Den-O Light"}, - {{0x19, 0x30}, "Kamen Rider Kabuto Fire"}, - {{0x1A, 0x30}, "Kamen Rider Hibiki Fire"}, - {{0x1B, 0x50}, "Kamen Rider Blade Dark"}, - {{0x1C, 0x50}, "Kamen Rider Faiz Dark"}, - {{0x1D, 0x10}, "Kamen Rider Ryuki Wind"}, - {{0x1E, 0x20}, "Kamen Rider Agito Water"}, - {{0x1F, 0x40}, "Kamen Rider Kuuga Light"}, - {{0x20, 0x00}, "Type Wild"}, - {{0x21, 0x00}, "Kamen Rider Zangetsu"}, - {{0x22, 0x00}, "All Dragon"}, - {{0x31, 0x00}, "Kachidoki Arms"}, +static const std::map, const std::string> list_kamen_riders = { + // Character ID [0x1b], ERC type [0x1a], Figure type [0x19] + {{0x10, 0x01, 0x10}, "Kamen Rider Drive (Wind)"}, + {{0x10, 0x01, 0x20}, "Kamen Rider Drive (Water)"}, + {{0x10, 0x01, 0x30}, "Kamen Rider Drive (Fire)"}, + {{0x10, 0x01, 0x40}, "Kamen Rider Drive (Light)"}, + {{0x10, 0x01, 0x50}, "Kamen Rider Drive (Dark)"}, + {{0x20, 0x01, 0x00}, "Kamen Rider Drive - Type Wild"}, + {{0x20, 0x02, 0x00}, "Kamen Rider Drive - Type Wild Gyasha Ver"}, + // {{ , , }, "Kamen Rider Drive - Type Speed Flare"}, + // {{ , , }, "Kamen Rider Drive - Type Technic"}, // 1.05 update + {{0x11, 0x01, 0x10}, "Kamen Rider Gaim (Wind)"}, + {{0x11, 0x01, 0x20}, "Kamen Rider Gaim (Water)"}, + {{0x21, 0x01, 0x00}, "Kamen Rider Gaim - Jimber Lemon Arms"}, + {{0x21, 0x02, 0x00}, "Kamen Rider Gaim - Kachidoki Arms"}, + {{0x21, 0x03, 0x00}, "Kamen Rider Gaim - Kiwami Arms"}, + {{0x12, 0x01, 0x20}, "Kamen Rider Wizard (Water)"}, + {{0x12, 0x01, 0x30}, "Kamen Rider Wizard (Fire)"}, + {{0x22, 0x01, 0x00}, "Kamen Rider Wizard - Infinity Style"}, + {{0x22, 0x02, 0x00}, "Kamen Rider Wizard - All Dragon"}, + {{0x22, 0x03, 0x00}, "Kamen Rider Wizard - Infinity Gold Dragon"}, + {{0x13, 0x01, 0x40}, "Kamen Rider Fourze (Light)"}, + {{0x23, 0x01, 0x00}, "Kamen Rider Fourze - Magnet States"}, + {{0x23, 0x02, 0x00}, "Kamen Rider Fourze - Cosmic States"}, + {{0x23, 0x03, 0x00}, "Kamen Rider Fourze - Meteor Nadeshiko Fusion States"}, + {{0x14, 0x01, 0x20}, "Kamen Rider OOO (Water)"}, + {{0x24, 0x01, 0x00}, "Kamen Rider OOO - Super Tatoba Combo"}, + {{0x24, 0x02, 0x00}, "Kamen Rider OOO - Putotyra Combo"}, + {{0x24, 0x04, 0x00}, "Kamen Rider OOO - Tajadol Combo"}, + {{0x15, 0x01, 0x10}, "Kamen Rider W (Double) (Wind)"}, + {{0x25, 0x01, 0x00}, "Kamen Rider W (Double) - Cyclone Joker Extreme"}, + {{0x25, 0x02, 0x00}, "Kamen Rider W (Double) - Cyclone Joker Gold Extreme"}, + {{0x25, 0x03, 0x00}, "Kamen Rider W (Double) - Fang Joker"}, + {{0x16, 0x01, 0x50}, "Kamen Rider Decade (Dark)"}, + {{0x26, 0x01, 0x00}, "Kamen Rider Decade - Complete Form"}, + {{0x26, 0x02, 0x00}, "Kamen Rider Decade - Strongest Complete Form"}, + {{0x26, 0x03, 0x00}, "Kamen Rider Decade - Final Form"}, + {{0x17, 0x01, 0x50}, "Kamen Rider Kiva (Dark)"}, + {{0x27, 0x01, 0x00}, "Kamen Rider Kiva - Dogabaki Form"}, + {{0x27, 0x02, 0x00}, "Kamen Rider Kiva - Emperor Form"}, + {{0x18, 0x01, 0x40}, "Kamen Rider Den-O (Light)"}, + {{0x28, 0x01, 0x00}, "Kamen Rider Den-O - Super Climax Form"}, + {{0x28, 0x02, 0x00}, "Kamen Rider Den-O - Liner Form"}, + {{0x28, 0x03, 0x00}, "Kamen Rider Den-O - Climax Form"}, + {{0x19, 0x01, 0x30}, "Kamen Rider Kabuto (Fire)"}, + {{0x29, 0x01, 0x00}, "Kamen Rider Kabuto - Hyper Form"}, + {{0x29, 0x02, 0x00}, "Kamen Rider Kabuto - Masked Form"}, + {{0x1a, 0x01, 0x30}, "Kamen Rider Hibiki (Fire)"}, + {{0x2a, 0x01, 0x00}, "Kamen Rider Hibiki - Kurenai"}, + {{0x2a, 0x02, 0x00}, "Kamen Rider Hibiki - Armed"}, + {{0x1b, 0x01, 0x50}, "Kamen Rider Blade (Dark)"}, + {{0x2b, 0x01, 0x00}, "Kamen Rider Blade - Joker Form"}, + {{0x2b, 0x02, 0x00}, "Kamen Rider Blade - King Form"}, + {{0x1c, 0x01, 0x50}, "Kamen Rider Faiz (Dark)"}, + {{0x2c, 0x01, 0x00}, "Kamen Rider Faiz - Axel Form"}, + {{0x2c, 0x02, 0x00}, "Kamen Rider Faiz - Blaster Form"}, + {{0x1d, 0x01, 0x10}, "Kamen Rider Ryuki (Wind)"}, + {{0x2d, 0x01, 0x00}, "Kamen Rider Ryuki - Dragreder"}, + {{0x2d, 0x02, 0x00}, "Kamen Rider Ryuki - Survive"}, + {{0x1e, 0x01, 0x20}, "Kamen Rider Agito (Water)"}, + {{0x2e, 0x01, 0x00}, "Kamen Rider Agito - Shining Form"}, + {{0x2e, 0x02, 0x00}, "Kamen Rider Agito - Burning Form"}, + {{0x1f, 0x01, 0x40}, "Kamen Rider Kuuga (Light)"}, + {{0x2f, 0x01, 0x00}, "Kamen Rider Kuuga - Ultimate Form"}, + {{0x2f, 0x02, 0x00}, "Kamen Rider Kuuga - Amazing Mighty"}, + + {{0x31, 0x01, 0x00}, "Kamen Rider Baron"}, + {{0x31, 0x02, 0x00}, "Kamen Rider Zangetsu Shin"}, + {{0x32, 0x01, 0x00}, "Kamen Rider Beast"}, + {{0x33, 0x01, 0x00}, "Kamen Rider Meteor"}, + {{0x34, 0x01, 0x00}, "Kamen Rider Birth"}, + {{0x35, 0x01, 0x00}, "Kamen Rider Accel"}, + {{0x36, 0x01, 0x00}, "Kamen Rider Diend"}, + {{0x36, 0x02, 0x00}, "Kamen Rider Shocker Combatman"}, + {{0x39, 0x01, 0x00}, "Kamen Rider Gatack"}, + // {{ , , }, "Kamen Rider Mach"}, // 01.05 update }; static u32 kamen_rider_crc32(const std::array& buffer) @@ -113,12 +162,13 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) QStringList filterlist; for (const auto& [entry, figure_name] : list_kamen_riders) { - const uint qvar = (entry.first << 8) | entry.second; + const auto& [character_id, erc_type, figure_type] = entry; + const uint qvar = (character_id << 16) | (erc_type << 8) | figure_type; QString name = QString::fromStdString(figure_name); combo_figlist->addItem(name, QVariant(qvar)); filterlist << std::move(name); } - combo_figlist->addItem(tr("--Unknown--"), QVariant(0xFFFF)); + combo_figlist->addItem(tr("--Unknown--"), QVariant(0xFFFFFFFF)); combo_figlist->setEditable(true); combo_figlist->setInsertPolicy(QComboBox::NoInsert); combo_figlist->model()->sort(0, Qt::AscendingOrder); @@ -137,17 +187,22 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) vbox_panel->addWidget(line); QHBoxLayout* hbox_idvar = new QHBoxLayout(); - QLabel* label_id = new QLabel(tr("ID:")); - QLabel* label_type = new QLabel(tr("Type:")); + QLabel* label_id = new QLabel(tr("Character:")); + QLabel* label_erc = new QLabel(tr("ERC:")); + QLabel* label_fig = new QLabel(tr("Figure:")); QLineEdit* edit_id = new QLineEdit("0"); - QLineEdit* edit_type = new QLineEdit("0"); + QLineEdit* edit_erc = new QLineEdit("0"); + QLineEdit* edit_fig = new QLineEdit("0"); QRegularExpressionValidator* rxv = new QRegularExpressionValidator(QRegularExpression("\\d*"), this); edit_id->setValidator(rxv); - edit_type->setValidator(rxv); + edit_erc->setValidator(rxv); + edit_fig->setValidator(rxv); hbox_idvar->addWidget(label_id); hbox_idvar->addWidget(edit_id); - hbox_idvar->addWidget(label_type); - hbox_idvar->addWidget(edit_type); + hbox_idvar->addWidget(label_erc); + hbox_idvar->addWidget(edit_erc); + hbox_idvar->addWidget(label_fig); + hbox_idvar->addWidget(edit_fig); vbox_panel->addLayout(hbox_idvar); QHBoxLayout* hbox_buttons = new QHBoxLayout(); @@ -162,42 +217,50 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) connect(combo_figlist, &QComboBox::currentIndexChanged, [=](int index) { - const u16 fig_info = combo_figlist->itemData(index).toUInt(); - if (fig_info != 0xFFFF) + const u32 fig_info = combo_figlist->itemData(index).toUInt(); + if (fig_info != 0xFFFFFFFF) { - const u8 fig_id = fig_info >> 8; - const u8 fig_type = fig_info & 0xFF; + const u8 character_id = (fig_info >> 16) & 0xff; + const u8 erc_type = (fig_info >> 8) & 0xff; + const u8 figure_type = fig_info & 0xff; - edit_id->setText(QString::number(fig_id)); - edit_type->setText(QString::number(fig_type)); + edit_id->setText(QString::number(character_id)); + edit_erc->setText(QString::number(erc_type)); + edit_fig->setText(QString::number(figure_type)); } }); connect(btn_create, &QAbstractButton::clicked, this, [=, this]() { - bool ok_id = false, ok_var = false; - const u8 fig_id = edit_id->text().toUShort(&ok_id); - if (!ok_id) + bool ok_character = false, ok_erc = false, ok_fig = false; + const u8 character_id = edit_id->text().toUShort(&ok_character); + if (!ok_character) { QMessageBox::warning(this, tr("Error converting value"), tr("ID entered is invalid!"), QMessageBox::Ok); return; } - const u8 fig_type = edit_type->text().toUShort(&ok_var); - if (!ok_var) + const u8 erc_type = edit_erc->text().toUShort(&ok_erc); + if (!ok_erc) { - QMessageBox::warning(this, tr("Error converting value"), tr("Variant entered is invalid!"), QMessageBox::Ok); + QMessageBox::warning(this, tr("Error converting value"), tr("ERC entered is invalid!"), QMessageBox::Ok); + return; + } + const u8 figure_type = edit_fig->text().toUShort(&ok_fig); + if (!ok_fig) + { + QMessageBox::warning(this, tr("Error converting value"), tr("Figure entered is invalid!"), QMessageBox::Ok); return; } QString predef_name = last_kamen_rider_path; - const auto found_fig = list_kamen_riders.find(std::make_pair(fig_id, fig_type)); + const auto found_fig = list_kamen_riders.find(std::make_tuple(character_id, erc_type, figure_type)); if (found_fig != list_kamen_riders.cend()) { predef_name += QString::fromStdString(found_fig->second + ".bin"); } else { - predef_name += QString("Unknown(%1 %2).bin").arg(fig_id).arg(fig_type); + predef_name += QString("Unknown(%1 %2 %3).bin").arg(character_id).arg(erc_type).arg(figure_type); } file_path = QFileDialog::getSaveFileName(this, tr("Create Kamen Rider File"), predef_name, tr("Kamen Rider Object (*.bin);;All Files (*)")); @@ -231,7 +294,7 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) buf[7] = 0x89; buf[8] = 0x44; buf[10] = 0xc2; - std::array figure_data = {u8(dist(mt)), 0x03, 0x00, 0x00, 0x01, 0x0e, 0x0a, 0x0a, 0x10, fig_type, 0x01, fig_id}; + std::array figure_data = {u8(dist(mt)), 0x03, 0x00, 0x00, 0x01, 0x0e, 0x0a, 0x0a, 0x10, figure_type, erc_type, character_id}; write_to_ptr>(figure_data.data(), 0xC, kamen_rider_crc32(figure_data)); memcpy(&buf[16], figure_data.data(), figure_data.size()); fig_file.write(buf.data(), buf.size()); @@ -338,7 +401,7 @@ void kamen_rider_dialog::clear_kamen_rider(u8 slot) { if (const auto& slot_infos = ::at32(figure_slots, slot)) { - const auto& [cur_slot, id, var] = slot_infos.value(); + const auto& [cur_slot, character_id, erc_type, figure_type] = slot_infos.value(); g_ridergate.remove_figure(cur_slot); figure_slots[slot] = {}; update_edits(); @@ -385,11 +448,12 @@ void kamen_rider_dialog::load_kamen_rider_path(u8 slot, const QString& path) clear_kamen_rider(slot); - u8 fig_id = data[0x1B]; - u8 fig_type = data[0x19]; + u8 character_id = data[0x1b]; + u8 erc_type = data[0x1a]; + u8 figure_type = data[0x19]; u8 portal_slot = g_ridergate.load_figure(data, std::move(fig_file)); - figure_slots[slot] = std::tuple(portal_slot, fig_id, fig_type); + figure_slots[slot] = std::tuple(portal_slot, character_id, erc_type, figure_type); update_edits(); } @@ -401,15 +465,15 @@ void kamen_rider_dialog::update_edits() QString display_string; if (const auto& sd = figure_slots[i]) { - const auto& [portal_slot, fig_id, fig_type] = sd.value(); - const auto found_fig = list_kamen_riders.find(std::make_pair(fig_id, fig_type)); + const auto& [portal_slot, character_id, erc_type, figure_type] = sd.value(); + const auto found_fig = list_kamen_riders.find(std::make_tuple(character_id, erc_type, figure_type)); if (found_fig != list_kamen_riders.cend()) { display_string = QString::fromStdString(found_fig->second); } else { - display_string = QString(tr("Unknown (Id:%1 Type:%2)")).arg(fig_id).arg(fig_type); + display_string = QString(tr("Unknown (Character:%1 ERC:%2 Figure:%3)")).arg(character_id).arg(erc_type).arg(figure_type); } } else diff --git a/rpcs3/rpcs3qt/kamen_rider_dialog.h b/rpcs3/rpcs3qt/kamen_rider_dialog.h index 3eb040d2b6..3b6dc69e51 100644 --- a/rpcs3/rpcs3qt/kamen_rider_dialog.h +++ b/rpcs3/rpcs3qt/kamen_rider_dialog.h @@ -42,7 +42,7 @@ protected: protected: std::array edit_kamen_riders{}; - static std::array>, UI_FIG_NUM> figure_slots; + static std::array>, UI_FIG_NUM> figure_slots; private: static kamen_rider_dialog* inst; From 27ebd182e7f1275d22239cfb3c4f210dcd6320ce Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 24 Jan 2026 08:37:47 +0000 Subject: [PATCH 166/630] Flatbuffers to Protobuf (#18082) Migrate from Flatbuffers to Protobuf to make some lawyers happy. Fixes https://github.com/RPCS3/rpcs3/issues/17894 --- .ci/build-mac.sh | 2 +- .gitmodules | 8 +- 3rdparty/CMakeLists.txt | 16 +- 3rdparty/flatbuffers | 1 - 3rdparty/protobuf/CMakeLists.txt | 27 + 3rdparty/protobuf/protobuf | 1 + 3rdparty/protobuf/protobuf_build.vcxproj | 111 + CMakeLists.txt | 2 +- buildfiles/msvc/rpcs3_default.props | 91 + rpcs3.sln | 8 + rpcs3/Emu/CMakeLists.txt | 5 +- rpcs3/Emu/NP/fb_helpers.cpp | 650 - rpcs3/Emu/NP/fb_helpers.h | 34 - rpcs3/Emu/NP/generated/np2_structs.fbs | 584 - rpcs3/Emu/NP/generated/np2_structs.pb.cc | 35690 +++++++++++++++ rpcs3/Emu/NP/generated/np2_structs.pb.h | 38096 ++++++++++++++++ rpcs3/Emu/NP/generated/np2_structs.proto | 687 + .../Emu/NP/generated/np2_structs_generated.h | 7429 --- rpcs3/Emu/NP/ip_address.cpp | 16 +- rpcs3/Emu/NP/ip_address.h | 5 +- rpcs3/Emu/NP/np_notifications.cpp | 51 +- rpcs3/Emu/NP/np_requests.cpp | 255 +- rpcs3/Emu/NP/np_requests_gui.cpp | 36 +- rpcs3/Emu/NP/pb_helpers.cpp | 635 + rpcs3/Emu/NP/pb_helpers.h | 35 + rpcs3/Emu/NP/rpcn_client.cpp | 1052 +- rpcs3/Emu/NP/rpcn_client.h | 20 +- rpcs3/emucore.vcxproj | 11 +- rpcs3/emucore.vcxproj.filters | 9 +- rpcs3/rpcs3.vcxproj | 140 +- rpcs3/tests/rpcs3_test.vcxproj | 2 +- 31 files changed, 76209 insertions(+), 9500 deletions(-) delete mode 160000 3rdparty/flatbuffers create mode 100644 3rdparty/protobuf/CMakeLists.txt create mode 160000 3rdparty/protobuf/protobuf create mode 100644 3rdparty/protobuf/protobuf_build.vcxproj delete mode 100644 rpcs3/Emu/NP/fb_helpers.cpp delete mode 100644 rpcs3/Emu/NP/fb_helpers.h delete mode 100644 rpcs3/Emu/NP/generated/np2_structs.fbs create mode 100644 rpcs3/Emu/NP/generated/np2_structs.pb.cc create mode 100644 rpcs3/Emu/NP/generated/np2_structs.pb.h create mode 100644 rpcs3/Emu/NP/generated/np2_structs.proto delete mode 100644 rpcs3/Emu/NP/generated/np2_structs_generated.h create mode 100644 rpcs3/Emu/NP/pb_helpers.cpp create mode 100644 rpcs3/Emu/NP/pb_helpers.h diff --git a/.ci/build-mac.sh b/.ci/build-mac.sh index 7c62fdc631..9eb27681b7 100755 --- a/.ci/build-mac.sh +++ b/.ci/build-mac.sh @@ -8,7 +8,7 @@ brew install -f --overwrite --quiet ccache "llvm@$LLVM_COMPILER_VER" brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" if [ "$AARCH64" -eq 1 ]; then brew install -f --overwrite --quiet googletest opencv@4 sdl3 vulkan-headers vulkan-loader molten-vk - brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative + brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative protobuf else arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader molten-vk diff --git a/.gitmodules b/.gitmodules index 77fae5cf55..4c1c0f0f12 100644 --- a/.gitmodules +++ b/.gitmodules @@ -52,10 +52,6 @@ path = 3rdparty/wolfssl/wolfssl url = ../../wolfSSL/wolfssl.git ignore = dirty -[submodule "3rdparty/flatbuffers"] - path = 3rdparty/flatbuffers - url = ../../google/flatbuffers.git - ignore = dirty [submodule "3rdparty/cubeb/cubeb"] path = 3rdparty/cubeb/cubeb url = ../../mozilla/cubeb.git @@ -112,3 +108,7 @@ path = 3rdparty/feralinteractive/feralinteractive url = ../../FeralInteractive/gamemode.git ignore = dirty +[submodule "3rdparty/protobuf/protobuf"] + path = 3rdparty/protobuf/protobuf + url = ../../protocolbuffers/protobuf.git + ignore = dirty diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index 3b2dc05f1f..b25afb8834 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -25,18 +25,8 @@ add_subdirectory(zstd EXCLUDE_FROM_ALL) # 7zip sdk add_subdirectory(7zip EXCLUDE_FROM_ALL) -add_library(3rdparty_flatbuffers INTERFACE) -if (USE_SYSTEM_FLATBUFFERS) - pkg_check_modules(FLATBUFFERS REQUIRED IMPORTED_TARGET flatbuffers>=2.0.0) - target_link_libraries(3rdparty_flatbuffers INTERFACE PkgConfig::FLATBUFFERS) - set(FBS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../rpcs3/Emu/NP/generated/") - execute_process(COMMAND flatc --cpp -o "${FBS_DIR}" "${FBS_DIR}/np2_structs.fbs" RESULT_VARIABLE FBS_CMD_ERROR) - if(FBS_CMD_ERROR AND NOT FBS_CMD_ERROR EQUAL 0) - message(FATAL_ERROR "flatc failed to regenerate flatbuffers headers.") - endif() -else() - target_include_directories(3rdparty_flatbuffers SYSTEM INTERFACE flatbuffers/include) -endif() +# Protobuf +add_subdirectory(protobuf EXCLUDE_FROM_ALL) # libPNG add_subdirectory(libpng EXCLUDE_FROM_ALL) @@ -372,7 +362,7 @@ endif() add_library(3rdparty::zlib ALIAS 3rdparty_zlib) add_library(3rdparty::zstd ALIAS 3rdparty_zstd) add_library(3rdparty::7zip ALIAS 3rdparty_7zip) -add_library(3rdparty::flatbuffers ALIAS 3rdparty_flatbuffers) +add_library(3rdparty::protobuf ALIAS 3rdparty_protobuf) add_library(3rdparty::pugixml ALIAS pugixml) add_library(3rdparty::glslang ALIAS 3rdparty_glslang) add_library(3rdparty::yaml-cpp ALIAS yaml-cpp) diff --git a/3rdparty/flatbuffers b/3rdparty/flatbuffers deleted file mode 160000 index 1872409707..0000000000 --- a/3rdparty/flatbuffers +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 187240970746d00bbd26b0f5873ed54d2477f9f3 diff --git a/3rdparty/protobuf/CMakeLists.txt b/3rdparty/protobuf/CMakeLists.txt new file mode 100644 index 0000000000..274e6110af --- /dev/null +++ b/3rdparty/protobuf/CMakeLists.txt @@ -0,0 +1,27 @@ +add_library(3rdparty_protobuf INTERFACE) +if (USE_SYSTEM_PROTOBUF) + pkg_check_modules(PROTOBUF REQUIRED IMPORTED_TARGET protobuf>=33.0.0) + target_link_libraries(3rdparty_protobuf INTERFACE PkgConfig::PROTOBUF) + set(PROTOBUF_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../rpcs3/Emu/NP/generated/") + execute_process(COMMAND protoc --cpp_out="${PROTOBUF_DIR}" --proto_path="${PROTOBUF_DIR}" np2_structs.proto RESULT_VARIABLE PROTOBUF_CMD_ERROR) + if(PROTOBUF_CMD_ERROR AND NOT PROTOBUF_CMD_ERROR EQUAL 0) + message(FATAL_ERROR "protoc failed to regenerate protobuf files.") + endif() +else() + option(protobuf_INSTALL "Install protobuf binaries and files" OFF) + option(protobuf_BUILD_TESTS "Build tests" OFF) + option(protobuf_BUILD_CONFORMANCE "Build conformance tests" OFF) + option(protobuf_BUILD_EXAMPLES "Build examples" OFF) + option(protobuf_BUILD_PROTOBUF_BINARIES "Build protobuf libraries and protoc compiler" ON) + option(protobuf_BUILD_PROTOC_BINARIES "Build libprotoc and protoc compiler" OFF) + option(protobuf_BUILD_LIBPROTOC "Build libprotoc" OFF) + option(protobuf_BUILD_LIBUPB "Build libupb" OFF) + option(protobuf_ALLOW_CCACHE "Adjust build flags to allow for ccache support." ON) + option(protobuf_DISABLE_RTTI "Remove runtime type information in the binaries" OFF) + option(protobuf_FORCE_FETCH_DEPENDENCIES "Force all dependencies to be downloaded from GitHub. Local installations will be ignored." OFF) + option(protobuf_LOCAL_DEPENDENCIES_ONLY "Prevent downloading any dependencies from GitHub. If this option is set, the dependency must be available locally as an installed package." OFF) + + add_subdirectory(protobuf EXCLUDE_FROM_ALL) + target_include_directories(3rdparty_protobuf SYSTEM INTERFACE protobuf/src) + target_link_libraries(3rdparty_protobuf INTERFACE libprotobuf) +endif() diff --git a/3rdparty/protobuf/protobuf b/3rdparty/protobuf/protobuf new file mode 160000 index 0000000000..edaa823d8b --- /dev/null +++ b/3rdparty/protobuf/protobuf @@ -0,0 +1 @@ +Subproject commit edaa823d8b36a8656d7b2b9241b7d0bfe50af878 diff --git a/3rdparty/protobuf/protobuf_build.vcxproj b/3rdparty/protobuf/protobuf_build.vcxproj new file mode 100644 index 0000000000..83c02058d1 --- /dev/null +++ b/3rdparty/protobuf/protobuf_build.vcxproj @@ -0,0 +1,111 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {7B3B4C5D-6E7F-8A9B-0C1D-2E3F4A5B6C7D} + MakeFileProj + + + + + + Makefile + true + + + Makefile + false + + + + x64 + + + + + + + + + + + call vsdevcmd.bat -arch=amd64 + if not exist "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)" mkdir "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)" + cd "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)" + cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_STANDARD=20 -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build" -DCMAKE_SYSTEM_VERSION=10.0 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -Dprotobuf_INSTALL=ON -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_CONFORMANCE=OFF -Dprotobuf_BUILD_EXAMPLES=OFF -Dprotobuf_BUILD_PROTOBUF_BINARIES=ON -Dprotobuf_BUILD_PROTOC_BINARIES=OFF -Dprotobuf_BUILD_LIBPROTOC=OFF -Dprotobuf_BUILD_LIBUPB=OFF -Dprotobuf_ALLOW_CCACHE=ON -Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=ON "$(SolutionDir)3rdparty\protobuf\protobuf" + + call vsdevcmd.bat -arch=amd64 + if not exist "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)" mkdir "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)" + cd "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)" + cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_STANDARD=20 -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build" -DCMAKE_SYSTEM_VERSION=10.0 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=$(WindowsTargetPlatformVersion) -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL -Dprotobuf_INSTALL=ON -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_CONFORMANCE=OFF -Dprotobuf_BUILD_EXAMPLES=OFF -Dprotobuf_BUILD_PROTOBUF_BINARIES=ON -Dprotobuf_BUILD_PROTOC_BINARIES=OFF -Dprotobuf_BUILD_LIBPROTOC=OFF -Dprotobuf_BUILD_LIBUPB=OFF -Dprotobuf_ALLOW_CCACHE=ON -Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF "$(SolutionDir)3rdparty\protobuf\protobuf" + + + echo Cleaning.. + rmdir /s /q "$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build" + cd "$(SolutionDir)build\tmp\protobuf_build-$(Configuration)-$(Platform)" + for /F "delims= eol=|" %%f in (' + dir /b ^| findstr /V "[^.]*\build[^.]*\.vcxproj"') do ( + echo Deleting .\%%f + if exist %%f\nul ( + rmdir .\%%f /s /q + ) else ( + del .\%%f /q + ) + ) + + + + + + $(SolutionDir)build\lib\$(Configuration)-$(Platform)\ + $(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\ + + $(CmakeDebugCLI) + ninja + ninja install + + + $(CmakeCleanCLI) + $(CmakeDebugCLI) + ninja + ninja install + + + $(CmakeCleanCLI) + + + + + + $(SolutionDir)build\lib\$(Configuration)-$(Platform)\ + $(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)\ + + $(CmakeReleaseCLI) + ninja + ninja install + + + $(CmakeCleanCLI) + $(CmakeReleaseCLI) + ninja + ninja install + + + $(CmakeCleanCLI) + + + + + + + + diff --git a/CMakeLists.txt b/CMakeLists.txt index f459351379..65e415bdb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ option(USE_SYSTEM_CUBEB "Prefer system cubeb instead of the builtin one" OFF) option(USE_SYSTEM_CURL "Prefer system Curl instead of the prebuild one" ON) option(USE_SYSTEM_FAUDIO "Prefer system FAudio instead of the builtin one" OFF) option(USE_SYSTEM_FFMPEG "Prefer system ffmpeg instead of the prebuild one" OFF) -option(USE_SYSTEM_FLATBUFFERS "Prefer system flatbuffers instead of the builtin one" OFF) +option(USE_SYSTEM_PROTOBUF "Prefer system protobuf instead of the builtin one" OFF) option(USE_SYSTEM_GLSLANG "Prefer system glslang instead of the builtin one" OFF) option(USE_SYSTEM_HIDAPI "Prefer system hidapi instead of the builtin one" OFF) option(USE_SYSTEM_LIBPNG "Prefer system libpng instead of the builtin one" OFF) diff --git a/buildfiles/msvc/rpcs3_default.props b/buildfiles/msvc/rpcs3_default.props index 3cd3d25a94..b612560a8e 100644 --- a/buildfiles/msvc/rpcs3_default.props +++ b/buildfiles/msvc/rpcs3_default.props @@ -131,6 +131,97 @@ LLVMX86Info.lib; LLVMX86TargetMCA.lib; LLVMXRay.lib; + absl_log_severity.lib; + absl_raw_logging_internal.lib; + absl_spinlock_wait.lib; + absl_malloc_internal.lib; + absl_base.lib; + absl_throw_delegate.lib; + absl_scoped_set_env.lib; + absl_strerror.lib; + absl_poison.lib; + absl_tracing_internal.lib; + absl_hashtablez_sampler.lib; + absl_raw_hash_set.lib; + absl_crc_cpu_detect.lib; + absl_crc_internal.lib; + absl_crc32c.lib; + absl_crc_cord_state.lib; + absl_stacktrace.lib; + absl_symbolize.lib; + absl_examine_stack.lib; + absl_failure_signal_handler.lib; + absl_debugging_internal.lib; + absl_demangle_internal.lib; + absl_decode_rust_punycode.lib; + absl_demangle_rust.lib; + absl_utf8_for_code_point.lib; + absl_leak_check.lib; + absl_flags_program_name.lib; + absl_flags_config.lib; + absl_flags_marshalling.lib; + absl_flags_commandlineflag_internal.lib; + absl_flags_commandlineflag.lib; + absl_flags_private_handle_accessor.lib; + absl_flags_reflection.lib; + absl_flags_internal.lib; + absl_flags_usage_internal.lib; + absl_flags_usage.lib; + absl_flags_parse.lib; + absl_hash.lib; + absl_city.lib; + absl_low_level_hash.lib; + absl_log_internal_check_op.lib; + absl_log_internal_conditions.lib; + absl_log_internal_format.lib; + absl_log_internal_globals.lib; + absl_log_internal_proto.lib; + absl_log_internal_message.lib; + absl_log_internal_log_sink_set.lib; + absl_log_internal_nullguard.lib; + absl_die_if_null.lib; + absl_log_flags.lib; + absl_log_globals.lib; + absl_log_initialize.lib; + absl_log_sink.lib; + absl_log_internal_structured_proto.lib; + absl_vlog_config_internal.lib; + absl_log_internal_fnmatch.lib; + absl_int128.lib; + absl_exponential_biased.lib; + absl_periodic_sampler.lib; + absl_random_distributions.lib; + absl_random_seed_gen_exception.lib; + absl_random_seed_sequences.lib; + absl_random_internal_seed_material.lib; + absl_random_internal_entropy_pool.lib; + absl_random_internal_platform.lib; + absl_random_internal_randen.lib; + absl_random_internal_randen_slow.lib; + absl_random_internal_randen_hwaes.lib; + absl_random_internal_randen_hwaes_impl.lib; + absl_random_internal_distribution_test_util.lib; + absl_status.lib; + absl_statusor.lib; + absl_string_view.lib; + absl_strings.lib; + absl_strings_internal.lib; + absl_str_format_internal.lib; + absl_cord_internal.lib; + absl_cordz_functions.lib; + absl_cordz_handle.lib; + absl_cordz_info.lib; + absl_cordz_sample_token.lib; + absl_cord.lib; + absl_graphcycles_internal.lib; + absl_kernel_timeout_internal.lib; + absl_synchronization.lib; + absl_time.lib; + absl_civil_time.lib; + absl_time_zone.lib; + libutf8_validity.lib; + libutf8_range.lib; + libprotobuf-lite.lib; $(SolutionDir)3rdparty\ffmpeg\lib\windows\x86_64 8388608 diff --git a/rpcs3.sln b/rpcs3.sln index acc5528038..4cb0830474 100644 --- a/rpcs3.sln +++ b/rpcs3.sln @@ -9,11 +9,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "emucore", "rpcs3\emucore.vc {2C902C67-985C-4BE0-94A3-E0FE2EB929A3} = {2C902C67-985C-4BE0-94A3-E0FE2EB929A3} {3C67A2FF-4710-402A-BE3E-31B0CB0576DF} = {3C67A2FF-4710-402A-BE3E-31B0CB0576DF} {5228F863-E0DD-4DE7-AA7B-5C52B14CD4D0} = {5228F863-E0DD-4DE7-AA7B-5C52B14CD4D0} + {7B3B4C5D-6E7F-8A9B-0C1D-2E3F4A5B6C7D} = {7B3B4C5D-6E7F-8A9B-0C1D-2E3F4A5B6C7D} {8846A9AA-5539-4C91-8301-F54260E1A07A} = {8846A9AA-5539-4C91-8301-F54260E1A07A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llvm_build", "3rdparty\llvm\llvm_build.vcxproj", "{8BC303AB-25BE-4276-8E57-73F171B2D672}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "protobuf_build", "3rdparty\protobuf\protobuf_build.vcxproj", "{7B3B4C5D-6E7F-8A9B-0C1D-2E3F4A5B6C7D}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GLGSRender", "rpcs3\GLGSRender.vcxproj", "{3384223A-6D97-4799-9862-359F85312892}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rpcs3.emu", "rpcs3.emu", "{10FBF193-D532-4CCF-B875-4C7091A7F6C2}" @@ -130,6 +133,10 @@ Global {C4A10229-4712-4BD2-B63E-50D93C67A038}.Release|x64.Build.0 = Release|x64 {8BC303AB-25BE-4276-8E57-73F171B2D672}.Debug|x64.ActiveCfg = Debug|x64 {8BC303AB-25BE-4276-8E57-73F171B2D672}.Release|x64.ActiveCfg = Release|x64 + {7B3B4C5D-6E7F-8A9B-0C1D-2E3F4A5B6C7D}.Debug|x64.ActiveCfg = Debug|x64 + {7B3B4C5D-6E7F-8A9B-0C1D-2E3F4A5B6C7D}.Debug|x64.Build.0 = Debug|x64 + {7B3B4C5D-6E7F-8A9B-0C1D-2E3F4A5B6C7D}.Release|x64.ActiveCfg = Release|x64 + {7B3B4C5D-6E7F-8A9B-0C1D-2E3F4A5B6C7D}.Release|x64.Build.0 = Release|x64 {3384223A-6D97-4799-9862-359F85312892}.Debug|x64.ActiveCfg = Debug|x64 {3384223A-6D97-4799-9862-359F85312892}.Debug|x64.Build.0 = Debug|x64 {3384223A-6D97-4799-9862-359F85312892}.Release|x64.ActiveCfg = Release|x64 @@ -240,6 +247,7 @@ Global {AC40FF01-426E-4838-A317-66354CEFAE88} = {6C3B64A0-8F8A-4DC4-8C0B-D71EBEED7FA8} {C4A10229-4712-4BD2-B63E-50D93C67A038} = {10FBF193-D532-4CCF-B875-4C7091A7F6C2} {8BC303AB-25BE-4276-8E57-73F171B2D672} = {B0AC29FD-7B01-4B5E-9C8D-0A081E4C5668} + {7B3B4C5D-6E7F-8A9B-0C1D-2E3F4A5B6C7D} = {6C3B64A0-8F8A-4DC4-8C0B-D71EBEED7FA8} {3384223A-6D97-4799-9862-359F85312892} = {10FBF193-D532-4CCF-B875-4C7091A7F6C2} {78CB2F39-B809-4A06-8329-8C0A19119D3D} = {10FBF193-D532-4CCF-B875-4C7091A7F6C2} {EB33566E-DA7F-4D28-9077-88C0B7C77E35} = {6C3B64A0-8F8A-4DC4-8C0B-D71EBEED7FA8} diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index a4e1ae5d64..edb98a6fa8 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -432,7 +432,7 @@ target_sources(rpcs3_emu PRIVATE # Np target_sources(rpcs3_emu PRIVATE - NP/fb_helpers.cpp + NP/pb_helpers.cpp NP/np_cache.cpp NP/np_gui_cache.cpp NP/np_contexts.cpp @@ -452,6 +452,7 @@ target_sources(rpcs3_emu PRIVATE NP/upnp_config.cpp NP/upnp_handler.cpp NP/ip_address.cpp + NP/generated/np2_structs.pb.cc ) # Memory @@ -657,7 +658,7 @@ target_link_libraries(rpcs3_emu 3rdparty::soundtouch 3rdparty::miniupnpc 3rdparty::libevdev - 3rdparty::flatbuffers + 3rdparty::protobuf 3rdparty::pugixml 3rdparty::vulkanmemoryallocator Threads::Threads diff --git a/rpcs3/Emu/NP/fb_helpers.cpp b/rpcs3/Emu/NP/fb_helpers.cpp deleted file mode 100644 index 100c3e864c..0000000000 --- a/rpcs3/Emu/NP/fb_helpers.cpp +++ /dev/null @@ -1,650 +0,0 @@ -#include "stdafx.h" -#include "Emu/Cell/lv2/sys_process.h" -#include "fb_helpers.h" - -LOG_CHANNEL(rpcn_log, "rpcn"); - -namespace np -{ - void BinAttr_to_SceNpMatching2BinAttr(event_data& edata, const BinAttr* bin_attr, SceNpMatching2BinAttr* binattr_info) - { - binattr_info->id = bin_attr->id(); - binattr_info->size = bin_attr->data()->size(); - auto* ptr = edata.allocate(binattr_info->size, binattr_info->ptr); - for (flatbuffers::uoffset_t i = 0; i < bin_attr->data()->size(); i++) - { - ptr[i] = bin_attr->data()->Get(i); - } - } - - void BinAttrs_to_SceNpMatching2BinAttrs(event_data& edata, const flatbuffers::Vector>* fb_attr, SceNpMatching2BinAttr* binattr_info) - { - for (flatbuffers::uoffset_t i = 0; i < fb_attr->size(); i++) - { - auto cur_fb_attr = fb_attr->Get(i); - auto cur_binattr = binattr_info + i; - - BinAttr_to_SceNpMatching2BinAttr(edata, cur_fb_attr, cur_binattr); - } - } - - void RoomMemberBinAttrInternal_to_SceNpMatching2RoomMemberBinAttrInternal(event_data& edata, const RoomMemberBinAttrInternal* fb_attr, SceNpMatching2RoomMemberBinAttrInternal* binattr_info) - { - binattr_info->updateDate.tick = fb_attr->updateDate(); - BinAttr_to_SceNpMatching2BinAttr(edata, fb_attr->data(), &binattr_info->data); - } - - void RoomBinAttrInternal_to_SceNpMatching2RoomBinAttrInternal(event_data& edata, const BinAttrInternal* fb_attr, SceNpMatching2RoomBinAttrInternal* binattr_info) - { - binattr_info->updateDate.tick = fb_attr->updateDate(); - binattr_info->updateMemberId = fb_attr->updateMemberId(); - BinAttr_to_SceNpMatching2BinAttr(edata, fb_attr->data(), &binattr_info->data); - } - - void RoomGroup_to_SceNpMatching2RoomGroup(const RoomGroup* fb_group, SceNpMatching2RoomGroup* sce_group) - { - sce_group->groupId = fb_group->groupId(); - sce_group->withPassword = fb_group->withPassword(); - sce_group->withLabel = fb_group->label() ? 1 : 0; - if (fb_group->label()) - { - for (flatbuffers::uoffset_t l_index = 0; l_index < fb_group->label()->size(); l_index++) - { - sce_group->label.data[l_index] = fb_group->label()->Get(l_index); - } - } - sce_group->slotNum = fb_group->slotNum(); - sce_group->curGroupMemberNum = fb_group->curGroupMemberNum(); - } - - void RoomGroups_to_SceNpMatching2RoomGroups(const flatbuffers::Vector>* fb_groups, SceNpMatching2RoomGroup* sce_groups) - { - for (flatbuffers::uoffset_t i = 0; i < fb_groups->size(); i++) - { - const auto* fb_group = fb_groups->Get(i); - SceNpMatching2RoomGroup* sce_group = &sce_groups[i]; - RoomGroup_to_SceNpMatching2RoomGroup(fb_group, sce_group); - } - } - - void UserInfo_to_SceNpUserInfo(const UserInfo* user, SceNpUserInfo* user_info) - { - if (const auto npid = user->npId(); npid) - { - std::memcpy(user_info->userId.handle.data, npid->c_str(), std::min(16, npid->size())); - } - - if (const auto online_name = user->onlineName(); online_name) - { - std::memcpy(user_info->name.data, online_name->c_str(), std::min(48, online_name->size())); - } - - if (const auto avatar_url = user->avatarUrl(); avatar_url) - { - std::memcpy(user_info->icon.data, avatar_url->c_str(), std::min(127, avatar_url->size())); - } - } - - void UserInfo_to_SceNpUserInfo2(event_data& edata, const UserInfo* user, SceNpUserInfo2* user_info, bool include_onlinename, bool include_avatarurl) - { - if (user->npId()) - std::memcpy(user_info->npId.handle.data, user->npId()->c_str(), std::min(16, user->npId()->size())); - - if (include_onlinename && user->onlineName()) - { - auto* ptr = edata.allocate(sizeof(SceNpOnlineName), user_info->onlineName); - std::memcpy(ptr->data, user->onlineName()->c_str(), std::min(48, user->onlineName()->size())); - } - if (include_avatarurl && user->avatarUrl()) - { - auto* ptr = edata.allocate(sizeof(SceNpAvatarUrl), user_info->avatarUrl); - std::memcpy(ptr->data, user->avatarUrl()->c_str(), std::min(127, user->avatarUrl()->size())); - } - } - - void RoomDataExternal_to_SceNpMatching2RoomDataExternal(event_data& edata, const RoomDataExternal* room, SceNpMatching2RoomDataExternal* room_info, bool include_onlinename, bool include_avatarurl) - { - room_info->serverId = room->serverId(); - room_info->worldId = room->worldId(); - room_info->lobbyId = room->lobbyId(); - room_info->roomId = room->roomId(); - room_info->maxSlot = room->maxSlot(); - room_info->curMemberNum = room->curMemberNum(); - room_info->passwordSlotMask = room->passwordSlotMask(); - - s32 sdk_ver; - process_get_sdk_version(process_getpid(), sdk_ver); - - // Structure changed in sdk 3.3.0 - if (sdk_ver >= 0x330000) - { - room_info->publicSlotNum = room->publicSlotNum(); - room_info->privateSlotNum = room->privateSlotNum(); - room_info->openPublicSlotNum = room->openPublicSlotNum(); - room_info->openPrivateSlotNum = room->openPrivateSlotNum(); - } - else - { - room_info->publicSlotNum = 0; - room_info->privateSlotNum = 0; - room_info->openPublicSlotNum = 0; - room_info->openPrivateSlotNum = 0; - } - - if (auto owner = room->owner()) - { - auto* ptr_owner = edata.allocate(sizeof(SceNpUserInfo2), room_info->owner); - UserInfo_to_SceNpUserInfo2(edata, owner, ptr_owner, include_onlinename, include_avatarurl); - } - - if (room->roomGroup() && room->roomGroup()->size() != 0) - { - room_info->roomGroupNum = room->roomGroup()->size(); - auto* ptr_groups = edata.allocate(sizeof(SceNpMatching2RoomGroup) * room_info->roomGroupNum, room_info->roomGroup); - RoomGroups_to_SceNpMatching2RoomGroups(room->roomGroup(), ptr_groups); - } - - room_info->flagAttr = room->flagAttr(); - - if (room->roomSearchableIntAttrExternal() && room->roomSearchableIntAttrExternal()->size() != 0) - { - room_info->roomSearchableIntAttrExternalNum = room->roomSearchableIntAttrExternal()->size(); - auto* ptr_int_attr = edata.allocate(sizeof(SceNpMatching2IntAttr) * room_info->roomSearchableIntAttrExternalNum, room_info->roomSearchableIntAttrExternal); - for (flatbuffers::uoffset_t a_index = 0; a_index < room->roomSearchableIntAttrExternal()->size(); a_index++) - { - auto fb_int_attr = room->roomSearchableIntAttrExternal()->Get(a_index); - ptr_int_attr[a_index].id = fb_int_attr->id(); - ptr_int_attr[a_index].num = fb_int_attr->num(); - } - } - - if (room->roomSearchableBinAttrExternal() && room->roomSearchableBinAttrExternal()->size() != 0) - { - room_info->roomSearchableBinAttrExternalNum = room->roomSearchableBinAttrExternal()->size(); - auto* ptr_bin_attr = edata.allocate(sizeof(SceNpMatching2BinAttr) * room_info->roomSearchableBinAttrExternalNum, room_info->roomSearchableBinAttrExternal); - BinAttrs_to_SceNpMatching2BinAttrs(edata, room->roomSearchableBinAttrExternal(), ptr_bin_attr); - } - - if (room->roomBinAttrExternal() && room->roomBinAttrExternal()->size() != 0) - { - room_info->roomBinAttrExternalNum = room->roomBinAttrExternal()->size(); - auto* ptr_bin_attr = edata.allocate(sizeof(SceNpMatching2BinAttr) * room_info->roomBinAttrExternalNum, room_info->roomBinAttrExternal); - BinAttrs_to_SceNpMatching2BinAttrs(edata, room->roomBinAttrExternal(), ptr_bin_attr); - } - } - - void SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(event_data& edata, const SearchRoomResponse* resp, SceNpMatching2SearchRoomResponse* search_resp) - { - search_resp->range.size = resp->rooms() ? resp->rooms()->size() : 0; - search_resp->range.startIndex = resp->startIndex(); - search_resp->range.total = resp->total(); - - SceNpMatching2RoomDataExternal* prev_room = nullptr; - for (flatbuffers::uoffset_t i = 0; i < search_resp->range.size; i++) - { - auto* fb_room = resp->rooms()->Get(i); - SceNpMatching2RoomDataExternal* cur_room; - cur_room = edata.allocate(sizeof(SceNpMatching2RoomDataExternal), (i > 0) ? prev_room->next : search_resp->roomDataExternal); - RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, fb_room, cur_room, true, true); - prev_room = cur_room; - } - } - - void GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(event_data& edata, const GetRoomDataExternalListResponse* resp, SceNpMatching2GetRoomDataExternalListResponse* get_resp, bool include_onlinename, bool include_avatarurl) - { - get_resp->roomDataExternalNum = resp->rooms() ? resp->rooms()->size() : 0; - - SceNpMatching2RoomDataExternal* prev_room = nullptr; - for (flatbuffers::uoffset_t i = 0; i < get_resp->roomDataExternalNum; i++) - { - auto* fb_room = resp->rooms()->Get(i); - SceNpMatching2RoomDataExternal* cur_room; - - cur_room = edata.allocate(sizeof(SceNpMatching2RoomDataExternal), (i > 0) ? prev_room->next : get_resp->roomDataExternal); - - RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, fb_room, cur_room, include_onlinename, include_avatarurl); - prev_room = cur_room; - } - } - - u16 RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const RoomDataInternal* resp, SceNpMatching2RoomDataInternal* room_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl) - { - u16 member_id = 0; - room_info->serverId = resp->serverId(); - room_info->worldId = resp->worldId(); - room_info->lobbyId = resp->lobbyId(); - room_info->roomId = resp->roomId(); - room_info->passwordSlotMask = resp->passwordSlotMask(); - room_info->maxSlot = resp->maxSlot(); - - if (resp->roomGroup() && resp->roomGroup()->size() != 0) - { - room_info->roomGroupNum = resp->roomGroup()->size(); - auto* ptr_groups = edata.allocate(sizeof(SceNpMatching2RoomGroup) * room_info->roomGroupNum, room_info->roomGroup); - RoomGroups_to_SceNpMatching2RoomGroups(resp->roomGroup(), ptr_groups); - } - - room_info->memberList.membersNum = static_cast(resp->memberList()->size()); - edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal) * room_info->memberList.membersNum, room_info->memberList.members); - - for (flatbuffers::uoffset_t i = 0; i < resp->memberList()->size(); i++) - { - auto fb_member = resp->memberList()->Get(i); - SceNpMatching2RoomMemberDataInternal* sce_member = &room_info->memberList.members[i]; - - if (i < (resp->memberList()->size() - 1)) - { - sce_member->next = room_info->memberList.members + i + 1; - edata.add_relocation(sce_member->next); - } - - RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, fb_member, room_info, sce_member, include_onlinename, include_avatarurl); - } - - for (u32 i = 0; i < room_info->memberList.membersNum; i++) - { - SceNpMatching2RoomMemberDataInternal* sce_member = &room_info->memberList.members[i]; - if (strcmp(sce_member->userInfo.npId.handle.data, npid.handle.data) == 0) - { - room_info->memberList.me = room_info->memberList.members + i; - edata.add_relocation(room_info->memberList.me); - member_id = sce_member->memberId; - break; - } - } - - for (u32 i = 0; i < room_info->memberList.membersNum; i++) - { - SceNpMatching2RoomMemberDataInternal* sce_member = &room_info->memberList.members[i]; - if (sce_member->memberId == resp->ownerId()) - { - room_info->memberList.owner = room_info->memberList.members + i; - edata.add_relocation(room_info->memberList.owner); - break; - } - } - - room_info->flagAttr = resp->flagAttr(); - - if (resp->roomBinAttrInternal() && resp->roomBinAttrInternal()->size() != 0) - { - room_info->roomBinAttrInternalNum = resp->roomBinAttrInternal()->size(); - auto* ptr_bin_attr = edata.allocate(sizeof(SceNpMatching2RoomBinAttrInternal) * room_info->roomBinAttrInternalNum, room_info->roomBinAttrInternal); - - for (u32 b_index = 0; b_index < room_info->roomBinAttrInternalNum; b_index++) - { - auto fb_bin_attr = resp->roomBinAttrInternal()->Get(b_index); - ptr_bin_attr[b_index].updateDate.tick = fb_bin_attr->updateDate(); - ptr_bin_attr[b_index].updateMemberId = fb_bin_attr->updateMemberId(); - - ptr_bin_attr[b_index].data.id = fb_bin_attr->data()->id(); - ptr_bin_attr[b_index].data.size = fb_bin_attr->data()->data()->size(); - auto* ptr_bin_attr_data = edata.allocate(ptr_bin_attr[b_index].data.size, ptr_bin_attr[b_index].data.ptr); - for (flatbuffers::uoffset_t tmp_index = 0; tmp_index < ptr_bin_attr[b_index].data.size; tmp_index++) - { - ptr_bin_attr_data[tmp_index] = fb_bin_attr->data()->data()->Get(tmp_index); - } - } - } - - return member_id; - } - - void RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(event_data& edata, const RoomMemberDataInternal* member_data, const SceNpMatching2RoomDataInternal* room_info, SceNpMatching2RoomMemberDataInternal* sce_member_data, bool include_onlinename, bool include_avatarurl) - { - UserInfo_to_SceNpUserInfo2(edata, member_data->userInfo(), &sce_member_data->userInfo, include_onlinename, include_avatarurl); - sce_member_data->joinDate.tick = member_data->joinDate(); - sce_member_data->memberId = member_data->memberId(); - sce_member_data->teamId = member_data->teamId(); - - if (const auto* fb_roomgroup = member_data->roomGroup()) - { - if (room_info) - { - // If we have SceNpMatching2RoomDataInternal available we point the pointers to the group there - sce_member_data->roomGroup = room_info->roomGroup + (fb_roomgroup->groupId() - 1); - edata.add_relocation(sce_member_data->roomGroup); - } - else - { - // Otherwise we allocate for it - auto* ptr_group = edata.allocate(sizeof(SceNpMatching2RoomGroup), sce_member_data->roomGroup); - RoomGroup_to_SceNpMatching2RoomGroup(fb_roomgroup, ptr_group); - } - } - - sce_member_data->natType = member_data->natType(); - sce_member_data->flagAttr = member_data->flagAttr(); - - if (member_data->roomMemberBinAttrInternal() && member_data->roomMemberBinAttrInternal()->size() != 0) - { - sce_member_data->roomMemberBinAttrInternalNum = member_data->roomMemberBinAttrInternal()->size(); - auto* sce_binattrs = edata.allocate(sizeof(SceNpMatching2RoomMemberBinAttrInternal) * sce_member_data->roomMemberBinAttrInternalNum, sce_member_data->roomMemberBinAttrInternal); - for (u32 b_index = 0; b_index < sce_member_data->roomMemberBinAttrInternalNum; b_index++) - { - const auto fb_battr = member_data->roomMemberBinAttrInternal()->Get(b_index); - sce_binattrs[b_index].updateDate.tick = fb_battr->updateDate(); - - sce_binattrs[b_index].data.id = fb_battr->data()->id(); - sce_binattrs[b_index].data.size = fb_battr->data()->data()->size(); - auto* sce_binattr_data = edata.allocate(sce_binattrs[b_index].data.size, sce_binattrs[b_index].data.ptr); - for (flatbuffers::uoffset_t tmp_index = 0; tmp_index < sce_binattrs[b_index].data.size; tmp_index++) - { - sce_binattr_data[tmp_index] = fb_battr->data()->data()->Get(tmp_index); - } - } - } - } - - void RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(event_data& edata, const RoomMemberUpdateInfo* update_info, SceNpMatching2RoomMemberUpdateInfo* sce_update_info, bool include_onlinename, bool include_avatarurl) - { - sce_update_info->eventCause = 0; - if (update_info->optData()) - { - sce_update_info->optData.length = update_info->optData()->data()->size(); - for (flatbuffers::uoffset_t i = 0; i < 16; i++) - { - sce_update_info->optData.data[i] = update_info->optData()->data()->Get(i); - } - } - - if (update_info->roomMemberDataInternal()) - { - auto fb_member = update_info->roomMemberDataInternal(); - auto* ptr_roomemberinternal = edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal), sce_update_info->roomMemberDataInternal); - - // TODO: Pass room_info - RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, fb_member, nullptr, ptr_roomemberinternal, include_onlinename, include_avatarurl); - } - } - - void RoomUpdateInfo_to_SceNpMatching2RoomUpdateInfo(const RoomUpdateInfo* update_info, SceNpMatching2RoomUpdateInfo* sce_update_info) - { - sce_update_info->errorCode = 0; - sce_update_info->eventCause = 0; - if (update_info->optData()) - { - sce_update_info->optData.length = update_info->optData()->data()->size(); - for (flatbuffers::uoffset_t i = 0; i < 16; i++) - { - sce_update_info->optData.data[i] = update_info->optData()->data()->Get(i); - } - } - } - - void RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(event_data& edata, const RoomDataInternalUpdateInfo* update_info, SceNpMatching2RoomDataInternalUpdateInfo* sce_update_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl) - { - auto* sce_room_data = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), sce_update_info->newRoomDataInternal); - RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, update_info->newRoomDataInternal(), sce_room_data, npid, include_onlinename, include_avatarurl); - - if (sce_room_data->flagAttr != update_info->prevFlagAttr()) - { - sce_update_info->newFlagAttr = sce_update_info->newRoomDataInternal.ptr(&SceNpMatching2RoomDataInternal::flagAttr); - edata.add_relocation(sce_update_info->newFlagAttr); - auto* ptr_sce_prevflag = edata.allocate(sizeof(SceNpMatching2FlagAttr), sce_update_info->prevFlagAttr); - *ptr_sce_prevflag = update_info->prevFlagAttr(); - } - - if (sce_room_data->passwordSlotMask != update_info->prevRoomPasswordSlotMask()) - { - sce_update_info->newRoomPasswordSlotMask = sce_update_info->newRoomDataInternal.ptr(&SceNpMatching2RoomDataInternal::passwordSlotMask); - edata.add_relocation(sce_update_info->newRoomPasswordSlotMask); - auto* ptr_sce_prevpass = edata.allocate(sizeof(SceNpMatching2RoomPasswordSlotMask), sce_update_info->prevRoomPasswordSlotMask); - *ptr_sce_prevpass = update_info->prevRoomPasswordSlotMask(); - } - - if (update_info->newRoomGroup() && update_info->newRoomGroup()->size() != 0) - { - rpcn_log.todo("RoomDataInternalUpdateInfo::newRoomGroup"); - // TODO - // sce_update_info->newRoomGroupNum = update_info->newRoomGroup()->size(); - // vm::ptr group_info(allocate(sizeof(SceNpMatching2RoomGroup) * sce_update_info->newRoomGroupNum)); - // RoomGroups_to_SceNpMatching2RoomGroup(update_info->newRoomGroup(), group_info); - // sce_update_info->newRoomGroup = group_info; - } - - if (update_info->newRoomBinAttrInternal() && update_info->newRoomBinAttrInternal()->size() != 0) - { - const auto get_ptr_for_binattr = [&](u16 binattr_id) -> vm::bptr - { - vm::bptr ret_ptr = sce_room_data->roomBinAttrInternal; - for (u32 i = 0; i < sce_room_data->roomBinAttrInternalNum; i++) - { - if (ret_ptr->data.id == binattr_id) - return ret_ptr; - - ret_ptr++; - } - rpcn_log.fatal("RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo: Couldn't find matching roomBinAttrInternal!"); - return vm::null; - }; - - sce_update_info->newRoomBinAttrInternalNum = update_info->newRoomBinAttrInternal()->size(); - edata.allocate_ptr_array(sce_update_info->newRoomBinAttrInternalNum, sce_update_info->newRoomBinAttrInternal); - for (u32 i = 0; i < sce_update_info->newRoomBinAttrInternalNum; i++) - { - sce_update_info->newRoomBinAttrInternal[i] = get_ptr_for_binattr(update_info->newRoomBinAttrInternal()->Get(i)); - } - } - } - - void RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(event_data& edata, const RoomMemberDataInternalUpdateInfo* update_info, SceNpMatching2RoomMemberDataInternalUpdateInfo* sce_update_info, bool include_onlinename, bool include_avatarurl) - { - auto* sce_room_member_data = edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal), sce_update_info->newRoomMemberDataInternal); - RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, update_info->newRoomMemberDataInternal(), nullptr, sce_room_member_data, include_onlinename, include_avatarurl); - - if (sce_update_info->newRoomMemberDataInternal->flagAttr != update_info->prevFlagAttr()) - { - sce_update_info->newFlagAttr = sce_update_info->newRoomMemberDataInternal.ptr(&SceNpMatching2RoomMemberDataInternal::flagAttr); - edata.add_relocation(sce_update_info->newFlagAttr); - auto* ptr_sce_prevflag = edata.allocate(sizeof(SceNpMatching2FlagAttr), sce_update_info->prevFlagAttr); - *ptr_sce_prevflag = update_info->prevFlagAttr(); - } - - if (sce_update_info->newRoomMemberDataInternal->teamId != update_info->prevTeamId()) - { - sce_update_info->newTeamId = sce_update_info->newRoomMemberDataInternal.ptr(&SceNpMatching2RoomMemberDataInternal::teamId); - edata.add_relocation(sce_update_info->newTeamId); - } - - if (update_info->newRoomMemberBinAttrInternal() && update_info->newRoomMemberBinAttrInternal()->size() != 0) - { - const auto get_ptr_for_binattr = [&](u16 binattr_id) -> vm::bptr - { - vm::bptr ret_ptr = sce_room_member_data->roomMemberBinAttrInternal; - for (u32 i = 0; i < sce_room_member_data->roomMemberBinAttrInternalNum; i++) - { - if (ret_ptr->data.id == binattr_id) - return ret_ptr; - - ret_ptr++; - } - rpcn_log.fatal("RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo: Couldn't find matching roomMemberBinAttrInternal!"); - return vm::null; - }; - - sce_update_info->newRoomMemberBinAttrInternalNum = update_info->newRoomMemberBinAttrInternal()->size(); - edata.allocate_ptr_array(sce_update_info->newRoomMemberBinAttrInternalNum, sce_update_info->newRoomMemberBinAttrInternal); - for (u32 i = 0; i < sce_update_info->newRoomMemberBinAttrInternalNum; i++) - { - sce_update_info->newRoomMemberBinAttrInternal[i] = get_ptr_for_binattr(update_info->newRoomMemberBinAttrInternal()->Get(i)); - } - } - } - - void GetPingInfoResponse_to_SceNpMatching2SignalingGetPingInfoResponse(const GetPingInfoResponse* resp, SceNpMatching2SignalingGetPingInfoResponse* sce_resp) - { - sce_resp->serverId = resp->serverId(); - sce_resp->worldId = resp->worldId(); - sce_resp->roomId = resp->roomId(); - sce_resp->rtt = resp->rtt(); - } - - void RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(event_data& edata, const RoomMessageInfo* mi, SceNpMatching2RoomMessageInfo* sce_mi, bool include_onlinename, bool include_avatarurl) - { - sce_mi->filtered = mi->filtered(); - sce_mi->castType = mi->castType(); - - if (sce_mi->castType != SCE_NP_MATCHING2_CASTTYPE_BROADCAST) - { - edata.allocate(sizeof(SceNpMatching2RoomMessageDestination), sce_mi->dst); - } - - switch (sce_mi->castType) - { - case SCE_NP_MATCHING2_CASTTYPE_BROADCAST: break; - case SCE_NP_MATCHING2_CASTTYPE_UNICAST: sce_mi->dst->unicastTarget = mi->dst()->Get(0); break; - case SCE_NP_MATCHING2_CASTTYPE_MULTICAST: - { - sce_mi->dst->multicastTarget.memberIdNum = mi->dst()->size(); - edata.allocate(sizeof(u16) * mi->dst()->size(), sce_mi->dst->multicastTarget.memberId); - for (u32 i = 0; i < mi->dst()->size(); i++) - { - sce_mi->dst->multicastTarget.memberId[i] = mi->dst()->Get(i); - } - break; - } - case SCE_NP_MATCHING2_CASTTYPE_MULTICAST_TEAM: sce_mi->dst->multicastTargetTeamId = ::narrow(mi->dst()->Get(0)); break; - default: ensure(false); - } - - if (auto src_member = mi->srcMember()) - { - auto* ptr_sce_userinfo = edata.allocate(sizeof(SceNpUserInfo2), sce_mi->srcMember); - UserInfo_to_SceNpUserInfo2(edata, src_member, ptr_sce_userinfo, include_onlinename, include_avatarurl); - } - - if (auto msg = mi->msg()) - { - sce_mi->msgLen = msg->size(); - auto* ptr_msg_data = static_cast(edata.allocate(msg->size(), sce_mi->msg)); - for (u32 i = 0; i < msg->size(); i++) - { - ptr_msg_data[i] = msg->Get(i); - } - } - } - - void MatchingRoomStatus_to_SceNpMatchingRoomStatus(event_data& edata, const MatchingRoomStatus* resp, SceNpMatchingRoomStatus* room_status) - { - const auto* vec_id = resp->id(); - ensure(vec_id && vec_id->size() == 28, "Invalid room id in MatchingRoomStatus"); - - for (flatbuffers::uoffset_t i = 0; i < 28; i++) - { - room_status->id.opt[i] = vec_id->Get(i); - } - - // In some events the member list can be empty - if (const auto* members = resp->members(); members && members->size()) - { - room_status->num = members->size(); - SceNpMatchingRoomMember* prev_member{}; - - for (flatbuffers::uoffset_t i = 0; i < members->size(); i++) - { - auto* cur_member = edata.allocate(sizeof(SceNpMatchingRoomMember), (i > 0) ? prev_member->next : room_status->members); - const auto* member = members->Get(i); - ensure(member && member->info(), "Invalid member in MatchingRoomStatus list"); - - cur_member->owner = member->owner() ? 1 : 0; - UserInfo_to_SceNpUserInfo(member->info(), &cur_member->user_info); - - prev_member = cur_member; - } - } - - if (const auto* kick_npid = resp->kick_actor(); kick_npid) - { - auto* npid = edata.allocate(sizeof(SceNpId), room_status->kick_actor); - std::memcpy(npid->handle.data, kick_npid->c_str(), std::min(16, kick_npid->size())); - } - - if (const auto* opt = resp->opt(); opt && opt->size()) - { - room_status->opt_len = opt->size(); - u8* opt_data = static_cast(edata.allocate(opt->size(), room_status->opt)); - - for (flatbuffers::uoffset_t i = 0; i < opt->size(); i++) - { - opt_data[i] = opt->Get(i); - } - } - } - - void MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(event_data& edata, const MatchingRoomStatus* resp, SceNpMatchingJoinedRoomInfo* room_info) - { - // The use of SceNpLobbyId is unclear as it is never specified by the client except in further operations, so we always set it to a series of 0 and a 1 - room_info->lobbyid.opt[27] = 1; - MatchingRoomStatus_to_SceNpMatchingRoomStatus(edata, resp, &room_info->room_status); - } - - void MatchingAttr_to_SceNpMatchingAttr(event_data& edata, const flatbuffers::Vector>* attr_list, vm::bptr& first_attr) - { - if (attr_list) - { - SceNpMatchingAttr* cur_attr = nullptr; - - for (flatbuffers::uoffset_t i_attr = 0; i_attr < attr_list->size(); i_attr++) - { - const auto* attr = attr_list->Get(i_attr); - cur_attr = edata.allocate(sizeof(SceNpMatchingAttr), cur_attr ? cur_attr->next : first_attr); - - ensure(attr); - cur_attr->type = attr->attr_type(); - cur_attr->id = attr->attr_id(); - if (attr->data()) - { - if (attr->data()->size()) - { - cur_attr->value.data.size = attr->data()->size(); - u8* data_ptr = static_cast(edata.allocate(attr->data()->size(), cur_attr->value.data.ptr)); - memcpy(data_ptr, attr->data()->data(), attr->data()->size()); - } - } - else - { - cur_attr->value.num = attr->num(); - } - } - } - } - - void MatchingRoom_to_SceNpMatchingRoom(event_data& edata, const MatchingRoom* resp, SceNpMatchingRoom* room) - { - ensure(room && resp->id() && resp->id()->size() == sizeof(SceNpRoomId::opt)); - memcpy(room->id.opt, resp->id()->data(), sizeof(SceNpRoomId::opt)); - MatchingAttr_to_SceNpMatchingAttr(edata, resp->attr(), room->attr); - } - - void MatchingRoomList_to_SceNpMatchingRoomList(event_data& edata, const MatchingRoomList* resp, SceNpMatchingRoomList* room_list) - { - // The use of SceNpLobbyId is unclear as it is never specified by the client except in further operations, so we always set it to a series of 0 and a 1 - room_list->lobbyid.opt[27] = 1; - room_list->range.start = resp->start(); - room_list->range.total = resp->total(); - - if (auto rooms = resp->rooms(); rooms) - { - room_list->range.results = rooms->size(); - - SceNpMatchingRoom* cur_room = nullptr; - - for (flatbuffers::uoffset_t i = 0; i < rooms->size(); i++) - { - const auto* room = rooms->Get(i); - cur_room = edata.allocate(sizeof(SceNpMatchingRoom), cur_room ? cur_room->next : room_list->head); - MatchingRoom_to_SceNpMatchingRoom(edata, room, cur_room); - } - } - } - - void MatchingSearchJoinRoomInfo_to_SceNpMatchingSearchJoinRoomInfo(event_data& edata, const MatchingSearchJoinRoomInfo* resp, SceNpMatchingSearchJoinRoomInfo* room_info) - { - ensure(resp->room()); - room_info->lobbyid.opt[27] = 1; - MatchingRoomStatus_to_SceNpMatchingRoomStatus(edata, resp->room(), &room_info->room_status); - MatchingAttr_to_SceNpMatchingAttr(edata, resp->attr(), room_info->attr); - } - -} // namespace np diff --git a/rpcs3/Emu/NP/fb_helpers.h b/rpcs3/Emu/NP/fb_helpers.h deleted file mode 100644 index 6b92cfba37..0000000000 --- a/rpcs3/Emu/NP/fb_helpers.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "Emu/Cell/Modules/sceNp.h" -#include "Emu/Cell/Modules/sceNp2.h" -#include "np_event_data.h" -#include "generated/np2_structs_generated.h" - -namespace np -{ - void BinAttr_to_SceNpMatching2BinAttr(event_data& edata, const BinAttr* bin_attr, SceNpMatching2BinAttr* binattr_info); - void BinAttrs_to_SceNpMatching2BinAttrs(event_data& edata, const flatbuffers::Vector>* fb_attr, SceNpMatching2BinAttr* binattr_info); - void RoomMemberBinAttrInternal_to_SceNpMatching2RoomMemberBinAttrInternal(event_data& edata, const RoomMemberBinAttrInternal* fb_attr, SceNpMatching2RoomMemberBinAttrInternal* binattr_info); - void RoomBinAttrInternal_to_SceNpMatching2RoomBinAttrInternal(event_data& edata, const BinAttrInternal* fb_attr, SceNpMatching2RoomBinAttrInternal* binattr_info); - void RoomGroup_to_SceNpMatching2RoomGroup(const RoomGroup* fb_group, SceNpMatching2RoomGroup* sce_group); - void RoomGroups_to_SceNpMatching2RoomGroups(const flatbuffers::Vector>* fb_groups, SceNpMatching2RoomGroup* sce_groups); - void UserInfo_to_SceNpUserInfo(const UserInfo* user, SceNpUserInfo* user_info); - void UserInfo_to_SceNpUserInfo2(event_data& edata, const UserInfo* user, SceNpUserInfo2* user_info, bool include_onlinename, bool include_avatarurl); - void RoomDataExternal_to_SceNpMatching2RoomDataExternal(event_data& edata, const RoomDataExternal* room, SceNpMatching2RoomDataExternal* room_info, bool include_onlinename, bool include_avatarurl); - void SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(event_data& edata, const SearchRoomResponse* resp, SceNpMatching2SearchRoomResponse* search_resp); - void GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(event_data& edata, const GetRoomDataExternalListResponse* resp, SceNpMatching2GetRoomDataExternalListResponse* get_resp, bool include_onlinename, bool include_avatarurl); - u16 RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const RoomDataInternal* resp, SceNpMatching2RoomDataInternal* room_resp, const SceNpId& npid, bool include_onlinename, bool include_avatarurl); - void RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(event_data& edata, const RoomMemberDataInternal* member_data, const SceNpMatching2RoomDataInternal* room_info, SceNpMatching2RoomMemberDataInternal* sce_member_data, bool include_onlinename, bool include_avatarurl); - void RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(event_data& edata, const RoomMemberUpdateInfo* resp, SceNpMatching2RoomMemberUpdateInfo* room_info, bool include_onlinename, bool include_avatarurl); - void RoomUpdateInfo_to_SceNpMatching2RoomUpdateInfo(const RoomUpdateInfo* update_info, SceNpMatching2RoomUpdateInfo* sce_update_info); - void GetPingInfoResponse_to_SceNpMatching2SignalingGetPingInfoResponse(const GetPingInfoResponse* resp, SceNpMatching2SignalingGetPingInfoResponse* sce_resp); - void RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(event_data& edata, const RoomMessageInfo* mi, SceNpMatching2RoomMessageInfo* sce_mi, bool include_onlinename, bool include_avatarurl); - void RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(event_data& edata, const RoomDataInternalUpdateInfo* update_info, SceNpMatching2RoomDataInternalUpdateInfo* sce_update_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl); - void RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(event_data& edata, const RoomMemberDataInternalUpdateInfo* update_info, SceNpMatching2RoomMemberDataInternalUpdateInfo* sce_update_info, bool include_onlinename, bool include_avatarurl); - void MatchingRoomStatus_to_SceNpMatchingRoomStatus(event_data& edata, const MatchingRoomStatus* resp, SceNpMatchingRoomStatus* room_status); - void MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(event_data& edata, const MatchingRoomStatus* resp, SceNpMatchingJoinedRoomInfo* room_info); - void MatchingRoom_to_SceNpMatchingRoom(event_data& edata, const MatchingRoom* resp, SceNpMatchingRoom* room); - void MatchingRoomList_to_SceNpMatchingRoomList(event_data& edata, const MatchingRoomList* resp, SceNpMatchingRoomList* room_list); - void MatchingSearchJoinRoomInfo_to_SceNpMatchingSearchJoinRoomInfo(event_data& edata, const MatchingSearchJoinRoomInfo* resp, SceNpMatchingSearchJoinRoomInfo* room_info); -} // namespace np diff --git a/rpcs3/Emu/NP/generated/np2_structs.fbs b/rpcs3/Emu/NP/generated/np2_structs.fbs deleted file mode 100644 index 9ca6e4a437..0000000000 --- a/rpcs3/Emu/NP/generated/np2_structs.fbs +++ /dev/null @@ -1,584 +0,0 @@ -table SignalingAddr { - ip:[uint8]; - port:uint16; -} - -table MatchingSignalingInfo { - npid:string; - addr:SignalingAddr; -} - -table Matching2SignalingInfo { - member_id:uint16; - addr:SignalingAddr; -} - -table BinAttr { - id:uint16; - data:[uint8]; -} - -table IntAttr { - id:uint16; - num:uint32; -} - -table RoomMemberBinAttrInternal { - updateDate:uint64; - data:BinAttr; -} - -table BinAttrInternal { - updateDate:uint64; - updateMemberId:uint16; - data:BinAttr; -} - -table OptParam { - type:uint8; - flag:uint8; - hubMemberId:uint16 ; -} - -table GroupConfig { - slotNum:uint32; - label:[uint8]; - withPassword:bool; -} - -table UserInfo { - npId:string; - onlineName:string; - avatarUrl:string; -} - -table RoomMemberDataInternal { - userInfo:UserInfo; - joinDate:uint64; - memberId:uint16; - teamId:uint8; - roomGroup:RoomGroup; - natType:uint8; - flagAttr:uint32; - roomMemberBinAttrInternal:[RoomMemberBinAttrInternal]; -} - -table RoomGroup { - groupId:uint8; - withPassword:bool; - label:[uint8]; - slotNum:uint32; - curGroupMemberNum:uint32; -} - -table RoomDataInternal { - serverId:uint16; - worldId:uint32; - lobbyId:uint64; - roomId:uint64; - passwordSlotMask:uint64; - maxSlot:uint32; - memberList:[RoomMemberDataInternal]; - ownerId:uint16; - roomGroup:[RoomGroup]; - flagAttr:uint32; - roomBinAttrInternal:[BinAttrInternal]; -} - -table RoomDataExternal { - serverId:uint16; - worldId:uint32; - publicSlotNum:uint16; - privateSlotNum:uint16; - lobbyId:uint64; - roomId:uint64; - openPublicSlotNum:uint16; - maxSlot:uint16; - openPrivateSlotNum:uint16; - curMemberNum:uint16; - passwordSlotMask:uint64; - owner:UserInfo; - roomGroup:[RoomGroup]; - flagAttr:uint32; - roomSearchableIntAttrExternal:[IntAttr]; - roomSearchableBinAttrExternal:[BinAttr]; - roomBinAttrExternal:[BinAttr]; -} - -table IntSearchFilter { - searchOperator:uint8; - attr:IntAttr; -} - -table BinSearchFilter { - searchOperator:uint8; - attr:BinAttr; -} - -table PresenceOptionData { - data:[uint8]; - len:uint32; -} - -table RoomGroupPasswordConfig { - groupId:uint8; - withPassword:bool; -} - -table SearchRoomRequest { - option:int32; - worldId:uint32; - lobbyId:uint64; - rangeFilter_startIndex:uint32; - rangeFilter_max:uint32; - flagFilter:uint32; - flagAttr:uint32; - intFilter:[IntSearchFilter]; - binFilter:[BinSearchFilter]; - attrId:[uint16]; -} - -table SearchRoomResponse { - startIndex:uint32; - total:uint32; - rooms:[RoomDataExternal]; -} - -table CreateJoinRoomRequest { - worldId:uint32; - lobbyId:uint64; - maxSlot:uint32; - flagAttr:uint32; - roomBinAttrInternal:[BinAttr]; - roomSearchableIntAttrExternal:[IntAttr]; - roomSearchableBinAttrExternal:[BinAttr]; - roomBinAttrExternal:[BinAttr]; - roomPassword:[uint8]; - groupConfig:[GroupConfig]; - passwordSlotMask:uint64; - allowedUser:[string]; - blockedUser:[string]; - - joinRoomGroupLabel:[uint8]; - roomMemberBinAttrInternal:[BinAttr]; - teamId:uint8; - sigOptParam:OptParam; -} - -table JoinRoomRequest { - roomId:uint64; - roomPassword:[uint8]; - joinRoomGroupLabel:[uint8]; - roomMemberBinAttrInternal:[BinAttr]; - optData:PresenceOptionData; - teamId:uint8; -} - -table JoinRoomResponse { - room_data: RoomDataInternal; - signaling_data: [Matching2SignalingInfo]; -} - -table LeaveRoomRequest { - roomId:uint64; - optData:PresenceOptionData; -} - -table GetRoomDataExternalListRequest { - roomIds:[uint64]; - attrIds:[uint16]; -} - -table GetRoomDataExternalListResponse { - rooms:[RoomDataExternal]; -} - -table SetRoomDataExternalRequest { - roomId:uint64; - roomSearchableIntAttrExternal:[IntAttr]; - roomSearchableBinAttrExternal:[BinAttr]; - roomBinAttrExternal:[BinAttr]; -} - -table SetRoomDataInternalRequest { - roomId:uint64; - flagFilter:uint32; - flagAttr:uint32; - roomBinAttrInternal:[BinAttr]; - passwordConfig:[RoomGroupPasswordConfig]; - passwordSlotMask:[uint64]; - ownerPrivilegeRank:[uint16]; -} - -table GetRoomMemberDataInternalRequest { - roomId:uint64; - memberId:uint16; - attrId:[uint16]; -} - -table SetRoomMemberDataInternalRequest { - roomId:uint64; - memberId:uint16; - teamId:uint8; - roomMemberBinAttrInternal:[BinAttr]; -} - -table SetUserInfo { - serverId:uint16; - userBinAttr:[BinAttr]; -} - -table GetRoomDataInternalRequest { - roomId:uint64; - attrId:[uint16]; -} - -table RoomMemberUpdateInfo { - roomMemberDataInternal:RoomMemberDataInternal; - eventCause:uint8; - optData:PresenceOptionData; -} - -table NotificationUserJoinedRoom { - room_id:uint64; - update_info:RoomMemberUpdateInfo; - signaling:SignalingAddr; -} - -table RoomUpdateInfo { - eventCause:uint8; - errorCode:int32; - optData:PresenceOptionData; -} - -table RoomDataInternalUpdateInfo { - newRoomDataInternal:RoomDataInternal; - prevFlagAttr:uint32; - prevRoomPasswordSlotMask:uint64; - newRoomGroup:[uint8]; - newRoomBinAttrInternal:[uint16]; -} - -table RoomMemberDataInternalUpdateInfo { - newRoomMemberDataInternal:RoomMemberDataInternal; - prevFlagAttr:uint32; - prevTeamId:uint8; - newRoomMemberBinAttrInternal:[uint16]; -} - -table GetPingInfoResponse { - serverId:uint16; - worldId:uint32; - roomId:uint64; - rtt:uint32; -} - -table SendRoomMessageRequest { - roomId:uint64; - castType:uint8; - dst:[uint16]; - msg:[uint8]; - option:uint8; -} - -table RoomMessageInfo { - filtered:bool; - castType:uint8; - dst:[uint16]; - srcMember:UserInfo; - msg:[uint8]; -} - -table MessageDetails { - communicationId:string; - msgId:uint64; - mainType:uint16; - subType:uint16; - msgFeatures:uint32; - subject:string; - body:string; - data:[uint8]; -} - -table SendMessageRequest { - message:[uint8] (nested_flatbuffer: "MessageDetails"); - npids:[string]; -} - -table BoardInfo { - rankLimit:uint32; - updateMode:uint32; - sortMode:uint32; - uploadNumLimit:uint32; - uploadSizeLimit:uint32; -} - -table RecordScoreRequest { - boardId:uint32; - pcId:int32; - score:int64; - comment:string; - data:[uint8]; -} - -table GetScoreRangeRequest { - boardId:uint32; - startRank:uint32; - numRanks:uint32; - withComment:bool; - withGameInfo:bool; -} - -table ScoreNpIdPcId { - npid:string; - pcId:int32; -} - -table GetScoreNpIdRequest { - boardId:uint32; - npids:[ScoreNpIdPcId]; - withComment:bool; - withGameInfo:bool; -} - -table GetScoreFriendsRequest { - boardId:uint32; - include_self:bool; - max:uint32; - withComment:bool; - withGameInfo:bool; -} - -table ScoreRankData { - npId:string; - onlineName:string; - pcId:int32; - rank:uint32; - score:int64; - hasGameData:bool; - recordDate:uint64; -} - -table ScoreInfo { - data:[uint8]; -} - -table GetScoreResponse { - rankArray:[ScoreRankData]; - commentArray:[string]; - infoArray:[ScoreInfo]; - lastSortDate:uint64; - totalRecord:uint32; -} - -table RecordScoreGameDataRequest { - boardId:uint32; - pcId:int32; - score:int64; -} - -table GetScoreGameDataRequest { - boardId:uint32; - npId:string; - pcId:int32; -} - -table TusUser { - vuser:bool; - npid:string; -} - -table TusVariable { - ownerId:string; - hasData:bool; - lastChangedDate:uint64; - lastChangedAuthorId:string; - variable:int64; - oldVariable:int64; -} - -table TusVarResponse { - vars:[TusVariable]; -} - -table TusSetMultiSlotVariableRequest { - user:TusUser; - slotIdArray:[int32]; - variableArray:[int64]; -} - -table TusGetMultiSlotVariableRequest { - user:TusUser; - slotIdArray:[int32]; -} - -table TusGetMultiUserVariableRequest { - users:[TusUser]; - slotId:int32; -} - -table TusGetFriendsVariableRequest { - slotId:int32; - includeSelf:bool; - sortType:int32; - arrayNum:uint32; -} - -table TusAddAndGetVariableRequest { - user:TusUser; - slotId:int32; - inVariable:int64; - isLastChangedDate:[uint64]; - isLastChangedAuthorId:string; -} - -table TusTryAndSetVariableRequest { - user:TusUser; - slotId:int32; - opeType:int32; - variable:int64; - isLastChangedDate:[uint64]; - isLastChangedAuthorId:string; - compareValue:[int64]; -} - -table TusDeleteMultiSlotVariableRequest { - user:TusUser; - slotIdArray:[int32]; -} - -table TusSetDataRequest { - user:TusUser; - slotId:int32; - data:[uint8]; - info:[uint8]; - isLastChangedDate:[uint64]; - isLastChangedAuthorId:string; -} - -table TusDataStatus { - ownerId:string; - hasData:bool; - lastChangedDate:uint64; - lastChangedAuthorId:string; - info:[uint8]; -} - -table TusData { - status: TusDataStatus; - data:[uint8]; -} - -table TusDataStatusResponse { - status: [TusDataStatus]; -} - -table TusGetDataRequest { - user:TusUser; - slotId:int32; -} - -table TusGetMultiSlotDataStatusRequest { - user:TusUser; - slotIdArray:[int32]; -} - -table TusGetMultiUserDataStatusRequest { - users:[TusUser]; - slotId:int32; -} - -table TusGetFriendsDataStatusRequest { - slotId:int32; - includeSelf:bool; - sortType:int32; - arrayNum:uint32; -} - -table TusDeleteMultiSlotDataRequest { - user:TusUser; - slotIdArray:[int32]; -} - -table SetPresenceRequest { - title:string; - status:string; - comment:string; - data:[uint8]; -} - -table MatchingSearchCondition { - attr_type:uint32; - attr_id:uint32; - comp_op:uint32; - comp_value:uint32; -} - -table MatchingAttr { - attr_type:uint32; - attr_id:uint32; - num:uint32; - data:[uint8]; -} - -table CreateRoomGUIRequest { - total_slots:uint32; - private_slots:uint32; - privilege_grant:bool; - stealth:bool; - game_attrs:[MatchingAttr]; -} - -table GUIUserInfo { - info:UserInfo; - owner:bool; -} - -table MatchingRoomStatus { - id:[uint8]; - members:[GUIUserInfo]; - kick_actor:string; - opt:[uint8]; -} - -table GetRoomListGUIRequest { - range_start:uint32; - range_max:uint32; - conds:[MatchingSearchCondition]; - attrs:[MatchingAttr]; -} - -table MatchingRoom { - id:[uint8]; - attr:[MatchingAttr]; -} - -table MatchingRoomList { - start:uint32; - total:uint32; - rooms:[MatchingRoom]; -} - -table MatchingGuiRoomId { - id:[uint8]; -} - -table SetRoomSearchFlagGUI { - roomid:[uint8]; - stealth:bool; -} - -table QuickMatchGUIRequest { - conds:[MatchingSearchCondition]; - available_num:uint32; -} - -table SearchJoinRoomGUIRequest { - conds:[MatchingSearchCondition]; - attrs:[MatchingAttr]; -} - -table MatchingSearchJoinRoomInfo { - room:MatchingRoomStatus; - attr:[MatchingAttr]; -} diff --git a/rpcs3/Emu/NP/generated/np2_structs.pb.cc b/rpcs3/Emu/NP/generated/np2_structs.pb.cc new file mode 100644 index 0000000000..756b12b0dc --- /dev/null +++ b/rpcs3/Emu/NP/generated/np2_structs.pb.cc @@ -0,0 +1,35690 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// NO CHECKED-IN PROTOBUF GENCODE +// source: np2_structs.proto +// Protobuf C++ Version: 6.33.4 + +#include "np2_structs.pb.h" + +#include +#include +#include "google/protobuf/io/coded_stream.h" +#include "google/protobuf/generated_message_tctable_impl.h" +#include "google/protobuf/extension_set.h" +#include "google/protobuf/generated_message_util.h" +#include "google/protobuf/wire_format_lite.h" +#include "google/protobuf/io/zero_copy_stream_impl_lite.h" +// @@protoc_insertion_point(includes) + +// Must be included last. +#include "google/protobuf/port_def.inc" +PROTOBUF_PRAGMA_INIT_SEG +namespace _pb = ::google::protobuf; +namespace _pbi = ::google::protobuf::internal; +namespace _fl = ::google::protobuf::internal::field_layout; +namespace np2_structs { + +inline constexpr uint8::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + value_{0u} {} + +template +PROTOBUF_CONSTEXPR uint8::uint8(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(uint8_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct uint8DefaultTypeInternal { + PROTOBUF_CONSTEXPR uint8DefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~uint8DefaultTypeInternal() {} + union { + uint8 _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 uint8DefaultTypeInternal _uint8_default_instance_; + +inline constexpr uint16::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + value_{0u} {} + +template +PROTOBUF_CONSTEXPR uint16::uint16(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(uint16_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct uint16DefaultTypeInternal { + PROTOBUF_CONSTEXPR uint16DefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~uint16DefaultTypeInternal() {} + union { + uint16 _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 uint16DefaultTypeInternal _uint16_default_instance_; + +inline constexpr UserInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + npid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + onlinename_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + avatarurl_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()) {} + +template +PROTOBUF_CONSTEXPR UserInfo::UserInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(UserInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct UserInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR UserInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~UserInfoDefaultTypeInternal() {} + union { + UserInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UserInfoDefaultTypeInternal _UserInfo_default_instance_; + +inline constexpr TusVariable::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + ownerid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + lastchangedauthorid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + lastchangeddate_{::uint64_t{0u}}, + variable_{::int64_t{0}}, + oldvariable_{::int64_t{0}}, + hasdata_{false} {} + +template +PROTOBUF_CONSTEXPR TusVariable::TusVariable(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusVariable_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusVariableDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusVariableDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusVariableDefaultTypeInternal() {} + union { + TusVariable _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusVariableDefaultTypeInternal _TusVariable_default_instance_; + +inline constexpr TusUser::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + npid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + vuser_{false} {} + +template +PROTOBUF_CONSTEXPR TusUser::TusUser(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusUser_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusUserDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusUserDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusUserDefaultTypeInternal() {} + union { + TusUser _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusUserDefaultTypeInternal _TusUser_default_instance_; + +inline constexpr TusGetFriendsVariableRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + slotid_{0}, + includeself_{false}, + sorttype_{0}, + arraynum_{0u} {} + +template +PROTOBUF_CONSTEXPR TusGetFriendsVariableRequest::TusGetFriendsVariableRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusGetFriendsVariableRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusGetFriendsVariableRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusGetFriendsVariableRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusGetFriendsVariableRequestDefaultTypeInternal() {} + union { + TusGetFriendsVariableRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusGetFriendsVariableRequestDefaultTypeInternal _TusGetFriendsVariableRequest_default_instance_; + +inline constexpr TusGetFriendsDataStatusRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + slotid_{0}, + includeself_{false}, + sorttype_{0}, + arraynum_{0u} {} + +template +PROTOBUF_CONSTEXPR TusGetFriendsDataStatusRequest::TusGetFriendsDataStatusRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusGetFriendsDataStatusRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusGetFriendsDataStatusRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusGetFriendsDataStatusRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusGetFriendsDataStatusRequestDefaultTypeInternal() {} + union { + TusGetFriendsDataStatusRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusGetFriendsDataStatusRequestDefaultTypeInternal _TusGetFriendsDataStatusRequest_default_instance_; + +inline constexpr TusDataStatus::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + ownerid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + lastchangedauthorid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + info_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + lastchangeddate_{::uint64_t{0u}}, + hasdata_{false} {} + +template +PROTOBUF_CONSTEXPR TusDataStatus::TusDataStatus(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusDataStatus_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusDataStatusDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusDataStatusDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusDataStatusDefaultTypeInternal() {} + union { + TusDataStatus _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusDataStatusDefaultTypeInternal _TusDataStatus_default_instance_; + +inline constexpr SetRoomSearchFlagGUI::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roomid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + stealth_{false} {} + +template +PROTOBUF_CONSTEXPR SetRoomSearchFlagGUI::SetRoomSearchFlagGUI(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SetRoomSearchFlagGUI_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SetRoomSearchFlagGUIDefaultTypeInternal { + PROTOBUF_CONSTEXPR SetRoomSearchFlagGUIDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SetRoomSearchFlagGUIDefaultTypeInternal() {} + union { + SetRoomSearchFlagGUI _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SetRoomSearchFlagGUIDefaultTypeInternal _SetRoomSearchFlagGUI_default_instance_; + +inline constexpr SetPresenceRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + title_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + status_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + comment_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + data_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()) {} + +template +PROTOBUF_CONSTEXPR SetPresenceRequest::SetPresenceRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SetPresenceRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SetPresenceRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR SetPresenceRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SetPresenceRequestDefaultTypeInternal() {} + union { + SetPresenceRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SetPresenceRequestDefaultTypeInternal _SetPresenceRequest_default_instance_; + +inline constexpr SendMessageRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + npids_{}, + message_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()) {} + +template +PROTOBUF_CONSTEXPR SendMessageRequest::SendMessageRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SendMessageRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SendMessageRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR SendMessageRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SendMessageRequestDefaultTypeInternal() {} + union { + SendMessageRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SendMessageRequestDefaultTypeInternal _SendMessageRequest_default_instance_; + +inline constexpr ScoreRankData::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + npid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + onlinename_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + pcid_{0}, + rank_{0u}, + score_{::int64_t{0}}, + recorddate_{::uint64_t{0u}}, + hasgamedata_{false} {} + +template +PROTOBUF_CONSTEXPR ScoreRankData::ScoreRankData(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(ScoreRankData_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct ScoreRankDataDefaultTypeInternal { + PROTOBUF_CONSTEXPR ScoreRankDataDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~ScoreRankDataDefaultTypeInternal() {} + union { + ScoreRankData _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ScoreRankDataDefaultTypeInternal _ScoreRankData_default_instance_; + +inline constexpr ScoreNpIdPcId::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + npid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + pcid_{0} {} + +template +PROTOBUF_CONSTEXPR ScoreNpIdPcId::ScoreNpIdPcId(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(ScoreNpIdPcId_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct ScoreNpIdPcIdDefaultTypeInternal { + PROTOBUF_CONSTEXPR ScoreNpIdPcIdDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~ScoreNpIdPcIdDefaultTypeInternal() {} + union { + ScoreNpIdPcId _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ScoreNpIdPcIdDefaultTypeInternal _ScoreNpIdPcId_default_instance_; + +inline constexpr ScoreInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + data_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()) {} + +template +PROTOBUF_CONSTEXPR ScoreInfo::ScoreInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(ScoreInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct ScoreInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR ScoreInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~ScoreInfoDefaultTypeInternal() {} + union { + ScoreInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ScoreInfoDefaultTypeInternal _ScoreInfo_default_instance_; + +inline constexpr RecordScoreRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + comment_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + data_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + boardid_{0u}, + pcid_{0}, + score_{::int64_t{0}} {} + +template +PROTOBUF_CONSTEXPR RecordScoreRequest::RecordScoreRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RecordScoreRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RecordScoreRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR RecordScoreRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RecordScoreRequestDefaultTypeInternal() {} + union { + RecordScoreRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RecordScoreRequestDefaultTypeInternal _RecordScoreRequest_default_instance_; + +inline constexpr RecordScoreGameDataRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + boardid_{0u}, + pcid_{0}, + score_{::int64_t{0}} {} + +template +PROTOBUF_CONSTEXPR RecordScoreGameDataRequest::RecordScoreGameDataRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RecordScoreGameDataRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RecordScoreGameDataRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR RecordScoreGameDataRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RecordScoreGameDataRequestDefaultTypeInternal() {} + union { + RecordScoreGameDataRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RecordScoreGameDataRequestDefaultTypeInternal _RecordScoreGameDataRequest_default_instance_; + +inline constexpr PresenceOptionData::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + data_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + len_{0u} {} + +template +PROTOBUF_CONSTEXPR PresenceOptionData::PresenceOptionData(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(PresenceOptionData_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct PresenceOptionDataDefaultTypeInternal { + PROTOBUF_CONSTEXPR PresenceOptionDataDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~PresenceOptionDataDefaultTypeInternal() {} + union { + PresenceOptionData _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 PresenceOptionDataDefaultTypeInternal _PresenceOptionData_default_instance_; + +inline constexpr MatchingSearchCondition::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + attr_type_{0u}, + attr_id_{0u}, + comp_op_{0u}, + comp_value_{0u} {} + +template +PROTOBUF_CONSTEXPR MatchingSearchCondition::MatchingSearchCondition(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(MatchingSearchCondition_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct MatchingSearchConditionDefaultTypeInternal { + PROTOBUF_CONSTEXPR MatchingSearchConditionDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~MatchingSearchConditionDefaultTypeInternal() {} + union { + MatchingSearchCondition _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MatchingSearchConditionDefaultTypeInternal _MatchingSearchCondition_default_instance_; + +inline constexpr MatchingGuiRoomId::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + id_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()) {} + +template +PROTOBUF_CONSTEXPR MatchingGuiRoomId::MatchingGuiRoomId(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(MatchingGuiRoomId_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct MatchingGuiRoomIdDefaultTypeInternal { + PROTOBUF_CONSTEXPR MatchingGuiRoomIdDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~MatchingGuiRoomIdDefaultTypeInternal() {} + union { + MatchingGuiRoomId _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MatchingGuiRoomIdDefaultTypeInternal _MatchingGuiRoomId_default_instance_; + +inline constexpr MatchingAttr::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + data_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + attr_type_{0u}, + attr_id_{0u}, + num_{0u} {} + +template +PROTOBUF_CONSTEXPR MatchingAttr::MatchingAttr(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(MatchingAttr_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct MatchingAttrDefaultTypeInternal { + PROTOBUF_CONSTEXPR MatchingAttrDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~MatchingAttrDefaultTypeInternal() {} + union { + MatchingAttr _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MatchingAttrDefaultTypeInternal _MatchingAttr_default_instance_; + +inline constexpr GroupConfig::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + label_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + slotnum_{0u}, + withpassword_{false} {} + +template +PROTOBUF_CONSTEXPR GroupConfig::GroupConfig(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GroupConfig_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GroupConfigDefaultTypeInternal { + PROTOBUF_CONSTEXPR GroupConfigDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GroupConfigDefaultTypeInternal() {} + union { + GroupConfig _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GroupConfigDefaultTypeInternal _GroupConfig_default_instance_; + +inline constexpr GetScoreRangeRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + boardid_{0u}, + startrank_{0u}, + numranks_{0u}, + withcomment_{false}, + withgameinfo_{false} {} + +template +PROTOBUF_CONSTEXPR GetScoreRangeRequest::GetScoreRangeRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetScoreRangeRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetScoreRangeRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetScoreRangeRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetScoreRangeRequestDefaultTypeInternal() {} + union { + GetScoreRangeRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetScoreRangeRequestDefaultTypeInternal _GetScoreRangeRequest_default_instance_; + +inline constexpr GetScoreGameDataRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + npid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + boardid_{0u}, + pcid_{0} {} + +template +PROTOBUF_CONSTEXPR GetScoreGameDataRequest::GetScoreGameDataRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetScoreGameDataRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetScoreGameDataRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetScoreGameDataRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetScoreGameDataRequestDefaultTypeInternal() {} + union { + GetScoreGameDataRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetScoreGameDataRequestDefaultTypeInternal _GetScoreGameDataRequest_default_instance_; + +inline constexpr GetScoreFriendsRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + boardid_{0u}, + max_{0u}, + include_self_{false}, + withcomment_{false}, + withgameinfo_{false} {} + +template +PROTOBUF_CONSTEXPR GetScoreFriendsRequest::GetScoreFriendsRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetScoreFriendsRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetScoreFriendsRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetScoreFriendsRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetScoreFriendsRequestDefaultTypeInternal() {} + union { + GetScoreFriendsRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetScoreFriendsRequestDefaultTypeInternal _GetScoreFriendsRequest_default_instance_; + +inline constexpr BoardInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + ranklimit_{0u}, + updatemode_{0u}, + sortmode_{0u}, + uploadnumlimit_{0u}, + uploadsizelimit_{0u} {} + +template +PROTOBUF_CONSTEXPR BoardInfo::BoardInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(BoardInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct BoardInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR BoardInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~BoardInfoDefaultTypeInternal() {} + union { + BoardInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 BoardInfoDefaultTypeInternal _BoardInfo_default_instance_; + +inline constexpr TusVarResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + vars_{} {} + +template +PROTOBUF_CONSTEXPR TusVarResponse::TusVarResponse(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusVarResponse_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusVarResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusVarResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusVarResponseDefaultTypeInternal() {} + union { + TusVarResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusVarResponseDefaultTypeInternal _TusVarResponse_default_instance_; + +inline constexpr TusTryAndSetVariableRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + islastchangeddate_{}, + _islastchangeddate_cached_byte_size_{0}, + comparevalue_{}, + _comparevalue_cached_byte_size_{0}, + islastchangedauthorid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + user_{nullptr}, + slotid_{0}, + opetype_{0}, + variable_{::int64_t{0}} {} + +template +PROTOBUF_CONSTEXPR TusTryAndSetVariableRequest::TusTryAndSetVariableRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusTryAndSetVariableRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusTryAndSetVariableRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusTryAndSetVariableRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusTryAndSetVariableRequestDefaultTypeInternal() {} + union { + TusTryAndSetVariableRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusTryAndSetVariableRequestDefaultTypeInternal _TusTryAndSetVariableRequest_default_instance_; + +inline constexpr TusSetMultiSlotVariableRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + slotidarray_{}, + _slotidarray_cached_byte_size_{0}, + variablearray_{}, + _variablearray_cached_byte_size_{0}, + user_{nullptr} {} + +template +PROTOBUF_CONSTEXPR TusSetMultiSlotVariableRequest::TusSetMultiSlotVariableRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusSetMultiSlotVariableRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusSetMultiSlotVariableRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusSetMultiSlotVariableRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusSetMultiSlotVariableRequestDefaultTypeInternal() {} + union { + TusSetMultiSlotVariableRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusSetMultiSlotVariableRequestDefaultTypeInternal _TusSetMultiSlotVariableRequest_default_instance_; + +inline constexpr TusSetDataRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + islastchangeddate_{}, + _islastchangeddate_cached_byte_size_{0}, + data_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + info_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + islastchangedauthorid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + user_{nullptr}, + slotid_{0} {} + +template +PROTOBUF_CONSTEXPR TusSetDataRequest::TusSetDataRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusSetDataRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusSetDataRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusSetDataRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusSetDataRequestDefaultTypeInternal() {} + union { + TusSetDataRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusSetDataRequestDefaultTypeInternal _TusSetDataRequest_default_instance_; + +inline constexpr TusGetMultiUserVariableRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + users_{}, + slotid_{0} {} + +template +PROTOBUF_CONSTEXPR TusGetMultiUserVariableRequest::TusGetMultiUserVariableRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusGetMultiUserVariableRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusGetMultiUserVariableRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusGetMultiUserVariableRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusGetMultiUserVariableRequestDefaultTypeInternal() {} + union { + TusGetMultiUserVariableRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusGetMultiUserVariableRequestDefaultTypeInternal _TusGetMultiUserVariableRequest_default_instance_; + +inline constexpr TusGetMultiUserDataStatusRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + users_{}, + slotid_{0} {} + +template +PROTOBUF_CONSTEXPR TusGetMultiUserDataStatusRequest::TusGetMultiUserDataStatusRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusGetMultiUserDataStatusRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusGetMultiUserDataStatusRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusGetMultiUserDataStatusRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusGetMultiUserDataStatusRequestDefaultTypeInternal() {} + union { + TusGetMultiUserDataStatusRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusGetMultiUserDataStatusRequestDefaultTypeInternal _TusGetMultiUserDataStatusRequest_default_instance_; + +inline constexpr TusGetMultiSlotVariableRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + slotidarray_{}, + _slotidarray_cached_byte_size_{0}, + user_{nullptr} {} + +template +PROTOBUF_CONSTEXPR TusGetMultiSlotVariableRequest::TusGetMultiSlotVariableRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusGetMultiSlotVariableRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusGetMultiSlotVariableRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusGetMultiSlotVariableRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusGetMultiSlotVariableRequestDefaultTypeInternal() {} + union { + TusGetMultiSlotVariableRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusGetMultiSlotVariableRequestDefaultTypeInternal _TusGetMultiSlotVariableRequest_default_instance_; + +inline constexpr TusGetMultiSlotDataStatusRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + slotidarray_{}, + _slotidarray_cached_byte_size_{0}, + user_{nullptr} {} + +template +PROTOBUF_CONSTEXPR TusGetMultiSlotDataStatusRequest::TusGetMultiSlotDataStatusRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusGetMultiSlotDataStatusRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusGetMultiSlotDataStatusRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusGetMultiSlotDataStatusRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusGetMultiSlotDataStatusRequestDefaultTypeInternal() {} + union { + TusGetMultiSlotDataStatusRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusGetMultiSlotDataStatusRequestDefaultTypeInternal _TusGetMultiSlotDataStatusRequest_default_instance_; + +inline constexpr TusGetDataRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + user_{nullptr}, + slotid_{0} {} + +template +PROTOBUF_CONSTEXPR TusGetDataRequest::TusGetDataRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusGetDataRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusGetDataRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusGetDataRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusGetDataRequestDefaultTypeInternal() {} + union { + TusGetDataRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusGetDataRequestDefaultTypeInternal _TusGetDataRequest_default_instance_; + +inline constexpr TusDeleteMultiSlotVariableRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + slotidarray_{}, + _slotidarray_cached_byte_size_{0}, + user_{nullptr} {} + +template +PROTOBUF_CONSTEXPR TusDeleteMultiSlotVariableRequest::TusDeleteMultiSlotVariableRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusDeleteMultiSlotVariableRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusDeleteMultiSlotVariableRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusDeleteMultiSlotVariableRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusDeleteMultiSlotVariableRequestDefaultTypeInternal() {} + union { + TusDeleteMultiSlotVariableRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusDeleteMultiSlotVariableRequestDefaultTypeInternal _TusDeleteMultiSlotVariableRequest_default_instance_; + +inline constexpr TusDeleteMultiSlotDataRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + slotidarray_{}, + _slotidarray_cached_byte_size_{0}, + user_{nullptr} {} + +template +PROTOBUF_CONSTEXPR TusDeleteMultiSlotDataRequest::TusDeleteMultiSlotDataRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusDeleteMultiSlotDataRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusDeleteMultiSlotDataRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusDeleteMultiSlotDataRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusDeleteMultiSlotDataRequestDefaultTypeInternal() {} + union { + TusDeleteMultiSlotDataRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusDeleteMultiSlotDataRequestDefaultTypeInternal _TusDeleteMultiSlotDataRequest_default_instance_; + +inline constexpr TusDataStatusResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + status_{} {} + +template +PROTOBUF_CONSTEXPR TusDataStatusResponse::TusDataStatusResponse(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusDataStatusResponse_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusDataStatusResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusDataStatusResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusDataStatusResponseDefaultTypeInternal() {} + union { + TusDataStatusResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusDataStatusResponseDefaultTypeInternal _TusDataStatusResponse_default_instance_; + +inline constexpr TusData::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + data_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + status_{nullptr} {} + +template +PROTOBUF_CONSTEXPR TusData::TusData(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusData_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusDataDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusDataDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusDataDefaultTypeInternal() {} + union { + TusData _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusDataDefaultTypeInternal _TusData_default_instance_; + +inline constexpr TusAddAndGetVariableRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + islastchangeddate_{}, + _islastchangeddate_cached_byte_size_{0}, + islastchangedauthorid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + user_{nullptr}, + invariable_{::int64_t{0}}, + slotid_{0} {} + +template +PROTOBUF_CONSTEXPR TusAddAndGetVariableRequest::TusAddAndGetVariableRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(TusAddAndGetVariableRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct TusAddAndGetVariableRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR TusAddAndGetVariableRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~TusAddAndGetVariableRequestDefaultTypeInternal() {} + union { + TusAddAndGetVariableRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TusAddAndGetVariableRequestDefaultTypeInternal _TusAddAndGetVariableRequest_default_instance_; + +inline constexpr SignalingAddr::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + ip_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + port_{nullptr} {} + +template +PROTOBUF_CONSTEXPR SignalingAddr::SignalingAddr(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SignalingAddr_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SignalingAddrDefaultTypeInternal { + PROTOBUF_CONSTEXPR SignalingAddrDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SignalingAddrDefaultTypeInternal() {} + union { + SignalingAddr _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SignalingAddrDefaultTypeInternal _SignalingAddr_default_instance_; + +inline constexpr SendRoomMessageRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + dst_{}, + msg_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + casttype_{nullptr}, + option_{nullptr}, + roomid_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR SendRoomMessageRequest::SendRoomMessageRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SendRoomMessageRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SendRoomMessageRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR SendRoomMessageRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SendRoomMessageRequestDefaultTypeInternal() {} + union { + SendRoomMessageRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SendRoomMessageRequestDefaultTypeInternal _SendRoomMessageRequest_default_instance_; + +inline constexpr SearchJoinRoomGUIRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + conds_{}, + attrs_{} {} + +template +PROTOBUF_CONSTEXPR SearchJoinRoomGUIRequest::SearchJoinRoomGUIRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SearchJoinRoomGUIRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SearchJoinRoomGUIRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR SearchJoinRoomGUIRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SearchJoinRoomGUIRequestDefaultTypeInternal() {} + union { + SearchJoinRoomGUIRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SearchJoinRoomGUIRequestDefaultTypeInternal _SearchJoinRoomGUIRequest_default_instance_; + +inline constexpr RoomUpdateInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + eventcause_{nullptr}, + optdata_{nullptr}, + errorcode_{0} {} + +template +PROTOBUF_CONSTEXPR RoomUpdateInfo::RoomUpdateInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomUpdateInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomUpdateInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomUpdateInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomUpdateInfoDefaultTypeInternal() {} + union { + RoomUpdateInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomUpdateInfoDefaultTypeInternal _RoomUpdateInfo_default_instance_; + +inline constexpr RoomMessageInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + dst_{}, + msg_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + casttype_{nullptr}, + srcmember_{nullptr}, + filtered_{false} {} + +template +PROTOBUF_CONSTEXPR RoomMessageInfo::RoomMessageInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomMessageInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomMessageInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomMessageInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomMessageInfoDefaultTypeInternal() {} + union { + RoomMessageInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomMessageInfoDefaultTypeInternal _RoomMessageInfo_default_instance_; + +inline constexpr RoomGroupPasswordConfig::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + groupid_{nullptr}, + withpassword_{false} {} + +template +PROTOBUF_CONSTEXPR RoomGroupPasswordConfig::RoomGroupPasswordConfig(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomGroupPasswordConfig_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomGroupPasswordConfigDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomGroupPasswordConfigDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomGroupPasswordConfigDefaultTypeInternal() {} + union { + RoomGroupPasswordConfig _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomGroupPasswordConfigDefaultTypeInternal _RoomGroupPasswordConfig_default_instance_; + +inline constexpr RoomGroup::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + label_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + groupid_{nullptr}, + withpassword_{false}, + slotnum_{0u}, + curgroupmembernum_{0u} {} + +template +PROTOBUF_CONSTEXPR RoomGroup::RoomGroup(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomGroup_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomGroupDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomGroupDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomGroupDefaultTypeInternal() {} + union { + RoomGroup _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomGroupDefaultTypeInternal _RoomGroup_default_instance_; + +inline constexpr QuickMatchGUIRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + conds_{}, + available_num_{0u} {} + +template +PROTOBUF_CONSTEXPR QuickMatchGUIRequest::QuickMatchGUIRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(QuickMatchGUIRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct QuickMatchGUIRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR QuickMatchGUIRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~QuickMatchGUIRequestDefaultTypeInternal() {} + union { + QuickMatchGUIRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 QuickMatchGUIRequestDefaultTypeInternal _QuickMatchGUIRequest_default_instance_; + +inline constexpr OptParam::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + type_{nullptr}, + flag_{nullptr}, + hubmemberid_{nullptr} {} + +template +PROTOBUF_CONSTEXPR OptParam::OptParam(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(OptParam_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct OptParamDefaultTypeInternal { + PROTOBUF_CONSTEXPR OptParamDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~OptParamDefaultTypeInternal() {} + union { + OptParam _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OptParamDefaultTypeInternal _OptParam_default_instance_; + +inline constexpr MessageDetails::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + communicationid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + subject_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + body_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + data_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + maintype_{nullptr}, + subtype_{nullptr}, + msgid_{::uint64_t{0u}}, + msgfeatures_{0u} {} + +template +PROTOBUF_CONSTEXPR MessageDetails::MessageDetails(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(MessageDetails_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct MessageDetailsDefaultTypeInternal { + PROTOBUF_CONSTEXPR MessageDetailsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~MessageDetailsDefaultTypeInternal() {} + union { + MessageDetails _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MessageDetailsDefaultTypeInternal _MessageDetails_default_instance_; + +inline constexpr MatchingRoom::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + attr_{}, + id_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()) {} + +template +PROTOBUF_CONSTEXPR MatchingRoom::MatchingRoom(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(MatchingRoom_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct MatchingRoomDefaultTypeInternal { + PROTOBUF_CONSTEXPR MatchingRoomDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~MatchingRoomDefaultTypeInternal() {} + union { + MatchingRoom _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MatchingRoomDefaultTypeInternal _MatchingRoom_default_instance_; + +inline constexpr LeaveRoomRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + optdata_{nullptr}, + roomid_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR LeaveRoomRequest::LeaveRoomRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(LeaveRoomRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct LeaveRoomRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR LeaveRoomRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~LeaveRoomRequestDefaultTypeInternal() {} + union { + LeaveRoomRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 LeaveRoomRequestDefaultTypeInternal _LeaveRoomRequest_default_instance_; + +inline constexpr IntAttr::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + id_{nullptr}, + num_{0u} {} + +template +PROTOBUF_CONSTEXPR IntAttr::IntAttr(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(IntAttr_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct IntAttrDefaultTypeInternal { + PROTOBUF_CONSTEXPR IntAttrDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~IntAttrDefaultTypeInternal() {} + union { + IntAttr _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 IntAttrDefaultTypeInternal _IntAttr_default_instance_; + +inline constexpr GetScoreResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + rankarray_{}, + commentarray_{}, + infoarray_{}, + lastsortdate_{::uint64_t{0u}}, + totalrecord_{0u} {} + +template +PROTOBUF_CONSTEXPR GetScoreResponse::GetScoreResponse(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetScoreResponse_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetScoreResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetScoreResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetScoreResponseDefaultTypeInternal() {} + union { + GetScoreResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetScoreResponseDefaultTypeInternal _GetScoreResponse_default_instance_; + +inline constexpr GetScoreNpIdRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + npids_{}, + boardid_{0u}, + withcomment_{false}, + withgameinfo_{false} {} + +template +PROTOBUF_CONSTEXPR GetScoreNpIdRequest::GetScoreNpIdRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetScoreNpIdRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetScoreNpIdRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetScoreNpIdRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetScoreNpIdRequestDefaultTypeInternal() {} + union { + GetScoreNpIdRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetScoreNpIdRequestDefaultTypeInternal _GetScoreNpIdRequest_default_instance_; + +inline constexpr GetRoomMemberDataInternalRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + attrid_{}, + memberid_{nullptr}, + roomid_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR GetRoomMemberDataInternalRequest::GetRoomMemberDataInternalRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetRoomMemberDataInternalRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetRoomMemberDataInternalRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetRoomMemberDataInternalRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetRoomMemberDataInternalRequestDefaultTypeInternal() {} + union { + GetRoomMemberDataInternalRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetRoomMemberDataInternalRequestDefaultTypeInternal _GetRoomMemberDataInternalRequest_default_instance_; + +inline constexpr GetRoomListGUIRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + conds_{}, + attrs_{}, + range_start_{0u}, + range_max_{0u} {} + +template +PROTOBUF_CONSTEXPR GetRoomListGUIRequest::GetRoomListGUIRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetRoomListGUIRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetRoomListGUIRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetRoomListGUIRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetRoomListGUIRequestDefaultTypeInternal() {} + union { + GetRoomListGUIRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetRoomListGUIRequestDefaultTypeInternal _GetRoomListGUIRequest_default_instance_; + +inline constexpr GetRoomDataInternalRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + attrid_{}, + roomid_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR GetRoomDataInternalRequest::GetRoomDataInternalRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetRoomDataInternalRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetRoomDataInternalRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetRoomDataInternalRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetRoomDataInternalRequestDefaultTypeInternal() {} + union { + GetRoomDataInternalRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetRoomDataInternalRequestDefaultTypeInternal _GetRoomDataInternalRequest_default_instance_; + +inline constexpr GetRoomDataExternalListRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roomids_{}, + _roomids_cached_byte_size_{0}, + attrids_{} {} + +template +PROTOBUF_CONSTEXPR GetRoomDataExternalListRequest::GetRoomDataExternalListRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetRoomDataExternalListRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetRoomDataExternalListRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetRoomDataExternalListRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetRoomDataExternalListRequestDefaultTypeInternal() {} + union { + GetRoomDataExternalListRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetRoomDataExternalListRequestDefaultTypeInternal _GetRoomDataExternalListRequest_default_instance_; + +inline constexpr GetPingInfoResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + serverid_{nullptr}, + roomid_{::uint64_t{0u}}, + worldid_{0u}, + rtt_{0u} {} + +template +PROTOBUF_CONSTEXPR GetPingInfoResponse::GetPingInfoResponse(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetPingInfoResponse_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetPingInfoResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetPingInfoResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetPingInfoResponseDefaultTypeInternal() {} + union { + GetPingInfoResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetPingInfoResponseDefaultTypeInternal _GetPingInfoResponse_default_instance_; + +inline constexpr GUIUserInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + info_{nullptr}, + owner_{false} {} + +template +PROTOBUF_CONSTEXPR GUIUserInfo::GUIUserInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GUIUserInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GUIUserInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR GUIUserInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GUIUserInfoDefaultTypeInternal() {} + union { + GUIUserInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GUIUserInfoDefaultTypeInternal _GUIUserInfo_default_instance_; + +inline constexpr CreateRoomGUIRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + game_attrs_{}, + total_slots_{0u}, + private_slots_{0u}, + privilege_grant_{false}, + stealth_{false} {} + +template +PROTOBUF_CONSTEXPR CreateRoomGUIRequest::CreateRoomGUIRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(CreateRoomGUIRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct CreateRoomGUIRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR CreateRoomGUIRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~CreateRoomGUIRequestDefaultTypeInternal() {} + union { + CreateRoomGUIRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CreateRoomGUIRequestDefaultTypeInternal _CreateRoomGUIRequest_default_instance_; + +inline constexpr BinAttr::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + data_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + id_{nullptr} {} + +template +PROTOBUF_CONSTEXPR BinAttr::BinAttr(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(BinAttr_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct BinAttrDefaultTypeInternal { + PROTOBUF_CONSTEXPR BinAttrDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~BinAttrDefaultTypeInternal() {} + union { + BinAttr _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 BinAttrDefaultTypeInternal _BinAttr_default_instance_; + +inline constexpr SetUserInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + userbinattr_{}, + serverid_{nullptr} {} + +template +PROTOBUF_CONSTEXPR SetUserInfo::SetUserInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SetUserInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SetUserInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR SetUserInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SetUserInfoDefaultTypeInternal() {} + union { + SetUserInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SetUserInfoDefaultTypeInternal _SetUserInfo_default_instance_; + +inline constexpr SetRoomMemberDataInternalRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roommemberbinattrinternal_{}, + memberid_{nullptr}, + teamid_{nullptr}, + roomid_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR SetRoomMemberDataInternalRequest::SetRoomMemberDataInternalRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SetRoomMemberDataInternalRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SetRoomMemberDataInternalRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR SetRoomMemberDataInternalRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SetRoomMemberDataInternalRequestDefaultTypeInternal() {} + union { + SetRoomMemberDataInternalRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SetRoomMemberDataInternalRequestDefaultTypeInternal _SetRoomMemberDataInternalRequest_default_instance_; + +inline constexpr SetRoomDataInternalRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roombinattrinternal_{}, + passwordconfig_{}, + passwordslotmask_{}, + _passwordslotmask_cached_byte_size_{0}, + ownerprivilegerank_{}, + roomid_{::uint64_t{0u}}, + flagfilter_{0u}, + flagattr_{0u} {} + +template +PROTOBUF_CONSTEXPR SetRoomDataInternalRequest::SetRoomDataInternalRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SetRoomDataInternalRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SetRoomDataInternalRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR SetRoomDataInternalRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SetRoomDataInternalRequestDefaultTypeInternal() {} + union { + SetRoomDataInternalRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SetRoomDataInternalRequestDefaultTypeInternal _SetRoomDataInternalRequest_default_instance_; + +inline constexpr SetRoomDataExternalRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roomsearchableintattrexternal_{}, + roomsearchablebinattrexternal_{}, + roombinattrexternal_{}, + roomid_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR SetRoomDataExternalRequest::SetRoomDataExternalRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SetRoomDataExternalRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SetRoomDataExternalRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR SetRoomDataExternalRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SetRoomDataExternalRequestDefaultTypeInternal() {} + union { + SetRoomDataExternalRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SetRoomDataExternalRequestDefaultTypeInternal _SetRoomDataExternalRequest_default_instance_; + +inline constexpr RoomMemberBinAttrInternal::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + data_{nullptr}, + updatedate_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR RoomMemberBinAttrInternal::RoomMemberBinAttrInternal(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomMemberBinAttrInternal_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomMemberBinAttrInternalDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomMemberBinAttrInternalDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomMemberBinAttrInternalDefaultTypeInternal() {} + union { + RoomMemberBinAttrInternal _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomMemberBinAttrInternalDefaultTypeInternal _RoomMemberBinAttrInternal_default_instance_; + +inline constexpr RoomDataExternal::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roomgroup_{}, + roomsearchableintattrexternal_{}, + roomsearchablebinattrexternal_{}, + roombinattrexternal_{}, + serverid_{nullptr}, + publicslotnum_{nullptr}, + privateslotnum_{nullptr}, + openpublicslotnum_{nullptr}, + maxslot_{nullptr}, + openprivateslotnum_{nullptr}, + curmembernum_{nullptr}, + owner_{nullptr}, + lobbyid_{::uint64_t{0u}}, + roomid_{::uint64_t{0u}}, + worldid_{0u}, + flagattr_{0u}, + passwordslotmask_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR RoomDataExternal::RoomDataExternal(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomDataExternal_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomDataExternalDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomDataExternalDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomDataExternalDefaultTypeInternal() {} + union { + RoomDataExternal _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomDataExternalDefaultTypeInternal _RoomDataExternal_default_instance_; + +inline constexpr MatchingSignalingInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + npid_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + addr_{nullptr} {} + +template +PROTOBUF_CONSTEXPR MatchingSignalingInfo::MatchingSignalingInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(MatchingSignalingInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct MatchingSignalingInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR MatchingSignalingInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~MatchingSignalingInfoDefaultTypeInternal() {} + union { + MatchingSignalingInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MatchingSignalingInfoDefaultTypeInternal _MatchingSignalingInfo_default_instance_; + +inline constexpr MatchingRoomStatus::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + members_{}, + id_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + kick_actor_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + opt_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()) {} + +template +PROTOBUF_CONSTEXPR MatchingRoomStatus::MatchingRoomStatus(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(MatchingRoomStatus_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct MatchingRoomStatusDefaultTypeInternal { + PROTOBUF_CONSTEXPR MatchingRoomStatusDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~MatchingRoomStatusDefaultTypeInternal() {} + union { + MatchingRoomStatus _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MatchingRoomStatusDefaultTypeInternal _MatchingRoomStatus_default_instance_; + +inline constexpr MatchingRoomList::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + rooms_{}, + start_{0u}, + total_{0u} {} + +template +PROTOBUF_CONSTEXPR MatchingRoomList::MatchingRoomList(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(MatchingRoomList_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct MatchingRoomListDefaultTypeInternal { + PROTOBUF_CONSTEXPR MatchingRoomListDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~MatchingRoomListDefaultTypeInternal() {} + union { + MatchingRoomList _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MatchingRoomListDefaultTypeInternal _MatchingRoomList_default_instance_; + +inline constexpr Matching2SignalingInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + member_id_{nullptr}, + addr_{nullptr} {} + +template +PROTOBUF_CONSTEXPR Matching2SignalingInfo::Matching2SignalingInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(Matching2SignalingInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct Matching2SignalingInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR Matching2SignalingInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~Matching2SignalingInfoDefaultTypeInternal() {} + union { + Matching2SignalingInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Matching2SignalingInfoDefaultTypeInternal _Matching2SignalingInfo_default_instance_; + +inline constexpr JoinRoomRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roommemberbinattrinternal_{}, + roompassword_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + joinroomgrouplabel_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + optdata_{nullptr}, + teamid_{nullptr}, + roomid_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR JoinRoomRequest::JoinRoomRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(JoinRoomRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct JoinRoomRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR JoinRoomRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~JoinRoomRequestDefaultTypeInternal() {} + union { + JoinRoomRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 JoinRoomRequestDefaultTypeInternal _JoinRoomRequest_default_instance_; + +inline constexpr IntSearchFilter::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + searchoperator_{nullptr}, + attr_{nullptr} {} + +template +PROTOBUF_CONSTEXPR IntSearchFilter::IntSearchFilter(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(IntSearchFilter_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct IntSearchFilterDefaultTypeInternal { + PROTOBUF_CONSTEXPR IntSearchFilterDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~IntSearchFilterDefaultTypeInternal() {} + union { + IntSearchFilter _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 IntSearchFilterDefaultTypeInternal _IntSearchFilter_default_instance_; + +inline constexpr CreateJoinRoomRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roombinattrinternal_{}, + roomsearchableintattrexternal_{}, + roomsearchablebinattrexternal_{}, + roombinattrexternal_{}, + groupconfig_{}, + alloweduser_{}, + blockeduser_{}, + roommemberbinattrinternal_{}, + roompassword_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + joinroomgrouplabel_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + teamid_{nullptr}, + sigoptparam_{nullptr}, + lobbyid_{::uint64_t{0u}}, + worldid_{0u}, + maxslot_{0u}, + passwordslotmask_{::uint64_t{0u}}, + flagattr_{0u} {} + +template +PROTOBUF_CONSTEXPR CreateJoinRoomRequest::CreateJoinRoomRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(CreateJoinRoomRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct CreateJoinRoomRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR CreateJoinRoomRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~CreateJoinRoomRequestDefaultTypeInternal() {} + union { + CreateJoinRoomRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CreateJoinRoomRequestDefaultTypeInternal _CreateJoinRoomRequest_default_instance_; + +inline constexpr BinSearchFilter::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + searchoperator_{nullptr}, + attr_{nullptr} {} + +template +PROTOBUF_CONSTEXPR BinSearchFilter::BinSearchFilter(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(BinSearchFilter_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct BinSearchFilterDefaultTypeInternal { + PROTOBUF_CONSTEXPR BinSearchFilterDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~BinSearchFilterDefaultTypeInternal() {} + union { + BinSearchFilter _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 BinSearchFilterDefaultTypeInternal _BinSearchFilter_default_instance_; + +inline constexpr BinAttrInternal::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + updatememberid_{nullptr}, + data_{nullptr}, + updatedate_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR BinAttrInternal::BinAttrInternal(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(BinAttrInternal_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct BinAttrInternalDefaultTypeInternal { + PROTOBUF_CONSTEXPR BinAttrInternalDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~BinAttrInternalDefaultTypeInternal() {} + union { + BinAttrInternal _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 BinAttrInternalDefaultTypeInternal _BinAttrInternal_default_instance_; + +inline constexpr SearchRoomResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + rooms_{}, + startindex_{0u}, + total_{0u} {} + +template +PROTOBUF_CONSTEXPR SearchRoomResponse::SearchRoomResponse(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SearchRoomResponse_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SearchRoomResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR SearchRoomResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SearchRoomResponseDefaultTypeInternal() {} + union { + SearchRoomResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SearchRoomResponseDefaultTypeInternal _SearchRoomResponse_default_instance_; + +inline constexpr SearchRoomRequest::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + intfilter_{}, + binfilter_{}, + attrid_{}, + option_{0}, + worldid_{0u}, + lobbyid_{::uint64_t{0u}}, + rangefilter_startindex_{0u}, + rangefilter_max_{0u}, + flagfilter_{0u}, + flagattr_{0u} {} + +template +PROTOBUF_CONSTEXPR SearchRoomRequest::SearchRoomRequest(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(SearchRoomRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct SearchRoomRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR SearchRoomRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~SearchRoomRequestDefaultTypeInternal() {} + union { + SearchRoomRequest _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SearchRoomRequestDefaultTypeInternal _SearchRoomRequest_default_instance_; + +inline constexpr RoomMemberDataInternal::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roommemberbinattrinternal_{}, + userinfo_{nullptr}, + teamid_{nullptr}, + roomgroup_{nullptr}, + nattype_{nullptr}, + joindate_{::uint64_t{0u}}, + memberid_{0u}, + flagattr_{0u} {} + +template +PROTOBUF_CONSTEXPR RoomMemberDataInternal::RoomMemberDataInternal(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomMemberDataInternal_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomMemberDataInternalDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomMemberDataInternalDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomMemberDataInternalDefaultTypeInternal() {} + union { + RoomMemberDataInternal _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomMemberDataInternalDefaultTypeInternal _RoomMemberDataInternal_default_instance_; + +inline constexpr MatchingSearchJoinRoomInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + attr_{}, + room_{nullptr} {} + +template +PROTOBUF_CONSTEXPR MatchingSearchJoinRoomInfo::MatchingSearchJoinRoomInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(MatchingSearchJoinRoomInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct MatchingSearchJoinRoomInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR MatchingSearchJoinRoomInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~MatchingSearchJoinRoomInfoDefaultTypeInternal() {} + union { + MatchingSearchJoinRoomInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MatchingSearchJoinRoomInfoDefaultTypeInternal _MatchingSearchJoinRoomInfo_default_instance_; + +inline constexpr GetRoomDataExternalListResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + rooms_{} {} + +template +PROTOBUF_CONSTEXPR GetRoomDataExternalListResponse::GetRoomDataExternalListResponse(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetRoomDataExternalListResponse_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetRoomDataExternalListResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetRoomDataExternalListResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetRoomDataExternalListResponseDefaultTypeInternal() {} + union { + GetRoomDataExternalListResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetRoomDataExternalListResponseDefaultTypeInternal _GetRoomDataExternalListResponse_default_instance_; + +inline constexpr RoomMemberUpdateInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + roommemberdatainternal_{nullptr}, + eventcause_{nullptr}, + optdata_{nullptr} {} + +template +PROTOBUF_CONSTEXPR RoomMemberUpdateInfo::RoomMemberUpdateInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomMemberUpdateInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomMemberUpdateInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomMemberUpdateInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomMemberUpdateInfoDefaultTypeInternal() {} + union { + RoomMemberUpdateInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomMemberUpdateInfoDefaultTypeInternal _RoomMemberUpdateInfo_default_instance_; + +inline constexpr RoomMemberDataInternalUpdateInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + newroommemberbinattrinternal_{}, + newroommemberdatainternal_{nullptr}, + prevteamid_{nullptr}, + prevflagattr_{0u} {} + +template +PROTOBUF_CONSTEXPR RoomMemberDataInternalUpdateInfo::RoomMemberDataInternalUpdateInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomMemberDataInternalUpdateInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomMemberDataInternalUpdateInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomMemberDataInternalUpdateInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomMemberDataInternalUpdateInfoDefaultTypeInternal() {} + union { + RoomMemberDataInternalUpdateInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomMemberDataInternalUpdateInfoDefaultTypeInternal _RoomMemberDataInternalUpdateInfo_default_instance_; + +inline constexpr RoomDataInternal::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + memberlist_{}, + roomgroup_{}, + roombinattrinternal_{}, + serverid_{nullptr}, + ownerid_{nullptr}, + lobbyid_{::uint64_t{0u}}, + roomid_{::uint64_t{0u}}, + worldid_{0u}, + maxslot_{0u}, + passwordslotmask_{::uint64_t{0u}}, + flagattr_{0u} {} + +template +PROTOBUF_CONSTEXPR RoomDataInternal::RoomDataInternal(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomDataInternal_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomDataInternalDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomDataInternalDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomDataInternalDefaultTypeInternal() {} + union { + RoomDataInternal _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomDataInternalDefaultTypeInternal _RoomDataInternal_default_instance_; + +inline constexpr RoomDataInternalUpdateInfo::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + newroombinattrinternal_{}, + newroomgroup_( + &::google::protobuf::internal::fixed_address_empty_string, + ::_pbi::ConstantInitialized()), + newroomdatainternal_{nullptr}, + prevroompasswordslotmask_{::uint64_t{0u}}, + prevflagattr_{0u} {} + +template +PROTOBUF_CONSTEXPR RoomDataInternalUpdateInfo::RoomDataInternalUpdateInfo(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomDataInternalUpdateInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomDataInternalUpdateInfoDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomDataInternalUpdateInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomDataInternalUpdateInfoDefaultTypeInternal() {} + union { + RoomDataInternalUpdateInfo _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomDataInternalUpdateInfoDefaultTypeInternal _RoomDataInternalUpdateInfo_default_instance_; + +inline constexpr NotificationUserJoinedRoom::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + update_info_{nullptr}, + signaling_{nullptr}, + room_id_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR NotificationUserJoinedRoom::NotificationUserJoinedRoom(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(NotificationUserJoinedRoom_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct NotificationUserJoinedRoomDefaultTypeInternal { + PROTOBUF_CONSTEXPR NotificationUserJoinedRoomDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~NotificationUserJoinedRoomDefaultTypeInternal() {} + union { + NotificationUserJoinedRoom _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 NotificationUserJoinedRoomDefaultTypeInternal _NotificationUserJoinedRoom_default_instance_; + +inline constexpr JoinRoomResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + signaling_data_{}, + room_data_{nullptr} {} + +template +PROTOBUF_CONSTEXPR JoinRoomResponse::JoinRoomResponse(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(JoinRoomResponse_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct JoinRoomResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR JoinRoomResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~JoinRoomResponseDefaultTypeInternal() {} + union { + JoinRoomResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 JoinRoomResponseDefaultTypeInternal _JoinRoomResponse_default_instance_; +} // namespace np2_structs +namespace np2_structs { +// =================================================================== + +class uint8::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(uint8, _impl_._has_bits_); +}; + +uint8::uint8(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, uint8_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.uint8) +} +uint8::uint8( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const uint8& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, uint8_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(from._impl_) { + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} +PROTOBUF_NDEBUG_INLINE uint8::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void uint8::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.value_ = {}; +} +uint8::~uint8() { + // @@protoc_insertion_point(destructor:np2_structs.uint8) + SharedDtor(*this); +} +inline void uint8::SharedDtor(MessageLite& self) { + uint8& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL uint8::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) uint8(arena); +} +constexpr auto uint8::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(uint8), + alignof(uint8)); +} +constexpr auto uint8::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<18>{ + { + &_uint8_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &uint8::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &uint8::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &uint8::ByteSizeLong, + &uint8::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(uint8, _impl_._cached_size_), + true, + }, + "np2_structs.uint8", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<18> uint8_class_data_ = + uint8::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +uint8::GetClassData() const { + return uint8_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 0, 0, 2> +uint8::_table_ = { + { + PROTOBUF_FIELD_OFFSET(uint8, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + uint8_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::uint8>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // uint32 value = 1; + {::_pbi::TcParser::FastV32S1, + {8, 0, 0, + PROTOBUF_FIELD_OFFSET(uint8, _impl_.value_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 value = 1; + {PROTOBUF_FIELD_OFFSET(uint8, _impl_.value_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void uint8::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.uint8) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + _impl_.value_ = 0u; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL uint8::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const uint8& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL uint8::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const uint8& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.uint8) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 value = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_value() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_value(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.uint8) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t uint8::ByteSizeLong(const MessageLite& base) { + const uint8& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t uint8::ByteSizeLong() const { + const uint8& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.uint8) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + { + // uint32 value = 1; + cached_has_bits = this_._impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_value() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_value()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void uint8::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.uint8) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (from._internal_value() != 0) { + _this->_impl_.value_ = from._impl_.value_; + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void uint8::CopyFrom(const uint8& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.uint8) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void uint8::InternalSwap(uint8* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + swap(_impl_.value_, other->_impl_.value_); +} + +// =================================================================== + +class uint16::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(uint16, _impl_._has_bits_); +}; + +uint16::uint16(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, uint16_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.uint16) +} +uint16::uint16( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const uint16& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, uint16_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(from._impl_) { + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} +PROTOBUF_NDEBUG_INLINE uint16::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void uint16::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.value_ = {}; +} +uint16::~uint16() { + // @@protoc_insertion_point(destructor:np2_structs.uint16) + SharedDtor(*this); +} +inline void uint16::SharedDtor(MessageLite& self) { + uint16& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL uint16::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) uint16(arena); +} +constexpr auto uint16::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(uint16), + alignof(uint16)); +} +constexpr auto uint16::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<19>{ + { + &_uint16_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &uint16::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &uint16::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &uint16::ByteSizeLong, + &uint16::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(uint16, _impl_._cached_size_), + true, + }, + "np2_structs.uint16", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<19> uint16_class_data_ = + uint16::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +uint16::GetClassData() const { + return uint16_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 0, 0, 2> +uint16::_table_ = { + { + PROTOBUF_FIELD_OFFSET(uint16, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + uint16_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::uint16>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // uint32 value = 1; + {::_pbi::TcParser::FastV32S1, + {8, 0, 0, + PROTOBUF_FIELD_OFFSET(uint16, _impl_.value_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 value = 1; + {PROTOBUF_FIELD_OFFSET(uint16, _impl_.value_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void uint16::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.uint16) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + _impl_.value_ = 0u; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL uint16::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const uint16& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL uint16::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const uint16& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.uint16) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 value = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_value() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_value(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.uint16) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t uint16::ByteSizeLong(const MessageLite& base) { + const uint16& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t uint16::ByteSizeLong() const { + const uint16& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.uint16) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + { + // uint32 value = 1; + cached_has_bits = this_._impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_value() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_value()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void uint16::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.uint16) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (from._internal_value() != 0) { + _this->_impl_.value_ = from._impl_.value_; + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void uint16::CopyFrom(const uint16& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.uint16) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void uint16::InternalSwap(uint16* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + swap(_impl_.value_, other->_impl_.value_); +} + +// =================================================================== + +class SignalingAddr::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SignalingAddr, _impl_._has_bits_); +}; + +SignalingAddr::SignalingAddr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SignalingAddr_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SignalingAddr) +} +PROTOBUF_NDEBUG_INLINE SignalingAddr::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SignalingAddr& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + ip_(arena, from.ip_) {} + +SignalingAddr::SignalingAddr( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SignalingAddr& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SignalingAddr_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SignalingAddr* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.port_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.port_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.SignalingAddr) +} +PROTOBUF_NDEBUG_INLINE SignalingAddr::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + ip_(arena) {} + +inline void SignalingAddr::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.port_ = {}; +} +SignalingAddr::~SignalingAddr() { + // @@protoc_insertion_point(destructor:np2_structs.SignalingAddr) + SharedDtor(*this); +} +inline void SignalingAddr::SharedDtor(MessageLite& self) { + SignalingAddr& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.ip_.Destroy(); + delete this_._impl_.port_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SignalingAddr::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SignalingAddr(arena); +} +constexpr auto SignalingAddr::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(SignalingAddr), + alignof(SignalingAddr)); +} +constexpr auto SignalingAddr::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<26>{ + { + &_SignalingAddr_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SignalingAddr::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SignalingAddr::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SignalingAddr::ByteSizeLong, + &SignalingAddr::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SignalingAddr, _impl_._cached_size_), + true, + }, + "np2_structs.SignalingAddr", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<26> SignalingAddr_class_data_ = + SignalingAddr::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SignalingAddr::GetClassData() const { + return SignalingAddr_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +SignalingAddr::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SignalingAddr, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + SignalingAddr_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SignalingAddr>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // .np2_structs.uint16 port = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(SignalingAddr, _impl_.port_)}}, + // bytes ip = 1; + {::_pbi::TcParser::FastBS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(SignalingAddr, _impl_.ip_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bytes ip = 1; + {PROTOBUF_FIELD_OFFSET(SignalingAddr, _impl_.ip_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // .np2_structs.uint16 port = 2; + {PROTOBUF_FIELD_OFFSET(SignalingAddr, _impl_.port_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void SignalingAddr::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SignalingAddr) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.ip_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.port_ != nullptr); + _impl_.port_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SignalingAddr::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SignalingAddr& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SignalingAddr::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SignalingAddr& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SignalingAddr) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bytes ip = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_ip().empty()) { + const ::std::string& _s = this_._internal_ip(); + target = stream->WriteBytesMaybeAliased(1, _s, target); + } + } + + // .np2_structs.uint16 port = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.port_, this_._impl_.port_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SignalingAddr) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SignalingAddr::ByteSizeLong(const MessageLite& base) { + const SignalingAddr& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SignalingAddr::ByteSizeLong() const { + const SignalingAddr& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SignalingAddr) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // bytes ip = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_ip().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_ip()); + } + } + // .np2_structs.uint16 port = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.port_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SignalingAddr::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SignalingAddr) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_ip().empty()) { + _this->_internal_set_ip(from._internal_ip()); + } else { + if (_this->_impl_.ip_.IsDefault()) { + _this->_internal_set_ip(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.port_ != nullptr); + if (_this->_impl_.port_ == nullptr) { + _this->_impl_.port_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.port_); + } else { + _this->_impl_.port_->MergeFrom(*from._impl_.port_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SignalingAddr::CopyFrom(const SignalingAddr& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SignalingAddr) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SignalingAddr::InternalSwap(SignalingAddr* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.ip_, &other->_impl_.ip_, arena); + swap(_impl_.port_, other->_impl_.port_); +} + +// =================================================================== + +class MatchingSignalingInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MatchingSignalingInfo, _impl_._has_bits_); +}; + +MatchingSignalingInfo::MatchingSignalingInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingSignalingInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.MatchingSignalingInfo) +} +PROTOBUF_NDEBUG_INLINE MatchingSignalingInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::MatchingSignalingInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + npid_(arena, from.npid_) {} + +MatchingSignalingInfo::MatchingSignalingInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const MatchingSignalingInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingSignalingInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + MatchingSignalingInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.addr_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.addr_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.MatchingSignalingInfo) +} +PROTOBUF_NDEBUG_INLINE MatchingSignalingInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + npid_(arena) {} + +inline void MatchingSignalingInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.addr_ = {}; +} +MatchingSignalingInfo::~MatchingSignalingInfo() { + // @@protoc_insertion_point(destructor:np2_structs.MatchingSignalingInfo) + SharedDtor(*this); +} +inline void MatchingSignalingInfo::SharedDtor(MessageLite& self) { + MatchingSignalingInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.npid_.Destroy(); + delete this_._impl_.addr_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL MatchingSignalingInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) MatchingSignalingInfo(arena); +} +constexpr auto MatchingSignalingInfo::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(MatchingSignalingInfo), + alignof(MatchingSignalingInfo)); +} +constexpr auto MatchingSignalingInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<34>{ + { + &_MatchingSignalingInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &MatchingSignalingInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &MatchingSignalingInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &MatchingSignalingInfo::ByteSizeLong, + &MatchingSignalingInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(MatchingSignalingInfo, _impl_._cached_size_), + true, + }, + "np2_structs.MatchingSignalingInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<34> MatchingSignalingInfo_class_data_ = + MatchingSignalingInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +MatchingSignalingInfo::GetClassData() const { + return MatchingSignalingInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 46, 2> +MatchingSignalingInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(MatchingSignalingInfo, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + MatchingSignalingInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::MatchingSignalingInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // .np2_structs.SignalingAddr addr = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(MatchingSignalingInfo, _impl_.addr_)}}, + // string npid = 1; + {::_pbi::TcParser::FastUS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(MatchingSignalingInfo, _impl_.npid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // string npid = 1; + {PROTOBUF_FIELD_OFFSET(MatchingSignalingInfo, _impl_.npid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // .np2_structs.SignalingAddr addr = 2; + {PROTOBUF_FIELD_OFFSET(MatchingSignalingInfo, _impl_.addr_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::SignalingAddr>()}, + }}, + {{ + "\41\4\0\0\0\0\0\0" + "np2_structs.MatchingSignalingInfo" + "npid" + }}, +}; +PROTOBUF_NOINLINE void MatchingSignalingInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.MatchingSignalingInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.npid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.addr_ != nullptr); + _impl_.addr_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL MatchingSignalingInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const MatchingSignalingInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL MatchingSignalingInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const MatchingSignalingInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.MatchingSignalingInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // string npid = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + const ::std::string& _s = this_._internal_npid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.MatchingSignalingInfo.npid"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + } + + // .np2_structs.SignalingAddr addr = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.addr_, this_._impl_.addr_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.MatchingSignalingInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t MatchingSignalingInfo::ByteSizeLong(const MessageLite& base) { + const MatchingSignalingInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t MatchingSignalingInfo::ByteSizeLong() const { + const MatchingSignalingInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.MatchingSignalingInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // string npid = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_npid()); + } + } + // .np2_structs.SignalingAddr addr = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.addr_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void MatchingSignalingInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.MatchingSignalingInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_npid().empty()) { + _this->_internal_set_npid(from._internal_npid()); + } else { + if (_this->_impl_.npid_.IsDefault()) { + _this->_internal_set_npid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.addr_ != nullptr); + if (_this->_impl_.addr_ == nullptr) { + _this->_impl_.addr_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.addr_); + } else { + _this->_impl_.addr_->MergeFrom(*from._impl_.addr_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void MatchingSignalingInfo::CopyFrom(const MatchingSignalingInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.MatchingSignalingInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void MatchingSignalingInfo::InternalSwap(MatchingSignalingInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.npid_, &other->_impl_.npid_, arena); + swap(_impl_.addr_, other->_impl_.addr_); +} + +// =================================================================== + +class Matching2SignalingInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(Matching2SignalingInfo, _impl_._has_bits_); +}; + +Matching2SignalingInfo::Matching2SignalingInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, Matching2SignalingInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.Matching2SignalingInfo) +} +PROTOBUF_NDEBUG_INLINE Matching2SignalingInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::Matching2SignalingInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +Matching2SignalingInfo::Matching2SignalingInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const Matching2SignalingInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, Matching2SignalingInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + Matching2SignalingInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.member_id_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.member_id_) + : nullptr; + _impl_.addr_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.addr_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.Matching2SignalingInfo) +} +PROTOBUF_NDEBUG_INLINE Matching2SignalingInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void Matching2SignalingInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, member_id_), + 0, + offsetof(Impl_, addr_) - + offsetof(Impl_, member_id_) + + sizeof(Impl_::addr_)); +} +Matching2SignalingInfo::~Matching2SignalingInfo() { + // @@protoc_insertion_point(destructor:np2_structs.Matching2SignalingInfo) + SharedDtor(*this); +} +inline void Matching2SignalingInfo::SharedDtor(MessageLite& self) { + Matching2SignalingInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.member_id_; + delete this_._impl_.addr_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL Matching2SignalingInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) Matching2SignalingInfo(arena); +} +constexpr auto Matching2SignalingInfo::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(Matching2SignalingInfo), + alignof(Matching2SignalingInfo)); +} +constexpr auto Matching2SignalingInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<35>{ + { + &_Matching2SignalingInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &Matching2SignalingInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &Matching2SignalingInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &Matching2SignalingInfo::ByteSizeLong, + &Matching2SignalingInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(Matching2SignalingInfo, _impl_._cached_size_), + true, + }, + "np2_structs.Matching2SignalingInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<35> Matching2SignalingInfo_class_data_ = + Matching2SignalingInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +Matching2SignalingInfo::GetClassData() const { + return Matching2SignalingInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 2, 0, 2> +Matching2SignalingInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(Matching2SignalingInfo, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + Matching2SignalingInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::Matching2SignalingInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // .np2_structs.SignalingAddr addr = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 1, + PROTOBUF_FIELD_OFFSET(Matching2SignalingInfo, _impl_.addr_)}}, + // .np2_structs.uint16 member_id = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(Matching2SignalingInfo, _impl_.member_id_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint16 member_id = 1; + {PROTOBUF_FIELD_OFFSET(Matching2SignalingInfo, _impl_.member_id_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.SignalingAddr addr = 2; + {PROTOBUF_FIELD_OFFSET(Matching2SignalingInfo, _impl_.addr_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::SignalingAddr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void Matching2SignalingInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.Matching2SignalingInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.member_id_ != nullptr); + _impl_.member_id_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.addr_ != nullptr); + _impl_.addr_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL Matching2SignalingInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const Matching2SignalingInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL Matching2SignalingInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const Matching2SignalingInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.Matching2SignalingInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint16 member_id = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.member_id_, this_._impl_.member_id_->GetCachedSize(), target, + stream); + } + + // .np2_structs.SignalingAddr addr = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.addr_, this_._impl_.addr_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.Matching2SignalingInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t Matching2SignalingInfo::ByteSizeLong(const MessageLite& base) { + const Matching2SignalingInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t Matching2SignalingInfo::ByteSizeLong() const { + const Matching2SignalingInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.Matching2SignalingInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.uint16 member_id = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.member_id_); + } + // .np2_structs.SignalingAddr addr = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.addr_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void Matching2SignalingInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.Matching2SignalingInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.member_id_ != nullptr); + if (_this->_impl_.member_id_ == nullptr) { + _this->_impl_.member_id_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.member_id_); + } else { + _this->_impl_.member_id_->MergeFrom(*from._impl_.member_id_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.addr_ != nullptr); + if (_this->_impl_.addr_ == nullptr) { + _this->_impl_.addr_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.addr_); + } else { + _this->_impl_.addr_->MergeFrom(*from._impl_.addr_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void Matching2SignalingInfo::CopyFrom(const Matching2SignalingInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.Matching2SignalingInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void Matching2SignalingInfo::InternalSwap(Matching2SignalingInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(Matching2SignalingInfo, _impl_.addr_) + + sizeof(Matching2SignalingInfo::_impl_.addr_) + - PROTOBUF_FIELD_OFFSET(Matching2SignalingInfo, _impl_.member_id_)>( + reinterpret_cast(&_impl_.member_id_), + reinterpret_cast(&other->_impl_.member_id_)); +} + +// =================================================================== + +class BinAttr::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(BinAttr, _impl_._has_bits_); +}; + +BinAttr::BinAttr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, BinAttr_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.BinAttr) +} +PROTOBUF_NDEBUG_INLINE BinAttr::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::BinAttr& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + data_(arena, from.data_) {} + +BinAttr::BinAttr( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const BinAttr& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, BinAttr_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + BinAttr* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.id_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.id_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.BinAttr) +} +PROTOBUF_NDEBUG_INLINE BinAttr::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + data_(arena) {} + +inline void BinAttr::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.id_ = {}; +} +BinAttr::~BinAttr() { + // @@protoc_insertion_point(destructor:np2_structs.BinAttr) + SharedDtor(*this); +} +inline void BinAttr::SharedDtor(MessageLite& self) { + BinAttr& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.data_.Destroy(); + delete this_._impl_.id_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL BinAttr::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) BinAttr(arena); +} +constexpr auto BinAttr::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(BinAttr), + alignof(BinAttr)); +} +constexpr auto BinAttr::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<20>{ + { + &_BinAttr_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &BinAttr::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &BinAttr::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &BinAttr::ByteSizeLong, + &BinAttr::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(BinAttr, _impl_._cached_size_), + true, + }, + "np2_structs.BinAttr", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<20> BinAttr_class_data_ = + BinAttr::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +BinAttr::GetClassData() const { + return BinAttr_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +BinAttr::_table_ = { + { + PROTOBUF_FIELD_OFFSET(BinAttr, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + BinAttr_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::BinAttr>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bytes data = 2; + {::_pbi::TcParser::FastBS1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(BinAttr, _impl_.data_)}}, + // .np2_structs.uint16 id = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(BinAttr, _impl_.id_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint16 id = 1; + {PROTOBUF_FIELD_OFFSET(BinAttr, _impl_.id_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // bytes data = 2; + {PROTOBUF_FIELD_OFFSET(BinAttr, _impl_.data_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void BinAttr::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.BinAttr) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.data_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.id_ != nullptr); + _impl_.id_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL BinAttr::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const BinAttr& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL BinAttr::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const BinAttr& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.BinAttr) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint16 id = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.id_, this_._impl_.id_->GetCachedSize(), target, + stream); + } + + // bytes data = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + const ::std::string& _s = this_._internal_data(); + target = stream->WriteBytesMaybeAliased(2, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.BinAttr) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t BinAttr::ByteSizeLong(const MessageLite& base) { + const BinAttr& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t BinAttr::ByteSizeLong() const { + const BinAttr& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.BinAttr) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // bytes data = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_data()); + } + } + // .np2_structs.uint16 id = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.id_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void BinAttr::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.BinAttr) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_data().empty()) { + _this->_internal_set_data(from._internal_data()); + } else { + if (_this->_impl_.data_.IsDefault()) { + _this->_internal_set_data(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.id_ != nullptr); + if (_this->_impl_.id_ == nullptr) { + _this->_impl_.id_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.id_); + } else { + _this->_impl_.id_->MergeFrom(*from._impl_.id_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void BinAttr::CopyFrom(const BinAttr& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.BinAttr) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void BinAttr::InternalSwap(BinAttr* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.data_, &other->_impl_.data_, arena); + swap(_impl_.id_, other->_impl_.id_); +} + +// =================================================================== + +class IntAttr::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(IntAttr, _impl_._has_bits_); +}; + +IntAttr::IntAttr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, IntAttr_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.IntAttr) +} +PROTOBUF_NDEBUG_INLINE IntAttr::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::IntAttr& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +IntAttr::IntAttr( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const IntAttr& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, IntAttr_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + IntAttr* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.id_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.id_) + : nullptr; + _impl_.num_ = from._impl_.num_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.IntAttr) +} +PROTOBUF_NDEBUG_INLINE IntAttr::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void IntAttr::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, id_), + 0, + offsetof(Impl_, num_) - + offsetof(Impl_, id_) + + sizeof(Impl_::num_)); +} +IntAttr::~IntAttr() { + // @@protoc_insertion_point(destructor:np2_structs.IntAttr) + SharedDtor(*this); +} +inline void IntAttr::SharedDtor(MessageLite& self) { + IntAttr& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.id_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL IntAttr::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) IntAttr(arena); +} +constexpr auto IntAttr::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(IntAttr), + alignof(IntAttr)); +} +constexpr auto IntAttr::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<20>{ + { + &_IntAttr_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &IntAttr::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &IntAttr::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &IntAttr::ByteSizeLong, + &IntAttr::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(IntAttr, _impl_._cached_size_), + true, + }, + "np2_structs.IntAttr", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<20> IntAttr_class_data_ = + IntAttr::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +IntAttr::GetClassData() const { + return IntAttr_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +IntAttr::_table_ = { + { + PROTOBUF_FIELD_OFFSET(IntAttr, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + IntAttr_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::IntAttr>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // uint32 num = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(IntAttr, _impl_.num_)}}, + // .np2_structs.uint16 id = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(IntAttr, _impl_.id_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint16 id = 1; + {PROTOBUF_FIELD_OFFSET(IntAttr, _impl_.id_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 num = 2; + {PROTOBUF_FIELD_OFFSET(IntAttr, _impl_.num_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void IntAttr::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.IntAttr) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.id_ != nullptr); + _impl_.id_->Clear(); + } + _impl_.num_ = 0u; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL IntAttr::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const IntAttr& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL IntAttr::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const IntAttr& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.IntAttr) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint16 id = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.id_, this_._impl_.id_->GetCachedSize(), target, + stream); + } + + // uint32 num = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_num() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_num(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.IntAttr) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t IntAttr::ByteSizeLong(const MessageLite& base) { + const IntAttr& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t IntAttr::ByteSizeLong() const { + const IntAttr& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.IntAttr) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.uint16 id = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.id_); + } + // uint32 num = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_num() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_num()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void IntAttr::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.IntAttr) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.id_ != nullptr); + if (_this->_impl_.id_ == nullptr) { + _this->_impl_.id_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.id_); + } else { + _this->_impl_.id_->MergeFrom(*from._impl_.id_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_num() != 0) { + _this->_impl_.num_ = from._impl_.num_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void IntAttr::CopyFrom(const IntAttr& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.IntAttr) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void IntAttr::InternalSwap(IntAttr* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(IntAttr, _impl_.num_) + + sizeof(IntAttr::_impl_.num_) + - PROTOBUF_FIELD_OFFSET(IntAttr, _impl_.id_)>( + reinterpret_cast(&_impl_.id_), + reinterpret_cast(&other->_impl_.id_)); +} + +// =================================================================== + +class RoomMemberBinAttrInternal::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomMemberBinAttrInternal, _impl_._has_bits_); +}; + +RoomMemberBinAttrInternal::RoomMemberBinAttrInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberBinAttrInternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomMemberBinAttrInternal) +} +PROTOBUF_NDEBUG_INLINE RoomMemberBinAttrInternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomMemberBinAttrInternal& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +RoomMemberBinAttrInternal::RoomMemberBinAttrInternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomMemberBinAttrInternal& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberBinAttrInternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomMemberBinAttrInternal* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.data_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.data_) + : nullptr; + _impl_.updatedate_ = from._impl_.updatedate_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomMemberBinAttrInternal) +} +PROTOBUF_NDEBUG_INLINE RoomMemberBinAttrInternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void RoomMemberBinAttrInternal::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, data_), + 0, + offsetof(Impl_, updatedate_) - + offsetof(Impl_, data_) + + sizeof(Impl_::updatedate_)); +} +RoomMemberBinAttrInternal::~RoomMemberBinAttrInternal() { + // @@protoc_insertion_point(destructor:np2_structs.RoomMemberBinAttrInternal) + SharedDtor(*this); +} +inline void RoomMemberBinAttrInternal::SharedDtor(MessageLite& self) { + RoomMemberBinAttrInternal& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.data_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomMemberBinAttrInternal::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomMemberBinAttrInternal(arena); +} +constexpr auto RoomMemberBinAttrInternal::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(RoomMemberBinAttrInternal), + alignof(RoomMemberBinAttrInternal)); +} +constexpr auto RoomMemberBinAttrInternal::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<38>{ + { + &_RoomMemberBinAttrInternal_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomMemberBinAttrInternal::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomMemberBinAttrInternal::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomMemberBinAttrInternal::ByteSizeLong, + &RoomMemberBinAttrInternal::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomMemberBinAttrInternal, _impl_._cached_size_), + true, + }, + "np2_structs.RoomMemberBinAttrInternal", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<38> RoomMemberBinAttrInternal_class_data_ = + RoomMemberBinAttrInternal::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomMemberBinAttrInternal::GetClassData() const { + return RoomMemberBinAttrInternal_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +RoomMemberBinAttrInternal::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomMemberBinAttrInternal, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomMemberBinAttrInternal_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomMemberBinAttrInternal>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // .np2_structs.BinAttr data = 2; + {::_pbi::TcParser::FastMtS1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberBinAttrInternal, _impl_.data_)}}, + // uint64 updateDate = 1; + {::_pbi::TcParser::FastV64S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberBinAttrInternal, _impl_.updatedate_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 updateDate = 1; + {PROTOBUF_FIELD_OFFSET(RoomMemberBinAttrInternal, _impl_.updatedate_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.BinAttr data = 2; + {PROTOBUF_FIELD_OFFSET(RoomMemberBinAttrInternal, _impl_.data_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomMemberBinAttrInternal::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomMemberBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.data_ != nullptr); + _impl_.data_->Clear(); + } + _impl_.updatedate_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomMemberBinAttrInternal::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomMemberBinAttrInternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomMemberBinAttrInternal::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomMemberBinAttrInternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomMemberBinAttrInternal) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 updateDate = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_updatedate() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_updatedate(), target); + } + } + + // .np2_structs.BinAttr data = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.data_, this_._impl_.data_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomMemberBinAttrInternal) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomMemberBinAttrInternal::ByteSizeLong(const MessageLite& base) { + const RoomMemberBinAttrInternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomMemberBinAttrInternal::ByteSizeLong() const { + const RoomMemberBinAttrInternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomMemberBinAttrInternal) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.BinAttr data = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.data_); + } + // uint64 updateDate = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_updatedate() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_updatedate()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomMemberBinAttrInternal::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomMemberBinAttrInternal) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.data_ != nullptr); + if (_this->_impl_.data_ == nullptr) { + _this->_impl_.data_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.data_); + } else { + _this->_impl_.data_->MergeFrom(*from._impl_.data_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_updatedate() != 0) { + _this->_impl_.updatedate_ = from._impl_.updatedate_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomMemberBinAttrInternal::CopyFrom(const RoomMemberBinAttrInternal& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomMemberBinAttrInternal) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomMemberBinAttrInternal::InternalSwap(RoomMemberBinAttrInternal* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomMemberBinAttrInternal, _impl_.updatedate_) + + sizeof(RoomMemberBinAttrInternal::_impl_.updatedate_) + - PROTOBUF_FIELD_OFFSET(RoomMemberBinAttrInternal, _impl_.data_)>( + reinterpret_cast(&_impl_.data_), + reinterpret_cast(&other->_impl_.data_)); +} + +// =================================================================== + +class BinAttrInternal::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_._has_bits_); +}; + +BinAttrInternal::BinAttrInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, BinAttrInternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.BinAttrInternal) +} +PROTOBUF_NDEBUG_INLINE BinAttrInternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::BinAttrInternal& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +BinAttrInternal::BinAttrInternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const BinAttrInternal& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, BinAttrInternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + BinAttrInternal* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.updatememberid_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.updatememberid_) + : nullptr; + _impl_.data_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.data_) + : nullptr; + _impl_.updatedate_ = from._impl_.updatedate_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.BinAttrInternal) +} +PROTOBUF_NDEBUG_INLINE BinAttrInternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void BinAttrInternal::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, updatememberid_), + 0, + offsetof(Impl_, updatedate_) - + offsetof(Impl_, updatememberid_) + + sizeof(Impl_::updatedate_)); +} +BinAttrInternal::~BinAttrInternal() { + // @@protoc_insertion_point(destructor:np2_structs.BinAttrInternal) + SharedDtor(*this); +} +inline void BinAttrInternal::SharedDtor(MessageLite& self) { + BinAttrInternal& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.updatememberid_; + delete this_._impl_.data_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL BinAttrInternal::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) BinAttrInternal(arena); +} +constexpr auto BinAttrInternal::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(BinAttrInternal), + alignof(BinAttrInternal)); +} +constexpr auto BinAttrInternal::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<28>{ + { + &_BinAttrInternal_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &BinAttrInternal::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &BinAttrInternal::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &BinAttrInternal::ByteSizeLong, + &BinAttrInternal::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_._cached_size_), + true, + }, + "np2_structs.BinAttrInternal", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<28> BinAttrInternal_class_data_ = + BinAttrInternal::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +BinAttrInternal::GetClassData() const { + return BinAttrInternal_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 2, 0, 2> +BinAttrInternal::_table_ = { + { + PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + BinAttrInternal_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::BinAttrInternal>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint64 updateDate = 1; + {::_pbi::TcParser::FastV64S1, + {8, 2, 0, + PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_.updatedate_)}}, + // .np2_structs.uint16 updateMemberId = 2; + {::_pbi::TcParser::FastMtS1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_.updatememberid_)}}, + // .np2_structs.BinAttr data = 3; + {::_pbi::TcParser::FastMtS1, + {26, 1, 1, + PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_.data_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 updateDate = 1; + {PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_.updatedate_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.uint16 updateMemberId = 2; + {PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_.updatememberid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.BinAttr data = 3; + {PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_.data_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void BinAttrInternal::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.BinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.updatememberid_ != nullptr); + _impl_.updatememberid_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.data_ != nullptr); + _impl_.data_->Clear(); + } + } + _impl_.updatedate_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL BinAttrInternal::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const BinAttrInternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL BinAttrInternal::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const BinAttrInternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.BinAttrInternal) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 updateDate = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_updatedate() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_updatedate(), target); + } + } + + // .np2_structs.uint16 updateMemberId = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.updatememberid_, this_._impl_.updatememberid_->GetCachedSize(), target, + stream); + } + + // .np2_structs.BinAttr data = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.data_, this_._impl_.data_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.BinAttrInternal) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t BinAttrInternal::ByteSizeLong(const MessageLite& base) { + const BinAttrInternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t BinAttrInternal::ByteSizeLong() const { + const BinAttrInternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.BinAttrInternal) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // .np2_structs.uint16 updateMemberId = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.updatememberid_); + } + // .np2_structs.BinAttr data = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.data_); + } + // uint64 updateDate = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_updatedate() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_updatedate()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void BinAttrInternal::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.BinAttrInternal) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.updatememberid_ != nullptr); + if (_this->_impl_.updatememberid_ == nullptr) { + _this->_impl_.updatememberid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.updatememberid_); + } else { + _this->_impl_.updatememberid_->MergeFrom(*from._impl_.updatememberid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.data_ != nullptr); + if (_this->_impl_.data_ == nullptr) { + _this->_impl_.data_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.data_); + } else { + _this->_impl_.data_->MergeFrom(*from._impl_.data_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_updatedate() != 0) { + _this->_impl_.updatedate_ = from._impl_.updatedate_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void BinAttrInternal::CopyFrom(const BinAttrInternal& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.BinAttrInternal) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void BinAttrInternal::InternalSwap(BinAttrInternal* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_.updatedate_) + + sizeof(BinAttrInternal::_impl_.updatedate_) + - PROTOBUF_FIELD_OFFSET(BinAttrInternal, _impl_.updatememberid_)>( + reinterpret_cast(&_impl_.updatememberid_), + reinterpret_cast(&other->_impl_.updatememberid_)); +} + +// =================================================================== + +class OptParam::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(OptParam, _impl_._has_bits_); +}; + +OptParam::OptParam(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, OptParam_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.OptParam) +} +PROTOBUF_NDEBUG_INLINE OptParam::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::OptParam& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +OptParam::OptParam( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const OptParam& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, OptParam_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + OptParam* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.type_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.type_) + : nullptr; + _impl_.flag_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.flag_) + : nullptr; + _impl_.hubmemberid_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.hubmemberid_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.OptParam) +} +PROTOBUF_NDEBUG_INLINE OptParam::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void OptParam::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, type_), + 0, + offsetof(Impl_, hubmemberid_) - + offsetof(Impl_, type_) + + sizeof(Impl_::hubmemberid_)); +} +OptParam::~OptParam() { + // @@protoc_insertion_point(destructor:np2_structs.OptParam) + SharedDtor(*this); +} +inline void OptParam::SharedDtor(MessageLite& self) { + OptParam& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.type_; + delete this_._impl_.flag_; + delete this_._impl_.hubmemberid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL OptParam::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) OptParam(arena); +} +constexpr auto OptParam::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(OptParam), + alignof(OptParam)); +} +constexpr auto OptParam::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<21>{ + { + &_OptParam_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &OptParam::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &OptParam::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &OptParam::ByteSizeLong, + &OptParam::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(OptParam, _impl_._cached_size_), + true, + }, + "np2_structs.OptParam", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<21> OptParam_class_data_ = + OptParam::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +OptParam::GetClassData() const { + return OptParam_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 3, 0, 2> +OptParam::_table_ = { + { + PROTOBUF_FIELD_OFFSET(OptParam, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + OptParam_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::OptParam>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.uint8 type = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(OptParam, _impl_.type_)}}, + // .np2_structs.uint8 flag = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 1, + PROTOBUF_FIELD_OFFSET(OptParam, _impl_.flag_)}}, + // .np2_structs.uint16 hubMemberId = 3; + {::_pbi::TcParser::FastMtS1, + {26, 2, 2, + PROTOBUF_FIELD_OFFSET(OptParam, _impl_.hubmemberid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint8 type = 1; + {PROTOBUF_FIELD_OFFSET(OptParam, _impl_.type_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint8 flag = 2; + {PROTOBUF_FIELD_OFFSET(OptParam, _impl_.flag_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint16 hubMemberId = 3; + {PROTOBUF_FIELD_OFFSET(OptParam, _impl_.hubmemberid_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void OptParam::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.OptParam) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.type_ != nullptr); + _impl_.type_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.flag_ != nullptr); + _impl_.flag_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.hubmemberid_ != nullptr); + _impl_.hubmemberid_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL OptParam::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const OptParam& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL OptParam::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const OptParam& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.OptParam) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint8 type = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.type_, this_._impl_.type_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint8 flag = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.flag_, this_._impl_.flag_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint16 hubMemberId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.hubmemberid_, this_._impl_.hubmemberid_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.OptParam) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t OptParam::ByteSizeLong(const MessageLite& base) { + const OptParam& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t OptParam::ByteSizeLong() const { + const OptParam& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.OptParam) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // .np2_structs.uint8 type = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.type_); + } + // .np2_structs.uint8 flag = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.flag_); + } + // .np2_structs.uint16 hubMemberId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.hubmemberid_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void OptParam::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.OptParam) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.type_ != nullptr); + if (_this->_impl_.type_ == nullptr) { + _this->_impl_.type_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.type_); + } else { + _this->_impl_.type_->MergeFrom(*from._impl_.type_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.flag_ != nullptr); + if (_this->_impl_.flag_ == nullptr) { + _this->_impl_.flag_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.flag_); + } else { + _this->_impl_.flag_->MergeFrom(*from._impl_.flag_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.hubmemberid_ != nullptr); + if (_this->_impl_.hubmemberid_ == nullptr) { + _this->_impl_.hubmemberid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.hubmemberid_); + } else { + _this->_impl_.hubmemberid_->MergeFrom(*from._impl_.hubmemberid_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void OptParam::CopyFrom(const OptParam& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.OptParam) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void OptParam::InternalSwap(OptParam* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(OptParam, _impl_.hubmemberid_) + + sizeof(OptParam::_impl_.hubmemberid_) + - PROTOBUF_FIELD_OFFSET(OptParam, _impl_.type_)>( + reinterpret_cast(&_impl_.type_), + reinterpret_cast(&other->_impl_.type_)); +} + +// =================================================================== + +class GroupConfig::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_._has_bits_); +}; + +GroupConfig::GroupConfig(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GroupConfig_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GroupConfig) +} +PROTOBUF_NDEBUG_INLINE GroupConfig::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GroupConfig& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + label_(arena, from.label_) {} + +GroupConfig::GroupConfig( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GroupConfig& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GroupConfig_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GroupConfig* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, slotnum_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, slotnum_), + offsetof(Impl_, withpassword_) - + offsetof(Impl_, slotnum_) + + sizeof(Impl_::withpassword_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.GroupConfig) +} +PROTOBUF_NDEBUG_INLINE GroupConfig::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + label_(arena) {} + +inline void GroupConfig::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, slotnum_), + 0, + offsetof(Impl_, withpassword_) - + offsetof(Impl_, slotnum_) + + sizeof(Impl_::withpassword_)); +} +GroupConfig::~GroupConfig() { + // @@protoc_insertion_point(destructor:np2_structs.GroupConfig) + SharedDtor(*this); +} +inline void GroupConfig::SharedDtor(MessageLite& self) { + GroupConfig& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.label_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GroupConfig::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GroupConfig(arena); +} +constexpr auto GroupConfig::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(GroupConfig), + alignof(GroupConfig)); +} +constexpr auto GroupConfig::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<24>{ + { + &_GroupConfig_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GroupConfig::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GroupConfig::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GroupConfig::ByteSizeLong, + &GroupConfig::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_._cached_size_), + true, + }, + "np2_structs.GroupConfig", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<24> GroupConfig_class_data_ = + GroupConfig::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GroupConfig::GetClassData() const { + return GroupConfig_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 0, 0, 2> +GroupConfig::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + GroupConfig_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GroupConfig>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 slotNum = 1; + {::_pbi::TcParser::FastV32S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_.slotnum_)}}, + // bytes label = 2; + {::_pbi::TcParser::FastBS1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_.label_)}}, + // bool withPassword = 3; + {::_pbi::TcParser::FastV8S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_.withpassword_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 slotNum = 1; + {PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_.slotnum_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // bytes label = 2; + {PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_.label_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // bool withPassword = 3; + {PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_.withpassword_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void GroupConfig::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GroupConfig) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.label_.ClearNonDefaultToEmpty(); + } + if (BatchCheckHasBit(cached_has_bits, 0x00000006U)) { + ::memset(&_impl_.slotnum_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.withpassword_) - + reinterpret_cast(&_impl_.slotnum_)) + sizeof(_impl_.withpassword_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GroupConfig::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GroupConfig& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GroupConfig::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GroupConfig& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GroupConfig) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 slotNum = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_slotnum() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_slotnum(), target); + } + } + + // bytes label = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_label().empty()) { + const ::std::string& _s = this_._internal_label(); + target = stream->WriteBytesMaybeAliased(2, _s, target); + } + } + + // bool withPassword = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_withpassword() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 3, this_._internal_withpassword(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GroupConfig) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GroupConfig::ByteSizeLong(const MessageLite& base) { + const GroupConfig& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GroupConfig::ByteSizeLong() const { + const GroupConfig& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GroupConfig) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // bytes label = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_label().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_label()); + } + } + // uint32 slotNum = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_slotnum() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_slotnum()); + } + } + // bool withPassword = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_withpassword() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GroupConfig::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GroupConfig) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_label().empty()) { + _this->_internal_set_label(from._internal_label()); + } else { + if (_this->_impl_.label_.IsDefault()) { + _this->_internal_set_label(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_slotnum() != 0) { + _this->_impl_.slotnum_ = from._impl_.slotnum_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_withpassword() != 0) { + _this->_impl_.withpassword_ = from._impl_.withpassword_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GroupConfig::CopyFrom(const GroupConfig& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GroupConfig) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GroupConfig::InternalSwap(GroupConfig* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.label_, &other->_impl_.label_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_.withpassword_) + + sizeof(GroupConfig::_impl_.withpassword_) + - PROTOBUF_FIELD_OFFSET(GroupConfig, _impl_.slotnum_)>( + reinterpret_cast(&_impl_.slotnum_), + reinterpret_cast(&other->_impl_.slotnum_)); +} + +// =================================================================== + +class UserInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(UserInfo, _impl_._has_bits_); +}; + +UserInfo::UserInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, UserInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.UserInfo) +} +PROTOBUF_NDEBUG_INLINE UserInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::UserInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + npid_(arena, from.npid_), + onlinename_(arena, from.onlinename_), + avatarurl_(arena, from.avatarurl_) {} + +UserInfo::UserInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const UserInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, UserInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + UserInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.UserInfo) +} +PROTOBUF_NDEBUG_INLINE UserInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + npid_(arena), + onlinename_(arena), + avatarurl_(arena) {} + +inline void UserInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +UserInfo::~UserInfo() { + // @@protoc_insertion_point(destructor:np2_structs.UserInfo) + SharedDtor(*this); +} +inline void UserInfo::SharedDtor(MessageLite& self) { + UserInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.npid_.Destroy(); + this_._impl_.onlinename_.Destroy(); + this_._impl_.avatarurl_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL UserInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) UserInfo(arena); +} +constexpr auto UserInfo::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(UserInfo), + alignof(UserInfo)); +} +constexpr auto UserInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<21>{ + { + &_UserInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &UserInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &UserInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &UserInfo::ByteSizeLong, + &UserInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(UserInfo, _impl_._cached_size_), + true, + }, + "np2_structs.UserInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<21> UserInfo_class_data_ = + UserInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +UserInfo::GetClassData() const { + return UserInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 0, 52, 2> +UserInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(UserInfo, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + UserInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::UserInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // string npId = 1; + {::_pbi::TcParser::FastUS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(UserInfo, _impl_.npid_)}}, + // string onlineName = 2; + {::_pbi::TcParser::FastUS1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(UserInfo, _impl_.onlinename_)}}, + // string avatarUrl = 3; + {::_pbi::TcParser::FastUS1, + {26, 2, 0, + PROTOBUF_FIELD_OFFSET(UserInfo, _impl_.avatarurl_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // string npId = 1; + {PROTOBUF_FIELD_OFFSET(UserInfo, _impl_.npid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // string onlineName = 2; + {PROTOBUF_FIELD_OFFSET(UserInfo, _impl_.onlinename_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // string avatarUrl = 3; + {PROTOBUF_FIELD_OFFSET(UserInfo, _impl_.avatarurl_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + }}, + // no aux_entries + {{ + "\24\4\12\11\0\0\0\0" + "np2_structs.UserInfo" + "npId" + "onlineName" + "avatarUrl" + }}, +}; +PROTOBUF_NOINLINE void UserInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.UserInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.npid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.onlinename_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + _impl_.avatarurl_.ClearNonDefaultToEmpty(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL UserInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const UserInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL UserInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const UserInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.UserInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // string npId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + const ::std::string& _s = this_._internal_npid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.UserInfo.npId"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + } + + // string onlineName = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_onlinename().empty()) { + const ::std::string& _s = this_._internal_onlinename(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.UserInfo.onlineName"); + target = stream->WriteStringMaybeAliased(2, _s, target); + } + } + + // string avatarUrl = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_avatarurl().empty()) { + const ::std::string& _s = this_._internal_avatarurl(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.UserInfo.avatarUrl"); + target = stream->WriteStringMaybeAliased(3, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.UserInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t UserInfo::ByteSizeLong(const MessageLite& base) { + const UserInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t UserInfo::ByteSizeLong() const { + const UserInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.UserInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // string npId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_npid()); + } + } + // string onlineName = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_onlinename().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_onlinename()); + } + } + // string avatarUrl = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_avatarurl().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_avatarurl()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void UserInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.UserInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_npid().empty()) { + _this->_internal_set_npid(from._internal_npid()); + } else { + if (_this->_impl_.npid_.IsDefault()) { + _this->_internal_set_npid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_onlinename().empty()) { + _this->_internal_set_onlinename(from._internal_onlinename()); + } else { + if (_this->_impl_.onlinename_.IsDefault()) { + _this->_internal_set_onlinename(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!from._internal_avatarurl().empty()) { + _this->_internal_set_avatarurl(from._internal_avatarurl()); + } else { + if (_this->_impl_.avatarurl_.IsDefault()) { + _this->_internal_set_avatarurl(""); + } + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void UserInfo::CopyFrom(const UserInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.UserInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void UserInfo::InternalSwap(UserInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.npid_, &other->_impl_.npid_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.onlinename_, &other->_impl_.onlinename_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.avatarurl_, &other->_impl_.avatarurl_, arena); +} + +// =================================================================== + +class RoomMemberDataInternal::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_._has_bits_); +}; + +RoomMemberDataInternal::RoomMemberDataInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberDataInternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomMemberDataInternal) +} +PROTOBUF_NDEBUG_INLINE RoomMemberDataInternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomMemberDataInternal& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + roommemberbinattrinternal_{visibility, arena, from.roommemberbinattrinternal_} {} + +RoomMemberDataInternal::RoomMemberDataInternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomMemberDataInternal& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberDataInternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomMemberDataInternal* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.userinfo_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.userinfo_) + : nullptr; + _impl_.teamid_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.teamid_) + : nullptr; + _impl_.roomgroup_ = (CheckHasBit(cached_has_bits, 0x00000008U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.roomgroup_) + : nullptr; + _impl_.nattype_ = (CheckHasBit(cached_has_bits, 0x00000010U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.nattype_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, joindate_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, joindate_), + offsetof(Impl_, flagattr_) - + offsetof(Impl_, joindate_) + + sizeof(Impl_::flagattr_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomMemberDataInternal) +} +PROTOBUF_NDEBUG_INLINE RoomMemberDataInternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + roommemberbinattrinternal_{visibility, arena} {} + +inline void RoomMemberDataInternal::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, userinfo_), + 0, + offsetof(Impl_, flagattr_) - + offsetof(Impl_, userinfo_) + + sizeof(Impl_::flagattr_)); +} +RoomMemberDataInternal::~RoomMemberDataInternal() { + // @@protoc_insertion_point(destructor:np2_structs.RoomMemberDataInternal) + SharedDtor(*this); +} +inline void RoomMemberDataInternal::SharedDtor(MessageLite& self) { + RoomMemberDataInternal& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.userinfo_; + delete this_._impl_.teamid_; + delete this_._impl_.roomgroup_; + delete this_._impl_.nattype_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomMemberDataInternal::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomMemberDataInternal(arena); +} +constexpr auto RoomMemberDataInternal::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.roommemberbinattrinternal_) + + decltype(RoomMemberDataInternal::_impl_.roommemberbinattrinternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(RoomMemberDataInternal), alignof(RoomMemberDataInternal), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&RoomMemberDataInternal::PlacementNew_, + sizeof(RoomMemberDataInternal), + alignof(RoomMemberDataInternal)); + } +} +constexpr auto RoomMemberDataInternal::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<35>{ + { + &_RoomMemberDataInternal_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomMemberDataInternal::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomMemberDataInternal::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomMemberDataInternal::ByteSizeLong, + &RoomMemberDataInternal::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_._cached_size_), + true, + }, + "np2_structs.RoomMemberDataInternal", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<35> RoomMemberDataInternal_class_data_ = + RoomMemberDataInternal::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomMemberDataInternal::GetClassData() const { + return RoomMemberDataInternal_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 8, 5, 0, 2> +RoomMemberDataInternal::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_._has_bits_), + 0, // no _extensions_ + 8, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967040, // skipmap + offsetof(decltype(_table_), field_entries), + 8, // num_field_entries + 5, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomMemberDataInternal_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomMemberDataInternal>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.RoomMemberBinAttrInternal roomMemberBinAttrInternal = 8; + {::_pbi::TcParser::FastMtR1, + {66, 0, 4, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.roommemberbinattrinternal_)}}, + // .np2_structs.UserInfo userInfo = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.userinfo_)}}, + // uint64 joinDate = 2; + {::_pbi::TcParser::FastV64S1, + {16, 5, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.joindate_)}}, + // uint32 memberId = 3; + {::_pbi::TcParser::FastV32S1, + {24, 6, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.memberid_)}}, + // .np2_structs.uint8 teamId = 4; + {::_pbi::TcParser::FastMtS1, + {34, 2, 1, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.teamid_)}}, + // .np2_structs.RoomGroup roomGroup = 5; + {::_pbi::TcParser::FastMtS1, + {42, 3, 2, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.roomgroup_)}}, + // .np2_structs.uint8 natType = 6; + {::_pbi::TcParser::FastMtS1, + {50, 4, 3, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.nattype_)}}, + // uint32 flagAttr = 7; + {::_pbi::TcParser::FastV32S1, + {56, 7, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.flagattr_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.UserInfo userInfo = 1; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.userinfo_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint64 joinDate = 2; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.joindate_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint32 memberId = 3; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.memberid_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // .np2_structs.uint8 teamId = 4; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.teamid_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.RoomGroup roomGroup = 5; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.roomgroup_), _Internal::kHasBitsOffset + 3, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint8 natType = 6; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.nattype_), _Internal::kHasBitsOffset + 4, 3, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 flagAttr = 7; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.flagattr_), _Internal::kHasBitsOffset + 7, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.RoomMemberBinAttrInternal roomMemberBinAttrInternal = 8; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.roommemberbinattrinternal_), _Internal::kHasBitsOffset + 0, 4, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::UserInfo>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::RoomGroup>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::RoomMemberBinAttrInternal>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomMemberDataInternal::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomMemberDataInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.roommemberbinattrinternal_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.userinfo_ != nullptr); + _impl_.userinfo_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.teamid_ != nullptr); + _impl_.teamid_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(_impl_.roomgroup_ != nullptr); + _impl_.roomgroup_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(_impl_.nattype_ != nullptr); + _impl_.nattype_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x000000e0U)) { + ::memset(&_impl_.joindate_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.flagattr_) - + reinterpret_cast(&_impl_.joindate_)) + sizeof(_impl_.flagattr_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomMemberDataInternal::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomMemberDataInternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomMemberDataInternal::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomMemberDataInternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomMemberDataInternal) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.UserInfo userInfo = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.userinfo_, this_._impl_.userinfo_->GetCachedSize(), target, + stream); + } + + // uint64 joinDate = 2; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_joindate() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 2, this_._internal_joindate(), target); + } + } + + // uint32 memberId = 3; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_memberid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 3, this_._internal_memberid(), target); + } + } + + // .np2_structs.uint8 teamId = 4; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, *this_._impl_.teamid_, this_._impl_.teamid_->GetCachedSize(), target, + stream); + } + + // .np2_structs.RoomGroup roomGroup = 5; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 5, *this_._impl_.roomgroup_, this_._impl_.roomgroup_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint8 natType = 6; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 6, *this_._impl_.nattype_, this_._impl_.nattype_->GetCachedSize(), target, + stream); + } + + // uint32 flagAttr = 7; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (this_._internal_flagattr() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 7, this_._internal_flagattr(), target); + } + } + + // repeated .np2_structs.RoomMemberBinAttrInternal roomMemberBinAttrInternal = 8; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roommemberbinattrinternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roommemberbinattrinternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 8, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomMemberDataInternal) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomMemberDataInternal::ByteSizeLong(const MessageLite& base) { + const RoomMemberDataInternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomMemberDataInternal::ByteSizeLong() const { + const RoomMemberDataInternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomMemberDataInternal) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + // repeated .np2_structs.RoomMemberBinAttrInternal roomMemberBinAttrInternal = 8; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_roommemberbinattrinternal_size(); + for (const auto& msg : this_._internal_roommemberbinattrinternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // .np2_structs.UserInfo userInfo = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.userinfo_); + } + // .np2_structs.uint8 teamId = 4; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.teamid_); + } + // .np2_structs.RoomGroup roomGroup = 5; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.roomgroup_); + } + // .np2_structs.uint8 natType = 6; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.nattype_); + } + // uint64 joinDate = 2; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_joindate() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_joindate()); + } + } + // uint32 memberId = 3; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_memberid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_memberid()); + } + } + // uint32 flagAttr = 7; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (this_._internal_flagattr() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_flagattr()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomMemberDataInternal::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomMemberDataInternal) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_roommemberbinattrinternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roommemberbinattrinternal()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.userinfo_ != nullptr); + if (_this->_impl_.userinfo_ == nullptr) { + _this->_impl_.userinfo_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.userinfo_); + } else { + _this->_impl_.userinfo_->MergeFrom(*from._impl_.userinfo_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.teamid_ != nullptr); + if (_this->_impl_.teamid_ == nullptr) { + _this->_impl_.teamid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.teamid_); + } else { + _this->_impl_.teamid_->MergeFrom(*from._impl_.teamid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(from._impl_.roomgroup_ != nullptr); + if (_this->_impl_.roomgroup_ == nullptr) { + _this->_impl_.roomgroup_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.roomgroup_); + } else { + _this->_impl_.roomgroup_->MergeFrom(*from._impl_.roomgroup_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(from._impl_.nattype_ != nullptr); + if (_this->_impl_.nattype_ == nullptr) { + _this->_impl_.nattype_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.nattype_); + } else { + _this->_impl_.nattype_->MergeFrom(*from._impl_.nattype_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (from._internal_joindate() != 0) { + _this->_impl_.joindate_ = from._impl_.joindate_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (from._internal_memberid() != 0) { + _this->_impl_.memberid_ = from._impl_.memberid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (from._internal_flagattr() != 0) { + _this->_impl_.flagattr_ = from._impl_.flagattr_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomMemberDataInternal::CopyFrom(const RoomMemberDataInternal& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomMemberDataInternal) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomMemberDataInternal::InternalSwap(RoomMemberDataInternal* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.roommemberbinattrinternal_.InternalSwap(&other->_impl_.roommemberbinattrinternal_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.flagattr_) + + sizeof(RoomMemberDataInternal::_impl_.flagattr_) + - PROTOBUF_FIELD_OFFSET(RoomMemberDataInternal, _impl_.userinfo_)>( + reinterpret_cast(&_impl_.userinfo_), + reinterpret_cast(&other->_impl_.userinfo_)); +} + +// =================================================================== + +class RoomGroup::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_._has_bits_); +}; + +RoomGroup::RoomGroup(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomGroup_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomGroup) +} +PROTOBUF_NDEBUG_INLINE RoomGroup::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomGroup& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + label_(arena, from.label_) {} + +RoomGroup::RoomGroup( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomGroup& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomGroup_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomGroup* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.groupid_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.groupid_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, withpassword_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, withpassword_), + offsetof(Impl_, curgroupmembernum_) - + offsetof(Impl_, withpassword_) + + sizeof(Impl_::curgroupmembernum_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomGroup) +} +PROTOBUF_NDEBUG_INLINE RoomGroup::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + label_(arena) {} + +inline void RoomGroup::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, groupid_), + 0, + offsetof(Impl_, curgroupmembernum_) - + offsetof(Impl_, groupid_) + + sizeof(Impl_::curgroupmembernum_)); +} +RoomGroup::~RoomGroup() { + // @@protoc_insertion_point(destructor:np2_structs.RoomGroup) + SharedDtor(*this); +} +inline void RoomGroup::SharedDtor(MessageLite& self) { + RoomGroup& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.label_.Destroy(); + delete this_._impl_.groupid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomGroup::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomGroup(arena); +} +constexpr auto RoomGroup::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(RoomGroup), + alignof(RoomGroup)); +} +constexpr auto RoomGroup::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<22>{ + { + &_RoomGroup_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomGroup::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomGroup::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomGroup::ByteSizeLong, + &RoomGroup::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_._cached_size_), + true, + }, + "np2_structs.RoomGroup", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<22> RoomGroup_class_data_ = + RoomGroup::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomGroup::GetClassData() const { + return RoomGroup_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 1, 0, 2> +RoomGroup::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomGroup_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomGroup>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.uint8 groupId = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.groupid_)}}, + // bool withPassword = 2; + {::_pbi::TcParser::FastV8S1, + {16, 2, 0, + PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.withpassword_)}}, + // bytes label = 3; + {::_pbi::TcParser::FastBS1, + {26, 0, 0, + PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.label_)}}, + // uint32 slotNum = 4; + {::_pbi::TcParser::FastV32S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.slotnum_)}}, + // uint32 curGroupMemberNum = 5; + {::_pbi::TcParser::FastV32S1, + {40, 4, 0, + PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.curgroupmembernum_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint8 groupId = 1; + {PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.groupid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // bool withPassword = 2; + {PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.withpassword_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // bytes label = 3; + {PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.label_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // uint32 slotNum = 4; + {PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.slotnum_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 curGroupMemberNum = 5; + {PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.curgroupmembernum_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomGroup::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomGroup) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.label_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.groupid_ != nullptr); + _impl_.groupid_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000001cU)) { + ::memset(&_impl_.withpassword_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.curgroupmembernum_) - + reinterpret_cast(&_impl_.withpassword_)) + sizeof(_impl_.curgroupmembernum_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomGroup::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomGroup& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomGroup::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomGroup& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomGroup) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint8 groupId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.groupid_, this_._impl_.groupid_->GetCachedSize(), target, + stream); + } + + // bool withPassword = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_withpassword() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 2, this_._internal_withpassword(), target); + } + } + + // bytes label = 3; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_label().empty()) { + const ::std::string& _s = this_._internal_label(); + target = stream->WriteBytesMaybeAliased(3, _s, target); + } + } + + // uint32 slotNum = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_slotnum() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 4, this_._internal_slotnum(), target); + } + } + + // uint32 curGroupMemberNum = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_curgroupmembernum() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 5, this_._internal_curgroupmembernum(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomGroup) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomGroup::ByteSizeLong(const MessageLite& base) { + const RoomGroup& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomGroup::ByteSizeLong() const { + const RoomGroup& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomGroup) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // bytes label = 3; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_label().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_label()); + } + } + // .np2_structs.uint8 groupId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.groupid_); + } + // bool withPassword = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_withpassword() != 0) { + total_size += 2; + } + } + // uint32 slotNum = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_slotnum() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_slotnum()); + } + } + // uint32 curGroupMemberNum = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_curgroupmembernum() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_curgroupmembernum()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomGroup::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomGroup) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_label().empty()) { + _this->_internal_set_label(from._internal_label()); + } else { + if (_this->_impl_.label_.IsDefault()) { + _this->_internal_set_label(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.groupid_ != nullptr); + if (_this->_impl_.groupid_ == nullptr) { + _this->_impl_.groupid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.groupid_); + } else { + _this->_impl_.groupid_->MergeFrom(*from._impl_.groupid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_withpassword() != 0) { + _this->_impl_.withpassword_ = from._impl_.withpassword_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_slotnum() != 0) { + _this->_impl_.slotnum_ = from._impl_.slotnum_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_curgroupmembernum() != 0) { + _this->_impl_.curgroupmembernum_ = from._impl_.curgroupmembernum_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomGroup::CopyFrom(const RoomGroup& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomGroup) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomGroup::InternalSwap(RoomGroup* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.label_, &other->_impl_.label_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.curgroupmembernum_) + + sizeof(RoomGroup::_impl_.curgroupmembernum_) + - PROTOBUF_FIELD_OFFSET(RoomGroup, _impl_.groupid_)>( + reinterpret_cast(&_impl_.groupid_), + reinterpret_cast(&other->_impl_.groupid_)); +} + +// =================================================================== + +class RoomDataInternal::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_._has_bits_); +}; + +RoomDataInternal::RoomDataInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomDataInternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomDataInternal) +} +PROTOBUF_NDEBUG_INLINE RoomDataInternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomDataInternal& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + memberlist_{visibility, arena, from.memberlist_}, + roomgroup_{visibility, arena, from.roomgroup_}, + roombinattrinternal_{visibility, arena, from.roombinattrinternal_} {} + +RoomDataInternal::RoomDataInternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomDataInternal& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomDataInternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomDataInternal* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.serverid_ = (CheckHasBit(cached_has_bits, 0x00000008U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.serverid_) + : nullptr; + _impl_.ownerid_ = (CheckHasBit(cached_has_bits, 0x00000010U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.ownerid_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, lobbyid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, lobbyid_), + offsetof(Impl_, flagattr_) - + offsetof(Impl_, lobbyid_) + + sizeof(Impl_::flagattr_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomDataInternal) +} +PROTOBUF_NDEBUG_INLINE RoomDataInternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + memberlist_{visibility, arena}, + roomgroup_{visibility, arena}, + roombinattrinternal_{visibility, arena} {} + +inline void RoomDataInternal::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, serverid_), + 0, + offsetof(Impl_, flagattr_) - + offsetof(Impl_, serverid_) + + sizeof(Impl_::flagattr_)); +} +RoomDataInternal::~RoomDataInternal() { + // @@protoc_insertion_point(destructor:np2_structs.RoomDataInternal) + SharedDtor(*this); +} +inline void RoomDataInternal::SharedDtor(MessageLite& self) { + RoomDataInternal& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.serverid_; + delete this_._impl_.ownerid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomDataInternal::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomDataInternal(arena); +} +constexpr auto RoomDataInternal::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.memberlist_) + + decltype(RoomDataInternal::_impl_.memberlist_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.roomgroup_) + + decltype(RoomDataInternal::_impl_.roomgroup_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.roombinattrinternal_) + + decltype(RoomDataInternal::_impl_.roombinattrinternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(RoomDataInternal), alignof(RoomDataInternal), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&RoomDataInternal::PlacementNew_, + sizeof(RoomDataInternal), + alignof(RoomDataInternal)); + } +} +constexpr auto RoomDataInternal::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<29>{ + { + &_RoomDataInternal_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomDataInternal::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomDataInternal::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomDataInternal::ByteSizeLong, + &RoomDataInternal::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_._cached_size_), + true, + }, + "np2_structs.RoomDataInternal", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<29> RoomDataInternal_class_data_ = + RoomDataInternal::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomDataInternal::GetClassData() const { + return RoomDataInternal_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<4, 11, 5, 0, 2> +RoomDataInternal::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_._has_bits_), + 0, // no _extensions_ + 11, 120, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294965248, // skipmap + offsetof(decltype(_table_), field_entries), + 11, // num_field_entries + 5, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomDataInternal_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomDataInternal>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.uint16 serverId = 1; + {::_pbi::TcParser::FastMtS1, + {10, 3, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.serverid_)}}, + // uint32 worldId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 7, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.worldid_)}}, + // uint64 lobbyId = 3; + {::_pbi::TcParser::FastV64S1, + {24, 5, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.lobbyid_)}}, + // uint64 roomId = 4; + {::_pbi::TcParser::FastV64S1, + {32, 6, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.roomid_)}}, + // uint64 passwordSlotMask = 5; + {::_pbi::TcParser::FastV64S1, + {40, 9, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.passwordslotmask_)}}, + // uint32 maxSlot = 6; + {::_pbi::TcParser::FastV32S1, + {48, 8, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.maxslot_)}}, + // repeated .np2_structs.RoomMemberDataInternal memberList = 7; + {::_pbi::TcParser::FastMtR1, + {58, 0, 1, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.memberlist_)}}, + // .np2_structs.uint16 ownerId = 8; + {::_pbi::TcParser::FastMtS1, + {66, 4, 2, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.ownerid_)}}, + // repeated .np2_structs.RoomGroup roomGroup = 9; + {::_pbi::TcParser::FastMtR1, + {74, 1, 3, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.roomgroup_)}}, + // uint32 flagAttr = 10; + {::_pbi::TcParser::FastV32S1, + {80, 10, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.flagattr_)}}, + // repeated .np2_structs.BinAttrInternal roomBinAttrInternal = 11; + {::_pbi::TcParser::FastMtR1, + {90, 2, 4, + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.roombinattrinternal_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint16 serverId = 1; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.serverid_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 worldId = 2; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.worldid_), _Internal::kHasBitsOffset + 7, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint64 lobbyId = 3; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.lobbyid_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint64 roomId = 4; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.roomid_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint64 passwordSlotMask = 5; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.passwordslotmask_), _Internal::kHasBitsOffset + 9, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint32 maxSlot = 6; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.maxslot_), _Internal::kHasBitsOffset + 8, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.RoomMemberDataInternal memberList = 7; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.memberlist_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint16 ownerId = 8; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.ownerid_), _Internal::kHasBitsOffset + 4, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.RoomGroup roomGroup = 9; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.roomgroup_), _Internal::kHasBitsOffset + 1, 3, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 flagAttr = 10; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.flagattr_), _Internal::kHasBitsOffset + 10, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.BinAttrInternal roomBinAttrInternal = 11; + {PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.roombinattrinternal_), _Internal::kHasBitsOffset + 2, 4, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::RoomMemberDataInternal>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::RoomGroup>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttrInternal>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomDataInternal::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomDataInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.memberlist_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.roomgroup_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _impl_.roombinattrinternal_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(_impl_.serverid_ != nullptr); + _impl_.serverid_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(_impl_.ownerid_ != nullptr); + _impl_.ownerid_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x000000e0U)) { + ::memset(&_impl_.lobbyid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.worldid_) - + reinterpret_cast(&_impl_.lobbyid_)) + sizeof(_impl_.worldid_)); + } + if (BatchCheckHasBit(cached_has_bits, 0x00000700U)) { + ::memset(&_impl_.maxslot_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.flagattr_) - + reinterpret_cast(&_impl_.maxslot_)) + sizeof(_impl_.flagattr_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomDataInternal::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomDataInternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomDataInternal::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomDataInternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomDataInternal) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint16 serverId = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.serverid_, this_._impl_.serverid_->GetCachedSize(), target, + stream); + } + + // uint32 worldId = 2; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (this_._internal_worldid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_worldid(), target); + } + } + + // uint64 lobbyId = 3; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_lobbyid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 3, this_._internal_lobbyid(), target); + } + } + + // uint64 roomId = 4; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 4, this_._internal_roomid(), target); + } + } + + // uint64 passwordSlotMask = 5; + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + if (this_._internal_passwordslotmask() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 5, this_._internal_passwordslotmask(), target); + } + } + + // uint32 maxSlot = 6; + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + if (this_._internal_maxslot() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 6, this_._internal_maxslot(), target); + } + } + + // repeated .np2_structs.RoomMemberDataInternal memberList = 7; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_memberlist_size()); + i < n; i++) { + const auto& repfield = this_._internal_memberlist().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 7, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // .np2_structs.uint16 ownerId = 8; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 8, *this_._impl_.ownerid_, this_._impl_.ownerid_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.RoomGroup roomGroup = 9; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roomgroup_size()); + i < n; i++) { + const auto& repfield = this_._internal_roomgroup().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 9, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // uint32 flagAttr = 10; + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + if (this_._internal_flagattr() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 10, this_._internal_flagattr(), target); + } + } + + // repeated .np2_structs.BinAttrInternal roomBinAttrInternal = 11; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roombinattrinternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roombinattrinternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 11, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomDataInternal) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomDataInternal::ByteSizeLong(const MessageLite& base) { + const RoomDataInternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomDataInternal::ByteSizeLong() const { + const RoomDataInternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomDataInternal) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + // repeated .np2_structs.RoomMemberDataInternal memberList = 7; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_memberlist_size(); + for (const auto& msg : this_._internal_memberlist()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.RoomGroup roomGroup = 9; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += 1UL * this_._internal_roomgroup_size(); + for (const auto& msg : this_._internal_roomgroup()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.BinAttrInternal roomBinAttrInternal = 11; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + total_size += 1UL * this_._internal_roombinattrinternal_size(); + for (const auto& msg : this_._internal_roombinattrinternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // .np2_structs.uint16 serverId = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.serverid_); + } + // .np2_structs.uint16 ownerId = 8; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.ownerid_); + } + // uint64 lobbyId = 3; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_lobbyid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_lobbyid()); + } + } + // uint64 roomId = 4; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + // uint32 worldId = 2; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (this_._internal_worldid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_worldid()); + } + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000700U)) { + // uint32 maxSlot = 6; + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + if (this_._internal_maxslot() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_maxslot()); + } + } + // uint64 passwordSlotMask = 5; + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + if (this_._internal_passwordslotmask() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_passwordslotmask()); + } + } + // uint32 flagAttr = 10; + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + if (this_._internal_flagattr() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_flagattr()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomDataInternal::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomDataInternal) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_memberlist()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_memberlist()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_roomgroup()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roomgroup()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _this->_internal_mutable_roombinattrinternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roombinattrinternal()); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(from._impl_.serverid_ != nullptr); + if (_this->_impl_.serverid_ == nullptr) { + _this->_impl_.serverid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.serverid_); + } else { + _this->_impl_.serverid_->MergeFrom(*from._impl_.serverid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(from._impl_.ownerid_ != nullptr); + if (_this->_impl_.ownerid_ == nullptr) { + _this->_impl_.ownerid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.ownerid_); + } else { + _this->_impl_.ownerid_->MergeFrom(*from._impl_.ownerid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (from._internal_lobbyid() != 0) { + _this->_impl_.lobbyid_ = from._impl_.lobbyid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (from._internal_worldid() != 0) { + _this->_impl_.worldid_ = from._impl_.worldid_; + } + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000700U)) { + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + if (from._internal_maxslot() != 0) { + _this->_impl_.maxslot_ = from._impl_.maxslot_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + if (from._internal_passwordslotmask() != 0) { + _this->_impl_.passwordslotmask_ = from._impl_.passwordslotmask_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + if (from._internal_flagattr() != 0) { + _this->_impl_.flagattr_ = from._impl_.flagattr_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomDataInternal::CopyFrom(const RoomDataInternal& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomDataInternal) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomDataInternal::InternalSwap(RoomDataInternal* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.memberlist_.InternalSwap(&other->_impl_.memberlist_); + _impl_.roomgroup_.InternalSwap(&other->_impl_.roomgroup_); + _impl_.roombinattrinternal_.InternalSwap(&other->_impl_.roombinattrinternal_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.flagattr_) + + sizeof(RoomDataInternal::_impl_.flagattr_) + - PROTOBUF_FIELD_OFFSET(RoomDataInternal, _impl_.serverid_)>( + reinterpret_cast(&_impl_.serverid_), + reinterpret_cast(&other->_impl_.serverid_)); +} + +// =================================================================== + +class RoomDataExternal::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_._has_bits_); +}; + +RoomDataExternal::RoomDataExternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomDataExternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomDataExternal) +} +PROTOBUF_NDEBUG_INLINE RoomDataExternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomDataExternal& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + roomgroup_{visibility, arena, from.roomgroup_}, + roomsearchableintattrexternal_{visibility, arena, from.roomsearchableintattrexternal_}, + roomsearchablebinattrexternal_{visibility, arena, from.roomsearchablebinattrexternal_}, + roombinattrexternal_{visibility, arena, from.roombinattrexternal_} {} + +RoomDataExternal::RoomDataExternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomDataExternal& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomDataExternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomDataExternal* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.serverid_ = (CheckHasBit(cached_has_bits, 0x00000010U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.serverid_) + : nullptr; + _impl_.publicslotnum_ = (CheckHasBit(cached_has_bits, 0x00000020U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.publicslotnum_) + : nullptr; + _impl_.privateslotnum_ = (CheckHasBit(cached_has_bits, 0x00000040U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.privateslotnum_) + : nullptr; + _impl_.openpublicslotnum_ = (CheckHasBit(cached_has_bits, 0x00000080U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.openpublicslotnum_) + : nullptr; + _impl_.maxslot_ = (CheckHasBit(cached_has_bits, 0x00000100U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.maxslot_) + : nullptr; + _impl_.openprivateslotnum_ = (CheckHasBit(cached_has_bits, 0x00000200U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.openprivateslotnum_) + : nullptr; + _impl_.curmembernum_ = (CheckHasBit(cached_has_bits, 0x00000400U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.curmembernum_) + : nullptr; + _impl_.owner_ = (CheckHasBit(cached_has_bits, 0x00000800U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.owner_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, lobbyid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, lobbyid_), + offsetof(Impl_, passwordslotmask_) - + offsetof(Impl_, lobbyid_) + + sizeof(Impl_::passwordslotmask_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomDataExternal) +} +PROTOBUF_NDEBUG_INLINE RoomDataExternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + roomgroup_{visibility, arena}, + roomsearchableintattrexternal_{visibility, arena}, + roomsearchablebinattrexternal_{visibility, arena}, + roombinattrexternal_{visibility, arena} {} + +inline void RoomDataExternal::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, serverid_), + 0, + offsetof(Impl_, passwordslotmask_) - + offsetof(Impl_, serverid_) + + sizeof(Impl_::passwordslotmask_)); +} +RoomDataExternal::~RoomDataExternal() { + // @@protoc_insertion_point(destructor:np2_structs.RoomDataExternal) + SharedDtor(*this); +} +inline void RoomDataExternal::SharedDtor(MessageLite& self) { + RoomDataExternal& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.serverid_; + delete this_._impl_.publicslotnum_; + delete this_._impl_.privateslotnum_; + delete this_._impl_.openpublicslotnum_; + delete this_._impl_.maxslot_; + delete this_._impl_.openprivateslotnum_; + delete this_._impl_.curmembernum_; + delete this_._impl_.owner_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomDataExternal::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomDataExternal(arena); +} +constexpr auto RoomDataExternal::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomgroup_) + + decltype(RoomDataExternal::_impl_.roomgroup_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomsearchableintattrexternal_) + + decltype(RoomDataExternal::_impl_.roomsearchableintattrexternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomsearchablebinattrexternal_) + + decltype(RoomDataExternal::_impl_.roomsearchablebinattrexternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roombinattrexternal_) + + decltype(RoomDataExternal::_impl_.roombinattrexternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(RoomDataExternal), alignof(RoomDataExternal), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&RoomDataExternal::PlacementNew_, + sizeof(RoomDataExternal), + alignof(RoomDataExternal)); + } +} +constexpr auto RoomDataExternal::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<29>{ + { + &_RoomDataExternal_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomDataExternal::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomDataExternal::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomDataExternal::ByteSizeLong, + &RoomDataExternal::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_._cached_size_), + true, + }, + "np2_structs.RoomDataExternal", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<29> RoomDataExternal_class_data_ = + RoomDataExternal::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomDataExternal::GetClassData() const { + return RoomDataExternal_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<5, 17, 12, 0, 2> +RoomDataExternal::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_._has_bits_), + 0, // no _extensions_ + 17, 248, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294836224, // skipmap + offsetof(decltype(_table_), field_entries), + 17, // num_field_entries + 12, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomDataExternal_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomDataExternal>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.uint16 serverId = 1; + {::_pbi::TcParser::FastMtS1, + {10, 4, 0, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.serverid_)}}, + // uint32 worldId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 14, 0, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.worldid_)}}, + // .np2_structs.uint16 publicSlotNum = 3; + {::_pbi::TcParser::FastMtS1, + {26, 5, 1, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.publicslotnum_)}}, + // .np2_structs.uint16 privateSlotNum = 4; + {::_pbi::TcParser::FastMtS1, + {34, 6, 2, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.privateslotnum_)}}, + // uint64 lobbyId = 5; + {::_pbi::TcParser::FastV64S1, + {40, 12, 0, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.lobbyid_)}}, + // uint64 roomId = 6; + {::_pbi::TcParser::FastV64S1, + {48, 13, 0, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomid_)}}, + // .np2_structs.uint16 openPublicSlotNum = 7; + {::_pbi::TcParser::FastMtS1, + {58, 7, 3, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.openpublicslotnum_)}}, + // .np2_structs.uint16 maxSlot = 8; + {::_pbi::TcParser::FastMtS1, + {66, 8, 4, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.maxslot_)}}, + // .np2_structs.uint16 openPrivateSlotNum = 9; + {::_pbi::TcParser::FastMtS1, + {74, 9, 5, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.openprivateslotnum_)}}, + // .np2_structs.uint16 curMemberNum = 10; + {::_pbi::TcParser::FastMtS1, + {82, 10, 6, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.curmembernum_)}}, + // uint64 passwordSlotMask = 11; + {::_pbi::TcParser::FastV64S1, + {88, 16, 0, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.passwordslotmask_)}}, + // .np2_structs.UserInfo owner = 12; + {::_pbi::TcParser::FastMtS1, + {98, 11, 7, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.owner_)}}, + // repeated .np2_structs.RoomGroup roomGroup = 13; + {::_pbi::TcParser::FastMtR1, + {106, 0, 8, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomgroup_)}}, + // uint32 flagAttr = 14; + {::_pbi::TcParser::FastV32S1, + {112, 15, 0, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.flagattr_)}}, + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 15; + {::_pbi::TcParser::FastMtR1, + {122, 1, 9, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomsearchableintattrexternal_)}}, + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 16; + {::_pbi::TcParser::FastMtR2, + {386, 2, 10, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomsearchablebinattrexternal_)}}, + // repeated .np2_structs.BinAttr roomBinAttrExternal = 17; + {::_pbi::TcParser::FastMtR2, + {394, 3, 11, + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roombinattrexternal_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint16 serverId = 1; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.serverid_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 worldId = 2; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.worldid_), _Internal::kHasBitsOffset + 14, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // .np2_structs.uint16 publicSlotNum = 3; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.publicslotnum_), _Internal::kHasBitsOffset + 5, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint16 privateSlotNum = 4; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.privateslotnum_), _Internal::kHasBitsOffset + 6, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint64 lobbyId = 5; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.lobbyid_), _Internal::kHasBitsOffset + 12, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint64 roomId = 6; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomid_), _Internal::kHasBitsOffset + 13, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.uint16 openPublicSlotNum = 7; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.openpublicslotnum_), _Internal::kHasBitsOffset + 7, 3, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint16 maxSlot = 8; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.maxslot_), _Internal::kHasBitsOffset + 8, 4, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint16 openPrivateSlotNum = 9; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.openprivateslotnum_), _Internal::kHasBitsOffset + 9, 5, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint16 curMemberNum = 10; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.curmembernum_), _Internal::kHasBitsOffset + 10, 6, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint64 passwordSlotMask = 11; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.passwordslotmask_), _Internal::kHasBitsOffset + 16, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.UserInfo owner = 12; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.owner_), _Internal::kHasBitsOffset + 11, 7, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.RoomGroup roomGroup = 13; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomgroup_), _Internal::kHasBitsOffset + 0, 8, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 flagAttr = 14; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.flagattr_), _Internal::kHasBitsOffset + 15, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 15; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomsearchableintattrexternal_), _Internal::kHasBitsOffset + 1, 9, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 16; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roomsearchablebinattrexternal_), _Internal::kHasBitsOffset + 2, 10, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.BinAttr roomBinAttrExternal = 17; + {PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.roombinattrexternal_), _Internal::kHasBitsOffset + 3, 11, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::UserInfo>()}, + {::_pbi::TcParser::GetTable<::np2_structs::RoomGroup>()}, + {::_pbi::TcParser::GetTable<::np2_structs::IntAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomDataExternal::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomDataExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.roomgroup_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.roomsearchableintattrexternal_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _impl_.roomsearchablebinattrexternal_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + _impl_.roombinattrexternal_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(_impl_.serverid_ != nullptr); + _impl_.serverid_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + ABSL_DCHECK(_impl_.publicslotnum_ != nullptr); + _impl_.publicslotnum_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + ABSL_DCHECK(_impl_.privateslotnum_ != nullptr); + _impl_.privateslotnum_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + ABSL_DCHECK(_impl_.openpublicslotnum_ != nullptr); + _impl_.openpublicslotnum_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000f00U)) { + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + ABSL_DCHECK(_impl_.maxslot_ != nullptr); + _impl_.maxslot_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + ABSL_DCHECK(_impl_.openprivateslotnum_ != nullptr); + _impl_.openprivateslotnum_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + ABSL_DCHECK(_impl_.curmembernum_ != nullptr); + _impl_.curmembernum_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000800U)) { + ABSL_DCHECK(_impl_.owner_ != nullptr); + _impl_.owner_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000f000U)) { + ::memset(&_impl_.lobbyid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.flagattr_) - + reinterpret_cast(&_impl_.lobbyid_)) + sizeof(_impl_.flagattr_)); + } + _impl_.passwordslotmask_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomDataExternal::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomDataExternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomDataExternal::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomDataExternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomDataExternal) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint16 serverId = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.serverid_, this_._impl_.serverid_->GetCachedSize(), target, + stream); + } + + // uint32 worldId = 2; + if (CheckHasBit(cached_has_bits, 0x00004000U)) { + if (this_._internal_worldid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_worldid(), target); + } + } + + // .np2_structs.uint16 publicSlotNum = 3; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.publicslotnum_, this_._impl_.publicslotnum_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint16 privateSlotNum = 4; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, *this_._impl_.privateslotnum_, this_._impl_.privateslotnum_->GetCachedSize(), target, + stream); + } + + // uint64 lobbyId = 5; + if (CheckHasBit(cached_has_bits, 0x00001000U)) { + if (this_._internal_lobbyid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 5, this_._internal_lobbyid(), target); + } + } + + // uint64 roomId = 6; + if (CheckHasBit(cached_has_bits, 0x00002000U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 6, this_._internal_roomid(), target); + } + } + + // .np2_structs.uint16 openPublicSlotNum = 7; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 7, *this_._impl_.openpublicslotnum_, this_._impl_.openpublicslotnum_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint16 maxSlot = 8; + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 8, *this_._impl_.maxslot_, this_._impl_.maxslot_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint16 openPrivateSlotNum = 9; + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 9, *this_._impl_.openprivateslotnum_, this_._impl_.openprivateslotnum_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint16 curMemberNum = 10; + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 10, *this_._impl_.curmembernum_, this_._impl_.curmembernum_->GetCachedSize(), target, + stream); + } + + // uint64 passwordSlotMask = 11; + if (CheckHasBit(cached_has_bits, 0x00010000U)) { + if (this_._internal_passwordslotmask() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 11, this_._internal_passwordslotmask(), target); + } + } + + // .np2_structs.UserInfo owner = 12; + if (CheckHasBit(cached_has_bits, 0x00000800U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 12, *this_._impl_.owner_, this_._impl_.owner_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.RoomGroup roomGroup = 13; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roomgroup_size()); + i < n; i++) { + const auto& repfield = this_._internal_roomgroup().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 13, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // uint32 flagAttr = 14; + if (CheckHasBit(cached_has_bits, 0x00008000U)) { + if (this_._internal_flagattr() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 14, this_._internal_flagattr(), target); + } + } + + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 15; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roomsearchableintattrexternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roomsearchableintattrexternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 15, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 16; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roomsearchablebinattrexternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roomsearchablebinattrexternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 16, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.BinAttr roomBinAttrExternal = 17; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roombinattrexternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roombinattrexternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 17, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomDataExternal) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomDataExternal::ByteSizeLong(const MessageLite& base) { + const RoomDataExternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomDataExternal::ByteSizeLong() const { + const RoomDataExternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomDataExternal) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + // repeated .np2_structs.RoomGroup roomGroup = 13; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_roomgroup_size(); + for (const auto& msg : this_._internal_roomgroup()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 15; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += 1UL * this_._internal_roomsearchableintattrexternal_size(); + for (const auto& msg : this_._internal_roomsearchableintattrexternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 16; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + total_size += 2UL * this_._internal_roomsearchablebinattrexternal_size(); + for (const auto& msg : this_._internal_roomsearchablebinattrexternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.BinAttr roomBinAttrExternal = 17; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + total_size += 2UL * this_._internal_roombinattrexternal_size(); + for (const auto& msg : this_._internal_roombinattrexternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // .np2_structs.uint16 serverId = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.serverid_); + } + // .np2_structs.uint16 publicSlotNum = 3; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.publicslotnum_); + } + // .np2_structs.uint16 privateSlotNum = 4; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.privateslotnum_); + } + // .np2_structs.uint16 openPublicSlotNum = 7; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.openpublicslotnum_); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000ff00U)) { + // .np2_structs.uint16 maxSlot = 8; + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.maxslot_); + } + // .np2_structs.uint16 openPrivateSlotNum = 9; + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.openprivateslotnum_); + } + // .np2_structs.uint16 curMemberNum = 10; + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.curmembernum_); + } + // .np2_structs.UserInfo owner = 12; + if (CheckHasBit(cached_has_bits, 0x00000800U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.owner_); + } + // uint64 lobbyId = 5; + if (CheckHasBit(cached_has_bits, 0x00001000U)) { + if (this_._internal_lobbyid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_lobbyid()); + } + } + // uint64 roomId = 6; + if (CheckHasBit(cached_has_bits, 0x00002000U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + // uint32 worldId = 2; + if (CheckHasBit(cached_has_bits, 0x00004000U)) { + if (this_._internal_worldid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_worldid()); + } + } + // uint32 flagAttr = 14; + if (CheckHasBit(cached_has_bits, 0x00008000U)) { + if (this_._internal_flagattr() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_flagattr()); + } + } + } + { + // uint64 passwordSlotMask = 11; + if (CheckHasBit(cached_has_bits, 0x00010000U)) { + if (this_._internal_passwordslotmask() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_passwordslotmask()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomDataExternal::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomDataExternal) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_roomgroup()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roomgroup()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_roomsearchableintattrexternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roomsearchableintattrexternal()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _this->_internal_mutable_roomsearchablebinattrexternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roomsearchablebinattrexternal()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + _this->_internal_mutable_roombinattrexternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roombinattrexternal()); + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(from._impl_.serverid_ != nullptr); + if (_this->_impl_.serverid_ == nullptr) { + _this->_impl_.serverid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.serverid_); + } else { + _this->_impl_.serverid_->MergeFrom(*from._impl_.serverid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + ABSL_DCHECK(from._impl_.publicslotnum_ != nullptr); + if (_this->_impl_.publicslotnum_ == nullptr) { + _this->_impl_.publicslotnum_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.publicslotnum_); + } else { + _this->_impl_.publicslotnum_->MergeFrom(*from._impl_.publicslotnum_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + ABSL_DCHECK(from._impl_.privateslotnum_ != nullptr); + if (_this->_impl_.privateslotnum_ == nullptr) { + _this->_impl_.privateslotnum_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.privateslotnum_); + } else { + _this->_impl_.privateslotnum_->MergeFrom(*from._impl_.privateslotnum_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + ABSL_DCHECK(from._impl_.openpublicslotnum_ != nullptr); + if (_this->_impl_.openpublicslotnum_ == nullptr) { + _this->_impl_.openpublicslotnum_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.openpublicslotnum_); + } else { + _this->_impl_.openpublicslotnum_->MergeFrom(*from._impl_.openpublicslotnum_); + } + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000ff00U)) { + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + ABSL_DCHECK(from._impl_.maxslot_ != nullptr); + if (_this->_impl_.maxslot_ == nullptr) { + _this->_impl_.maxslot_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.maxslot_); + } else { + _this->_impl_.maxslot_->MergeFrom(*from._impl_.maxslot_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + ABSL_DCHECK(from._impl_.openprivateslotnum_ != nullptr); + if (_this->_impl_.openprivateslotnum_ == nullptr) { + _this->_impl_.openprivateslotnum_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.openprivateslotnum_); + } else { + _this->_impl_.openprivateslotnum_->MergeFrom(*from._impl_.openprivateslotnum_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + ABSL_DCHECK(from._impl_.curmembernum_ != nullptr); + if (_this->_impl_.curmembernum_ == nullptr) { + _this->_impl_.curmembernum_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.curmembernum_); + } else { + _this->_impl_.curmembernum_->MergeFrom(*from._impl_.curmembernum_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000800U)) { + ABSL_DCHECK(from._impl_.owner_ != nullptr); + if (_this->_impl_.owner_ == nullptr) { + _this->_impl_.owner_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.owner_); + } else { + _this->_impl_.owner_->MergeFrom(*from._impl_.owner_); + } + } + if (CheckHasBit(cached_has_bits, 0x00001000U)) { + if (from._internal_lobbyid() != 0) { + _this->_impl_.lobbyid_ = from._impl_.lobbyid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00002000U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00004000U)) { + if (from._internal_worldid() != 0) { + _this->_impl_.worldid_ = from._impl_.worldid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00008000U)) { + if (from._internal_flagattr() != 0) { + _this->_impl_.flagattr_ = from._impl_.flagattr_; + } + } + } + if (CheckHasBit(cached_has_bits, 0x00010000U)) { + if (from._internal_passwordslotmask() != 0) { + _this->_impl_.passwordslotmask_ = from._impl_.passwordslotmask_; + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomDataExternal::CopyFrom(const RoomDataExternal& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomDataExternal) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomDataExternal::InternalSwap(RoomDataExternal* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.roomgroup_.InternalSwap(&other->_impl_.roomgroup_); + _impl_.roomsearchableintattrexternal_.InternalSwap(&other->_impl_.roomsearchableintattrexternal_); + _impl_.roomsearchablebinattrexternal_.InternalSwap(&other->_impl_.roomsearchablebinattrexternal_); + _impl_.roombinattrexternal_.InternalSwap(&other->_impl_.roombinattrexternal_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.passwordslotmask_) + + sizeof(RoomDataExternal::_impl_.passwordslotmask_) + - PROTOBUF_FIELD_OFFSET(RoomDataExternal, _impl_.serverid_)>( + reinterpret_cast(&_impl_.serverid_), + reinterpret_cast(&other->_impl_.serverid_)); +} + +// =================================================================== + +class IntSearchFilter::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(IntSearchFilter, _impl_._has_bits_); +}; + +IntSearchFilter::IntSearchFilter(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, IntSearchFilter_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.IntSearchFilter) +} +PROTOBUF_NDEBUG_INLINE IntSearchFilter::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::IntSearchFilter& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +IntSearchFilter::IntSearchFilter( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const IntSearchFilter& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, IntSearchFilter_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + IntSearchFilter* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.searchoperator_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.searchoperator_) + : nullptr; + _impl_.attr_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.attr_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.IntSearchFilter) +} +PROTOBUF_NDEBUG_INLINE IntSearchFilter::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void IntSearchFilter::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, searchoperator_), + 0, + offsetof(Impl_, attr_) - + offsetof(Impl_, searchoperator_) + + sizeof(Impl_::attr_)); +} +IntSearchFilter::~IntSearchFilter() { + // @@protoc_insertion_point(destructor:np2_structs.IntSearchFilter) + SharedDtor(*this); +} +inline void IntSearchFilter::SharedDtor(MessageLite& self) { + IntSearchFilter& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.searchoperator_; + delete this_._impl_.attr_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL IntSearchFilter::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) IntSearchFilter(arena); +} +constexpr auto IntSearchFilter::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(IntSearchFilter), + alignof(IntSearchFilter)); +} +constexpr auto IntSearchFilter::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<28>{ + { + &_IntSearchFilter_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &IntSearchFilter::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &IntSearchFilter::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &IntSearchFilter::ByteSizeLong, + &IntSearchFilter::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(IntSearchFilter, _impl_._cached_size_), + true, + }, + "np2_structs.IntSearchFilter", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<28> IntSearchFilter_class_data_ = + IntSearchFilter::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +IntSearchFilter::GetClassData() const { + return IntSearchFilter_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 2, 0, 2> +IntSearchFilter::_table_ = { + { + PROTOBUF_FIELD_OFFSET(IntSearchFilter, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + IntSearchFilter_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::IntSearchFilter>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // .np2_structs.IntAttr attr = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 1, + PROTOBUF_FIELD_OFFSET(IntSearchFilter, _impl_.attr_)}}, + // .np2_structs.uint8 searchOperator = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(IntSearchFilter, _impl_.searchoperator_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint8 searchOperator = 1; + {PROTOBUF_FIELD_OFFSET(IntSearchFilter, _impl_.searchoperator_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.IntAttr attr = 2; + {PROTOBUF_FIELD_OFFSET(IntSearchFilter, _impl_.attr_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::IntAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void IntSearchFilter::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.IntSearchFilter) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.searchoperator_ != nullptr); + _impl_.searchoperator_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.attr_ != nullptr); + _impl_.attr_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL IntSearchFilter::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const IntSearchFilter& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL IntSearchFilter::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const IntSearchFilter& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.IntSearchFilter) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint8 searchOperator = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.searchoperator_, this_._impl_.searchoperator_->GetCachedSize(), target, + stream); + } + + // .np2_structs.IntAttr attr = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.attr_, this_._impl_.attr_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.IntSearchFilter) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t IntSearchFilter::ByteSizeLong(const MessageLite& base) { + const IntSearchFilter& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t IntSearchFilter::ByteSizeLong() const { + const IntSearchFilter& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.IntSearchFilter) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.uint8 searchOperator = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.searchoperator_); + } + // .np2_structs.IntAttr attr = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.attr_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void IntSearchFilter::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.IntSearchFilter) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.searchoperator_ != nullptr); + if (_this->_impl_.searchoperator_ == nullptr) { + _this->_impl_.searchoperator_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.searchoperator_); + } else { + _this->_impl_.searchoperator_->MergeFrom(*from._impl_.searchoperator_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.attr_ != nullptr); + if (_this->_impl_.attr_ == nullptr) { + _this->_impl_.attr_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.attr_); + } else { + _this->_impl_.attr_->MergeFrom(*from._impl_.attr_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void IntSearchFilter::CopyFrom(const IntSearchFilter& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.IntSearchFilter) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void IntSearchFilter::InternalSwap(IntSearchFilter* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(IntSearchFilter, _impl_.attr_) + + sizeof(IntSearchFilter::_impl_.attr_) + - PROTOBUF_FIELD_OFFSET(IntSearchFilter, _impl_.searchoperator_)>( + reinterpret_cast(&_impl_.searchoperator_), + reinterpret_cast(&other->_impl_.searchoperator_)); +} + +// =================================================================== + +class BinSearchFilter::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(BinSearchFilter, _impl_._has_bits_); +}; + +BinSearchFilter::BinSearchFilter(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, BinSearchFilter_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.BinSearchFilter) +} +PROTOBUF_NDEBUG_INLINE BinSearchFilter::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::BinSearchFilter& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +BinSearchFilter::BinSearchFilter( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const BinSearchFilter& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, BinSearchFilter_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + BinSearchFilter* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.searchoperator_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.searchoperator_) + : nullptr; + _impl_.attr_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.attr_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.BinSearchFilter) +} +PROTOBUF_NDEBUG_INLINE BinSearchFilter::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void BinSearchFilter::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, searchoperator_), + 0, + offsetof(Impl_, attr_) - + offsetof(Impl_, searchoperator_) + + sizeof(Impl_::attr_)); +} +BinSearchFilter::~BinSearchFilter() { + // @@protoc_insertion_point(destructor:np2_structs.BinSearchFilter) + SharedDtor(*this); +} +inline void BinSearchFilter::SharedDtor(MessageLite& self) { + BinSearchFilter& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.searchoperator_; + delete this_._impl_.attr_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL BinSearchFilter::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) BinSearchFilter(arena); +} +constexpr auto BinSearchFilter::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(BinSearchFilter), + alignof(BinSearchFilter)); +} +constexpr auto BinSearchFilter::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<28>{ + { + &_BinSearchFilter_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &BinSearchFilter::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &BinSearchFilter::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &BinSearchFilter::ByteSizeLong, + &BinSearchFilter::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(BinSearchFilter, _impl_._cached_size_), + true, + }, + "np2_structs.BinSearchFilter", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<28> BinSearchFilter_class_data_ = + BinSearchFilter::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +BinSearchFilter::GetClassData() const { + return BinSearchFilter_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 2, 0, 2> +BinSearchFilter::_table_ = { + { + PROTOBUF_FIELD_OFFSET(BinSearchFilter, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + BinSearchFilter_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::BinSearchFilter>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // .np2_structs.BinAttr attr = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 1, + PROTOBUF_FIELD_OFFSET(BinSearchFilter, _impl_.attr_)}}, + // .np2_structs.uint8 searchOperator = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(BinSearchFilter, _impl_.searchoperator_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint8 searchOperator = 1; + {PROTOBUF_FIELD_OFFSET(BinSearchFilter, _impl_.searchoperator_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.BinAttr attr = 2; + {PROTOBUF_FIELD_OFFSET(BinSearchFilter, _impl_.attr_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void BinSearchFilter::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.BinSearchFilter) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.searchoperator_ != nullptr); + _impl_.searchoperator_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.attr_ != nullptr); + _impl_.attr_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL BinSearchFilter::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const BinSearchFilter& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL BinSearchFilter::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const BinSearchFilter& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.BinSearchFilter) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint8 searchOperator = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.searchoperator_, this_._impl_.searchoperator_->GetCachedSize(), target, + stream); + } + + // .np2_structs.BinAttr attr = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.attr_, this_._impl_.attr_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.BinSearchFilter) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t BinSearchFilter::ByteSizeLong(const MessageLite& base) { + const BinSearchFilter& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t BinSearchFilter::ByteSizeLong() const { + const BinSearchFilter& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.BinSearchFilter) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.uint8 searchOperator = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.searchoperator_); + } + // .np2_structs.BinAttr attr = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.attr_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void BinSearchFilter::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.BinSearchFilter) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.searchoperator_ != nullptr); + if (_this->_impl_.searchoperator_ == nullptr) { + _this->_impl_.searchoperator_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.searchoperator_); + } else { + _this->_impl_.searchoperator_->MergeFrom(*from._impl_.searchoperator_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.attr_ != nullptr); + if (_this->_impl_.attr_ == nullptr) { + _this->_impl_.attr_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.attr_); + } else { + _this->_impl_.attr_->MergeFrom(*from._impl_.attr_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void BinSearchFilter::CopyFrom(const BinSearchFilter& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.BinSearchFilter) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void BinSearchFilter::InternalSwap(BinSearchFilter* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(BinSearchFilter, _impl_.attr_) + + sizeof(BinSearchFilter::_impl_.attr_) + - PROTOBUF_FIELD_OFFSET(BinSearchFilter, _impl_.searchoperator_)>( + reinterpret_cast(&_impl_.searchoperator_), + reinterpret_cast(&other->_impl_.searchoperator_)); +} + +// =================================================================== + +class PresenceOptionData::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(PresenceOptionData, _impl_._has_bits_); +}; + +PresenceOptionData::PresenceOptionData(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, PresenceOptionData_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.PresenceOptionData) +} +PROTOBUF_NDEBUG_INLINE PresenceOptionData::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::PresenceOptionData& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + data_(arena, from.data_) {} + +PresenceOptionData::PresenceOptionData( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const PresenceOptionData& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, PresenceOptionData_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + PresenceOptionData* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + _impl_.len_ = from._impl_.len_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.PresenceOptionData) +} +PROTOBUF_NDEBUG_INLINE PresenceOptionData::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + data_(arena) {} + +inline void PresenceOptionData::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.len_ = {}; +} +PresenceOptionData::~PresenceOptionData() { + // @@protoc_insertion_point(destructor:np2_structs.PresenceOptionData) + SharedDtor(*this); +} +inline void PresenceOptionData::SharedDtor(MessageLite& self) { + PresenceOptionData& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.data_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL PresenceOptionData::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) PresenceOptionData(arena); +} +constexpr auto PresenceOptionData::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(PresenceOptionData), + alignof(PresenceOptionData)); +} +constexpr auto PresenceOptionData::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<31>{ + { + &_PresenceOptionData_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &PresenceOptionData::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &PresenceOptionData::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &PresenceOptionData::ByteSizeLong, + &PresenceOptionData::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(PresenceOptionData, _impl_._cached_size_), + true, + }, + "np2_structs.PresenceOptionData", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<31> PresenceOptionData_class_data_ = + PresenceOptionData::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +PresenceOptionData::GetClassData() const { + return PresenceOptionData_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 0, 0, 2> +PresenceOptionData::_table_ = { + { + PROTOBUF_FIELD_OFFSET(PresenceOptionData, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + PresenceOptionData_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::PresenceOptionData>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // uint32 len = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(PresenceOptionData, _impl_.len_)}}, + // bytes data = 1; + {::_pbi::TcParser::FastBS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(PresenceOptionData, _impl_.data_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bytes data = 1; + {PROTOBUF_FIELD_OFFSET(PresenceOptionData, _impl_.data_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // uint32 len = 2; + {PROTOBUF_FIELD_OFFSET(PresenceOptionData, _impl_.len_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void PresenceOptionData::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.PresenceOptionData) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.data_.ClearNonDefaultToEmpty(); + } + _impl_.len_ = 0u; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL PresenceOptionData::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const PresenceOptionData& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL PresenceOptionData::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const PresenceOptionData& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.PresenceOptionData) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bytes data = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + const ::std::string& _s = this_._internal_data(); + target = stream->WriteBytesMaybeAliased(1, _s, target); + } + } + + // uint32 len = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_len() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_len(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.PresenceOptionData) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t PresenceOptionData::ByteSizeLong(const MessageLite& base) { + const PresenceOptionData& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t PresenceOptionData::ByteSizeLong() const { + const PresenceOptionData& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.PresenceOptionData) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // bytes data = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_data()); + } + } + // uint32 len = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_len() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_len()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void PresenceOptionData::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.PresenceOptionData) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_data().empty()) { + _this->_internal_set_data(from._internal_data()); + } else { + if (_this->_impl_.data_.IsDefault()) { + _this->_internal_set_data(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_len() != 0) { + _this->_impl_.len_ = from._impl_.len_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void PresenceOptionData::CopyFrom(const PresenceOptionData& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.PresenceOptionData) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void PresenceOptionData::InternalSwap(PresenceOptionData* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.data_, &other->_impl_.data_, arena); + swap(_impl_.len_, other->_impl_.len_); +} + +// =================================================================== + +class RoomGroupPasswordConfig::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomGroupPasswordConfig, _impl_._has_bits_); +}; + +RoomGroupPasswordConfig::RoomGroupPasswordConfig(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomGroupPasswordConfig_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomGroupPasswordConfig) +} +PROTOBUF_NDEBUG_INLINE RoomGroupPasswordConfig::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomGroupPasswordConfig& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +RoomGroupPasswordConfig::RoomGroupPasswordConfig( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomGroupPasswordConfig& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomGroupPasswordConfig_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomGroupPasswordConfig* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.groupid_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.groupid_) + : nullptr; + _impl_.withpassword_ = from._impl_.withpassword_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomGroupPasswordConfig) +} +PROTOBUF_NDEBUG_INLINE RoomGroupPasswordConfig::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void RoomGroupPasswordConfig::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, groupid_), + 0, + offsetof(Impl_, withpassword_) - + offsetof(Impl_, groupid_) + + sizeof(Impl_::withpassword_)); +} +RoomGroupPasswordConfig::~RoomGroupPasswordConfig() { + // @@protoc_insertion_point(destructor:np2_structs.RoomGroupPasswordConfig) + SharedDtor(*this); +} +inline void RoomGroupPasswordConfig::SharedDtor(MessageLite& self) { + RoomGroupPasswordConfig& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.groupid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomGroupPasswordConfig::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomGroupPasswordConfig(arena); +} +constexpr auto RoomGroupPasswordConfig::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(RoomGroupPasswordConfig), + alignof(RoomGroupPasswordConfig)); +} +constexpr auto RoomGroupPasswordConfig::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<36>{ + { + &_RoomGroupPasswordConfig_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomGroupPasswordConfig::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomGroupPasswordConfig::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomGroupPasswordConfig::ByteSizeLong, + &RoomGroupPasswordConfig::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomGroupPasswordConfig, _impl_._cached_size_), + true, + }, + "np2_structs.RoomGroupPasswordConfig", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<36> RoomGroupPasswordConfig_class_data_ = + RoomGroupPasswordConfig::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomGroupPasswordConfig::GetClassData() const { + return RoomGroupPasswordConfig_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +RoomGroupPasswordConfig::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomGroupPasswordConfig, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomGroupPasswordConfig_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomGroupPasswordConfig>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bool withPassword = 2; + {::_pbi::TcParser::FastV8S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(RoomGroupPasswordConfig, _impl_.withpassword_)}}, + // .np2_structs.uint8 groupId = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(RoomGroupPasswordConfig, _impl_.groupid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint8 groupId = 1; + {PROTOBUF_FIELD_OFFSET(RoomGroupPasswordConfig, _impl_.groupid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // bool withPassword = 2; + {PROTOBUF_FIELD_OFFSET(RoomGroupPasswordConfig, _impl_.withpassword_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomGroupPasswordConfig::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomGroupPasswordConfig) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.groupid_ != nullptr); + _impl_.groupid_->Clear(); + } + _impl_.withpassword_ = false; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomGroupPasswordConfig::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomGroupPasswordConfig& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomGroupPasswordConfig::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomGroupPasswordConfig& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomGroupPasswordConfig) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint8 groupId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.groupid_, this_._impl_.groupid_->GetCachedSize(), target, + stream); + } + + // bool withPassword = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_withpassword() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 2, this_._internal_withpassword(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomGroupPasswordConfig) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomGroupPasswordConfig::ByteSizeLong(const MessageLite& base) { + const RoomGroupPasswordConfig& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomGroupPasswordConfig::ByteSizeLong() const { + const RoomGroupPasswordConfig& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomGroupPasswordConfig) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.uint8 groupId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.groupid_); + } + // bool withPassword = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_withpassword() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomGroupPasswordConfig::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomGroupPasswordConfig) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.groupid_ != nullptr); + if (_this->_impl_.groupid_ == nullptr) { + _this->_impl_.groupid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.groupid_); + } else { + _this->_impl_.groupid_->MergeFrom(*from._impl_.groupid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_withpassword() != 0) { + _this->_impl_.withpassword_ = from._impl_.withpassword_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomGroupPasswordConfig::CopyFrom(const RoomGroupPasswordConfig& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomGroupPasswordConfig) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomGroupPasswordConfig::InternalSwap(RoomGroupPasswordConfig* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomGroupPasswordConfig, _impl_.withpassword_) + + sizeof(RoomGroupPasswordConfig::_impl_.withpassword_) + - PROTOBUF_FIELD_OFFSET(RoomGroupPasswordConfig, _impl_.groupid_)>( + reinterpret_cast(&_impl_.groupid_), + reinterpret_cast(&other->_impl_.groupid_)); +} + +// =================================================================== + +class SearchRoomRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_._has_bits_); +}; + +SearchRoomRequest::SearchRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SearchRoomRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SearchRoomRequest) +} +PROTOBUF_NDEBUG_INLINE SearchRoomRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SearchRoomRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + intfilter_{visibility, arena, from.intfilter_}, + binfilter_{visibility, arena, from.binfilter_}, + attrid_{visibility, arena, from.attrid_} {} + +SearchRoomRequest::SearchRoomRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SearchRoomRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SearchRoomRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SearchRoomRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, option_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, option_), + offsetof(Impl_, flagattr_) - + offsetof(Impl_, option_) + + sizeof(Impl_::flagattr_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.SearchRoomRequest) +} +PROTOBUF_NDEBUG_INLINE SearchRoomRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + intfilter_{visibility, arena}, + binfilter_{visibility, arena}, + attrid_{visibility, arena} {} + +inline void SearchRoomRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, option_), + 0, + offsetof(Impl_, flagattr_) - + offsetof(Impl_, option_) + + sizeof(Impl_::flagattr_)); +} +SearchRoomRequest::~SearchRoomRequest() { + // @@protoc_insertion_point(destructor:np2_structs.SearchRoomRequest) + SharedDtor(*this); +} +inline void SearchRoomRequest::SharedDtor(MessageLite& self) { + SearchRoomRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SearchRoomRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SearchRoomRequest(arena); +} +constexpr auto SearchRoomRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.intfilter_) + + decltype(SearchRoomRequest::_impl_.intfilter_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.binfilter_) + + decltype(SearchRoomRequest::_impl_.binfilter_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.attrid_) + + decltype(SearchRoomRequest::_impl_.attrid_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(SearchRoomRequest), alignof(SearchRoomRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&SearchRoomRequest::PlacementNew_, + sizeof(SearchRoomRequest), + alignof(SearchRoomRequest)); + } +} +constexpr auto SearchRoomRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<30>{ + { + &_SearchRoomRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SearchRoomRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SearchRoomRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SearchRoomRequest::ByteSizeLong, + &SearchRoomRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_._cached_size_), + true, + }, + "np2_structs.SearchRoomRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<30> SearchRoomRequest_class_data_ = + SearchRoomRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SearchRoomRequest::GetClassData() const { + return SearchRoomRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<4, 10, 3, 0, 2> +SearchRoomRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_._has_bits_), + 0, // no _extensions_ + 10, 120, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294966272, // skipmap + offsetof(decltype(_table_), field_entries), + 10, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + SearchRoomRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SearchRoomRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // int32 option = 1; + {::_pbi::TcParser::FastV32S1, + {8, 3, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.option_)}}, + // uint32 worldId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 4, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.worldid_)}}, + // uint64 lobbyId = 3; + {::_pbi::TcParser::FastV64S1, + {24, 5, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.lobbyid_)}}, + // uint32 rangeFilter_startIndex = 4; + {::_pbi::TcParser::FastV32S1, + {32, 6, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.rangefilter_startindex_)}}, + // uint32 rangeFilter_max = 5; + {::_pbi::TcParser::FastV32S1, + {40, 7, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.rangefilter_max_)}}, + // uint32 flagFilter = 6; + {::_pbi::TcParser::FastV32S1, + {48, 8, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.flagfilter_)}}, + // uint32 flagAttr = 7; + {::_pbi::TcParser::FastV32S1, + {56, 9, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.flagattr_)}}, + // repeated .np2_structs.IntSearchFilter intFilter = 8; + {::_pbi::TcParser::FastMtR1, + {66, 0, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.intfilter_)}}, + // repeated .np2_structs.BinSearchFilter binFilter = 9; + {::_pbi::TcParser::FastMtR1, + {74, 1, 1, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.binfilter_)}}, + // repeated .np2_structs.uint16 attrId = 10; + {::_pbi::TcParser::FastMtR1, + {82, 2, 2, + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.attrid_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // int32 option = 1; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.option_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // uint32 worldId = 2; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.worldid_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint64 lobbyId = 3; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.lobbyid_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint32 rangeFilter_startIndex = 4; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.rangefilter_startindex_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 rangeFilter_max = 5; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.rangefilter_max_), _Internal::kHasBitsOffset + 7, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 flagFilter = 6; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.flagfilter_), _Internal::kHasBitsOffset + 8, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 flagAttr = 7; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.flagattr_), _Internal::kHasBitsOffset + 9, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.IntSearchFilter intFilter = 8; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.intfilter_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.BinSearchFilter binFilter = 9; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.binfilter_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.uint16 attrId = 10; + {PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.attrid_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::IntSearchFilter>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinSearchFilter>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void SearchRoomRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SearchRoomRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.intfilter_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.binfilter_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _impl_.attrid_.Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x000000f8U)) { + ::memset(&_impl_.option_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.rangefilter_max_) - + reinterpret_cast(&_impl_.option_)) + sizeof(_impl_.rangefilter_max_)); + } + if (BatchCheckHasBit(cached_has_bits, 0x00000300U)) { + ::memset(&_impl_.flagfilter_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.flagattr_) - + reinterpret_cast(&_impl_.flagfilter_)) + sizeof(_impl_.flagattr_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SearchRoomRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SearchRoomRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SearchRoomRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SearchRoomRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SearchRoomRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // int32 option = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_option() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<1>( + stream, this_._internal_option(), target); + } + } + + // uint32 worldId = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_worldid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_worldid(), target); + } + } + + // uint64 lobbyId = 3; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_lobbyid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 3, this_._internal_lobbyid(), target); + } + } + + // uint32 rangeFilter_startIndex = 4; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_rangefilter_startindex() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 4, this_._internal_rangefilter_startindex(), target); + } + } + + // uint32 rangeFilter_max = 5; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (this_._internal_rangefilter_max() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 5, this_._internal_rangefilter_max(), target); + } + } + + // uint32 flagFilter = 6; + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + if (this_._internal_flagfilter() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 6, this_._internal_flagfilter(), target); + } + } + + // uint32 flagAttr = 7; + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + if (this_._internal_flagattr() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 7, this_._internal_flagattr(), target); + } + } + + // repeated .np2_structs.IntSearchFilter intFilter = 8; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_intfilter_size()); + i < n; i++) { + const auto& repfield = this_._internal_intfilter().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 8, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.BinSearchFilter binFilter = 9; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_binfilter_size()); + i < n; i++) { + const auto& repfield = this_._internal_binfilter().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 9, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.uint16 attrId = 10; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_attrid_size()); + i < n; i++) { + const auto& repfield = this_._internal_attrid().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 10, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SearchRoomRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SearchRoomRequest::ByteSizeLong(const MessageLite& base) { + const SearchRoomRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SearchRoomRequest::ByteSizeLong() const { + const SearchRoomRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SearchRoomRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + // repeated .np2_structs.IntSearchFilter intFilter = 8; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_intfilter_size(); + for (const auto& msg : this_._internal_intfilter()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.BinSearchFilter binFilter = 9; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += 1UL * this_._internal_binfilter_size(); + for (const auto& msg : this_._internal_binfilter()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.uint16 attrId = 10; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + total_size += 1UL * this_._internal_attrid_size(); + for (const auto& msg : this_._internal_attrid()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // int32 option = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_option() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_option()); + } + } + // uint32 worldId = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_worldid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_worldid()); + } + } + // uint64 lobbyId = 3; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_lobbyid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_lobbyid()); + } + } + // uint32 rangeFilter_startIndex = 4; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_rangefilter_startindex() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_rangefilter_startindex()); + } + } + // uint32 rangeFilter_max = 5; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (this_._internal_rangefilter_max() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_rangefilter_max()); + } + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000300U)) { + // uint32 flagFilter = 6; + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + if (this_._internal_flagfilter() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_flagfilter()); + } + } + // uint32 flagAttr = 7; + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + if (this_._internal_flagattr() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_flagattr()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SearchRoomRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SearchRoomRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_intfilter()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_intfilter()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_binfilter()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_binfilter()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _this->_internal_mutable_attrid()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_attrid()); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_option() != 0) { + _this->_impl_.option_ = from._impl_.option_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_worldid() != 0) { + _this->_impl_.worldid_ = from._impl_.worldid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (from._internal_lobbyid() != 0) { + _this->_impl_.lobbyid_ = from._impl_.lobbyid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (from._internal_rangefilter_startindex() != 0) { + _this->_impl_.rangefilter_startindex_ = from._impl_.rangefilter_startindex_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (from._internal_rangefilter_max() != 0) { + _this->_impl_.rangefilter_max_ = from._impl_.rangefilter_max_; + } + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000300U)) { + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + if (from._internal_flagfilter() != 0) { + _this->_impl_.flagfilter_ = from._impl_.flagfilter_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + if (from._internal_flagattr() != 0) { + _this->_impl_.flagattr_ = from._impl_.flagattr_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SearchRoomRequest::CopyFrom(const SearchRoomRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SearchRoomRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SearchRoomRequest::InternalSwap(SearchRoomRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.intfilter_.InternalSwap(&other->_impl_.intfilter_); + _impl_.binfilter_.InternalSwap(&other->_impl_.binfilter_); + _impl_.attrid_.InternalSwap(&other->_impl_.attrid_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.flagattr_) + + sizeof(SearchRoomRequest::_impl_.flagattr_) + - PROTOBUF_FIELD_OFFSET(SearchRoomRequest, _impl_.option_)>( + reinterpret_cast(&_impl_.option_), + reinterpret_cast(&other->_impl_.option_)); +} + +// =================================================================== + +class SearchRoomResponse::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_._has_bits_); +}; + +SearchRoomResponse::SearchRoomResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SearchRoomResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SearchRoomResponse) +} +PROTOBUF_NDEBUG_INLINE SearchRoomResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SearchRoomResponse& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + rooms_{visibility, arena, from.rooms_} {} + +SearchRoomResponse::SearchRoomResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SearchRoomResponse& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SearchRoomResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SearchRoomResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, startindex_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, startindex_), + offsetof(Impl_, total_) - + offsetof(Impl_, startindex_) + + sizeof(Impl_::total_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.SearchRoomResponse) +} +PROTOBUF_NDEBUG_INLINE SearchRoomResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + rooms_{visibility, arena} {} + +inline void SearchRoomResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, startindex_), + 0, + offsetof(Impl_, total_) - + offsetof(Impl_, startindex_) + + sizeof(Impl_::total_)); +} +SearchRoomResponse::~SearchRoomResponse() { + // @@protoc_insertion_point(destructor:np2_structs.SearchRoomResponse) + SharedDtor(*this); +} +inline void SearchRoomResponse::SharedDtor(MessageLite& self) { + SearchRoomResponse& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SearchRoomResponse::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SearchRoomResponse(arena); +} +constexpr auto SearchRoomResponse::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_.rooms_) + + decltype(SearchRoomResponse::_impl_.rooms_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(SearchRoomResponse), alignof(SearchRoomResponse), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&SearchRoomResponse::PlacementNew_, + sizeof(SearchRoomResponse), + alignof(SearchRoomResponse)); + } +} +constexpr auto SearchRoomResponse::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<31>{ + { + &_SearchRoomResponse_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SearchRoomResponse::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SearchRoomResponse::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SearchRoomResponse::ByteSizeLong, + &SearchRoomResponse::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_._cached_size_), + true, + }, + "np2_structs.SearchRoomResponse", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<31> SearchRoomResponse_class_data_ = + SearchRoomResponse::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SearchRoomResponse::GetClassData() const { + return SearchRoomResponse_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 1, 0, 2> +SearchRoomResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + SearchRoomResponse_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SearchRoomResponse>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 startIndex = 1; + {::_pbi::TcParser::FastV32S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_.startindex_)}}, + // uint32 total = 2; + {::_pbi::TcParser::FastV32S1, + {16, 2, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_.total_)}}, + // repeated .np2_structs.RoomDataExternal rooms = 3; + {::_pbi::TcParser::FastMtR1, + {26, 0, 0, + PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_.rooms_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 startIndex = 1; + {PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_.startindex_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 total = 2; + {PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_.total_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.RoomDataExternal rooms = 3; + {PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_.rooms_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::RoomDataExternal>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void SearchRoomResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SearchRoomResponse) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.rooms_.Clear(); + } + if (BatchCheckHasBit(cached_has_bits, 0x00000006U)) { + ::memset(&_impl_.startindex_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.total_) - + reinterpret_cast(&_impl_.startindex_)) + sizeof(_impl_.total_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SearchRoomResponse::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SearchRoomResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SearchRoomResponse::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SearchRoomResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SearchRoomResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 startIndex = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_startindex() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_startindex(), target); + } + } + + // uint32 total = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_total() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_total(), target); + } + } + + // repeated .np2_structs.RoomDataExternal rooms = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_rooms_size()); + i < n; i++) { + const auto& repfield = this_._internal_rooms().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SearchRoomResponse) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SearchRoomResponse::ByteSizeLong(const MessageLite& base) { + const SearchRoomResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SearchRoomResponse::ByteSizeLong() const { + const SearchRoomResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SearchRoomResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // repeated .np2_structs.RoomDataExternal rooms = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_rooms_size(); + for (const auto& msg : this_._internal_rooms()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint32 startIndex = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_startindex() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_startindex()); + } + } + // uint32 total = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_total() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_total()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SearchRoomResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SearchRoomResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_rooms()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_rooms()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_startindex() != 0) { + _this->_impl_.startindex_ = from._impl_.startindex_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_total() != 0) { + _this->_impl_.total_ = from._impl_.total_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SearchRoomResponse::CopyFrom(const SearchRoomResponse& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SearchRoomResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SearchRoomResponse::InternalSwap(SearchRoomResponse* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.rooms_.InternalSwap(&other->_impl_.rooms_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_.total_) + + sizeof(SearchRoomResponse::_impl_.total_) + - PROTOBUF_FIELD_OFFSET(SearchRoomResponse, _impl_.startindex_)>( + reinterpret_cast(&_impl_.startindex_), + reinterpret_cast(&other->_impl_.startindex_)); +} + +// =================================================================== + +class CreateJoinRoomRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_._has_bits_); +}; + +CreateJoinRoomRequest::CreateJoinRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, CreateJoinRoomRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.CreateJoinRoomRequest) +} +PROTOBUF_NDEBUG_INLINE CreateJoinRoomRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::CreateJoinRoomRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + roombinattrinternal_{visibility, arena, from.roombinattrinternal_}, + roomsearchableintattrexternal_{visibility, arena, from.roomsearchableintattrexternal_}, + roomsearchablebinattrexternal_{visibility, arena, from.roomsearchablebinattrexternal_}, + roombinattrexternal_{visibility, arena, from.roombinattrexternal_}, + groupconfig_{visibility, arena, from.groupconfig_}, + alloweduser_{visibility, arena, from.alloweduser_}, + blockeduser_{visibility, arena, from.blockeduser_}, + roommemberbinattrinternal_{visibility, arena, from.roommemberbinattrinternal_}, + roompassword_(arena, from.roompassword_), + joinroomgrouplabel_(arena, from.joinroomgrouplabel_) {} + +CreateJoinRoomRequest::CreateJoinRoomRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const CreateJoinRoomRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, CreateJoinRoomRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + CreateJoinRoomRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.teamid_ = (CheckHasBit(cached_has_bits, 0x00000400U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.teamid_) + : nullptr; + _impl_.sigoptparam_ = (CheckHasBit(cached_has_bits, 0x00000800U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.sigoptparam_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, lobbyid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, lobbyid_), + offsetof(Impl_, flagattr_) - + offsetof(Impl_, lobbyid_) + + sizeof(Impl_::flagattr_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.CreateJoinRoomRequest) +} +PROTOBUF_NDEBUG_INLINE CreateJoinRoomRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + roombinattrinternal_{visibility, arena}, + roomsearchableintattrexternal_{visibility, arena}, + roomsearchablebinattrexternal_{visibility, arena}, + roombinattrexternal_{visibility, arena}, + groupconfig_{visibility, arena}, + alloweduser_{visibility, arena}, + blockeduser_{visibility, arena}, + roommemberbinattrinternal_{visibility, arena}, + roompassword_(arena), + joinroomgrouplabel_(arena) {} + +inline void CreateJoinRoomRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, teamid_), + 0, + offsetof(Impl_, flagattr_) - + offsetof(Impl_, teamid_) + + sizeof(Impl_::flagattr_)); +} +CreateJoinRoomRequest::~CreateJoinRoomRequest() { + // @@protoc_insertion_point(destructor:np2_structs.CreateJoinRoomRequest) + SharedDtor(*this); +} +inline void CreateJoinRoomRequest::SharedDtor(MessageLite& self) { + CreateJoinRoomRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.roompassword_.Destroy(); + this_._impl_.joinroomgrouplabel_.Destroy(); + delete this_._impl_.teamid_; + delete this_._impl_.sigoptparam_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL CreateJoinRoomRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) CreateJoinRoomRequest(arena); +} +constexpr auto CreateJoinRoomRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roombinattrinternal_) + + decltype(CreateJoinRoomRequest::_impl_.roombinattrinternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roomsearchableintattrexternal_) + + decltype(CreateJoinRoomRequest::_impl_.roomsearchableintattrexternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roomsearchablebinattrexternal_) + + decltype(CreateJoinRoomRequest::_impl_.roomsearchablebinattrexternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roombinattrexternal_) + + decltype(CreateJoinRoomRequest::_impl_.roombinattrexternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.groupconfig_) + + decltype(CreateJoinRoomRequest::_impl_.groupconfig_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.alloweduser_) + + decltype(CreateJoinRoomRequest::_impl_.alloweduser_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.blockeduser_) + + decltype(CreateJoinRoomRequest::_impl_.blockeduser_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roommemberbinattrinternal_) + + decltype(CreateJoinRoomRequest::_impl_.roommemberbinattrinternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(CreateJoinRoomRequest), alignof(CreateJoinRoomRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&CreateJoinRoomRequest::PlacementNew_, + sizeof(CreateJoinRoomRequest), + alignof(CreateJoinRoomRequest)); + } +} +constexpr auto CreateJoinRoomRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<34>{ + { + &_CreateJoinRoomRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &CreateJoinRoomRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &CreateJoinRoomRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &CreateJoinRoomRequest::ByteSizeLong, + &CreateJoinRoomRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_._cached_size_), + true, + }, + "np2_structs.CreateJoinRoomRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<34> CreateJoinRoomRequest_class_data_ = + CreateJoinRoomRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +CreateJoinRoomRequest::GetClassData() const { + return CreateJoinRoomRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<5, 17, 8, 80, 2> +CreateJoinRoomRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_._has_bits_), + 0, // no _extensions_ + 17, 248, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294836224, // skipmap + offsetof(decltype(_table_), field_entries), + 17, // num_field_entries + 8, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + CreateJoinRoomRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::CreateJoinRoomRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 worldId = 1; + {::_pbi::TcParser::FastV32S1, + {8, 13, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.worldid_)}}, + // uint64 lobbyId = 2; + {::_pbi::TcParser::FastV64S1, + {16, 12, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.lobbyid_)}}, + // uint32 maxSlot = 3; + {::_pbi::TcParser::FastV32S1, + {24, 14, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.maxslot_)}}, + // uint32 flagAttr = 4; + {::_pbi::TcParser::FastV32S1, + {32, 16, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.flagattr_)}}, + // repeated .np2_structs.BinAttr roomBinAttrInternal = 5; + {::_pbi::TcParser::FastMtR1, + {42, 0, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roombinattrinternal_)}}, + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 6; + {::_pbi::TcParser::FastMtR1, + {50, 1, 1, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roomsearchableintattrexternal_)}}, + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 7; + {::_pbi::TcParser::FastMtR1, + {58, 2, 2, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roomsearchablebinattrexternal_)}}, + // repeated .np2_structs.BinAttr roomBinAttrExternal = 8; + {::_pbi::TcParser::FastMtR1, + {66, 3, 3, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roombinattrexternal_)}}, + // bytes roomPassword = 9; + {::_pbi::TcParser::FastBS1, + {74, 8, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roompassword_)}}, + // repeated .np2_structs.GroupConfig groupConfig = 10; + {::_pbi::TcParser::FastMtR1, + {82, 4, 4, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.groupconfig_)}}, + // uint64 passwordSlotMask = 11; + {::_pbi::TcParser::FastV64S1, + {88, 15, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.passwordslotmask_)}}, + // repeated string allowedUser = 12; + {::_pbi::TcParser::FastUR1, + {98, 5, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.alloweduser_)}}, + // repeated string blockedUser = 13; + {::_pbi::TcParser::FastUR1, + {106, 6, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.blockeduser_)}}, + // bytes joinRoomGroupLabel = 14; + {::_pbi::TcParser::FastBS1, + {114, 9, 0, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.joinroomgrouplabel_)}}, + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 15; + {::_pbi::TcParser::FastMtR1, + {122, 7, 5, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roommemberbinattrinternal_)}}, + // .np2_structs.uint8 teamId = 16; + {::_pbi::TcParser::FastMtS2, + {386, 10, 6, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.teamid_)}}, + // .np2_structs.OptParam sigOptParam = 17; + {::_pbi::TcParser::FastMtS2, + {394, 11, 7, + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.sigoptparam_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 worldId = 1; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.worldid_), _Internal::kHasBitsOffset + 13, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint64 lobbyId = 2; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.lobbyid_), _Internal::kHasBitsOffset + 12, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint32 maxSlot = 3; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.maxslot_), _Internal::kHasBitsOffset + 14, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 flagAttr = 4; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.flagattr_), _Internal::kHasBitsOffset + 16, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.BinAttr roomBinAttrInternal = 5; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roombinattrinternal_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 6; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roomsearchableintattrexternal_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 7; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roomsearchablebinattrexternal_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.BinAttr roomBinAttrExternal = 8; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roombinattrexternal_), _Internal::kHasBitsOffset + 3, 3, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // bytes roomPassword = 9; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roompassword_), _Internal::kHasBitsOffset + 8, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // repeated .np2_structs.GroupConfig groupConfig = 10; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.groupconfig_), _Internal::kHasBitsOffset + 4, 4, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint64 passwordSlotMask = 11; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.passwordslotmask_), _Internal::kHasBitsOffset + 15, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // repeated string allowedUser = 12; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.alloweduser_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcRepeated | ::_fl::kUtf8String | ::_fl::kRepSString)}, + // repeated string blockedUser = 13; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.blockeduser_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcRepeated | ::_fl::kUtf8String | ::_fl::kRepSString)}, + // bytes joinRoomGroupLabel = 14; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.joinroomgrouplabel_), _Internal::kHasBitsOffset + 9, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 15; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.roommemberbinattrinternal_), _Internal::kHasBitsOffset + 7, 5, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint8 teamId = 16; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.teamid_), _Internal::kHasBitsOffset + 10, 6, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.OptParam sigOptParam = 17; + {PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.sigoptparam_), _Internal::kHasBitsOffset + 11, 7, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::IntAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::GroupConfig>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::OptParam>()}, + }}, + {{ + "\41\0\0\0\0\0\0\0\0\0\0\0\13\13\0\0\0\0\0\0\0\0\0\0" + "np2_structs.CreateJoinRoomRequest" + "allowedUser" + "blockedUser" + }}, +}; +PROTOBUF_NOINLINE void CreateJoinRoomRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.CreateJoinRoomRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.roombinattrinternal_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.roomsearchableintattrexternal_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _impl_.roomsearchablebinattrexternal_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + _impl_.roombinattrexternal_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) { + _impl_.groupconfig_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) { + _impl_.alloweduser_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) { + _impl_.blockeduser_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) { + _impl_.roommemberbinattrinternal_.Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000f00U)) { + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + _impl_.roompassword_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + _impl_.joinroomgrouplabel_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + ABSL_DCHECK(_impl_.teamid_ != nullptr); + _impl_.teamid_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000800U)) { + ABSL_DCHECK(_impl_.sigoptparam_ != nullptr); + _impl_.sigoptparam_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000f000U)) { + ::memset(&_impl_.lobbyid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.passwordslotmask_) - + reinterpret_cast(&_impl_.lobbyid_)) + sizeof(_impl_.passwordslotmask_)); + } + _impl_.flagattr_ = 0u; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL CreateJoinRoomRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const CreateJoinRoomRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL CreateJoinRoomRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const CreateJoinRoomRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.CreateJoinRoomRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 worldId = 1; + if (CheckHasBit(cached_has_bits, 0x00002000U)) { + if (this_._internal_worldid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_worldid(), target); + } + } + + // uint64 lobbyId = 2; + if (CheckHasBit(cached_has_bits, 0x00001000U)) { + if (this_._internal_lobbyid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 2, this_._internal_lobbyid(), target); + } + } + + // uint32 maxSlot = 3; + if (CheckHasBit(cached_has_bits, 0x00004000U)) { + if (this_._internal_maxslot() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 3, this_._internal_maxslot(), target); + } + } + + // uint32 flagAttr = 4; + if (CheckHasBit(cached_has_bits, 0x00010000U)) { + if (this_._internal_flagattr() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 4, this_._internal_flagattr(), target); + } + } + + // repeated .np2_structs.BinAttr roomBinAttrInternal = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roombinattrinternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roombinattrinternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 5, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 6; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roomsearchableintattrexternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roomsearchableintattrexternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 6, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 7; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roomsearchablebinattrexternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roomsearchablebinattrexternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 7, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.BinAttr roomBinAttrExternal = 8; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roombinattrexternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roombinattrexternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 8, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // bytes roomPassword = 9; + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + if (!this_._internal_roompassword().empty()) { + const ::std::string& _s = this_._internal_roompassword(); + target = stream->WriteBytesMaybeAliased(9, _s, target); + } + } + + // repeated .np2_structs.GroupConfig groupConfig = 10; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_groupconfig_size()); + i < n; i++) { + const auto& repfield = this_._internal_groupconfig().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 10, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // uint64 passwordSlotMask = 11; + if (CheckHasBit(cached_has_bits, 0x00008000U)) { + if (this_._internal_passwordslotmask() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 11, this_._internal_passwordslotmask(), target); + } + } + + // repeated string allowedUser = 12; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) { + for (int i = 0, n = this_._internal_alloweduser_size(); i < n; ++i) { + const auto& s = this_._internal_alloweduser().Get(i); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + s.data(), static_cast(s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.CreateJoinRoomRequest.allowedUser"); + target = stream->WriteString(12, s, target); + } + } + + // repeated string blockedUser = 13; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) { + for (int i = 0, n = this_._internal_blockeduser_size(); i < n; ++i) { + const auto& s = this_._internal_blockeduser().Get(i); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + s.data(), static_cast(s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.CreateJoinRoomRequest.blockedUser"); + target = stream->WriteString(13, s, target); + } + } + + // bytes joinRoomGroupLabel = 14; + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + if (!this_._internal_joinroomgrouplabel().empty()) { + const ::std::string& _s = this_._internal_joinroomgrouplabel(); + target = stream->WriteBytesMaybeAliased(14, _s, target); + } + } + + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 15; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roommemberbinattrinternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roommemberbinattrinternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 15, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // .np2_structs.uint8 teamId = 16; + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 16, *this_._impl_.teamid_, this_._impl_.teamid_->GetCachedSize(), target, + stream); + } + + // .np2_structs.OptParam sigOptParam = 17; + if (CheckHasBit(cached_has_bits, 0x00000800U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 17, *this_._impl_.sigoptparam_, this_._impl_.sigoptparam_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.CreateJoinRoomRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t CreateJoinRoomRequest::ByteSizeLong(const MessageLite& base) { + const CreateJoinRoomRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t CreateJoinRoomRequest::ByteSizeLong() const { + const CreateJoinRoomRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.CreateJoinRoomRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + // repeated .np2_structs.BinAttr roomBinAttrInternal = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_roombinattrinternal_size(); + for (const auto& msg : this_._internal_roombinattrinternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 6; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += 1UL * this_._internal_roomsearchableintattrexternal_size(); + for (const auto& msg : this_._internal_roomsearchableintattrexternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 7; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + total_size += 1UL * this_._internal_roomsearchablebinattrexternal_size(); + for (const auto& msg : this_._internal_roomsearchablebinattrexternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.BinAttr roomBinAttrExternal = 8; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + total_size += 1UL * this_._internal_roombinattrexternal_size(); + for (const auto& msg : this_._internal_roombinattrexternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.GroupConfig groupConfig = 10; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) { + total_size += 1UL * this_._internal_groupconfig_size(); + for (const auto& msg : this_._internal_groupconfig()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated string allowedUser = 12; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) { + total_size += + 1 * ::google::protobuf::internal::FromIntSize(this_._internal_alloweduser().size()); + for (int i = 0, n = this_._internal_alloweduser().size(); i < n; ++i) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_alloweduser().Get(i)); + } + } + // repeated string blockedUser = 13; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) { + total_size += + 1 * ::google::protobuf::internal::FromIntSize(this_._internal_blockeduser().size()); + for (int i = 0, n = this_._internal_blockeduser().size(); i < n; ++i) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_blockeduser().Get(i)); + } + } + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 15; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) { + total_size += 1UL * this_._internal_roommemberbinattrinternal_size(); + for (const auto& msg : this_._internal_roommemberbinattrinternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000ff00U)) { + // bytes roomPassword = 9; + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + if (!this_._internal_roompassword().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_roompassword()); + } + } + // bytes joinRoomGroupLabel = 14; + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + if (!this_._internal_joinroomgrouplabel().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_joinroomgrouplabel()); + } + } + // .np2_structs.uint8 teamId = 16; + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.teamid_); + } + // .np2_structs.OptParam sigOptParam = 17; + if (CheckHasBit(cached_has_bits, 0x00000800U)) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.sigoptparam_); + } + // uint64 lobbyId = 2; + if (CheckHasBit(cached_has_bits, 0x00001000U)) { + if (this_._internal_lobbyid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_lobbyid()); + } + } + // uint32 worldId = 1; + if (CheckHasBit(cached_has_bits, 0x00002000U)) { + if (this_._internal_worldid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_worldid()); + } + } + // uint32 maxSlot = 3; + if (CheckHasBit(cached_has_bits, 0x00004000U)) { + if (this_._internal_maxslot() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_maxslot()); + } + } + // uint64 passwordSlotMask = 11; + if (CheckHasBit(cached_has_bits, 0x00008000U)) { + if (this_._internal_passwordslotmask() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_passwordslotmask()); + } + } + } + { + // uint32 flagAttr = 4; + if (CheckHasBit(cached_has_bits, 0x00010000U)) { + if (this_._internal_flagattr() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_flagattr()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void CreateJoinRoomRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.CreateJoinRoomRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_roombinattrinternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roombinattrinternal()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_roomsearchableintattrexternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roomsearchableintattrexternal()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _this->_internal_mutable_roomsearchablebinattrexternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roomsearchablebinattrexternal()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + _this->_internal_mutable_roombinattrexternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roombinattrexternal()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) { + _this->_internal_mutable_groupconfig()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_groupconfig()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) { + _this->_internal_mutable_alloweduser()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_alloweduser()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) { + _this->_internal_mutable_blockeduser()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_blockeduser()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) { + _this->_internal_mutable_roommemberbinattrinternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roommemberbinattrinternal()); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000ff00U)) { + if (CheckHasBit(cached_has_bits, 0x00000100U)) { + if (!from._internal_roompassword().empty()) { + _this->_internal_set_roompassword(from._internal_roompassword()); + } else { + if (_this->_impl_.roompassword_.IsDefault()) { + _this->_internal_set_roompassword(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000200U)) { + if (!from._internal_joinroomgrouplabel().empty()) { + _this->_internal_set_joinroomgrouplabel(from._internal_joinroomgrouplabel()); + } else { + if (_this->_impl_.joinroomgrouplabel_.IsDefault()) { + _this->_internal_set_joinroomgrouplabel(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000400U)) { + ABSL_DCHECK(from._impl_.teamid_ != nullptr); + if (_this->_impl_.teamid_ == nullptr) { + _this->_impl_.teamid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.teamid_); + } else { + _this->_impl_.teamid_->MergeFrom(*from._impl_.teamid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000800U)) { + ABSL_DCHECK(from._impl_.sigoptparam_ != nullptr); + if (_this->_impl_.sigoptparam_ == nullptr) { + _this->_impl_.sigoptparam_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.sigoptparam_); + } else { + _this->_impl_.sigoptparam_->MergeFrom(*from._impl_.sigoptparam_); + } + } + if (CheckHasBit(cached_has_bits, 0x00001000U)) { + if (from._internal_lobbyid() != 0) { + _this->_impl_.lobbyid_ = from._impl_.lobbyid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00002000U)) { + if (from._internal_worldid() != 0) { + _this->_impl_.worldid_ = from._impl_.worldid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00004000U)) { + if (from._internal_maxslot() != 0) { + _this->_impl_.maxslot_ = from._impl_.maxslot_; + } + } + if (CheckHasBit(cached_has_bits, 0x00008000U)) { + if (from._internal_passwordslotmask() != 0) { + _this->_impl_.passwordslotmask_ = from._impl_.passwordslotmask_; + } + } + } + if (CheckHasBit(cached_has_bits, 0x00010000U)) { + if (from._internal_flagattr() != 0) { + _this->_impl_.flagattr_ = from._impl_.flagattr_; + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void CreateJoinRoomRequest::CopyFrom(const CreateJoinRoomRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.CreateJoinRoomRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void CreateJoinRoomRequest::InternalSwap(CreateJoinRoomRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.roombinattrinternal_.InternalSwap(&other->_impl_.roombinattrinternal_); + _impl_.roomsearchableintattrexternal_.InternalSwap(&other->_impl_.roomsearchableintattrexternal_); + _impl_.roomsearchablebinattrexternal_.InternalSwap(&other->_impl_.roomsearchablebinattrexternal_); + _impl_.roombinattrexternal_.InternalSwap(&other->_impl_.roombinattrexternal_); + _impl_.groupconfig_.InternalSwap(&other->_impl_.groupconfig_); + _impl_.alloweduser_.InternalSwap(&other->_impl_.alloweduser_); + _impl_.blockeduser_.InternalSwap(&other->_impl_.blockeduser_); + _impl_.roommemberbinattrinternal_.InternalSwap(&other->_impl_.roommemberbinattrinternal_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.roompassword_, &other->_impl_.roompassword_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.joinroomgrouplabel_, &other->_impl_.joinroomgrouplabel_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.flagattr_) + + sizeof(CreateJoinRoomRequest::_impl_.flagattr_) + - PROTOBUF_FIELD_OFFSET(CreateJoinRoomRequest, _impl_.teamid_)>( + reinterpret_cast(&_impl_.teamid_), + reinterpret_cast(&other->_impl_.teamid_)); +} + +// =================================================================== + +class JoinRoomRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_._has_bits_); +}; + +JoinRoomRequest::JoinRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, JoinRoomRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.JoinRoomRequest) +} +PROTOBUF_NDEBUG_INLINE JoinRoomRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::JoinRoomRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + roommemberbinattrinternal_{visibility, arena, from.roommemberbinattrinternal_}, + roompassword_(arena, from.roompassword_), + joinroomgrouplabel_(arena, from.joinroomgrouplabel_) {} + +JoinRoomRequest::JoinRoomRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const JoinRoomRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, JoinRoomRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + JoinRoomRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.optdata_ = (CheckHasBit(cached_has_bits, 0x00000008U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.optdata_) + : nullptr; + _impl_.teamid_ = (CheckHasBit(cached_has_bits, 0x00000010U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.teamid_) + : nullptr; + _impl_.roomid_ = from._impl_.roomid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.JoinRoomRequest) +} +PROTOBUF_NDEBUG_INLINE JoinRoomRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + roommemberbinattrinternal_{visibility, arena}, + roompassword_(arena), + joinroomgrouplabel_(arena) {} + +inline void JoinRoomRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, optdata_), + 0, + offsetof(Impl_, roomid_) - + offsetof(Impl_, optdata_) + + sizeof(Impl_::roomid_)); +} +JoinRoomRequest::~JoinRoomRequest() { + // @@protoc_insertion_point(destructor:np2_structs.JoinRoomRequest) + SharedDtor(*this); +} +inline void JoinRoomRequest::SharedDtor(MessageLite& self) { + JoinRoomRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.roompassword_.Destroy(); + this_._impl_.joinroomgrouplabel_.Destroy(); + delete this_._impl_.optdata_; + delete this_._impl_.teamid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL JoinRoomRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) JoinRoomRequest(arena); +} +constexpr auto JoinRoomRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.roommemberbinattrinternal_) + + decltype(JoinRoomRequest::_impl_.roommemberbinattrinternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(JoinRoomRequest), alignof(JoinRoomRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&JoinRoomRequest::PlacementNew_, + sizeof(JoinRoomRequest), + alignof(JoinRoomRequest)); + } +} +constexpr auto JoinRoomRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<28>{ + { + &_JoinRoomRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &JoinRoomRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &JoinRoomRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &JoinRoomRequest::ByteSizeLong, + &JoinRoomRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_._cached_size_), + true, + }, + "np2_structs.JoinRoomRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<28> JoinRoomRequest_class_data_ = + JoinRoomRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +JoinRoomRequest::GetClassData() const { + return JoinRoomRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 6, 3, 0, 2> +JoinRoomRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_._has_bits_), + 0, // no _extensions_ + 6, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967232, // skipmap + offsetof(decltype(_table_), field_entries), + 6, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + JoinRoomRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::JoinRoomRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint64 roomId = 1; + {::_pbi::TcParser::FastV64S1, + {8, 5, 0, + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.roomid_)}}, + // bytes roomPassword = 2; + {::_pbi::TcParser::FastBS1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.roompassword_)}}, + // bytes joinRoomGroupLabel = 3; + {::_pbi::TcParser::FastBS1, + {26, 2, 0, + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.joinroomgrouplabel_)}}, + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + {::_pbi::TcParser::FastMtR1, + {34, 0, 0, + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.roommemberbinattrinternal_)}}, + // .np2_structs.PresenceOptionData optData = 5; + {::_pbi::TcParser::FastMtS1, + {42, 3, 1, + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.optdata_)}}, + // .np2_structs.uint8 teamId = 6; + {::_pbi::TcParser::FastMtS1, + {50, 4, 2, + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.teamid_)}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 roomId = 1; + {PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.roomid_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // bytes roomPassword = 2; + {PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.roompassword_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // bytes joinRoomGroupLabel = 3; + {PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.joinroomgrouplabel_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + {PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.roommemberbinattrinternal_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.PresenceOptionData optData = 5; + {PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.optdata_), _Internal::kHasBitsOffset + 3, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint8 teamId = 6; + {PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.teamid_), _Internal::kHasBitsOffset + 4, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::PresenceOptionData>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void JoinRoomRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.JoinRoomRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.roommemberbinattrinternal_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.roompassword_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + _impl_.joinroomgrouplabel_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(_impl_.optdata_ != nullptr); + _impl_.optdata_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(_impl_.teamid_ != nullptr); + _impl_.teamid_->Clear(); + } + } + _impl_.roomid_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL JoinRoomRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const JoinRoomRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL JoinRoomRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const JoinRoomRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.JoinRoomRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_roomid(), target); + } + } + + // bytes roomPassword = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_roompassword().empty()) { + const ::std::string& _s = this_._internal_roompassword(); + target = stream->WriteBytesMaybeAliased(2, _s, target); + } + } + + // bytes joinRoomGroupLabel = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_joinroomgrouplabel().empty()) { + const ::std::string& _s = this_._internal_joinroomgrouplabel(); + target = stream->WriteBytesMaybeAliased(3, _s, target); + } + } + + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roommemberbinattrinternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roommemberbinattrinternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // .np2_structs.PresenceOptionData optData = 5; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 5, *this_._impl_.optdata_, this_._impl_.optdata_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint8 teamId = 6; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 6, *this_._impl_.teamid_, this_._impl_.teamid_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.JoinRoomRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t JoinRoomRequest::ByteSizeLong(const MessageLite& base) { + const JoinRoomRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t JoinRoomRequest::ByteSizeLong() const { + const JoinRoomRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.JoinRoomRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) { + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_roommemberbinattrinternal_size(); + for (const auto& msg : this_._internal_roommemberbinattrinternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // bytes roomPassword = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_roompassword().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_roompassword()); + } + } + // bytes joinRoomGroupLabel = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_joinroomgrouplabel().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_joinroomgrouplabel()); + } + } + // .np2_structs.PresenceOptionData optData = 5; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.optdata_); + } + // .np2_structs.uint8 teamId = 6; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.teamid_); + } + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void JoinRoomRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.JoinRoomRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_roommemberbinattrinternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roommemberbinattrinternal()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_roompassword().empty()) { + _this->_internal_set_roompassword(from._internal_roompassword()); + } else { + if (_this->_impl_.roompassword_.IsDefault()) { + _this->_internal_set_roompassword(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!from._internal_joinroomgrouplabel().empty()) { + _this->_internal_set_joinroomgrouplabel(from._internal_joinroomgrouplabel()); + } else { + if (_this->_impl_.joinroomgrouplabel_.IsDefault()) { + _this->_internal_set_joinroomgrouplabel(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(from._impl_.optdata_ != nullptr); + if (_this->_impl_.optdata_ == nullptr) { + _this->_impl_.optdata_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.optdata_); + } else { + _this->_impl_.optdata_->MergeFrom(*from._impl_.optdata_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(from._impl_.teamid_ != nullptr); + if (_this->_impl_.teamid_ == nullptr) { + _this->_impl_.teamid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.teamid_); + } else { + _this->_impl_.teamid_->MergeFrom(*from._impl_.teamid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void JoinRoomRequest::CopyFrom(const JoinRoomRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.JoinRoomRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void JoinRoomRequest::InternalSwap(JoinRoomRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.roommemberbinattrinternal_.InternalSwap(&other->_impl_.roommemberbinattrinternal_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.roompassword_, &other->_impl_.roompassword_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.joinroomgrouplabel_, &other->_impl_.joinroomgrouplabel_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.roomid_) + + sizeof(JoinRoomRequest::_impl_.roomid_) + - PROTOBUF_FIELD_OFFSET(JoinRoomRequest, _impl_.optdata_)>( + reinterpret_cast(&_impl_.optdata_), + reinterpret_cast(&other->_impl_.optdata_)); +} + +// =================================================================== + +class JoinRoomResponse::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_._has_bits_); +}; + +JoinRoomResponse::JoinRoomResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, JoinRoomResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.JoinRoomResponse) +} +PROTOBUF_NDEBUG_INLINE JoinRoomResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::JoinRoomResponse& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + signaling_data_{visibility, arena, from.signaling_data_} {} + +JoinRoomResponse::JoinRoomResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const JoinRoomResponse& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, JoinRoomResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + JoinRoomResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.room_data_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.room_data_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.JoinRoomResponse) +} +PROTOBUF_NDEBUG_INLINE JoinRoomResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + signaling_data_{visibility, arena} {} + +inline void JoinRoomResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.room_data_ = {}; +} +JoinRoomResponse::~JoinRoomResponse() { + // @@protoc_insertion_point(destructor:np2_structs.JoinRoomResponse) + SharedDtor(*this); +} +inline void JoinRoomResponse::SharedDtor(MessageLite& self) { + JoinRoomResponse& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.room_data_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL JoinRoomResponse::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) JoinRoomResponse(arena); +} +constexpr auto JoinRoomResponse::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.signaling_data_) + + decltype(JoinRoomResponse::_impl_.signaling_data_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(JoinRoomResponse), alignof(JoinRoomResponse), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&JoinRoomResponse::PlacementNew_, + sizeof(JoinRoomResponse), + alignof(JoinRoomResponse)); + } +} +constexpr auto JoinRoomResponse::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<29>{ + { + &_JoinRoomResponse_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &JoinRoomResponse::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &JoinRoomResponse::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &JoinRoomResponse::ByteSizeLong, + &JoinRoomResponse::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_._cached_size_), + true, + }, + "np2_structs.JoinRoomResponse", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<29> JoinRoomResponse_class_data_ = + JoinRoomResponse::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +JoinRoomResponse::GetClassData() const { + return JoinRoomResponse_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 2, 0, 2> +JoinRoomResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + JoinRoomResponse_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::JoinRoomResponse>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; + {::_pbi::TcParser::FastMtR1, + {18, 0, 1, + PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.signaling_data_)}}, + // .np2_structs.RoomDataInternal room_data = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.room_data_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.RoomDataInternal room_data = 1; + {PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.room_data_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; + {PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.signaling_data_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::RoomDataInternal>()}, + {::_pbi::TcParser::GetTable<::np2_structs::Matching2SignalingInfo>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void JoinRoomResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.JoinRoomResponse) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.signaling_data_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.room_data_ != nullptr); + _impl_.room_data_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL JoinRoomResponse::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const JoinRoomResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL JoinRoomResponse::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const JoinRoomResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.JoinRoomResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.RoomDataInternal room_data = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.room_data_, this_._impl_.room_data_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_signaling_data_size()); + i < n; i++) { + const auto& repfield = this_._internal_signaling_data().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.JoinRoomResponse) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t JoinRoomResponse::ByteSizeLong(const MessageLite& base) { + const JoinRoomResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t JoinRoomResponse::ByteSizeLong() const { + const JoinRoomResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.JoinRoomResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_signaling_data_size(); + for (const auto& msg : this_._internal_signaling_data()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // .np2_structs.RoomDataInternal room_data = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.room_data_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void JoinRoomResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.JoinRoomResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_signaling_data()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_signaling_data()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.room_data_ != nullptr); + if (_this->_impl_.room_data_ == nullptr) { + _this->_impl_.room_data_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.room_data_); + } else { + _this->_impl_.room_data_->MergeFrom(*from._impl_.room_data_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void JoinRoomResponse::CopyFrom(const JoinRoomResponse& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.JoinRoomResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void JoinRoomResponse::InternalSwap(JoinRoomResponse* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.signaling_data_.InternalSwap(&other->_impl_.signaling_data_); + swap(_impl_.room_data_, other->_impl_.room_data_); +} + +// =================================================================== + +class LeaveRoomRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(LeaveRoomRequest, _impl_._has_bits_); +}; + +LeaveRoomRequest::LeaveRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, LeaveRoomRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.LeaveRoomRequest) +} +PROTOBUF_NDEBUG_INLINE LeaveRoomRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::LeaveRoomRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +LeaveRoomRequest::LeaveRoomRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const LeaveRoomRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, LeaveRoomRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + LeaveRoomRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.optdata_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.optdata_) + : nullptr; + _impl_.roomid_ = from._impl_.roomid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.LeaveRoomRequest) +} +PROTOBUF_NDEBUG_INLINE LeaveRoomRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void LeaveRoomRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, optdata_), + 0, + offsetof(Impl_, roomid_) - + offsetof(Impl_, optdata_) + + sizeof(Impl_::roomid_)); +} +LeaveRoomRequest::~LeaveRoomRequest() { + // @@protoc_insertion_point(destructor:np2_structs.LeaveRoomRequest) + SharedDtor(*this); +} +inline void LeaveRoomRequest::SharedDtor(MessageLite& self) { + LeaveRoomRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.optdata_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL LeaveRoomRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) LeaveRoomRequest(arena); +} +constexpr auto LeaveRoomRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(LeaveRoomRequest), + alignof(LeaveRoomRequest)); +} +constexpr auto LeaveRoomRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<29>{ + { + &_LeaveRoomRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &LeaveRoomRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &LeaveRoomRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &LeaveRoomRequest::ByteSizeLong, + &LeaveRoomRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(LeaveRoomRequest, _impl_._cached_size_), + true, + }, + "np2_structs.LeaveRoomRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<29> LeaveRoomRequest_class_data_ = + LeaveRoomRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +LeaveRoomRequest::GetClassData() const { + return LeaveRoomRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +LeaveRoomRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(LeaveRoomRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + LeaveRoomRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::LeaveRoomRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // .np2_structs.PresenceOptionData optData = 2; + {::_pbi::TcParser::FastMtS1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(LeaveRoomRequest, _impl_.optdata_)}}, + // uint64 roomId = 1; + {::_pbi::TcParser::FastV64S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(LeaveRoomRequest, _impl_.roomid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 roomId = 1; + {PROTOBUF_FIELD_OFFSET(LeaveRoomRequest, _impl_.roomid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.PresenceOptionData optData = 2; + {PROTOBUF_FIELD_OFFSET(LeaveRoomRequest, _impl_.optdata_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::PresenceOptionData>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void LeaveRoomRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.LeaveRoomRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.optdata_ != nullptr); + _impl_.optdata_->Clear(); + } + _impl_.roomid_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL LeaveRoomRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const LeaveRoomRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL LeaveRoomRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const LeaveRoomRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.LeaveRoomRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_roomid(), target); + } + } + + // .np2_structs.PresenceOptionData optData = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.optdata_, this_._impl_.optdata_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.LeaveRoomRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t LeaveRoomRequest::ByteSizeLong(const MessageLite& base) { + const LeaveRoomRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t LeaveRoomRequest::ByteSizeLong() const { + const LeaveRoomRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.LeaveRoomRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.PresenceOptionData optData = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.optdata_); + } + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void LeaveRoomRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.LeaveRoomRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.optdata_ != nullptr); + if (_this->_impl_.optdata_ == nullptr) { + _this->_impl_.optdata_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.optdata_); + } else { + _this->_impl_.optdata_->MergeFrom(*from._impl_.optdata_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void LeaveRoomRequest::CopyFrom(const LeaveRoomRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.LeaveRoomRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void LeaveRoomRequest::InternalSwap(LeaveRoomRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(LeaveRoomRequest, _impl_.roomid_) + + sizeof(LeaveRoomRequest::_impl_.roomid_) + - PROTOBUF_FIELD_OFFSET(LeaveRoomRequest, _impl_.optdata_)>( + reinterpret_cast(&_impl_.optdata_), + reinterpret_cast(&other->_impl_.optdata_)); +} + +// =================================================================== + +class GetRoomDataExternalListRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListRequest, _impl_._has_bits_); +}; + +GetRoomDataExternalListRequest::GetRoomDataExternalListRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomDataExternalListRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetRoomDataExternalListRequest) +} +PROTOBUF_NDEBUG_INLINE GetRoomDataExternalListRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetRoomDataExternalListRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + roomids_{visibility, arena, from.roomids_}, + _roomids_cached_byte_size_{0}, + attrids_{visibility, arena, from.attrids_} {} + +GetRoomDataExternalListRequest::GetRoomDataExternalListRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetRoomDataExternalListRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomDataExternalListRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetRoomDataExternalListRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetRoomDataExternalListRequest) +} +PROTOBUF_NDEBUG_INLINE GetRoomDataExternalListRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + roomids_{visibility, arena}, + _roomids_cached_byte_size_{0}, + attrids_{visibility, arena} {} + +inline void GetRoomDataExternalListRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +GetRoomDataExternalListRequest::~GetRoomDataExternalListRequest() { + // @@protoc_insertion_point(destructor:np2_structs.GetRoomDataExternalListRequest) + SharedDtor(*this); +} +inline void GetRoomDataExternalListRequest::SharedDtor(MessageLite& self) { + GetRoomDataExternalListRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetRoomDataExternalListRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetRoomDataExternalListRequest(arena); +} +constexpr auto GetRoomDataExternalListRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListRequest, _impl_.roomids_) + + decltype(GetRoomDataExternalListRequest::_impl_.roomids_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListRequest, _impl_.attrids_) + + decltype(GetRoomDataExternalListRequest::_impl_.attrids_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(GetRoomDataExternalListRequest), alignof(GetRoomDataExternalListRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&GetRoomDataExternalListRequest::PlacementNew_, + sizeof(GetRoomDataExternalListRequest), + alignof(GetRoomDataExternalListRequest)); + } +} +constexpr auto GetRoomDataExternalListRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<43>{ + { + &_GetRoomDataExternalListRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetRoomDataExternalListRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetRoomDataExternalListRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetRoomDataExternalListRequest::ByteSizeLong, + &GetRoomDataExternalListRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListRequest, _impl_._cached_size_), + true, + }, + "np2_structs.GetRoomDataExternalListRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<43> GetRoomDataExternalListRequest_class_data_ = + GetRoomDataExternalListRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetRoomDataExternalListRequest::GetClassData() const { + return GetRoomDataExternalListRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +GetRoomDataExternalListRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GetRoomDataExternalListRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetRoomDataExternalListRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.uint16 attrIds = 2; + {::_pbi::TcParser::FastMtR1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListRequest, _impl_.attrids_)}}, + // repeated uint64 roomIds = 1; + {::_pbi::TcParser::FastV64P1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListRequest, _impl_.roomids_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated uint64 roomIds = 1; + {PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListRequest, _impl_.roomids_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedUInt64)}, + // repeated .np2_structs.uint16 attrIds = 2; + {PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListRequest, _impl_.attrids_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void GetRoomDataExternalListRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetRoomDataExternalListRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.roomids_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.attrids_.Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetRoomDataExternalListRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetRoomDataExternalListRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetRoomDataExternalListRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetRoomDataExternalListRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetRoomDataExternalListRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated uint64 roomIds = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + { + int byte_size = this_._impl_._roomids_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteUInt64Packed( + 1, this_._internal_roomids(), byte_size, target); + } + } + } + + // repeated .np2_structs.uint16 attrIds = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_attrids_size()); + i < n; i++) { + const auto& repfield = this_._internal_attrids().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetRoomDataExternalListRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetRoomDataExternalListRequest::ByteSizeLong(const MessageLite& base) { + const GetRoomDataExternalListRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetRoomDataExternalListRequest::ByteSizeLong() const { + const GetRoomDataExternalListRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetRoomDataExternalListRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated uint64 roomIds = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + ::_pbi::WireFormatLite::UInt64SizeWithPackedTagSize( + this_._internal_roomids(), 1, + this_._impl_._roomids_cached_byte_size_); + } + // repeated .np2_structs.uint16 attrIds = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += 1UL * this_._internal_attrids_size(); + for (const auto& msg : this_._internal_attrids()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetRoomDataExternalListRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetRoomDataExternalListRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_roomids()->MergeFrom(from._internal_roomids()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_attrids()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_attrids()); + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetRoomDataExternalListRequest::CopyFrom(const GetRoomDataExternalListRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetRoomDataExternalListRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetRoomDataExternalListRequest::InternalSwap(GetRoomDataExternalListRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.roomids_.InternalSwap(&other->_impl_.roomids_); + _impl_.attrids_.InternalSwap(&other->_impl_.attrids_); +} + +// =================================================================== + +class GetRoomDataExternalListResponse::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListResponse, _impl_._has_bits_); +}; + +GetRoomDataExternalListResponse::GetRoomDataExternalListResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomDataExternalListResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetRoomDataExternalListResponse) +} +PROTOBUF_NDEBUG_INLINE GetRoomDataExternalListResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetRoomDataExternalListResponse& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + rooms_{visibility, arena, from.rooms_} {} + +GetRoomDataExternalListResponse::GetRoomDataExternalListResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetRoomDataExternalListResponse& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomDataExternalListResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetRoomDataExternalListResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetRoomDataExternalListResponse) +} +PROTOBUF_NDEBUG_INLINE GetRoomDataExternalListResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + rooms_{visibility, arena} {} + +inline void GetRoomDataExternalListResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +GetRoomDataExternalListResponse::~GetRoomDataExternalListResponse() { + // @@protoc_insertion_point(destructor:np2_structs.GetRoomDataExternalListResponse) + SharedDtor(*this); +} +inline void GetRoomDataExternalListResponse::SharedDtor(MessageLite& self) { + GetRoomDataExternalListResponse& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetRoomDataExternalListResponse::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetRoomDataExternalListResponse(arena); +} +constexpr auto GetRoomDataExternalListResponse::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListResponse, _impl_.rooms_) + + decltype(GetRoomDataExternalListResponse::_impl_.rooms_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(GetRoomDataExternalListResponse), alignof(GetRoomDataExternalListResponse), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&GetRoomDataExternalListResponse::PlacementNew_, + sizeof(GetRoomDataExternalListResponse), + alignof(GetRoomDataExternalListResponse)); + } +} +constexpr auto GetRoomDataExternalListResponse::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<44>{ + { + &_GetRoomDataExternalListResponse_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetRoomDataExternalListResponse::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetRoomDataExternalListResponse::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetRoomDataExternalListResponse::ByteSizeLong, + &GetRoomDataExternalListResponse::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListResponse, _impl_._cached_size_), + true, + }, + "np2_structs.GetRoomDataExternalListResponse", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<44> GetRoomDataExternalListResponse_class_data_ = + GetRoomDataExternalListResponse::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetRoomDataExternalListResponse::GetClassData() const { + return GetRoomDataExternalListResponse_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 1, 0, 2> +GetRoomDataExternalListResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListResponse, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GetRoomDataExternalListResponse_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetRoomDataExternalListResponse>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.RoomDataExternal rooms = 1; + {::_pbi::TcParser::FastMtR1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListResponse, _impl_.rooms_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .np2_structs.RoomDataExternal rooms = 1; + {PROTOBUF_FIELD_OFFSET(GetRoomDataExternalListResponse, _impl_.rooms_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::RoomDataExternal>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void GetRoomDataExternalListResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetRoomDataExternalListResponse) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.rooms_.Clear(); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetRoomDataExternalListResponse::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetRoomDataExternalListResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetRoomDataExternalListResponse::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetRoomDataExternalListResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetRoomDataExternalListResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated .np2_structs.RoomDataExternal rooms = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_rooms_size()); + i < n; i++) { + const auto& repfield = this_._internal_rooms().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetRoomDataExternalListResponse) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetRoomDataExternalListResponse::ByteSizeLong(const MessageLite& base) { + const GetRoomDataExternalListResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetRoomDataExternalListResponse::ByteSizeLong() const { + const GetRoomDataExternalListResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetRoomDataExternalListResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + { + // repeated .np2_structs.RoomDataExternal rooms = 1; + cached_has_bits = this_._impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_rooms_size(); + for (const auto& msg : this_._internal_rooms()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetRoomDataExternalListResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetRoomDataExternalListResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_rooms()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_rooms()); + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetRoomDataExternalListResponse::CopyFrom(const GetRoomDataExternalListResponse& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetRoomDataExternalListResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetRoomDataExternalListResponse::InternalSwap(GetRoomDataExternalListResponse* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.rooms_.InternalSwap(&other->_impl_.rooms_); +} + +// =================================================================== + +class SetRoomDataExternalRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_._has_bits_); +}; + +SetRoomDataExternalRequest::SetRoomDataExternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetRoomDataExternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SetRoomDataExternalRequest) +} +PROTOBUF_NDEBUG_INLINE SetRoomDataExternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SetRoomDataExternalRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + roomsearchableintattrexternal_{visibility, arena, from.roomsearchableintattrexternal_}, + roomsearchablebinattrexternal_{visibility, arena, from.roomsearchablebinattrexternal_}, + roombinattrexternal_{visibility, arena, from.roombinattrexternal_} {} + +SetRoomDataExternalRequest::SetRoomDataExternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SetRoomDataExternalRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetRoomDataExternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SetRoomDataExternalRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + _impl_.roomid_ = from._impl_.roomid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.SetRoomDataExternalRequest) +} +PROTOBUF_NDEBUG_INLINE SetRoomDataExternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + roomsearchableintattrexternal_{visibility, arena}, + roomsearchablebinattrexternal_{visibility, arena}, + roombinattrexternal_{visibility, arena} {} + +inline void SetRoomDataExternalRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.roomid_ = {}; +} +SetRoomDataExternalRequest::~SetRoomDataExternalRequest() { + // @@protoc_insertion_point(destructor:np2_structs.SetRoomDataExternalRequest) + SharedDtor(*this); +} +inline void SetRoomDataExternalRequest::SharedDtor(MessageLite& self) { + SetRoomDataExternalRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SetRoomDataExternalRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SetRoomDataExternalRequest(arena); +} +constexpr auto SetRoomDataExternalRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roomsearchableintattrexternal_) + + decltype(SetRoomDataExternalRequest::_impl_.roomsearchableintattrexternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roomsearchablebinattrexternal_) + + decltype(SetRoomDataExternalRequest::_impl_.roomsearchablebinattrexternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roombinattrexternal_) + + decltype(SetRoomDataExternalRequest::_impl_.roombinattrexternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(SetRoomDataExternalRequest), alignof(SetRoomDataExternalRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&SetRoomDataExternalRequest::PlacementNew_, + sizeof(SetRoomDataExternalRequest), + alignof(SetRoomDataExternalRequest)); + } +} +constexpr auto SetRoomDataExternalRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<39>{ + { + &_SetRoomDataExternalRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SetRoomDataExternalRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SetRoomDataExternalRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SetRoomDataExternalRequest::ByteSizeLong, + &SetRoomDataExternalRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_._cached_size_), + true, + }, + "np2_structs.SetRoomDataExternalRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<39> SetRoomDataExternalRequest_class_data_ = + SetRoomDataExternalRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SetRoomDataExternalRequest::GetClassData() const { + return SetRoomDataExternalRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 3, 0, 2> +SetRoomDataExternalRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + SetRoomDataExternalRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SetRoomDataExternalRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.BinAttr roomBinAttrExternal = 4; + {::_pbi::TcParser::FastMtR1, + {34, 2, 2, + PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roombinattrexternal_)}}, + // uint64 roomId = 1; + {::_pbi::TcParser::FastV64S1, + {8, 3, 0, + PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roomid_)}}, + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 2; + {::_pbi::TcParser::FastMtR1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roomsearchableintattrexternal_)}}, + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 3; + {::_pbi::TcParser::FastMtR1, + {26, 1, 1, + PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roomsearchablebinattrexternal_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 roomId = 1; + {PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roomid_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 2; + {PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roomsearchableintattrexternal_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 3; + {PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roomsearchablebinattrexternal_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.BinAttr roomBinAttrExternal = 4; + {PROTOBUF_FIELD_OFFSET(SetRoomDataExternalRequest, _impl_.roombinattrexternal_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::IntAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void SetRoomDataExternalRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SetRoomDataExternalRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.roomsearchableintattrexternal_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.roomsearchablebinattrexternal_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _impl_.roombinattrexternal_.Clear(); + } + } + _impl_.roomid_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SetRoomDataExternalRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SetRoomDataExternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SetRoomDataExternalRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SetRoomDataExternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SetRoomDataExternalRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_roomid(), target); + } + } + + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roomsearchableintattrexternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roomsearchableintattrexternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roomsearchablebinattrexternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roomsearchablebinattrexternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.BinAttr roomBinAttrExternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roombinattrexternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roombinattrexternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SetRoomDataExternalRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SetRoomDataExternalRequest::ByteSizeLong(const MessageLite& base) { + const SetRoomDataExternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SetRoomDataExternalRequest::ByteSizeLong() const { + const SetRoomDataExternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SetRoomDataExternalRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_roomsearchableintattrexternal_size(); + for (const auto& msg : this_._internal_roomsearchableintattrexternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += 1UL * this_._internal_roomsearchablebinattrexternal_size(); + for (const auto& msg : this_._internal_roomsearchablebinattrexternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.BinAttr roomBinAttrExternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + total_size += 1UL * this_._internal_roombinattrexternal_size(); + for (const auto& msg : this_._internal_roombinattrexternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SetRoomDataExternalRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SetRoomDataExternalRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_roomsearchableintattrexternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roomsearchableintattrexternal()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_roomsearchablebinattrexternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roomsearchablebinattrexternal()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _this->_internal_mutable_roombinattrexternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roombinattrexternal()); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SetRoomDataExternalRequest::CopyFrom(const SetRoomDataExternalRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SetRoomDataExternalRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SetRoomDataExternalRequest::InternalSwap(SetRoomDataExternalRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.roomsearchableintattrexternal_.InternalSwap(&other->_impl_.roomsearchableintattrexternal_); + _impl_.roomsearchablebinattrexternal_.InternalSwap(&other->_impl_.roomsearchablebinattrexternal_); + _impl_.roombinattrexternal_.InternalSwap(&other->_impl_.roombinattrexternal_); + swap(_impl_.roomid_, other->_impl_.roomid_); +} + +// =================================================================== + +class SetRoomDataInternalRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_._has_bits_); +}; + +SetRoomDataInternalRequest::SetRoomDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetRoomDataInternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SetRoomDataInternalRequest) +} +PROTOBUF_NDEBUG_INLINE SetRoomDataInternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SetRoomDataInternalRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + roombinattrinternal_{visibility, arena, from.roombinattrinternal_}, + passwordconfig_{visibility, arena, from.passwordconfig_}, + passwordslotmask_{visibility, arena, from.passwordslotmask_}, + _passwordslotmask_cached_byte_size_{0}, + ownerprivilegerank_{visibility, arena, from.ownerprivilegerank_} {} + +SetRoomDataInternalRequest::SetRoomDataInternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SetRoomDataInternalRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetRoomDataInternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SetRoomDataInternalRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, roomid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, roomid_), + offsetof(Impl_, flagattr_) - + offsetof(Impl_, roomid_) + + sizeof(Impl_::flagattr_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.SetRoomDataInternalRequest) +} +PROTOBUF_NDEBUG_INLINE SetRoomDataInternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + roombinattrinternal_{visibility, arena}, + passwordconfig_{visibility, arena}, + passwordslotmask_{visibility, arena}, + _passwordslotmask_cached_byte_size_{0}, + ownerprivilegerank_{visibility, arena} {} + +inline void SetRoomDataInternalRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, roomid_), + 0, + offsetof(Impl_, flagattr_) - + offsetof(Impl_, roomid_) + + sizeof(Impl_::flagattr_)); +} +SetRoomDataInternalRequest::~SetRoomDataInternalRequest() { + // @@protoc_insertion_point(destructor:np2_structs.SetRoomDataInternalRequest) + SharedDtor(*this); +} +inline void SetRoomDataInternalRequest::SharedDtor(MessageLite& self) { + SetRoomDataInternalRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SetRoomDataInternalRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SetRoomDataInternalRequest(arena); +} +constexpr auto SetRoomDataInternalRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.roombinattrinternal_) + + decltype(SetRoomDataInternalRequest::_impl_.roombinattrinternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.passwordconfig_) + + decltype(SetRoomDataInternalRequest::_impl_.passwordconfig_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.passwordslotmask_) + + decltype(SetRoomDataInternalRequest::_impl_.passwordslotmask_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.ownerprivilegerank_) + + decltype(SetRoomDataInternalRequest::_impl_.ownerprivilegerank_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(SetRoomDataInternalRequest), alignof(SetRoomDataInternalRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&SetRoomDataInternalRequest::PlacementNew_, + sizeof(SetRoomDataInternalRequest), + alignof(SetRoomDataInternalRequest)); + } +} +constexpr auto SetRoomDataInternalRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<39>{ + { + &_SetRoomDataInternalRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SetRoomDataInternalRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SetRoomDataInternalRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SetRoomDataInternalRequest::ByteSizeLong, + &SetRoomDataInternalRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_._cached_size_), + true, + }, + "np2_structs.SetRoomDataInternalRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<39> SetRoomDataInternalRequest_class_data_ = + SetRoomDataInternalRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SetRoomDataInternalRequest::GetClassData() const { + return SetRoomDataInternalRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 7, 3, 0, 2> +SetRoomDataInternalRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_._has_bits_), + 0, // no _extensions_ + 7, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967168, // skipmap + offsetof(decltype(_table_), field_entries), + 7, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + SetRoomDataInternalRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SetRoomDataInternalRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint64 roomId = 1; + {::_pbi::TcParser::FastV64S1, + {8, 4, 0, + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.roomid_)}}, + // uint32 flagFilter = 2; + {::_pbi::TcParser::FastV32S1, + {16, 5, 0, + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.flagfilter_)}}, + // uint32 flagAttr = 3; + {::_pbi::TcParser::FastV32S1, + {24, 6, 0, + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.flagattr_)}}, + // repeated .np2_structs.BinAttr roomBinAttrInternal = 4; + {::_pbi::TcParser::FastMtR1, + {34, 0, 0, + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.roombinattrinternal_)}}, + // repeated .np2_structs.RoomGroupPasswordConfig passwordConfig = 5; + {::_pbi::TcParser::FastMtR1, + {42, 1, 1, + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.passwordconfig_)}}, + // repeated uint64 passwordSlotMask = 6; + {::_pbi::TcParser::FastV64P1, + {50, 2, 0, + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.passwordslotmask_)}}, + // repeated .np2_structs.uint16 ownerPrivilegeRank = 7; + {::_pbi::TcParser::FastMtR1, + {58, 3, 2, + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.ownerprivilegerank_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 roomId = 1; + {PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.roomid_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint32 flagFilter = 2; + {PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.flagfilter_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 flagAttr = 3; + {PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.flagattr_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.BinAttr roomBinAttrInternal = 4; + {PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.roombinattrinternal_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.RoomGroupPasswordConfig passwordConfig = 5; + {PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.passwordconfig_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated uint64 passwordSlotMask = 6; + {PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.passwordslotmask_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedUInt64)}, + // repeated .np2_structs.uint16 ownerPrivilegeRank = 7; + {PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.ownerprivilegerank_), _Internal::kHasBitsOffset + 3, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + {::_pbi::TcParser::GetTable<::np2_structs::RoomGroupPasswordConfig>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void SetRoomDataInternalRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SetRoomDataInternalRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.roombinattrinternal_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.passwordconfig_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _impl_.passwordslotmask_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + _impl_.ownerprivilegerank_.Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000070U)) { + ::memset(&_impl_.roomid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.flagattr_) - + reinterpret_cast(&_impl_.roomid_)) + sizeof(_impl_.flagattr_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SetRoomDataInternalRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SetRoomDataInternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SetRoomDataInternalRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SetRoomDataInternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SetRoomDataInternalRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_roomid(), target); + } + } + + // uint32 flagFilter = 2; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_flagfilter() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_flagfilter(), target); + } + } + + // uint32 flagAttr = 3; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_flagattr() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 3, this_._internal_flagattr(), target); + } + } + + // repeated .np2_structs.BinAttr roomBinAttrInternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roombinattrinternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roombinattrinternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.RoomGroupPasswordConfig passwordConfig = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_passwordconfig_size()); + i < n; i++) { + const auto& repfield = this_._internal_passwordconfig().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 5, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated uint64 passwordSlotMask = 6; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + { + int byte_size = this_._impl_._passwordslotmask_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteUInt64Packed( + 6, this_._internal_passwordslotmask(), byte_size, target); + } + } + } + + // repeated .np2_structs.uint16 ownerPrivilegeRank = 7; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_ownerprivilegerank_size()); + i < n; i++) { + const auto& repfield = this_._internal_ownerprivilegerank().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 7, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SetRoomDataInternalRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SetRoomDataInternalRequest::ByteSizeLong(const MessageLite& base) { + const SetRoomDataInternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SetRoomDataInternalRequest::ByteSizeLong() const { + const SetRoomDataInternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SetRoomDataInternalRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000007fU)) { + // repeated .np2_structs.BinAttr roomBinAttrInternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_roombinattrinternal_size(); + for (const auto& msg : this_._internal_roombinattrinternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.RoomGroupPasswordConfig passwordConfig = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += 1UL * this_._internal_passwordconfig_size(); + for (const auto& msg : this_._internal_passwordconfig()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated uint64 passwordSlotMask = 6; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + total_size += + ::_pbi::WireFormatLite::UInt64SizeWithPackedTagSize( + this_._internal_passwordslotmask(), 1, + this_._impl_._passwordslotmask_cached_byte_size_); + } + // repeated .np2_structs.uint16 ownerPrivilegeRank = 7; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + total_size += 1UL * this_._internal_ownerprivilegerank_size(); + for (const auto& msg : this_._internal_ownerprivilegerank()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + // uint32 flagFilter = 2; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_flagfilter() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_flagfilter()); + } + } + // uint32 flagAttr = 3; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_flagattr() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_flagattr()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SetRoomDataInternalRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SetRoomDataInternalRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000007fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_roombinattrinternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roombinattrinternal()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_passwordconfig()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_passwordconfig()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _this->_internal_mutable_passwordslotmask()->MergeFrom(from._internal_passwordslotmask()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) { + _this->_internal_mutable_ownerprivilegerank()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_ownerprivilegerank()); + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (from._internal_flagfilter() != 0) { + _this->_impl_.flagfilter_ = from._impl_.flagfilter_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (from._internal_flagattr() != 0) { + _this->_impl_.flagattr_ = from._impl_.flagattr_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SetRoomDataInternalRequest::CopyFrom(const SetRoomDataInternalRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SetRoomDataInternalRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SetRoomDataInternalRequest::InternalSwap(SetRoomDataInternalRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.roombinattrinternal_.InternalSwap(&other->_impl_.roombinattrinternal_); + _impl_.passwordconfig_.InternalSwap(&other->_impl_.passwordconfig_); + _impl_.passwordslotmask_.InternalSwap(&other->_impl_.passwordslotmask_); + _impl_.ownerprivilegerank_.InternalSwap(&other->_impl_.ownerprivilegerank_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.flagattr_) + + sizeof(SetRoomDataInternalRequest::_impl_.flagattr_) + - PROTOBUF_FIELD_OFFSET(SetRoomDataInternalRequest, _impl_.roomid_)>( + reinterpret_cast(&_impl_.roomid_), + reinterpret_cast(&other->_impl_.roomid_)); +} + +// =================================================================== + +class GetRoomMemberDataInternalRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_._has_bits_); +}; + +GetRoomMemberDataInternalRequest::GetRoomMemberDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomMemberDataInternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetRoomMemberDataInternalRequest) +} +PROTOBUF_NDEBUG_INLINE GetRoomMemberDataInternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetRoomMemberDataInternalRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + attrid_{visibility, arena, from.attrid_} {} + +GetRoomMemberDataInternalRequest::GetRoomMemberDataInternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetRoomMemberDataInternalRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomMemberDataInternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetRoomMemberDataInternalRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.memberid_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.memberid_) + : nullptr; + _impl_.roomid_ = from._impl_.roomid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetRoomMemberDataInternalRequest) +} +PROTOBUF_NDEBUG_INLINE GetRoomMemberDataInternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + attrid_{visibility, arena} {} + +inline void GetRoomMemberDataInternalRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, memberid_), + 0, + offsetof(Impl_, roomid_) - + offsetof(Impl_, memberid_) + + sizeof(Impl_::roomid_)); +} +GetRoomMemberDataInternalRequest::~GetRoomMemberDataInternalRequest() { + // @@protoc_insertion_point(destructor:np2_structs.GetRoomMemberDataInternalRequest) + SharedDtor(*this); +} +inline void GetRoomMemberDataInternalRequest::SharedDtor(MessageLite& self) { + GetRoomMemberDataInternalRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.memberid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetRoomMemberDataInternalRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetRoomMemberDataInternalRequest(arena); +} +constexpr auto GetRoomMemberDataInternalRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_.attrid_) + + decltype(GetRoomMemberDataInternalRequest::_impl_.attrid_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(GetRoomMemberDataInternalRequest), alignof(GetRoomMemberDataInternalRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&GetRoomMemberDataInternalRequest::PlacementNew_, + sizeof(GetRoomMemberDataInternalRequest), + alignof(GetRoomMemberDataInternalRequest)); + } +} +constexpr auto GetRoomMemberDataInternalRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<45>{ + { + &_GetRoomMemberDataInternalRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetRoomMemberDataInternalRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetRoomMemberDataInternalRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetRoomMemberDataInternalRequest::ByteSizeLong, + &GetRoomMemberDataInternalRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_._cached_size_), + true, + }, + "np2_structs.GetRoomMemberDataInternalRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<45> GetRoomMemberDataInternalRequest_class_data_ = + GetRoomMemberDataInternalRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetRoomMemberDataInternalRequest::GetClassData() const { + return GetRoomMemberDataInternalRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 2, 0, 2> +GetRoomMemberDataInternalRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GetRoomMemberDataInternalRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetRoomMemberDataInternalRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint64 roomId = 1; + {::_pbi::TcParser::FastV64S1, + {8, 2, 0, + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_.roomid_)}}, + // .np2_structs.uint16 memberId = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_.memberid_)}}, + // repeated .np2_structs.uint16 attrId = 3; + {::_pbi::TcParser::FastMtR1, + {26, 0, 1, + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_.attrid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 roomId = 1; + {PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_.roomid_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.uint16 memberId = 2; + {PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_.memberid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.uint16 attrId = 3; + {PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_.attrid_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void GetRoomMemberDataInternalRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetRoomMemberDataInternalRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.attrid_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.memberid_ != nullptr); + _impl_.memberid_->Clear(); + } + } + _impl_.roomid_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetRoomMemberDataInternalRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetRoomMemberDataInternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetRoomMemberDataInternalRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetRoomMemberDataInternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetRoomMemberDataInternalRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_roomid(), target); + } + } + + // .np2_structs.uint16 memberId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.memberid_, this_._impl_.memberid_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.uint16 attrId = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_attrid_size()); + i < n; i++) { + const auto& repfield = this_._internal_attrid().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetRoomMemberDataInternalRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetRoomMemberDataInternalRequest::ByteSizeLong(const MessageLite& base) { + const GetRoomMemberDataInternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetRoomMemberDataInternalRequest::ByteSizeLong() const { + const GetRoomMemberDataInternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetRoomMemberDataInternalRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // repeated .np2_structs.uint16 attrId = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_attrid_size(); + for (const auto& msg : this_._internal_attrid()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // .np2_structs.uint16 memberId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.memberid_); + } + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetRoomMemberDataInternalRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetRoomMemberDataInternalRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_attrid()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_attrid()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.memberid_ != nullptr); + if (_this->_impl_.memberid_ == nullptr) { + _this->_impl_.memberid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.memberid_); + } else { + _this->_impl_.memberid_->MergeFrom(*from._impl_.memberid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetRoomMemberDataInternalRequest::CopyFrom(const GetRoomMemberDataInternalRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetRoomMemberDataInternalRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetRoomMemberDataInternalRequest::InternalSwap(GetRoomMemberDataInternalRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.attrid_.InternalSwap(&other->_impl_.attrid_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_.roomid_) + + sizeof(GetRoomMemberDataInternalRequest::_impl_.roomid_) + - PROTOBUF_FIELD_OFFSET(GetRoomMemberDataInternalRequest, _impl_.memberid_)>( + reinterpret_cast(&_impl_.memberid_), + reinterpret_cast(&other->_impl_.memberid_)); +} + +// =================================================================== + +class SetRoomMemberDataInternalRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_._has_bits_); +}; + +SetRoomMemberDataInternalRequest::SetRoomMemberDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetRoomMemberDataInternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SetRoomMemberDataInternalRequest) +} +PROTOBUF_NDEBUG_INLINE SetRoomMemberDataInternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SetRoomMemberDataInternalRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + roommemberbinattrinternal_{visibility, arena, from.roommemberbinattrinternal_} {} + +SetRoomMemberDataInternalRequest::SetRoomMemberDataInternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SetRoomMemberDataInternalRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetRoomMemberDataInternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SetRoomMemberDataInternalRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.memberid_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.memberid_) + : nullptr; + _impl_.teamid_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.teamid_) + : nullptr; + _impl_.roomid_ = from._impl_.roomid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.SetRoomMemberDataInternalRequest) +} +PROTOBUF_NDEBUG_INLINE SetRoomMemberDataInternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + roommemberbinattrinternal_{visibility, arena} {} + +inline void SetRoomMemberDataInternalRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, memberid_), + 0, + offsetof(Impl_, roomid_) - + offsetof(Impl_, memberid_) + + sizeof(Impl_::roomid_)); +} +SetRoomMemberDataInternalRequest::~SetRoomMemberDataInternalRequest() { + // @@protoc_insertion_point(destructor:np2_structs.SetRoomMemberDataInternalRequest) + SharedDtor(*this); +} +inline void SetRoomMemberDataInternalRequest::SharedDtor(MessageLite& self) { + SetRoomMemberDataInternalRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.memberid_; + delete this_._impl_.teamid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SetRoomMemberDataInternalRequest(arena); +} +constexpr auto SetRoomMemberDataInternalRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.roommemberbinattrinternal_) + + decltype(SetRoomMemberDataInternalRequest::_impl_.roommemberbinattrinternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(SetRoomMemberDataInternalRequest), alignof(SetRoomMemberDataInternalRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&SetRoomMemberDataInternalRequest::PlacementNew_, + sizeof(SetRoomMemberDataInternalRequest), + alignof(SetRoomMemberDataInternalRequest)); + } +} +constexpr auto SetRoomMemberDataInternalRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<45>{ + { + &_SetRoomMemberDataInternalRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SetRoomMemberDataInternalRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SetRoomMemberDataInternalRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SetRoomMemberDataInternalRequest::ByteSizeLong, + &SetRoomMemberDataInternalRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_._cached_size_), + true, + }, + "np2_structs.SetRoomMemberDataInternalRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<45> SetRoomMemberDataInternalRequest_class_data_ = + SetRoomMemberDataInternalRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SetRoomMemberDataInternalRequest::GetClassData() const { + return SetRoomMemberDataInternalRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 3, 0, 2> +SetRoomMemberDataInternalRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + SetRoomMemberDataInternalRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SetRoomMemberDataInternalRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + {::_pbi::TcParser::FastMtR1, + {34, 0, 2, + PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.roommemberbinattrinternal_)}}, + // uint64 roomId = 1; + {::_pbi::TcParser::FastV64S1, + {8, 3, 0, + PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.roomid_)}}, + // .np2_structs.uint16 memberId = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.memberid_)}}, + // .np2_structs.uint8 teamId = 3; + {::_pbi::TcParser::FastMtS1, + {26, 2, 1, + PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.teamid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 roomId = 1; + {PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.roomid_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.uint16 memberId = 2; + {PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.memberid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint8 teamId = 3; + {PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.teamid_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + {PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.roommemberbinattrinternal_), _Internal::kHasBitsOffset + 0, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void SetRoomMemberDataInternalRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SetRoomMemberDataInternalRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.roommemberbinattrinternal_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.memberid_ != nullptr); + _impl_.memberid_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.teamid_ != nullptr); + _impl_.teamid_->Clear(); + } + } + _impl_.roomid_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SetRoomMemberDataInternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SetRoomMemberDataInternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SetRoomMemberDataInternalRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_roomid(), target); + } + } + + // .np2_structs.uint16 memberId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.memberid_, this_._impl_.memberid_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint8 teamId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.teamid_, this_._impl_.teamid_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_roommemberbinattrinternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_roommemberbinattrinternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SetRoomMemberDataInternalRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SetRoomMemberDataInternalRequest::ByteSizeLong(const MessageLite& base) { + const SetRoomMemberDataInternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SetRoomMemberDataInternalRequest::ByteSizeLong() const { + const SetRoomMemberDataInternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SetRoomMemberDataInternalRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_roommemberbinattrinternal_size(); + for (const auto& msg : this_._internal_roommemberbinattrinternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // .np2_structs.uint16 memberId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.memberid_); + } + // .np2_structs.uint8 teamId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.teamid_); + } + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SetRoomMemberDataInternalRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SetRoomMemberDataInternalRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_roommemberbinattrinternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_roommemberbinattrinternal()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.memberid_ != nullptr); + if (_this->_impl_.memberid_ == nullptr) { + _this->_impl_.memberid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.memberid_); + } else { + _this->_impl_.memberid_->MergeFrom(*from._impl_.memberid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.teamid_ != nullptr); + if (_this->_impl_.teamid_ == nullptr) { + _this->_impl_.teamid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.teamid_); + } else { + _this->_impl_.teamid_->MergeFrom(*from._impl_.teamid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SetRoomMemberDataInternalRequest::CopyFrom(const SetRoomMemberDataInternalRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SetRoomMemberDataInternalRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SetRoomMemberDataInternalRequest::InternalSwap(SetRoomMemberDataInternalRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.roommemberbinattrinternal_.InternalSwap(&other->_impl_.roommemberbinattrinternal_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.roomid_) + + sizeof(SetRoomMemberDataInternalRequest::_impl_.roomid_) + - PROTOBUF_FIELD_OFFSET(SetRoomMemberDataInternalRequest, _impl_.memberid_)>( + reinterpret_cast(&_impl_.memberid_), + reinterpret_cast(&other->_impl_.memberid_)); +} + +// =================================================================== + +class SetUserInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SetUserInfo, _impl_._has_bits_); +}; + +SetUserInfo::SetUserInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetUserInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SetUserInfo) +} +PROTOBUF_NDEBUG_INLINE SetUserInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SetUserInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + userbinattr_{visibility, arena, from.userbinattr_} {} + +SetUserInfo::SetUserInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SetUserInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetUserInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SetUserInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.serverid_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.serverid_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.SetUserInfo) +} +PROTOBUF_NDEBUG_INLINE SetUserInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + userbinattr_{visibility, arena} {} + +inline void SetUserInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.serverid_ = {}; +} +SetUserInfo::~SetUserInfo() { + // @@protoc_insertion_point(destructor:np2_structs.SetUserInfo) + SharedDtor(*this); +} +inline void SetUserInfo::SharedDtor(MessageLite& self) { + SetUserInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.serverid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SetUserInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SetUserInfo(arena); +} +constexpr auto SetUserInfo::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(SetUserInfo, _impl_.userbinattr_) + + decltype(SetUserInfo::_impl_.userbinattr_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(SetUserInfo), alignof(SetUserInfo), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&SetUserInfo::PlacementNew_, + sizeof(SetUserInfo), + alignof(SetUserInfo)); + } +} +constexpr auto SetUserInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<24>{ + { + &_SetUserInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SetUserInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SetUserInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SetUserInfo::ByteSizeLong, + &SetUserInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SetUserInfo, _impl_._cached_size_), + true, + }, + "np2_structs.SetUserInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<24> SetUserInfo_class_data_ = + SetUserInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SetUserInfo::GetClassData() const { + return SetUserInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 2, 0, 2> +SetUserInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SetUserInfo, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + SetUserInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SetUserInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.BinAttr userBinAttr = 2; + {::_pbi::TcParser::FastMtR1, + {18, 0, 1, + PROTOBUF_FIELD_OFFSET(SetUserInfo, _impl_.userbinattr_)}}, + // .np2_structs.uint16 serverId = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(SetUserInfo, _impl_.serverid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint16 serverId = 1; + {PROTOBUF_FIELD_OFFSET(SetUserInfo, _impl_.serverid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.BinAttr userBinAttr = 2; + {PROTOBUF_FIELD_OFFSET(SetUserInfo, _impl_.userbinattr_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::BinAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void SetUserInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SetUserInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.userbinattr_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.serverid_ != nullptr); + _impl_.serverid_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SetUserInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SetUserInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SetUserInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SetUserInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SetUserInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint16 serverId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.serverid_, this_._impl_.serverid_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.BinAttr userBinAttr = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_userbinattr_size()); + i < n; i++) { + const auto& repfield = this_._internal_userbinattr().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SetUserInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SetUserInfo::ByteSizeLong(const MessageLite& base) { + const SetUserInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SetUserInfo::ByteSizeLong() const { + const SetUserInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SetUserInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated .np2_structs.BinAttr userBinAttr = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_userbinattr_size(); + for (const auto& msg : this_._internal_userbinattr()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // .np2_structs.uint16 serverId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.serverid_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SetUserInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SetUserInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_userbinattr()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_userbinattr()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.serverid_ != nullptr); + if (_this->_impl_.serverid_ == nullptr) { + _this->_impl_.serverid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.serverid_); + } else { + _this->_impl_.serverid_->MergeFrom(*from._impl_.serverid_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SetUserInfo::CopyFrom(const SetUserInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SetUserInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SetUserInfo::InternalSwap(SetUserInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.userbinattr_.InternalSwap(&other->_impl_.userbinattr_); + swap(_impl_.serverid_, other->_impl_.serverid_); +} + +// =================================================================== + +class GetRoomDataInternalRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetRoomDataInternalRequest, _impl_._has_bits_); +}; + +GetRoomDataInternalRequest::GetRoomDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomDataInternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetRoomDataInternalRequest) +} +PROTOBUF_NDEBUG_INLINE GetRoomDataInternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetRoomDataInternalRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + attrid_{visibility, arena, from.attrid_} {} + +GetRoomDataInternalRequest::GetRoomDataInternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetRoomDataInternalRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomDataInternalRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetRoomDataInternalRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + _impl_.roomid_ = from._impl_.roomid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetRoomDataInternalRequest) +} +PROTOBUF_NDEBUG_INLINE GetRoomDataInternalRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + attrid_{visibility, arena} {} + +inline void GetRoomDataInternalRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.roomid_ = {}; +} +GetRoomDataInternalRequest::~GetRoomDataInternalRequest() { + // @@protoc_insertion_point(destructor:np2_structs.GetRoomDataInternalRequest) + SharedDtor(*this); +} +inline void GetRoomDataInternalRequest::SharedDtor(MessageLite& self) { + GetRoomDataInternalRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetRoomDataInternalRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetRoomDataInternalRequest(arena); +} +constexpr auto GetRoomDataInternalRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(GetRoomDataInternalRequest, _impl_.attrid_) + + decltype(GetRoomDataInternalRequest::_impl_.attrid_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(GetRoomDataInternalRequest), alignof(GetRoomDataInternalRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&GetRoomDataInternalRequest::PlacementNew_, + sizeof(GetRoomDataInternalRequest), + alignof(GetRoomDataInternalRequest)); + } +} +constexpr auto GetRoomDataInternalRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<39>{ + { + &_GetRoomDataInternalRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetRoomDataInternalRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetRoomDataInternalRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetRoomDataInternalRequest::ByteSizeLong, + &GetRoomDataInternalRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetRoomDataInternalRequest, _impl_._cached_size_), + true, + }, + "np2_structs.GetRoomDataInternalRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<39> GetRoomDataInternalRequest_class_data_ = + GetRoomDataInternalRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetRoomDataInternalRequest::GetClassData() const { + return GetRoomDataInternalRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +GetRoomDataInternalRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetRoomDataInternalRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GetRoomDataInternalRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetRoomDataInternalRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.uint16 attrId = 2; + {::_pbi::TcParser::FastMtR1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(GetRoomDataInternalRequest, _impl_.attrid_)}}, + // uint64 roomId = 1; + {::_pbi::TcParser::FastV64S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(GetRoomDataInternalRequest, _impl_.roomid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 roomId = 1; + {PROTOBUF_FIELD_OFFSET(GetRoomDataInternalRequest, _impl_.roomid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // repeated .np2_structs.uint16 attrId = 2; + {PROTOBUF_FIELD_OFFSET(GetRoomDataInternalRequest, _impl_.attrid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void GetRoomDataInternalRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetRoomDataInternalRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.attrid_.Clear(); + } + _impl_.roomid_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetRoomDataInternalRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetRoomDataInternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetRoomDataInternalRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetRoomDataInternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetRoomDataInternalRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_roomid(), target); + } + } + + // repeated .np2_structs.uint16 attrId = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_attrid_size()); + i < n; i++) { + const auto& repfield = this_._internal_attrid().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetRoomDataInternalRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetRoomDataInternalRequest::ByteSizeLong(const MessageLite& base) { + const GetRoomDataInternalRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetRoomDataInternalRequest::ByteSizeLong() const { + const GetRoomDataInternalRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetRoomDataInternalRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated .np2_structs.uint16 attrId = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_attrid_size(); + for (const auto& msg : this_._internal_attrid()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetRoomDataInternalRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetRoomDataInternalRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_attrid()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_attrid()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetRoomDataInternalRequest::CopyFrom(const GetRoomDataInternalRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetRoomDataInternalRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetRoomDataInternalRequest::InternalSwap(GetRoomDataInternalRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.attrid_.InternalSwap(&other->_impl_.attrid_); + swap(_impl_.roomid_, other->_impl_.roomid_); +} + +// =================================================================== + +class RoomMemberUpdateInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_._has_bits_); +}; + +RoomMemberUpdateInfo::RoomMemberUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberUpdateInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomMemberUpdateInfo) +} +PROTOBUF_NDEBUG_INLINE RoomMemberUpdateInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomMemberUpdateInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +RoomMemberUpdateInfo::RoomMemberUpdateInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomMemberUpdateInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberUpdateInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomMemberUpdateInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.roommemberdatainternal_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.roommemberdatainternal_) + : nullptr; + _impl_.eventcause_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.eventcause_) + : nullptr; + _impl_.optdata_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.optdata_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomMemberUpdateInfo) +} +PROTOBUF_NDEBUG_INLINE RoomMemberUpdateInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void RoomMemberUpdateInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, roommemberdatainternal_), + 0, + offsetof(Impl_, optdata_) - + offsetof(Impl_, roommemberdatainternal_) + + sizeof(Impl_::optdata_)); +} +RoomMemberUpdateInfo::~RoomMemberUpdateInfo() { + // @@protoc_insertion_point(destructor:np2_structs.RoomMemberUpdateInfo) + SharedDtor(*this); +} +inline void RoomMemberUpdateInfo::SharedDtor(MessageLite& self) { + RoomMemberUpdateInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.roommemberdatainternal_; + delete this_._impl_.eventcause_; + delete this_._impl_.optdata_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomMemberUpdateInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomMemberUpdateInfo(arena); +} +constexpr auto RoomMemberUpdateInfo::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(RoomMemberUpdateInfo), + alignof(RoomMemberUpdateInfo)); +} +constexpr auto RoomMemberUpdateInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<33>{ + { + &_RoomMemberUpdateInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomMemberUpdateInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomMemberUpdateInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomMemberUpdateInfo::ByteSizeLong, + &RoomMemberUpdateInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_._cached_size_), + true, + }, + "np2_structs.RoomMemberUpdateInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<33> RoomMemberUpdateInfo_class_data_ = + RoomMemberUpdateInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomMemberUpdateInfo::GetClassData() const { + return RoomMemberUpdateInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 3, 0, 2> +RoomMemberUpdateInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomMemberUpdateInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomMemberUpdateInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.RoomMemberDataInternal roomMemberDataInternal = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_.roommemberdatainternal_)}}, + // .np2_structs.uint8 eventCause = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 1, + PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_.eventcause_)}}, + // .np2_structs.PresenceOptionData optData = 3; + {::_pbi::TcParser::FastMtS1, + {26, 2, 2, + PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_.optdata_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.RoomMemberDataInternal roomMemberDataInternal = 1; + {PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_.roommemberdatainternal_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint8 eventCause = 2; + {PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_.eventcause_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.PresenceOptionData optData = 3; + {PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_.optdata_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::RoomMemberDataInternal>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::PresenceOptionData>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomMemberUpdateInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomMemberUpdateInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.roommemberdatainternal_ != nullptr); + _impl_.roommemberdatainternal_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.eventcause_ != nullptr); + _impl_.eventcause_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.optdata_ != nullptr); + _impl_.optdata_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomMemberUpdateInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomMemberUpdateInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomMemberUpdateInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomMemberUpdateInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomMemberUpdateInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.RoomMemberDataInternal roomMemberDataInternal = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.roommemberdatainternal_, this_._impl_.roommemberdatainternal_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint8 eventCause = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.eventcause_, this_._impl_.eventcause_->GetCachedSize(), target, + stream); + } + + // .np2_structs.PresenceOptionData optData = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.optdata_, this_._impl_.optdata_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomMemberUpdateInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomMemberUpdateInfo::ByteSizeLong(const MessageLite& base) { + const RoomMemberUpdateInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomMemberUpdateInfo::ByteSizeLong() const { + const RoomMemberUpdateInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomMemberUpdateInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // .np2_structs.RoomMemberDataInternal roomMemberDataInternal = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.roommemberdatainternal_); + } + // .np2_structs.uint8 eventCause = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.eventcause_); + } + // .np2_structs.PresenceOptionData optData = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.optdata_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomMemberUpdateInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomMemberUpdateInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.roommemberdatainternal_ != nullptr); + if (_this->_impl_.roommemberdatainternal_ == nullptr) { + _this->_impl_.roommemberdatainternal_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.roommemberdatainternal_); + } else { + _this->_impl_.roommemberdatainternal_->MergeFrom(*from._impl_.roommemberdatainternal_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.eventcause_ != nullptr); + if (_this->_impl_.eventcause_ == nullptr) { + _this->_impl_.eventcause_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.eventcause_); + } else { + _this->_impl_.eventcause_->MergeFrom(*from._impl_.eventcause_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.optdata_ != nullptr); + if (_this->_impl_.optdata_ == nullptr) { + _this->_impl_.optdata_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.optdata_); + } else { + _this->_impl_.optdata_->MergeFrom(*from._impl_.optdata_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomMemberUpdateInfo::CopyFrom(const RoomMemberUpdateInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomMemberUpdateInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomMemberUpdateInfo::InternalSwap(RoomMemberUpdateInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_.optdata_) + + sizeof(RoomMemberUpdateInfo::_impl_.optdata_) + - PROTOBUF_FIELD_OFFSET(RoomMemberUpdateInfo, _impl_.roommemberdatainternal_)>( + reinterpret_cast(&_impl_.roommemberdatainternal_), + reinterpret_cast(&other->_impl_.roommemberdatainternal_)); +} + +// =================================================================== + +class NotificationUserJoinedRoom::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_._has_bits_); +}; + +NotificationUserJoinedRoom::NotificationUserJoinedRoom(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, NotificationUserJoinedRoom_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.NotificationUserJoinedRoom) +} +PROTOBUF_NDEBUG_INLINE NotificationUserJoinedRoom::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::NotificationUserJoinedRoom& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +NotificationUserJoinedRoom::NotificationUserJoinedRoom( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const NotificationUserJoinedRoom& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, NotificationUserJoinedRoom_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + NotificationUserJoinedRoom* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.update_info_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.update_info_) + : nullptr; + _impl_.signaling_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.signaling_) + : nullptr; + _impl_.room_id_ = from._impl_.room_id_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.NotificationUserJoinedRoom) +} +PROTOBUF_NDEBUG_INLINE NotificationUserJoinedRoom::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void NotificationUserJoinedRoom::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, update_info_), + 0, + offsetof(Impl_, room_id_) - + offsetof(Impl_, update_info_) + + sizeof(Impl_::room_id_)); +} +NotificationUserJoinedRoom::~NotificationUserJoinedRoom() { + // @@protoc_insertion_point(destructor:np2_structs.NotificationUserJoinedRoom) + SharedDtor(*this); +} +inline void NotificationUserJoinedRoom::SharedDtor(MessageLite& self) { + NotificationUserJoinedRoom& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.update_info_; + delete this_._impl_.signaling_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL NotificationUserJoinedRoom::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) NotificationUserJoinedRoom(arena); +} +constexpr auto NotificationUserJoinedRoom::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(NotificationUserJoinedRoom), + alignof(NotificationUserJoinedRoom)); +} +constexpr auto NotificationUserJoinedRoom::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<39>{ + { + &_NotificationUserJoinedRoom_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &NotificationUserJoinedRoom::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &NotificationUserJoinedRoom::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &NotificationUserJoinedRoom::ByteSizeLong, + &NotificationUserJoinedRoom::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_._cached_size_), + true, + }, + "np2_structs.NotificationUserJoinedRoom", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<39> NotificationUserJoinedRoom_class_data_ = + NotificationUserJoinedRoom::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +NotificationUserJoinedRoom::GetClassData() const { + return NotificationUserJoinedRoom_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 2, 0, 2> +NotificationUserJoinedRoom::_table_ = { + { + PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + NotificationUserJoinedRoom_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::NotificationUserJoinedRoom>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint64 room_id = 1; + {::_pbi::TcParser::FastV64S1, + {8, 2, 0, + PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_.room_id_)}}, + // .np2_structs.RoomMemberUpdateInfo update_info = 2; + {::_pbi::TcParser::FastMtS1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_.update_info_)}}, + // .np2_structs.SignalingAddr signaling = 3; + {::_pbi::TcParser::FastMtS1, + {26, 1, 1, + PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_.signaling_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 room_id = 1; + {PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_.room_id_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.RoomMemberUpdateInfo update_info = 2; + {PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_.update_info_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.SignalingAddr signaling = 3; + {PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_.signaling_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::RoomMemberUpdateInfo>()}, + {::_pbi::TcParser::GetTable<::np2_structs::SignalingAddr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void NotificationUserJoinedRoom::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.NotificationUserJoinedRoom) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.update_info_ != nullptr); + _impl_.update_info_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.signaling_ != nullptr); + _impl_.signaling_->Clear(); + } + } + _impl_.room_id_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL NotificationUserJoinedRoom::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const NotificationUserJoinedRoom& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL NotificationUserJoinedRoom::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const NotificationUserJoinedRoom& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.NotificationUserJoinedRoom) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 room_id = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_room_id() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_room_id(), target); + } + } + + // .np2_structs.RoomMemberUpdateInfo update_info = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.update_info_, this_._impl_.update_info_->GetCachedSize(), target, + stream); + } + + // .np2_structs.SignalingAddr signaling = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.signaling_, this_._impl_.signaling_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.NotificationUserJoinedRoom) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t NotificationUserJoinedRoom::ByteSizeLong(const MessageLite& base) { + const NotificationUserJoinedRoom& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t NotificationUserJoinedRoom::ByteSizeLong() const { + const NotificationUserJoinedRoom& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.NotificationUserJoinedRoom) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // .np2_structs.RoomMemberUpdateInfo update_info = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.update_info_); + } + // .np2_structs.SignalingAddr signaling = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.signaling_); + } + // uint64 room_id = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_room_id() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_room_id()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void NotificationUserJoinedRoom::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.NotificationUserJoinedRoom) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.update_info_ != nullptr); + if (_this->_impl_.update_info_ == nullptr) { + _this->_impl_.update_info_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.update_info_); + } else { + _this->_impl_.update_info_->MergeFrom(*from._impl_.update_info_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.signaling_ != nullptr); + if (_this->_impl_.signaling_ == nullptr) { + _this->_impl_.signaling_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.signaling_); + } else { + _this->_impl_.signaling_->MergeFrom(*from._impl_.signaling_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_room_id() != 0) { + _this->_impl_.room_id_ = from._impl_.room_id_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void NotificationUserJoinedRoom::CopyFrom(const NotificationUserJoinedRoom& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.NotificationUserJoinedRoom) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void NotificationUserJoinedRoom::InternalSwap(NotificationUserJoinedRoom* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_.room_id_) + + sizeof(NotificationUserJoinedRoom::_impl_.room_id_) + - PROTOBUF_FIELD_OFFSET(NotificationUserJoinedRoom, _impl_.update_info_)>( + reinterpret_cast(&_impl_.update_info_), + reinterpret_cast(&other->_impl_.update_info_)); +} + +// =================================================================== + +class RoomUpdateInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_._has_bits_); +}; + +RoomUpdateInfo::RoomUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomUpdateInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomUpdateInfo) +} +PROTOBUF_NDEBUG_INLINE RoomUpdateInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomUpdateInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +RoomUpdateInfo::RoomUpdateInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomUpdateInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomUpdateInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomUpdateInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.eventcause_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.eventcause_) + : nullptr; + _impl_.optdata_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.optdata_) + : nullptr; + _impl_.errorcode_ = from._impl_.errorcode_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomUpdateInfo) +} +PROTOBUF_NDEBUG_INLINE RoomUpdateInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void RoomUpdateInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, eventcause_), + 0, + offsetof(Impl_, errorcode_) - + offsetof(Impl_, eventcause_) + + sizeof(Impl_::errorcode_)); +} +RoomUpdateInfo::~RoomUpdateInfo() { + // @@protoc_insertion_point(destructor:np2_structs.RoomUpdateInfo) + SharedDtor(*this); +} +inline void RoomUpdateInfo::SharedDtor(MessageLite& self) { + RoomUpdateInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.eventcause_; + delete this_._impl_.optdata_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomUpdateInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomUpdateInfo(arena); +} +constexpr auto RoomUpdateInfo::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(RoomUpdateInfo), + alignof(RoomUpdateInfo)); +} +constexpr auto RoomUpdateInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<27>{ + { + &_RoomUpdateInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomUpdateInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomUpdateInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomUpdateInfo::ByteSizeLong, + &RoomUpdateInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_._cached_size_), + true, + }, + "np2_structs.RoomUpdateInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<27> RoomUpdateInfo_class_data_ = + RoomUpdateInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomUpdateInfo::GetClassData() const { + return RoomUpdateInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 2, 0, 2> +RoomUpdateInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomUpdateInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomUpdateInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.uint8 eventCause = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_.eventcause_)}}, + // int32 errorCode = 2; + {::_pbi::TcParser::FastV32S1, + {16, 2, 0, + PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_.errorcode_)}}, + // .np2_structs.PresenceOptionData optData = 3; + {::_pbi::TcParser::FastMtS1, + {26, 1, 1, + PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_.optdata_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint8 eventCause = 1; + {PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_.eventcause_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // int32 errorCode = 2; + {PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_.errorcode_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // .np2_structs.PresenceOptionData optData = 3; + {PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_.optdata_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::PresenceOptionData>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomUpdateInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomUpdateInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.eventcause_ != nullptr); + _impl_.eventcause_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.optdata_ != nullptr); + _impl_.optdata_->Clear(); + } + } + _impl_.errorcode_ = 0; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomUpdateInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomUpdateInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomUpdateInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomUpdateInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomUpdateInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint8 eventCause = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.eventcause_, this_._impl_.eventcause_->GetCachedSize(), target, + stream); + } + + // int32 errorCode = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_errorcode() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_errorcode(), target); + } + } + + // .np2_structs.PresenceOptionData optData = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.optdata_, this_._impl_.optdata_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomUpdateInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomUpdateInfo::ByteSizeLong(const MessageLite& base) { + const RoomUpdateInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomUpdateInfo::ByteSizeLong() const { + const RoomUpdateInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomUpdateInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // .np2_structs.uint8 eventCause = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.eventcause_); + } + // .np2_structs.PresenceOptionData optData = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.optdata_); + } + // int32 errorCode = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_errorcode() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_errorcode()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomUpdateInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomUpdateInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.eventcause_ != nullptr); + if (_this->_impl_.eventcause_ == nullptr) { + _this->_impl_.eventcause_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.eventcause_); + } else { + _this->_impl_.eventcause_->MergeFrom(*from._impl_.eventcause_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.optdata_ != nullptr); + if (_this->_impl_.optdata_ == nullptr) { + _this->_impl_.optdata_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.optdata_); + } else { + _this->_impl_.optdata_->MergeFrom(*from._impl_.optdata_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_errorcode() != 0) { + _this->_impl_.errorcode_ = from._impl_.errorcode_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomUpdateInfo::CopyFrom(const RoomUpdateInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomUpdateInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomUpdateInfo::InternalSwap(RoomUpdateInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_.errorcode_) + + sizeof(RoomUpdateInfo::_impl_.errorcode_) + - PROTOBUF_FIELD_OFFSET(RoomUpdateInfo, _impl_.eventcause_)>( + reinterpret_cast(&_impl_.eventcause_), + reinterpret_cast(&other->_impl_.eventcause_)); +} + +// =================================================================== + +class RoomDataInternalUpdateInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_._has_bits_); +}; + +RoomDataInternalUpdateInfo::RoomDataInternalUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomDataInternalUpdateInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomDataInternalUpdateInfo) +} +PROTOBUF_NDEBUG_INLINE RoomDataInternalUpdateInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomDataInternalUpdateInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + newroombinattrinternal_{visibility, arena, from.newroombinattrinternal_}, + newroomgroup_(arena, from.newroomgroup_) {} + +RoomDataInternalUpdateInfo::RoomDataInternalUpdateInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomDataInternalUpdateInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomDataInternalUpdateInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomDataInternalUpdateInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.newroomdatainternal_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.newroomdatainternal_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, prevroompasswordslotmask_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, prevroompasswordslotmask_), + offsetof(Impl_, prevflagattr_) - + offsetof(Impl_, prevroompasswordslotmask_) + + sizeof(Impl_::prevflagattr_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomDataInternalUpdateInfo) +} +PROTOBUF_NDEBUG_INLINE RoomDataInternalUpdateInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + newroombinattrinternal_{visibility, arena}, + newroomgroup_(arena) {} + +inline void RoomDataInternalUpdateInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, newroomdatainternal_), + 0, + offsetof(Impl_, prevflagattr_) - + offsetof(Impl_, newroomdatainternal_) + + sizeof(Impl_::prevflagattr_)); +} +RoomDataInternalUpdateInfo::~RoomDataInternalUpdateInfo() { + // @@protoc_insertion_point(destructor:np2_structs.RoomDataInternalUpdateInfo) + SharedDtor(*this); +} +inline void RoomDataInternalUpdateInfo::SharedDtor(MessageLite& self) { + RoomDataInternalUpdateInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.newroomgroup_.Destroy(); + delete this_._impl_.newroomdatainternal_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomDataInternalUpdateInfo(arena); +} +constexpr auto RoomDataInternalUpdateInfo::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.newroombinattrinternal_) + + decltype(RoomDataInternalUpdateInfo::_impl_.newroombinattrinternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(RoomDataInternalUpdateInfo), alignof(RoomDataInternalUpdateInfo), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&RoomDataInternalUpdateInfo::PlacementNew_, + sizeof(RoomDataInternalUpdateInfo), + alignof(RoomDataInternalUpdateInfo)); + } +} +constexpr auto RoomDataInternalUpdateInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<39>{ + { + &_RoomDataInternalUpdateInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomDataInternalUpdateInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomDataInternalUpdateInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomDataInternalUpdateInfo::ByteSizeLong, + &RoomDataInternalUpdateInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_._cached_size_), + true, + }, + "np2_structs.RoomDataInternalUpdateInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<39> RoomDataInternalUpdateInfo_class_data_ = + RoomDataInternalUpdateInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomDataInternalUpdateInfo::GetClassData() const { + return RoomDataInternalUpdateInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 2, 0, 2> +RoomDataInternalUpdateInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomDataInternalUpdateInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomDataInternalUpdateInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.RoomDataInternal newRoomDataInternal = 1; + {::_pbi::TcParser::FastMtS1, + {10, 2, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.newroomdatainternal_)}}, + // uint32 prevFlagAttr = 2; + {::_pbi::TcParser::FastV32S1, + {16, 4, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.prevflagattr_)}}, + // uint64 prevRoomPasswordSlotMask = 3; + {::_pbi::TcParser::FastV64S1, + {24, 3, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.prevroompasswordslotmask_)}}, + // bytes newRoomGroup = 4; + {::_pbi::TcParser::FastBS1, + {34, 1, 0, + PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.newroomgroup_)}}, + // repeated .np2_structs.uint16 newRoomBinAttrInternal = 5; + {::_pbi::TcParser::FastMtR1, + {42, 0, 1, + PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.newroombinattrinternal_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.RoomDataInternal newRoomDataInternal = 1; + {PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.newroomdatainternal_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 prevFlagAttr = 2; + {PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.prevflagattr_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint64 prevRoomPasswordSlotMask = 3; + {PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.prevroompasswordslotmask_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // bytes newRoomGroup = 4; + {PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.newroomgroup_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // repeated .np2_structs.uint16 newRoomBinAttrInternal = 5; + {PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.newroombinattrinternal_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::RoomDataInternal>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomDataInternalUpdateInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomDataInternalUpdateInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.newroombinattrinternal_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.newroomgroup_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.newroomdatainternal_ != nullptr); + _impl_.newroomdatainternal_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000018U)) { + ::memset(&_impl_.prevroompasswordslotmask_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.prevflagattr_) - + reinterpret_cast(&_impl_.prevroompasswordslotmask_)) + sizeof(_impl_.prevflagattr_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomDataInternalUpdateInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomDataInternalUpdateInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomDataInternalUpdateInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.RoomDataInternal newRoomDataInternal = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.newroomdatainternal_, this_._impl_.newroomdatainternal_->GetCachedSize(), target, + stream); + } + + // uint32 prevFlagAttr = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_prevflagattr() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_prevflagattr(), target); + } + } + + // uint64 prevRoomPasswordSlotMask = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_prevroompasswordslotmask() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 3, this_._internal_prevroompasswordslotmask(), target); + } + } + + // bytes newRoomGroup = 4; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_newroomgroup().empty()) { + const ::std::string& _s = this_._internal_newroomgroup(); + target = stream->WriteBytesMaybeAliased(4, _s, target); + } + } + + // repeated .np2_structs.uint16 newRoomBinAttrInternal = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_newroombinattrinternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_newroombinattrinternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 5, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomDataInternalUpdateInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomDataInternalUpdateInfo::ByteSizeLong(const MessageLite& base) { + const RoomDataInternalUpdateInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomDataInternalUpdateInfo::ByteSizeLong() const { + const RoomDataInternalUpdateInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomDataInternalUpdateInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // repeated .np2_structs.uint16 newRoomBinAttrInternal = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_newroombinattrinternal_size(); + for (const auto& msg : this_._internal_newroombinattrinternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // bytes newRoomGroup = 4; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_newroomgroup().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_newroomgroup()); + } + } + // .np2_structs.RoomDataInternal newRoomDataInternal = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.newroomdatainternal_); + } + // uint64 prevRoomPasswordSlotMask = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_prevroompasswordslotmask() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_prevroompasswordslotmask()); + } + } + // uint32 prevFlagAttr = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_prevflagattr() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_prevflagattr()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomDataInternalUpdateInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomDataInternalUpdateInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_newroombinattrinternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_newroombinattrinternal()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_newroomgroup().empty()) { + _this->_internal_set_newroomgroup(from._internal_newroomgroup()); + } else { + if (_this->_impl_.newroomgroup_.IsDefault()) { + _this->_internal_set_newroomgroup(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.newroomdatainternal_ != nullptr); + if (_this->_impl_.newroomdatainternal_ == nullptr) { + _this->_impl_.newroomdatainternal_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.newroomdatainternal_); + } else { + _this->_impl_.newroomdatainternal_->MergeFrom(*from._impl_.newroomdatainternal_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_prevroompasswordslotmask() != 0) { + _this->_impl_.prevroompasswordslotmask_ = from._impl_.prevroompasswordslotmask_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_prevflagattr() != 0) { + _this->_impl_.prevflagattr_ = from._impl_.prevflagattr_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomDataInternalUpdateInfo::CopyFrom(const RoomDataInternalUpdateInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomDataInternalUpdateInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomDataInternalUpdateInfo::InternalSwap(RoomDataInternalUpdateInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.newroombinattrinternal_.InternalSwap(&other->_impl_.newroombinattrinternal_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.newroomgroup_, &other->_impl_.newroomgroup_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.prevflagattr_) + + sizeof(RoomDataInternalUpdateInfo::_impl_.prevflagattr_) + - PROTOBUF_FIELD_OFFSET(RoomDataInternalUpdateInfo, _impl_.newroomdatainternal_)>( + reinterpret_cast(&_impl_.newroomdatainternal_), + reinterpret_cast(&other->_impl_.newroomdatainternal_)); +} + +// =================================================================== + +class RoomMemberDataInternalUpdateInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_._has_bits_); +}; + +RoomMemberDataInternalUpdateInfo::RoomMemberDataInternalUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberDataInternalUpdateInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomMemberDataInternalUpdateInfo) +} +PROTOBUF_NDEBUG_INLINE RoomMemberDataInternalUpdateInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomMemberDataInternalUpdateInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + newroommemberbinattrinternal_{visibility, arena, from.newroommemberbinattrinternal_} {} + +RoomMemberDataInternalUpdateInfo::RoomMemberDataInternalUpdateInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomMemberDataInternalUpdateInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberDataInternalUpdateInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomMemberDataInternalUpdateInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.newroommemberdatainternal_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.newroommemberdatainternal_) + : nullptr; + _impl_.prevteamid_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.prevteamid_) + : nullptr; + _impl_.prevflagattr_ = from._impl_.prevflagattr_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomMemberDataInternalUpdateInfo) +} +PROTOBUF_NDEBUG_INLINE RoomMemberDataInternalUpdateInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + newroommemberbinattrinternal_{visibility, arena} {} + +inline void RoomMemberDataInternalUpdateInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, newroommemberdatainternal_), + 0, + offsetof(Impl_, prevflagattr_) - + offsetof(Impl_, newroommemberdatainternal_) + + sizeof(Impl_::prevflagattr_)); +} +RoomMemberDataInternalUpdateInfo::~RoomMemberDataInternalUpdateInfo() { + // @@protoc_insertion_point(destructor:np2_structs.RoomMemberDataInternalUpdateInfo) + SharedDtor(*this); +} +inline void RoomMemberDataInternalUpdateInfo::SharedDtor(MessageLite& self) { + RoomMemberDataInternalUpdateInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.newroommemberdatainternal_; + delete this_._impl_.prevteamid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomMemberDataInternalUpdateInfo(arena); +} +constexpr auto RoomMemberDataInternalUpdateInfo::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.newroommemberbinattrinternal_) + + decltype(RoomMemberDataInternalUpdateInfo::_impl_.newroommemberbinattrinternal_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(RoomMemberDataInternalUpdateInfo), alignof(RoomMemberDataInternalUpdateInfo), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&RoomMemberDataInternalUpdateInfo::PlacementNew_, + sizeof(RoomMemberDataInternalUpdateInfo), + alignof(RoomMemberDataInternalUpdateInfo)); + } +} +constexpr auto RoomMemberDataInternalUpdateInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<45>{ + { + &_RoomMemberDataInternalUpdateInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomMemberDataInternalUpdateInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomMemberDataInternalUpdateInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomMemberDataInternalUpdateInfo::ByteSizeLong, + &RoomMemberDataInternalUpdateInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_._cached_size_), + true, + }, + "np2_structs.RoomMemberDataInternalUpdateInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<45> RoomMemberDataInternalUpdateInfo_class_data_ = + RoomMemberDataInternalUpdateInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomMemberDataInternalUpdateInfo::GetClassData() const { + return RoomMemberDataInternalUpdateInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 3, 0, 2> +RoomMemberDataInternalUpdateInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomMemberDataInternalUpdateInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomMemberDataInternalUpdateInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.uint16 newRoomMemberBinAttrInternal = 4; + {::_pbi::TcParser::FastMtR1, + {34, 0, 2, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.newroommemberbinattrinternal_)}}, + // .np2_structs.RoomMemberDataInternal newRoomMemberDataInternal = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.newroommemberdatainternal_)}}, + // uint32 prevFlagAttr = 2; + {::_pbi::TcParser::FastV32S1, + {16, 3, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.prevflagattr_)}}, + // .np2_structs.uint8 prevTeamId = 3; + {::_pbi::TcParser::FastMtS1, + {26, 2, 1, + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.prevteamid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.RoomMemberDataInternal newRoomMemberDataInternal = 1; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.newroommemberdatainternal_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 prevFlagAttr = 2; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.prevflagattr_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // .np2_structs.uint8 prevTeamId = 3; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.prevteamid_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.uint16 newRoomMemberBinAttrInternal = 4; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.newroommemberbinattrinternal_), _Internal::kHasBitsOffset + 0, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::RoomMemberDataInternal>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomMemberDataInternalUpdateInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomMemberDataInternalUpdateInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.newroommemberbinattrinternal_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.newroommemberdatainternal_ != nullptr); + _impl_.newroommemberdatainternal_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.prevteamid_ != nullptr); + _impl_.prevteamid_->Clear(); + } + } + _impl_.prevflagattr_ = 0u; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomMemberDataInternalUpdateInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomMemberDataInternalUpdateInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomMemberDataInternalUpdateInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.RoomMemberDataInternal newRoomMemberDataInternal = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.newroommemberdatainternal_, this_._impl_.newroommemberdatainternal_->GetCachedSize(), target, + stream); + } + + // uint32 prevFlagAttr = 2; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_prevflagattr() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_prevflagattr(), target); + } + } + + // .np2_structs.uint8 prevTeamId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.prevteamid_, this_._impl_.prevteamid_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.uint16 newRoomMemberBinAttrInternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_newroommemberbinattrinternal_size()); + i < n; i++) { + const auto& repfield = this_._internal_newroommemberbinattrinternal().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomMemberDataInternalUpdateInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomMemberDataInternalUpdateInfo::ByteSizeLong(const MessageLite& base) { + const RoomMemberDataInternalUpdateInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomMemberDataInternalUpdateInfo::ByteSizeLong() const { + const RoomMemberDataInternalUpdateInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomMemberDataInternalUpdateInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // repeated .np2_structs.uint16 newRoomMemberBinAttrInternal = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_newroommemberbinattrinternal_size(); + for (const auto& msg : this_._internal_newroommemberbinattrinternal()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // .np2_structs.RoomMemberDataInternal newRoomMemberDataInternal = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.newroommemberdatainternal_); + } + // .np2_structs.uint8 prevTeamId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.prevteamid_); + } + // uint32 prevFlagAttr = 2; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_prevflagattr() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_prevflagattr()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomMemberDataInternalUpdateInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomMemberDataInternalUpdateInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_newroommemberbinattrinternal()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_newroommemberbinattrinternal()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.newroommemberdatainternal_ != nullptr); + if (_this->_impl_.newroommemberdatainternal_ == nullptr) { + _this->_impl_.newroommemberdatainternal_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.newroommemberdatainternal_); + } else { + _this->_impl_.newroommemberdatainternal_->MergeFrom(*from._impl_.newroommemberdatainternal_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.prevteamid_ != nullptr); + if (_this->_impl_.prevteamid_ == nullptr) { + _this->_impl_.prevteamid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.prevteamid_); + } else { + _this->_impl_.prevteamid_->MergeFrom(*from._impl_.prevteamid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_prevflagattr() != 0) { + _this->_impl_.prevflagattr_ = from._impl_.prevflagattr_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomMemberDataInternalUpdateInfo::CopyFrom(const RoomMemberDataInternalUpdateInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomMemberDataInternalUpdateInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomMemberDataInternalUpdateInfo::InternalSwap(RoomMemberDataInternalUpdateInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.newroommemberbinattrinternal_.InternalSwap(&other->_impl_.newroommemberbinattrinternal_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.prevflagattr_) + + sizeof(RoomMemberDataInternalUpdateInfo::_impl_.prevflagattr_) + - PROTOBUF_FIELD_OFFSET(RoomMemberDataInternalUpdateInfo, _impl_.newroommemberdatainternal_)>( + reinterpret_cast(&_impl_.newroommemberdatainternal_), + reinterpret_cast(&other->_impl_.newroommemberdatainternal_)); +} + +// =================================================================== + +class GetPingInfoResponse::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_._has_bits_); +}; + +GetPingInfoResponse::GetPingInfoResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetPingInfoResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetPingInfoResponse) +} +PROTOBUF_NDEBUG_INLINE GetPingInfoResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetPingInfoResponse& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +GetPingInfoResponse::GetPingInfoResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetPingInfoResponse& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetPingInfoResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetPingInfoResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.serverid_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.serverid_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, roomid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, roomid_), + offsetof(Impl_, rtt_) - + offsetof(Impl_, roomid_) + + sizeof(Impl_::rtt_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetPingInfoResponse) +} +PROTOBUF_NDEBUG_INLINE GetPingInfoResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void GetPingInfoResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, serverid_), + 0, + offsetof(Impl_, rtt_) - + offsetof(Impl_, serverid_) + + sizeof(Impl_::rtt_)); +} +GetPingInfoResponse::~GetPingInfoResponse() { + // @@protoc_insertion_point(destructor:np2_structs.GetPingInfoResponse) + SharedDtor(*this); +} +inline void GetPingInfoResponse::SharedDtor(MessageLite& self) { + GetPingInfoResponse& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.serverid_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetPingInfoResponse::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetPingInfoResponse(arena); +} +constexpr auto GetPingInfoResponse::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(GetPingInfoResponse), + alignof(GetPingInfoResponse)); +} +constexpr auto GetPingInfoResponse::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<32>{ + { + &_GetPingInfoResponse_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetPingInfoResponse::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetPingInfoResponse::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetPingInfoResponse::ByteSizeLong, + &GetPingInfoResponse::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_._cached_size_), + true, + }, + "np2_structs.GetPingInfoResponse", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<32> GetPingInfoResponse_class_data_ = + GetPingInfoResponse::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetPingInfoResponse::GetClassData() const { + return GetPingInfoResponse_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 1, 0, 2> +GetPingInfoResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GetPingInfoResponse_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetPingInfoResponse>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // uint32 rtt = 4; + {::_pbi::TcParser::FastV32S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.rtt_)}}, + // .np2_structs.uint16 serverId = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.serverid_)}}, + // uint32 worldId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 2, 0, + PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.worldid_)}}, + // uint64 roomId = 3; + {::_pbi::TcParser::FastV64S1, + {24, 1, 0, + PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.roomid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.uint16 serverId = 1; + {PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.serverid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 worldId = 2; + {PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.worldid_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint64 roomId = 3; + {PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.roomid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint32 rtt = 4; + {PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.rtt_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void GetPingInfoResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetPingInfoResponse) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.serverid_ != nullptr); + _impl_.serverid_->Clear(); + } + if (BatchCheckHasBit(cached_has_bits, 0x0000000eU)) { + ::memset(&_impl_.roomid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.rtt_) - + reinterpret_cast(&_impl_.roomid_)) + sizeof(_impl_.rtt_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetPingInfoResponse::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetPingInfoResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetPingInfoResponse::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetPingInfoResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetPingInfoResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.uint16 serverId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.serverid_, this_._impl_.serverid_->GetCachedSize(), target, + stream); + } + + // uint32 worldId = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_worldid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_worldid(), target); + } + } + + // uint64 roomId = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 3, this_._internal_roomid(), target); + } + } + + // uint32 rtt = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_rtt() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 4, this_._internal_rtt(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetPingInfoResponse) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetPingInfoResponse::ByteSizeLong(const MessageLite& base) { + const GetPingInfoResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetPingInfoResponse::ByteSizeLong() const { + const GetPingInfoResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetPingInfoResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // .np2_structs.uint16 serverId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.serverid_); + } + // uint64 roomId = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + // uint32 worldId = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_worldid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_worldid()); + } + } + // uint32 rtt = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_rtt() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_rtt()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetPingInfoResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetPingInfoResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.serverid_ != nullptr); + if (_this->_impl_.serverid_ == nullptr) { + _this->_impl_.serverid_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.serverid_); + } else { + _this->_impl_.serverid_->MergeFrom(*from._impl_.serverid_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_worldid() != 0) { + _this->_impl_.worldid_ = from._impl_.worldid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_rtt() != 0) { + _this->_impl_.rtt_ = from._impl_.rtt_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetPingInfoResponse::CopyFrom(const GetPingInfoResponse& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetPingInfoResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetPingInfoResponse::InternalSwap(GetPingInfoResponse* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.rtt_) + + sizeof(GetPingInfoResponse::_impl_.rtt_) + - PROTOBUF_FIELD_OFFSET(GetPingInfoResponse, _impl_.serverid_)>( + reinterpret_cast(&_impl_.serverid_), + reinterpret_cast(&other->_impl_.serverid_)); +} + +// =================================================================== + +class SendRoomMessageRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_._has_bits_); +}; + +SendRoomMessageRequest::SendRoomMessageRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SendRoomMessageRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SendRoomMessageRequest) +} +PROTOBUF_NDEBUG_INLINE SendRoomMessageRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SendRoomMessageRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + dst_{visibility, arena, from.dst_}, + msg_(arena, from.msg_) {} + +SendRoomMessageRequest::SendRoomMessageRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SendRoomMessageRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SendRoomMessageRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SendRoomMessageRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.casttype_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.casttype_) + : nullptr; + _impl_.option_ = (CheckHasBit(cached_has_bits, 0x00000008U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.option_) + : nullptr; + _impl_.roomid_ = from._impl_.roomid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.SendRoomMessageRequest) +} +PROTOBUF_NDEBUG_INLINE SendRoomMessageRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + dst_{visibility, arena}, + msg_(arena) {} + +inline void SendRoomMessageRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, casttype_), + 0, + offsetof(Impl_, roomid_) - + offsetof(Impl_, casttype_) + + sizeof(Impl_::roomid_)); +} +SendRoomMessageRequest::~SendRoomMessageRequest() { + // @@protoc_insertion_point(destructor:np2_structs.SendRoomMessageRequest) + SharedDtor(*this); +} +inline void SendRoomMessageRequest::SharedDtor(MessageLite& self) { + SendRoomMessageRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.msg_.Destroy(); + delete this_._impl_.casttype_; + delete this_._impl_.option_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SendRoomMessageRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SendRoomMessageRequest(arena); +} +constexpr auto SendRoomMessageRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.dst_) + + decltype(SendRoomMessageRequest::_impl_.dst_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(SendRoomMessageRequest), alignof(SendRoomMessageRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&SendRoomMessageRequest::PlacementNew_, + sizeof(SendRoomMessageRequest), + alignof(SendRoomMessageRequest)); + } +} +constexpr auto SendRoomMessageRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<35>{ + { + &_SendRoomMessageRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SendRoomMessageRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SendRoomMessageRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SendRoomMessageRequest::ByteSizeLong, + &SendRoomMessageRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_._cached_size_), + true, + }, + "np2_structs.SendRoomMessageRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<35> SendRoomMessageRequest_class_data_ = + SendRoomMessageRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SendRoomMessageRequest::GetClassData() const { + return SendRoomMessageRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 3, 0, 2> +SendRoomMessageRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + SendRoomMessageRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SendRoomMessageRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint64 roomId = 1; + {::_pbi::TcParser::FastV64S1, + {8, 4, 0, + PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.roomid_)}}, + // .np2_structs.uint8 castType = 2; + {::_pbi::TcParser::FastMtS1, + {18, 2, 0, + PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.casttype_)}}, + // repeated .np2_structs.uint16 dst = 3; + {::_pbi::TcParser::FastMtR1, + {26, 0, 1, + PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.dst_)}}, + // bytes msg = 4; + {::_pbi::TcParser::FastBS1, + {34, 1, 0, + PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.msg_)}}, + // .np2_structs.uint8 option = 5; + {::_pbi::TcParser::FastMtS1, + {42, 3, 2, + PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.option_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint64 roomId = 1; + {PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.roomid_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.uint8 castType = 2; + {PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.casttype_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.uint16 dst = 3; + {PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.dst_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // bytes msg = 4; + {PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.msg_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // .np2_structs.uint8 option = 5; + {PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.option_), _Internal::kHasBitsOffset + 3, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void SendRoomMessageRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SendRoomMessageRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.dst_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.msg_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.casttype_ != nullptr); + _impl_.casttype_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(_impl_.option_ != nullptr); + _impl_.option_->Clear(); + } + } + _impl_.roomid_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SendRoomMessageRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SendRoomMessageRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SendRoomMessageRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SendRoomMessageRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SendRoomMessageRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_roomid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 1, this_._internal_roomid(), target); + } + } + + // .np2_structs.uint8 castType = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.casttype_, this_._impl_.casttype_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.uint16 dst = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_dst_size()); + i < n; i++) { + const auto& repfield = this_._internal_dst().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // bytes msg = 4; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_msg().empty()) { + const ::std::string& _s = this_._internal_msg(); + target = stream->WriteBytesMaybeAliased(4, _s, target); + } + } + + // .np2_structs.uint8 option = 5; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 5, *this_._impl_.option_, this_._impl_.option_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SendRoomMessageRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SendRoomMessageRequest::ByteSizeLong(const MessageLite& base) { + const SendRoomMessageRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SendRoomMessageRequest::ByteSizeLong() const { + const SendRoomMessageRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SendRoomMessageRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // repeated .np2_structs.uint16 dst = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_dst_size(); + for (const auto& msg : this_._internal_dst()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // bytes msg = 4; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_msg().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_msg()); + } + } + // .np2_structs.uint8 castType = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.casttype_); + } + // .np2_structs.uint8 option = 5; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.option_); + } + // uint64 roomId = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_roomid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_roomid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SendRoomMessageRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SendRoomMessageRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_dst()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_dst()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_msg().empty()) { + _this->_internal_set_msg(from._internal_msg()); + } else { + if (_this->_impl_.msg_.IsDefault()) { + _this->_internal_set_msg(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.casttype_ != nullptr); + if (_this->_impl_.casttype_ == nullptr) { + _this->_impl_.casttype_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.casttype_); + } else { + _this->_impl_.casttype_->MergeFrom(*from._impl_.casttype_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(from._impl_.option_ != nullptr); + if (_this->_impl_.option_ == nullptr) { + _this->_impl_.option_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.option_); + } else { + _this->_impl_.option_->MergeFrom(*from._impl_.option_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_roomid() != 0) { + _this->_impl_.roomid_ = from._impl_.roomid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SendRoomMessageRequest::CopyFrom(const SendRoomMessageRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SendRoomMessageRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SendRoomMessageRequest::InternalSwap(SendRoomMessageRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.dst_.InternalSwap(&other->_impl_.dst_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.msg_, &other->_impl_.msg_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.roomid_) + + sizeof(SendRoomMessageRequest::_impl_.roomid_) + - PROTOBUF_FIELD_OFFSET(SendRoomMessageRequest, _impl_.casttype_)>( + reinterpret_cast(&_impl_.casttype_), + reinterpret_cast(&other->_impl_.casttype_)); +} + +// =================================================================== + +class RoomMessageInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_._has_bits_); +}; + +RoomMessageInfo::RoomMessageInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMessageInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomMessageInfo) +} +PROTOBUF_NDEBUG_INLINE RoomMessageInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomMessageInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + dst_{visibility, arena, from.dst_}, + msg_(arena, from.msg_) {} + +RoomMessageInfo::RoomMessageInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomMessageInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMessageInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomMessageInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.casttype_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.casttype_) + : nullptr; + _impl_.srcmember_ = (CheckHasBit(cached_has_bits, 0x00000008U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.srcmember_) + : nullptr; + _impl_.filtered_ = from._impl_.filtered_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomMessageInfo) +} +PROTOBUF_NDEBUG_INLINE RoomMessageInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + dst_{visibility, arena}, + msg_(arena) {} + +inline void RoomMessageInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, casttype_), + 0, + offsetof(Impl_, filtered_) - + offsetof(Impl_, casttype_) + + sizeof(Impl_::filtered_)); +} +RoomMessageInfo::~RoomMessageInfo() { + // @@protoc_insertion_point(destructor:np2_structs.RoomMessageInfo) + SharedDtor(*this); +} +inline void RoomMessageInfo::SharedDtor(MessageLite& self) { + RoomMessageInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.msg_.Destroy(); + delete this_._impl_.casttype_; + delete this_._impl_.srcmember_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomMessageInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomMessageInfo(arena); +} +constexpr auto RoomMessageInfo::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.dst_) + + decltype(RoomMessageInfo::_impl_.dst_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(RoomMessageInfo), alignof(RoomMessageInfo), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&RoomMessageInfo::PlacementNew_, + sizeof(RoomMessageInfo), + alignof(RoomMessageInfo)); + } +} +constexpr auto RoomMessageInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<28>{ + { + &_RoomMessageInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomMessageInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomMessageInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomMessageInfo::ByteSizeLong, + &RoomMessageInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_._cached_size_), + true, + }, + "np2_structs.RoomMessageInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<28> RoomMessageInfo_class_data_ = + RoomMessageInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomMessageInfo::GetClassData() const { + return RoomMessageInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 3, 0, 2> +RoomMessageInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 3, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomMessageInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomMessageInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // bool filtered = 1; + {::_pbi::TcParser::FastV8S1, + {8, 4, 0, + PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.filtered_)}}, + // .np2_structs.uint8 castType = 2; + {::_pbi::TcParser::FastMtS1, + {18, 2, 0, + PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.casttype_)}}, + // repeated .np2_structs.uint16 dst = 3; + {::_pbi::TcParser::FastMtR1, + {26, 0, 1, + PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.dst_)}}, + // .np2_structs.UserInfo srcMember = 4; + {::_pbi::TcParser::FastMtS1, + {34, 3, 2, + PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.srcmember_)}}, + // bytes msg = 5; + {::_pbi::TcParser::FastBS1, + {42, 1, 0, + PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.msg_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // bool filtered = 1; + {PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.filtered_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // .np2_structs.uint8 castType = 2; + {PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.casttype_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.uint16 dst = 3; + {PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.dst_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.UserInfo srcMember = 4; + {PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.srcmember_), _Internal::kHasBitsOffset + 3, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // bytes msg = 5; + {PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.msg_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::UserInfo>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomMessageInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomMessageInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.dst_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.msg_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.casttype_ != nullptr); + _impl_.casttype_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(_impl_.srcmember_ != nullptr); + _impl_.srcmember_->Clear(); + } + } + _impl_.filtered_ = false; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomMessageInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomMessageInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomMessageInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomMessageInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomMessageInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bool filtered = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_filtered() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 1, this_._internal_filtered(), target); + } + } + + // .np2_structs.uint8 castType = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.casttype_, this_._impl_.casttype_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.uint16 dst = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_dst_size()); + i < n; i++) { + const auto& repfield = this_._internal_dst().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // .np2_structs.UserInfo srcMember = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, *this_._impl_.srcmember_, this_._impl_.srcmember_->GetCachedSize(), target, + stream); + } + + // bytes msg = 5; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_msg().empty()) { + const ::std::string& _s = this_._internal_msg(); + target = stream->WriteBytesMaybeAliased(5, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomMessageInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomMessageInfo::ByteSizeLong(const MessageLite& base) { + const RoomMessageInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomMessageInfo::ByteSizeLong() const { + const RoomMessageInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomMessageInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // repeated .np2_structs.uint16 dst = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_dst_size(); + for (const auto& msg : this_._internal_dst()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // bytes msg = 5; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_msg().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_msg()); + } + } + // .np2_structs.uint8 castType = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.casttype_); + } + // .np2_structs.UserInfo srcMember = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.srcmember_); + } + // bool filtered = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_filtered() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomMessageInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomMessageInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_dst()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_dst()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_msg().empty()) { + _this->_internal_set_msg(from._internal_msg()); + } else { + if (_this->_impl_.msg_.IsDefault()) { + _this->_internal_set_msg(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.casttype_ != nullptr); + if (_this->_impl_.casttype_ == nullptr) { + _this->_impl_.casttype_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.casttype_); + } else { + _this->_impl_.casttype_->MergeFrom(*from._impl_.casttype_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(from._impl_.srcmember_ != nullptr); + if (_this->_impl_.srcmember_ == nullptr) { + _this->_impl_.srcmember_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.srcmember_); + } else { + _this->_impl_.srcmember_->MergeFrom(*from._impl_.srcmember_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_filtered() != 0) { + _this->_impl_.filtered_ = from._impl_.filtered_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomMessageInfo::CopyFrom(const RoomMessageInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomMessageInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomMessageInfo::InternalSwap(RoomMessageInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.dst_.InternalSwap(&other->_impl_.dst_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.msg_, &other->_impl_.msg_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.filtered_) + + sizeof(RoomMessageInfo::_impl_.filtered_) + - PROTOBUF_FIELD_OFFSET(RoomMessageInfo, _impl_.casttype_)>( + reinterpret_cast(&_impl_.casttype_), + reinterpret_cast(&other->_impl_.casttype_)); +} + +// =================================================================== + +class MessageDetails::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_._has_bits_); +}; + +MessageDetails::MessageDetails(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MessageDetails_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.MessageDetails) +} +PROTOBUF_NDEBUG_INLINE MessageDetails::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::MessageDetails& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + communicationid_(arena, from.communicationid_), + subject_(arena, from.subject_), + body_(arena, from.body_), + data_(arena, from.data_) {} + +MessageDetails::MessageDetails( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const MessageDetails& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MessageDetails_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + MessageDetails* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.maintype_ = (CheckHasBit(cached_has_bits, 0x00000010U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.maintype_) + : nullptr; + _impl_.subtype_ = (CheckHasBit(cached_has_bits, 0x00000020U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.subtype_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, msgid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, msgid_), + offsetof(Impl_, msgfeatures_) - + offsetof(Impl_, msgid_) + + sizeof(Impl_::msgfeatures_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.MessageDetails) +} +PROTOBUF_NDEBUG_INLINE MessageDetails::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + communicationid_(arena), + subject_(arena), + body_(arena), + data_(arena) {} + +inline void MessageDetails::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, maintype_), + 0, + offsetof(Impl_, msgfeatures_) - + offsetof(Impl_, maintype_) + + sizeof(Impl_::msgfeatures_)); +} +MessageDetails::~MessageDetails() { + // @@protoc_insertion_point(destructor:np2_structs.MessageDetails) + SharedDtor(*this); +} +inline void MessageDetails::SharedDtor(MessageLite& self) { + MessageDetails& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.communicationid_.Destroy(); + this_._impl_.subject_.Destroy(); + this_._impl_.body_.Destroy(); + this_._impl_.data_.Destroy(); + delete this_._impl_.maintype_; + delete this_._impl_.subtype_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL MessageDetails::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) MessageDetails(arena); +} +constexpr auto MessageDetails::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(MessageDetails), + alignof(MessageDetails)); +} +constexpr auto MessageDetails::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<27>{ + { + &_MessageDetails_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &MessageDetails::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &MessageDetails::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &MessageDetails::ByteSizeLong, + &MessageDetails::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_._cached_size_), + true, + }, + "np2_structs.MessageDetails", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<27> MessageDetails_class_data_ = + MessageDetails::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +MessageDetails::GetClassData() const { + return MessageDetails_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 8, 2, 69, 2> +MessageDetails::_table_ = { + { + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_._has_bits_), + 0, // no _extensions_ + 8, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967040, // skipmap + offsetof(decltype(_table_), field_entries), + 8, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + MessageDetails_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::MessageDetails>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bytes data = 8; + {::_pbi::TcParser::FastBS1, + {66, 3, 0, + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.data_)}}, + // string communicationId = 1; + {::_pbi::TcParser::FastUS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.communicationid_)}}, + // uint64 msgId = 2; + {::_pbi::TcParser::FastV64S1, + {16, 6, 0, + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.msgid_)}}, + // .np2_structs.uint16 mainType = 3; + {::_pbi::TcParser::FastMtS1, + {26, 4, 0, + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.maintype_)}}, + // .np2_structs.uint16 subType = 4; + {::_pbi::TcParser::FastMtS1, + {34, 5, 1, + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.subtype_)}}, + // uint32 msgFeatures = 5; + {::_pbi::TcParser::FastV32S1, + {40, 7, 0, + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.msgfeatures_)}}, + // string subject = 6; + {::_pbi::TcParser::FastUS1, + {50, 1, 0, + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.subject_)}}, + // string body = 7; + {::_pbi::TcParser::FastUS1, + {58, 2, 0, + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.body_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // string communicationId = 1; + {PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.communicationid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // uint64 msgId = 2; + {PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.msgid_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.uint16 mainType = 3; + {PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.maintype_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.uint16 subType = 4; + {PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.subtype_), _Internal::kHasBitsOffset + 5, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 msgFeatures = 5; + {PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.msgfeatures_), _Internal::kHasBitsOffset + 7, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // string subject = 6; + {PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.subject_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // string body = 7; + {PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.body_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // bytes data = 8; + {PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.data_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint16>()}, + }}, + {{ + "\32\17\0\0\0\0\7\4\0\0\0\0\0\0\0\0" + "np2_structs.MessageDetails" + "communicationId" + "subject" + "body" + }}, +}; +PROTOBUF_NOINLINE void MessageDetails::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.MessageDetails) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.communicationid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.subject_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + _impl_.body_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + _impl_.data_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(_impl_.maintype_ != nullptr); + _impl_.maintype_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + ABSL_DCHECK(_impl_.subtype_ != nullptr); + _impl_.subtype_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x000000c0U)) { + ::memset(&_impl_.msgid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.msgfeatures_) - + reinterpret_cast(&_impl_.msgid_)) + sizeof(_impl_.msgfeatures_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL MessageDetails::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const MessageDetails& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL MessageDetails::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const MessageDetails& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.MessageDetails) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // string communicationId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_communicationid().empty()) { + const ::std::string& _s = this_._internal_communicationid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.MessageDetails.communicationId"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + } + + // uint64 msgId = 2; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_msgid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 2, this_._internal_msgid(), target); + } + } + + // .np2_structs.uint16 mainType = 3; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.maintype_, this_._impl_.maintype_->GetCachedSize(), target, + stream); + } + + // .np2_structs.uint16 subType = 4; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, *this_._impl_.subtype_, this_._impl_.subtype_->GetCachedSize(), target, + stream); + } + + // uint32 msgFeatures = 5; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (this_._internal_msgfeatures() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 5, this_._internal_msgfeatures(), target); + } + } + + // string subject = 6; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_subject().empty()) { + const ::std::string& _s = this_._internal_subject(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.MessageDetails.subject"); + target = stream->WriteStringMaybeAliased(6, _s, target); + } + } + + // string body = 7; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_body().empty()) { + const ::std::string& _s = this_._internal_body(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.MessageDetails.body"); + target = stream->WriteStringMaybeAliased(7, _s, target); + } + } + + // bytes data = 8; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!this_._internal_data().empty()) { + const ::std::string& _s = this_._internal_data(); + target = stream->WriteBytesMaybeAliased(8, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.MessageDetails) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t MessageDetails::ByteSizeLong(const MessageLite& base) { + const MessageDetails& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t MessageDetails::ByteSizeLong() const { + const MessageDetails& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.MessageDetails) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + // string communicationId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_communicationid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_communicationid()); + } + } + // string subject = 6; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_subject().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_subject()); + } + } + // string body = 7; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_body().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_body()); + } + } + // bytes data = 8; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!this_._internal_data().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_data()); + } + } + // .np2_structs.uint16 mainType = 3; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.maintype_); + } + // .np2_structs.uint16 subType = 4; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.subtype_); + } + // uint64 msgId = 2; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_msgid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_msgid()); + } + } + // uint32 msgFeatures = 5; + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (this_._internal_msgfeatures() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_msgfeatures()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void MessageDetails::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.MessageDetails) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_communicationid().empty()) { + _this->_internal_set_communicationid(from._internal_communicationid()); + } else { + if (_this->_impl_.communicationid_.IsDefault()) { + _this->_internal_set_communicationid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_subject().empty()) { + _this->_internal_set_subject(from._internal_subject()); + } else { + if (_this->_impl_.subject_.IsDefault()) { + _this->_internal_set_subject(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!from._internal_body().empty()) { + _this->_internal_set_body(from._internal_body()); + } else { + if (_this->_impl_.body_.IsDefault()) { + _this->_internal_set_body(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!from._internal_data().empty()) { + _this->_internal_set_data(from._internal_data()); + } else { + if (_this->_impl_.data_.IsDefault()) { + _this->_internal_set_data(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(from._impl_.maintype_ != nullptr); + if (_this->_impl_.maintype_ == nullptr) { + _this->_impl_.maintype_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.maintype_); + } else { + _this->_impl_.maintype_->MergeFrom(*from._impl_.maintype_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + ABSL_DCHECK(from._impl_.subtype_ != nullptr); + if (_this->_impl_.subtype_ == nullptr) { + _this->_impl_.subtype_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.subtype_); + } else { + _this->_impl_.subtype_->MergeFrom(*from._impl_.subtype_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (from._internal_msgid() != 0) { + _this->_impl_.msgid_ = from._impl_.msgid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000080U)) { + if (from._internal_msgfeatures() != 0) { + _this->_impl_.msgfeatures_ = from._impl_.msgfeatures_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void MessageDetails::CopyFrom(const MessageDetails& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.MessageDetails) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void MessageDetails::InternalSwap(MessageDetails* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.communicationid_, &other->_impl_.communicationid_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.subject_, &other->_impl_.subject_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.body_, &other->_impl_.body_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.data_, &other->_impl_.data_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.msgfeatures_) + + sizeof(MessageDetails::_impl_.msgfeatures_) + - PROTOBUF_FIELD_OFFSET(MessageDetails, _impl_.maintype_)>( + reinterpret_cast(&_impl_.maintype_), + reinterpret_cast(&other->_impl_.maintype_)); +} + +// =================================================================== + +class SendMessageRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SendMessageRequest, _impl_._has_bits_); +}; + +SendMessageRequest::SendMessageRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SendMessageRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SendMessageRequest) +} +PROTOBUF_NDEBUG_INLINE SendMessageRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SendMessageRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + npids_{visibility, arena, from.npids_}, + message_(arena, from.message_) {} + +SendMessageRequest::SendMessageRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SendMessageRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SendMessageRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SendMessageRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.SendMessageRequest) +} +PROTOBUF_NDEBUG_INLINE SendMessageRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + npids_{visibility, arena}, + message_(arena) {} + +inline void SendMessageRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +SendMessageRequest::~SendMessageRequest() { + // @@protoc_insertion_point(destructor:np2_structs.SendMessageRequest) + SharedDtor(*this); +} +inline void SendMessageRequest::SharedDtor(MessageLite& self) { + SendMessageRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.message_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SendMessageRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SendMessageRequest(arena); +} +constexpr auto SendMessageRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(SendMessageRequest, _impl_.npids_) + + decltype(SendMessageRequest::_impl_.npids_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(SendMessageRequest), alignof(SendMessageRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&SendMessageRequest::PlacementNew_, + sizeof(SendMessageRequest), + alignof(SendMessageRequest)); + } +} +constexpr auto SendMessageRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<31>{ + { + &_SendMessageRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SendMessageRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SendMessageRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SendMessageRequest::ByteSizeLong, + &SendMessageRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SendMessageRequest, _impl_._cached_size_), + true, + }, + "np2_structs.SendMessageRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<31> SendMessageRequest_class_data_ = + SendMessageRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SendMessageRequest::GetClassData() const { + return SendMessageRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 0, 44, 2> +SendMessageRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SendMessageRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + SendMessageRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SendMessageRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated string npids = 2; + {::_pbi::TcParser::FastUR1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(SendMessageRequest, _impl_.npids_)}}, + // bytes message = 1; + {::_pbi::TcParser::FastBS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(SendMessageRequest, _impl_.message_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bytes message = 1; + {PROTOBUF_FIELD_OFFSET(SendMessageRequest, _impl_.message_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // repeated string npids = 2; + {PROTOBUF_FIELD_OFFSET(SendMessageRequest, _impl_.npids_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kUtf8String | ::_fl::kRepSString)}, + }}, + // no aux_entries + {{ + "\36\0\5\0\0\0\0\0" + "np2_structs.SendMessageRequest" + "npids" + }}, +}; +PROTOBUF_NOINLINE void SendMessageRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SendMessageRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.npids_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.message_.ClearNonDefaultToEmpty(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SendMessageRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SendMessageRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SendMessageRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SendMessageRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SendMessageRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bytes message = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_message().empty()) { + const ::std::string& _s = this_._internal_message(); + target = stream->WriteBytesMaybeAliased(1, _s, target); + } + } + + // repeated string npids = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (int i = 0, n = this_._internal_npids_size(); i < n; ++i) { + const auto& s = this_._internal_npids().Get(i); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + s.data(), static_cast(s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.SendMessageRequest.npids"); + target = stream->WriteString(2, s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SendMessageRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SendMessageRequest::ByteSizeLong(const MessageLite& base) { + const SendMessageRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SendMessageRequest::ByteSizeLong() const { + const SendMessageRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SendMessageRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated string npids = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + 1 * ::google::protobuf::internal::FromIntSize(this_._internal_npids().size()); + for (int i = 0, n = this_._internal_npids().size(); i < n; ++i) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_npids().Get(i)); + } + } + // bytes message = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_message().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_message()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SendMessageRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SendMessageRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_npids()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_npids()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_message().empty()) { + _this->_internal_set_message(from._internal_message()); + } else { + if (_this->_impl_.message_.IsDefault()) { + _this->_internal_set_message(""); + } + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SendMessageRequest::CopyFrom(const SendMessageRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SendMessageRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SendMessageRequest::InternalSwap(SendMessageRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.npids_.InternalSwap(&other->_impl_.npids_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.message_, &other->_impl_.message_, arena); +} + +// =================================================================== + +class BoardInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_._has_bits_); +}; + +BoardInfo::BoardInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, BoardInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.BoardInfo) +} +BoardInfo::BoardInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const BoardInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, BoardInfo_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(from._impl_) { + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} +PROTOBUF_NDEBUG_INLINE BoardInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void BoardInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, ranklimit_), + 0, + offsetof(Impl_, uploadsizelimit_) - + offsetof(Impl_, ranklimit_) + + sizeof(Impl_::uploadsizelimit_)); +} +BoardInfo::~BoardInfo() { + // @@protoc_insertion_point(destructor:np2_structs.BoardInfo) + SharedDtor(*this); +} +inline void BoardInfo::SharedDtor(MessageLite& self) { + BoardInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL BoardInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) BoardInfo(arena); +} +constexpr auto BoardInfo::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(BoardInfo), + alignof(BoardInfo)); +} +constexpr auto BoardInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<22>{ + { + &_BoardInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &BoardInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &BoardInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &BoardInfo::ByteSizeLong, + &BoardInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_._cached_size_), + true, + }, + "np2_structs.BoardInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<22> BoardInfo_class_data_ = + BoardInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +BoardInfo::GetClassData() const { + return BoardInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 0, 0, 2> +BoardInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + BoardInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::BoardInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 rankLimit = 1; + {::_pbi::TcParser::FastV32S1, + {8, 0, 0, + PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.ranklimit_)}}, + // uint32 updateMode = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.updatemode_)}}, + // uint32 sortMode = 3; + {::_pbi::TcParser::FastV32S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.sortmode_)}}, + // uint32 uploadNumLimit = 4; + {::_pbi::TcParser::FastV32S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.uploadnumlimit_)}}, + // uint32 uploadSizeLimit = 5; + {::_pbi::TcParser::FastV32S1, + {40, 4, 0, + PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.uploadsizelimit_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 rankLimit = 1; + {PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.ranklimit_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 updateMode = 2; + {PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.updatemode_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 sortMode = 3; + {PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.sortmode_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 uploadNumLimit = 4; + {PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.uploadnumlimit_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 uploadSizeLimit = 5; + {PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.uploadsizelimit_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void BoardInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.BoardInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + ::memset(&_impl_.ranklimit_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.uploadsizelimit_) - + reinterpret_cast(&_impl_.ranklimit_)) + sizeof(_impl_.uploadsizelimit_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL BoardInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const BoardInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL BoardInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const BoardInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.BoardInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 rankLimit = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_ranklimit() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_ranklimit(), target); + } + } + + // uint32 updateMode = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_updatemode() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_updatemode(), target); + } + } + + // uint32 sortMode = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_sortmode() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 3, this_._internal_sortmode(), target); + } + } + + // uint32 uploadNumLimit = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_uploadnumlimit() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 4, this_._internal_uploadnumlimit(), target); + } + } + + // uint32 uploadSizeLimit = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_uploadsizelimit() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 5, this_._internal_uploadsizelimit(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.BoardInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t BoardInfo::ByteSizeLong(const MessageLite& base) { + const BoardInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t BoardInfo::ByteSizeLong() const { + const BoardInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.BoardInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // uint32 rankLimit = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_ranklimit() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_ranklimit()); + } + } + // uint32 updateMode = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_updatemode() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_updatemode()); + } + } + // uint32 sortMode = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_sortmode() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_sortmode()); + } + } + // uint32 uploadNumLimit = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_uploadnumlimit() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_uploadnumlimit()); + } + } + // uint32 uploadSizeLimit = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_uploadsizelimit() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_uploadsizelimit()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void BoardInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.BoardInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (from._internal_ranklimit() != 0) { + _this->_impl_.ranklimit_ = from._impl_.ranklimit_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_updatemode() != 0) { + _this->_impl_.updatemode_ = from._impl_.updatemode_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_sortmode() != 0) { + _this->_impl_.sortmode_ = from._impl_.sortmode_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_uploadnumlimit() != 0) { + _this->_impl_.uploadnumlimit_ = from._impl_.uploadnumlimit_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_uploadsizelimit() != 0) { + _this->_impl_.uploadsizelimit_ = from._impl_.uploadsizelimit_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void BoardInfo::CopyFrom(const BoardInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.BoardInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void BoardInfo::InternalSwap(BoardInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.uploadsizelimit_) + + sizeof(BoardInfo::_impl_.uploadsizelimit_) + - PROTOBUF_FIELD_OFFSET(BoardInfo, _impl_.ranklimit_)>( + reinterpret_cast(&_impl_.ranklimit_), + reinterpret_cast(&other->_impl_.ranklimit_)); +} + +// =================================================================== + +class RecordScoreRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_._has_bits_); +}; + +RecordScoreRequest::RecordScoreRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RecordScoreRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RecordScoreRequest) +} +PROTOBUF_NDEBUG_INLINE RecordScoreRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RecordScoreRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + comment_(arena, from.comment_), + data_(arena, from.data_) {} + +RecordScoreRequest::RecordScoreRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RecordScoreRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RecordScoreRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RecordScoreRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, boardid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, boardid_), + offsetof(Impl_, score_) - + offsetof(Impl_, boardid_) + + sizeof(Impl_::score_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.RecordScoreRequest) +} +PROTOBUF_NDEBUG_INLINE RecordScoreRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + comment_(arena), + data_(arena) {} + +inline void RecordScoreRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, boardid_), + 0, + offsetof(Impl_, score_) - + offsetof(Impl_, boardid_) + + sizeof(Impl_::score_)); +} +RecordScoreRequest::~RecordScoreRequest() { + // @@protoc_insertion_point(destructor:np2_structs.RecordScoreRequest) + SharedDtor(*this); +} +inline void RecordScoreRequest::SharedDtor(MessageLite& self) { + RecordScoreRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.comment_.Destroy(); + this_._impl_.data_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RecordScoreRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RecordScoreRequest(arena); +} +constexpr auto RecordScoreRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(RecordScoreRequest), + alignof(RecordScoreRequest)); +} +constexpr auto RecordScoreRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<31>{ + { + &_RecordScoreRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RecordScoreRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RecordScoreRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RecordScoreRequest::ByteSizeLong, + &RecordScoreRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_._cached_size_), + true, + }, + "np2_structs.RecordScoreRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<31> RecordScoreRequest_class_data_ = + RecordScoreRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RecordScoreRequest::GetClassData() const { + return RecordScoreRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 0, 46, 2> +RecordScoreRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + RecordScoreRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RecordScoreRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 boardId = 1; + {::_pbi::TcParser::FastV32S1, + {8, 2, 0, + PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.boardid_)}}, + // int32 pcId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 3, 0, + PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.pcid_)}}, + // int64 score = 3; + {::_pbi::TcParser::FastV64S1, + {24, 4, 0, + PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.score_)}}, + // string comment = 4; + {::_pbi::TcParser::FastUS1, + {34, 0, 0, + PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.comment_)}}, + // bytes data = 5; + {::_pbi::TcParser::FastBS1, + {42, 1, 0, + PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.data_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 boardId = 1; + {PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.boardid_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // int32 pcId = 2; + {PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.pcid_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // int64 score = 3; + {PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.score_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt64)}, + // string comment = 4; + {PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.comment_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // bytes data = 5; + {PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.data_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + // no aux_entries + {{ + "\36\0\0\0\7\0\0\0" + "np2_structs.RecordScoreRequest" + "comment" + }}, +}; +PROTOBUF_NOINLINE void RecordScoreRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RecordScoreRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.comment_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.data_.ClearNonDefaultToEmpty(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000001cU)) { + ::memset(&_impl_.boardid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.score_) - + reinterpret_cast(&_impl_.boardid_)) + sizeof(_impl_.score_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RecordScoreRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RecordScoreRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RecordScoreRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RecordScoreRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RecordScoreRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_boardid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_boardid(), target); + } + } + + // int32 pcId = 2; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_pcid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_pcid(), target); + } + } + + // int64 score = 3; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_score() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt64ToArrayWithField<3>( + stream, this_._internal_score(), target); + } + } + + // string comment = 4; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_comment().empty()) { + const ::std::string& _s = this_._internal_comment(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.RecordScoreRequest.comment"); + target = stream->WriteStringMaybeAliased(4, _s, target); + } + } + + // bytes data = 5; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_data().empty()) { + const ::std::string& _s = this_._internal_data(); + target = stream->WriteBytesMaybeAliased(5, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RecordScoreRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RecordScoreRequest::ByteSizeLong(const MessageLite& base) { + const RecordScoreRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RecordScoreRequest::ByteSizeLong() const { + const RecordScoreRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RecordScoreRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // string comment = 4; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_comment().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_comment()); + } + } + // bytes data = 5; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_data().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_data()); + } + } + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_boardid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_boardid()); + } + } + // int32 pcId = 2; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_pcid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_pcid()); + } + } + // int64 score = 3; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_score() != 0) { + total_size += ::_pbi::WireFormatLite::Int64SizePlusOne( + this_._internal_score()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RecordScoreRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RecordScoreRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_comment().empty()) { + _this->_internal_set_comment(from._internal_comment()); + } else { + if (_this->_impl_.comment_.IsDefault()) { + _this->_internal_set_comment(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_data().empty()) { + _this->_internal_set_data(from._internal_data()); + } else { + if (_this->_impl_.data_.IsDefault()) { + _this->_internal_set_data(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_boardid() != 0) { + _this->_impl_.boardid_ = from._impl_.boardid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_pcid() != 0) { + _this->_impl_.pcid_ = from._impl_.pcid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_score() != 0) { + _this->_impl_.score_ = from._impl_.score_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RecordScoreRequest::CopyFrom(const RecordScoreRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RecordScoreRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RecordScoreRequest::InternalSwap(RecordScoreRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.comment_, &other->_impl_.comment_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.data_, &other->_impl_.data_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.score_) + + sizeof(RecordScoreRequest::_impl_.score_) + - PROTOBUF_FIELD_OFFSET(RecordScoreRequest, _impl_.boardid_)>( + reinterpret_cast(&_impl_.boardid_), + reinterpret_cast(&other->_impl_.boardid_)); +} + +// =================================================================== + +class GetScoreRangeRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_._has_bits_); +}; + +GetScoreRangeRequest::GetScoreRangeRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreRangeRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetScoreRangeRequest) +} +GetScoreRangeRequest::GetScoreRangeRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetScoreRangeRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreRangeRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(from._impl_) { + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} +PROTOBUF_NDEBUG_INLINE GetScoreRangeRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void GetScoreRangeRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, boardid_), + 0, + offsetof(Impl_, withgameinfo_) - + offsetof(Impl_, boardid_) + + sizeof(Impl_::withgameinfo_)); +} +GetScoreRangeRequest::~GetScoreRangeRequest() { + // @@protoc_insertion_point(destructor:np2_structs.GetScoreRangeRequest) + SharedDtor(*this); +} +inline void GetScoreRangeRequest::SharedDtor(MessageLite& self) { + GetScoreRangeRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetScoreRangeRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetScoreRangeRequest(arena); +} +constexpr auto GetScoreRangeRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(GetScoreRangeRequest), + alignof(GetScoreRangeRequest)); +} +constexpr auto GetScoreRangeRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<33>{ + { + &_GetScoreRangeRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetScoreRangeRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetScoreRangeRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetScoreRangeRequest::ByteSizeLong, + &GetScoreRangeRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_._cached_size_), + true, + }, + "np2_structs.GetScoreRangeRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<33> GetScoreRangeRequest_class_data_ = + GetScoreRangeRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetScoreRangeRequest::GetClassData() const { + return GetScoreRangeRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 0, 0, 2> +GetScoreRangeRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + GetScoreRangeRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetScoreRangeRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 boardId = 1; + {::_pbi::TcParser::FastV32S1, + {8, 0, 0, + PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.boardid_)}}, + // uint32 startRank = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.startrank_)}}, + // uint32 numRanks = 3; + {::_pbi::TcParser::FastV32S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.numranks_)}}, + // bool withComment = 4; + {::_pbi::TcParser::FastV8S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.withcomment_)}}, + // bool withGameInfo = 5; + {::_pbi::TcParser::FastV8S1, + {40, 4, 0, + PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.withgameinfo_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 boardId = 1; + {PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.boardid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 startRank = 2; + {PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.startrank_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 numRanks = 3; + {PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.numranks_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // bool withComment = 4; + {PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.withcomment_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // bool withGameInfo = 5; + {PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.withgameinfo_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void GetScoreRangeRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetScoreRangeRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + ::memset(&_impl_.boardid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.withgameinfo_) - + reinterpret_cast(&_impl_.boardid_)) + sizeof(_impl_.withgameinfo_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetScoreRangeRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetScoreRangeRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetScoreRangeRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetScoreRangeRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetScoreRangeRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_boardid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_boardid(), target); + } + } + + // uint32 startRank = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_startrank() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_startrank(), target); + } + } + + // uint32 numRanks = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_numranks() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 3, this_._internal_numranks(), target); + } + } + + // bool withComment = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_withcomment() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 4, this_._internal_withcomment(), target); + } + } + + // bool withGameInfo = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_withgameinfo() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 5, this_._internal_withgameinfo(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetScoreRangeRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetScoreRangeRequest::ByteSizeLong(const MessageLite& base) { + const GetScoreRangeRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetScoreRangeRequest::ByteSizeLong() const { + const GetScoreRangeRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetScoreRangeRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_boardid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_boardid()); + } + } + // uint32 startRank = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_startrank() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_startrank()); + } + } + // uint32 numRanks = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_numranks() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_numranks()); + } + } + // bool withComment = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_withcomment() != 0) { + total_size += 2; + } + } + // bool withGameInfo = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_withgameinfo() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetScoreRangeRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetScoreRangeRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (from._internal_boardid() != 0) { + _this->_impl_.boardid_ = from._impl_.boardid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_startrank() != 0) { + _this->_impl_.startrank_ = from._impl_.startrank_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_numranks() != 0) { + _this->_impl_.numranks_ = from._impl_.numranks_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_withcomment() != 0) { + _this->_impl_.withcomment_ = from._impl_.withcomment_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_withgameinfo() != 0) { + _this->_impl_.withgameinfo_ = from._impl_.withgameinfo_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetScoreRangeRequest::CopyFrom(const GetScoreRangeRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetScoreRangeRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetScoreRangeRequest::InternalSwap(GetScoreRangeRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.withgameinfo_) + + sizeof(GetScoreRangeRequest::_impl_.withgameinfo_) + - PROTOBUF_FIELD_OFFSET(GetScoreRangeRequest, _impl_.boardid_)>( + reinterpret_cast(&_impl_.boardid_), + reinterpret_cast(&other->_impl_.boardid_)); +} + +// =================================================================== + +class ScoreNpIdPcId::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(ScoreNpIdPcId, _impl_._has_bits_); +}; + +ScoreNpIdPcId::ScoreNpIdPcId(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, ScoreNpIdPcId_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.ScoreNpIdPcId) +} +PROTOBUF_NDEBUG_INLINE ScoreNpIdPcId::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::ScoreNpIdPcId& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + npid_(arena, from.npid_) {} + +ScoreNpIdPcId::ScoreNpIdPcId( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const ScoreNpIdPcId& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, ScoreNpIdPcId_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + ScoreNpIdPcId* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + _impl_.pcid_ = from._impl_.pcid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.ScoreNpIdPcId) +} +PROTOBUF_NDEBUG_INLINE ScoreNpIdPcId::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + npid_(arena) {} + +inline void ScoreNpIdPcId::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.pcid_ = {}; +} +ScoreNpIdPcId::~ScoreNpIdPcId() { + // @@protoc_insertion_point(destructor:np2_structs.ScoreNpIdPcId) + SharedDtor(*this); +} +inline void ScoreNpIdPcId::SharedDtor(MessageLite& self) { + ScoreNpIdPcId& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.npid_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL ScoreNpIdPcId::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) ScoreNpIdPcId(arena); +} +constexpr auto ScoreNpIdPcId::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(ScoreNpIdPcId), + alignof(ScoreNpIdPcId)); +} +constexpr auto ScoreNpIdPcId::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<26>{ + { + &_ScoreNpIdPcId_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &ScoreNpIdPcId::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &ScoreNpIdPcId::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &ScoreNpIdPcId::ByteSizeLong, + &ScoreNpIdPcId::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(ScoreNpIdPcId, _impl_._cached_size_), + true, + }, + "np2_structs.ScoreNpIdPcId", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<26> ScoreNpIdPcId_class_data_ = + ScoreNpIdPcId::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +ScoreNpIdPcId::GetClassData() const { + return ScoreNpIdPcId_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 0, 38, 2> +ScoreNpIdPcId::_table_ = { + { + PROTOBUF_FIELD_OFFSET(ScoreNpIdPcId, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + ScoreNpIdPcId_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::ScoreNpIdPcId>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // int32 pcId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(ScoreNpIdPcId, _impl_.pcid_)}}, + // string npid = 1; + {::_pbi::TcParser::FastUS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(ScoreNpIdPcId, _impl_.npid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // string npid = 1; + {PROTOBUF_FIELD_OFFSET(ScoreNpIdPcId, _impl_.npid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // int32 pcId = 2; + {PROTOBUF_FIELD_OFFSET(ScoreNpIdPcId, _impl_.pcid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + }}, + // no aux_entries + {{ + "\31\4\0\0\0\0\0\0" + "np2_structs.ScoreNpIdPcId" + "npid" + }}, +}; +PROTOBUF_NOINLINE void ScoreNpIdPcId::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.ScoreNpIdPcId) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.npid_.ClearNonDefaultToEmpty(); + } + _impl_.pcid_ = 0; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL ScoreNpIdPcId::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const ScoreNpIdPcId& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL ScoreNpIdPcId::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const ScoreNpIdPcId& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.ScoreNpIdPcId) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // string npid = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + const ::std::string& _s = this_._internal_npid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.ScoreNpIdPcId.npid"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + } + + // int32 pcId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_pcid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_pcid(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.ScoreNpIdPcId) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t ScoreNpIdPcId::ByteSizeLong(const MessageLite& base) { + const ScoreNpIdPcId& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t ScoreNpIdPcId::ByteSizeLong() const { + const ScoreNpIdPcId& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.ScoreNpIdPcId) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // string npid = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_npid()); + } + } + // int32 pcId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_pcid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_pcid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void ScoreNpIdPcId::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.ScoreNpIdPcId) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_npid().empty()) { + _this->_internal_set_npid(from._internal_npid()); + } else { + if (_this->_impl_.npid_.IsDefault()) { + _this->_internal_set_npid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_pcid() != 0) { + _this->_impl_.pcid_ = from._impl_.pcid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void ScoreNpIdPcId::CopyFrom(const ScoreNpIdPcId& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.ScoreNpIdPcId) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void ScoreNpIdPcId::InternalSwap(ScoreNpIdPcId* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.npid_, &other->_impl_.npid_, arena); + swap(_impl_.pcid_, other->_impl_.pcid_); +} + +// =================================================================== + +class GetScoreNpIdRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_._has_bits_); +}; + +GetScoreNpIdRequest::GetScoreNpIdRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreNpIdRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetScoreNpIdRequest) +} +PROTOBUF_NDEBUG_INLINE GetScoreNpIdRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetScoreNpIdRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + npids_{visibility, arena, from.npids_} {} + +GetScoreNpIdRequest::GetScoreNpIdRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetScoreNpIdRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreNpIdRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetScoreNpIdRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, boardid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, boardid_), + offsetof(Impl_, withgameinfo_) - + offsetof(Impl_, boardid_) + + sizeof(Impl_::withgameinfo_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetScoreNpIdRequest) +} +PROTOBUF_NDEBUG_INLINE GetScoreNpIdRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + npids_{visibility, arena} {} + +inline void GetScoreNpIdRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, boardid_), + 0, + offsetof(Impl_, withgameinfo_) - + offsetof(Impl_, boardid_) + + sizeof(Impl_::withgameinfo_)); +} +GetScoreNpIdRequest::~GetScoreNpIdRequest() { + // @@protoc_insertion_point(destructor:np2_structs.GetScoreNpIdRequest) + SharedDtor(*this); +} +inline void GetScoreNpIdRequest::SharedDtor(MessageLite& self) { + GetScoreNpIdRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetScoreNpIdRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetScoreNpIdRequest(arena); +} +constexpr auto GetScoreNpIdRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.npids_) + + decltype(GetScoreNpIdRequest::_impl_.npids_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(GetScoreNpIdRequest), alignof(GetScoreNpIdRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&GetScoreNpIdRequest::PlacementNew_, + sizeof(GetScoreNpIdRequest), + alignof(GetScoreNpIdRequest)); + } +} +constexpr auto GetScoreNpIdRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<32>{ + { + &_GetScoreNpIdRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetScoreNpIdRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetScoreNpIdRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetScoreNpIdRequest::ByteSizeLong, + &GetScoreNpIdRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_._cached_size_), + true, + }, + "np2_structs.GetScoreNpIdRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<32> GetScoreNpIdRequest_class_data_ = + GetScoreNpIdRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetScoreNpIdRequest::GetClassData() const { + return GetScoreNpIdRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 1, 0, 2> +GetScoreNpIdRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GetScoreNpIdRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetScoreNpIdRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bool withGameInfo = 4; + {::_pbi::TcParser::FastV8S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.withgameinfo_)}}, + // uint32 boardId = 1; + {::_pbi::TcParser::FastV32S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.boardid_)}}, + // repeated .np2_structs.ScoreNpIdPcId npids = 2; + {::_pbi::TcParser::FastMtR1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.npids_)}}, + // bool withComment = 3; + {::_pbi::TcParser::FastV8S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.withcomment_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 boardId = 1; + {PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.boardid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.ScoreNpIdPcId npids = 2; + {PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.npids_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // bool withComment = 3; + {PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.withcomment_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // bool withGameInfo = 4; + {PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.withgameinfo_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::ScoreNpIdPcId>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void GetScoreNpIdRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetScoreNpIdRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.npids_.Clear(); + } + if (BatchCheckHasBit(cached_has_bits, 0x0000000eU)) { + ::memset(&_impl_.boardid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.withgameinfo_) - + reinterpret_cast(&_impl_.boardid_)) + sizeof(_impl_.withgameinfo_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetScoreNpIdRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetScoreNpIdRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetScoreNpIdRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetScoreNpIdRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetScoreNpIdRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_boardid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_boardid(), target); + } + } + + // repeated .np2_structs.ScoreNpIdPcId npids = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_npids_size()); + i < n; i++) { + const auto& repfield = this_._internal_npids().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // bool withComment = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_withcomment() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 3, this_._internal_withcomment(), target); + } + } + + // bool withGameInfo = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_withgameinfo() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 4, this_._internal_withgameinfo(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetScoreNpIdRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetScoreNpIdRequest::ByteSizeLong(const MessageLite& base) { + const GetScoreNpIdRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetScoreNpIdRequest::ByteSizeLong() const { + const GetScoreNpIdRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetScoreNpIdRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // repeated .np2_structs.ScoreNpIdPcId npids = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_npids_size(); + for (const auto& msg : this_._internal_npids()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_boardid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_boardid()); + } + } + // bool withComment = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_withcomment() != 0) { + total_size += 2; + } + } + // bool withGameInfo = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_withgameinfo() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetScoreNpIdRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetScoreNpIdRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_npids()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_npids()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_boardid() != 0) { + _this->_impl_.boardid_ = from._impl_.boardid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_withcomment() != 0) { + _this->_impl_.withcomment_ = from._impl_.withcomment_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_withgameinfo() != 0) { + _this->_impl_.withgameinfo_ = from._impl_.withgameinfo_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetScoreNpIdRequest::CopyFrom(const GetScoreNpIdRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetScoreNpIdRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetScoreNpIdRequest::InternalSwap(GetScoreNpIdRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.npids_.InternalSwap(&other->_impl_.npids_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.withgameinfo_) + + sizeof(GetScoreNpIdRequest::_impl_.withgameinfo_) + - PROTOBUF_FIELD_OFFSET(GetScoreNpIdRequest, _impl_.boardid_)>( + reinterpret_cast(&_impl_.boardid_), + reinterpret_cast(&other->_impl_.boardid_)); +} + +// =================================================================== + +class GetScoreFriendsRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_._has_bits_); +}; + +GetScoreFriendsRequest::GetScoreFriendsRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreFriendsRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetScoreFriendsRequest) +} +GetScoreFriendsRequest::GetScoreFriendsRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetScoreFriendsRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreFriendsRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(from._impl_) { + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} +PROTOBUF_NDEBUG_INLINE GetScoreFriendsRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void GetScoreFriendsRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, boardid_), + 0, + offsetof(Impl_, withgameinfo_) - + offsetof(Impl_, boardid_) + + sizeof(Impl_::withgameinfo_)); +} +GetScoreFriendsRequest::~GetScoreFriendsRequest() { + // @@protoc_insertion_point(destructor:np2_structs.GetScoreFriendsRequest) + SharedDtor(*this); +} +inline void GetScoreFriendsRequest::SharedDtor(MessageLite& self) { + GetScoreFriendsRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetScoreFriendsRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetScoreFriendsRequest(arena); +} +constexpr auto GetScoreFriendsRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(GetScoreFriendsRequest), + alignof(GetScoreFriendsRequest)); +} +constexpr auto GetScoreFriendsRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<35>{ + { + &_GetScoreFriendsRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetScoreFriendsRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetScoreFriendsRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetScoreFriendsRequest::ByteSizeLong, + &GetScoreFriendsRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_._cached_size_), + true, + }, + "np2_structs.GetScoreFriendsRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<35> GetScoreFriendsRequest_class_data_ = + GetScoreFriendsRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetScoreFriendsRequest::GetClassData() const { + return GetScoreFriendsRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 0, 0, 2> +GetScoreFriendsRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + GetScoreFriendsRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetScoreFriendsRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 boardId = 1; + {::_pbi::TcParser::FastV32S1, + {8, 0, 0, + PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.boardid_)}}, + // bool include_self = 2; + {::_pbi::TcParser::FastV8S1, + {16, 2, 0, + PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.include_self_)}}, + // uint32 max = 3; + {::_pbi::TcParser::FastV32S1, + {24, 1, 0, + PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.max_)}}, + // bool withComment = 4; + {::_pbi::TcParser::FastV8S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.withcomment_)}}, + // bool withGameInfo = 5; + {::_pbi::TcParser::FastV8S1, + {40, 4, 0, + PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.withgameinfo_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 boardId = 1; + {PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.boardid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // bool include_self = 2; + {PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.include_self_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // uint32 max = 3; + {PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.max_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // bool withComment = 4; + {PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.withcomment_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // bool withGameInfo = 5; + {PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.withgameinfo_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void GetScoreFriendsRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetScoreFriendsRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + ::memset(&_impl_.boardid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.withgameinfo_) - + reinterpret_cast(&_impl_.boardid_)) + sizeof(_impl_.withgameinfo_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetScoreFriendsRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetScoreFriendsRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetScoreFriendsRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetScoreFriendsRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetScoreFriendsRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_boardid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_boardid(), target); + } + } + + // bool include_self = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_include_self() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 2, this_._internal_include_self(), target); + } + } + + // uint32 max = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_max() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 3, this_._internal_max(), target); + } + } + + // bool withComment = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_withcomment() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 4, this_._internal_withcomment(), target); + } + } + + // bool withGameInfo = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_withgameinfo() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 5, this_._internal_withgameinfo(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetScoreFriendsRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetScoreFriendsRequest::ByteSizeLong(const MessageLite& base) { + const GetScoreFriendsRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetScoreFriendsRequest::ByteSizeLong() const { + const GetScoreFriendsRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetScoreFriendsRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_boardid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_boardid()); + } + } + // uint32 max = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_max() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_max()); + } + } + // bool include_self = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_include_self() != 0) { + total_size += 2; + } + } + // bool withComment = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_withcomment() != 0) { + total_size += 2; + } + } + // bool withGameInfo = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_withgameinfo() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetScoreFriendsRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetScoreFriendsRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (from._internal_boardid() != 0) { + _this->_impl_.boardid_ = from._impl_.boardid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_max() != 0) { + _this->_impl_.max_ = from._impl_.max_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_include_self() != 0) { + _this->_impl_.include_self_ = from._impl_.include_self_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_withcomment() != 0) { + _this->_impl_.withcomment_ = from._impl_.withcomment_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_withgameinfo() != 0) { + _this->_impl_.withgameinfo_ = from._impl_.withgameinfo_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetScoreFriendsRequest::CopyFrom(const GetScoreFriendsRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetScoreFriendsRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetScoreFriendsRequest::InternalSwap(GetScoreFriendsRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.withgameinfo_) + + sizeof(GetScoreFriendsRequest::_impl_.withgameinfo_) + - PROTOBUF_FIELD_OFFSET(GetScoreFriendsRequest, _impl_.boardid_)>( + reinterpret_cast(&_impl_.boardid_), + reinterpret_cast(&other->_impl_.boardid_)); +} + +// =================================================================== + +class ScoreRankData::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_._has_bits_); +}; + +ScoreRankData::ScoreRankData(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, ScoreRankData_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.ScoreRankData) +} +PROTOBUF_NDEBUG_INLINE ScoreRankData::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::ScoreRankData& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + npid_(arena, from.npid_), + onlinename_(arena, from.onlinename_) {} + +ScoreRankData::ScoreRankData( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const ScoreRankData& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, ScoreRankData_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + ScoreRankData* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, pcid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, pcid_), + offsetof(Impl_, hasgamedata_) - + offsetof(Impl_, pcid_) + + sizeof(Impl_::hasgamedata_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.ScoreRankData) +} +PROTOBUF_NDEBUG_INLINE ScoreRankData::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + npid_(arena), + onlinename_(arena) {} + +inline void ScoreRankData::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, pcid_), + 0, + offsetof(Impl_, hasgamedata_) - + offsetof(Impl_, pcid_) + + sizeof(Impl_::hasgamedata_)); +} +ScoreRankData::~ScoreRankData() { + // @@protoc_insertion_point(destructor:np2_structs.ScoreRankData) + SharedDtor(*this); +} +inline void ScoreRankData::SharedDtor(MessageLite& self) { + ScoreRankData& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.npid_.Destroy(); + this_._impl_.onlinename_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL ScoreRankData::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) ScoreRankData(arena); +} +constexpr auto ScoreRankData::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(ScoreRankData), + alignof(ScoreRankData)); +} +constexpr auto ScoreRankData::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<26>{ + { + &_ScoreRankData_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &ScoreRankData::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &ScoreRankData::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &ScoreRankData::ByteSizeLong, + &ScoreRankData::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_._cached_size_), + true, + }, + "np2_structs.ScoreRankData", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<26> ScoreRankData_class_data_ = + ScoreRankData::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +ScoreRankData::GetClassData() const { + return ScoreRankData_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 7, 0, 48, 2> +ScoreRankData::_table_ = { + { + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_._has_bits_), + 0, // no _extensions_ + 7, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967168, // skipmap + offsetof(decltype(_table_), field_entries), + 7, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + ScoreRankData_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::ScoreRankData>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // string npId = 1; + {::_pbi::TcParser::FastUS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.npid_)}}, + // string onlineName = 2; + {::_pbi::TcParser::FastUS1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.onlinename_)}}, + // int32 pcId = 3; + {::_pbi::TcParser::FastV32S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.pcid_)}}, + // uint32 rank = 4; + {::_pbi::TcParser::FastV32S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.rank_)}}, + // int64 score = 5; + {::_pbi::TcParser::FastV64S1, + {40, 4, 0, + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.score_)}}, + // bool hasGameData = 6; + {::_pbi::TcParser::FastV8S1, + {48, 6, 0, + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.hasgamedata_)}}, + // uint64 recordDate = 7; + {::_pbi::TcParser::FastV64S1, + {56, 5, 0, + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.recorddate_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // string npId = 1; + {PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.npid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // string onlineName = 2; + {PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.onlinename_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // int32 pcId = 3; + {PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.pcid_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // uint32 rank = 4; + {PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.rank_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // int64 score = 5; + {PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.score_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt64)}, + // bool hasGameData = 6; + {PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.hasgamedata_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // uint64 recordDate = 7; + {PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.recorddate_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + }}, + // no aux_entries + {{ + "\31\4\12\0\0\0\0\0" + "np2_structs.ScoreRankData" + "npId" + "onlineName" + }}, +}; +PROTOBUF_NOINLINE void ScoreRankData::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.ScoreRankData) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.npid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.onlinename_.ClearNonDefaultToEmpty(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000007cU)) { + ::memset(&_impl_.pcid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.hasgamedata_) - + reinterpret_cast(&_impl_.pcid_)) + sizeof(_impl_.hasgamedata_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL ScoreRankData::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const ScoreRankData& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL ScoreRankData::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const ScoreRankData& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.ScoreRankData) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // string npId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + const ::std::string& _s = this_._internal_npid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.ScoreRankData.npId"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + } + + // string onlineName = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_onlinename().empty()) { + const ::std::string& _s = this_._internal_onlinename(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.ScoreRankData.onlineName"); + target = stream->WriteStringMaybeAliased(2, _s, target); + } + } + + // int32 pcId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_pcid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<3>( + stream, this_._internal_pcid(), target); + } + } + + // uint32 rank = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_rank() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 4, this_._internal_rank(), target); + } + } + + // int64 score = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_score() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt64ToArrayWithField<5>( + stream, this_._internal_score(), target); + } + } + + // bool hasGameData = 6; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_hasgamedata() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 6, this_._internal_hasgamedata(), target); + } + } + + // uint64 recordDate = 7; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_recorddate() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 7, this_._internal_recorddate(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.ScoreRankData) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t ScoreRankData::ByteSizeLong(const MessageLite& base) { + const ScoreRankData& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t ScoreRankData::ByteSizeLong() const { + const ScoreRankData& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.ScoreRankData) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000007fU)) { + // string npId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_npid()); + } + } + // string onlineName = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_onlinename().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_onlinename()); + } + } + // int32 pcId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_pcid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_pcid()); + } + } + // uint32 rank = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_rank() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_rank()); + } + } + // int64 score = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_score() != 0) { + total_size += ::_pbi::WireFormatLite::Int64SizePlusOne( + this_._internal_score()); + } + } + // uint64 recordDate = 7; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_recorddate() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_recorddate()); + } + } + // bool hasGameData = 6; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_hasgamedata() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void ScoreRankData::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.ScoreRankData) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000007fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_npid().empty()) { + _this->_internal_set_npid(from._internal_npid()); + } else { + if (_this->_impl_.npid_.IsDefault()) { + _this->_internal_set_npid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_onlinename().empty()) { + _this->_internal_set_onlinename(from._internal_onlinename()); + } else { + if (_this->_impl_.onlinename_.IsDefault()) { + _this->_internal_set_onlinename(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_pcid() != 0) { + _this->_impl_.pcid_ = from._impl_.pcid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_rank() != 0) { + _this->_impl_.rank_ = from._impl_.rank_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_score() != 0) { + _this->_impl_.score_ = from._impl_.score_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (from._internal_recorddate() != 0) { + _this->_impl_.recorddate_ = from._impl_.recorddate_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (from._internal_hasgamedata() != 0) { + _this->_impl_.hasgamedata_ = from._impl_.hasgamedata_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void ScoreRankData::CopyFrom(const ScoreRankData& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.ScoreRankData) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void ScoreRankData::InternalSwap(ScoreRankData* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.npid_, &other->_impl_.npid_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.onlinename_, &other->_impl_.onlinename_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.hasgamedata_) + + sizeof(ScoreRankData::_impl_.hasgamedata_) + - PROTOBUF_FIELD_OFFSET(ScoreRankData, _impl_.pcid_)>( + reinterpret_cast(&_impl_.pcid_), + reinterpret_cast(&other->_impl_.pcid_)); +} + +// =================================================================== + +class ScoreInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(ScoreInfo, _impl_._has_bits_); +}; + +ScoreInfo::ScoreInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, ScoreInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.ScoreInfo) +} +PROTOBUF_NDEBUG_INLINE ScoreInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::ScoreInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + data_(arena, from.data_) {} + +ScoreInfo::ScoreInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const ScoreInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, ScoreInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + ScoreInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.ScoreInfo) +} +PROTOBUF_NDEBUG_INLINE ScoreInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + data_(arena) {} + +inline void ScoreInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +ScoreInfo::~ScoreInfo() { + // @@protoc_insertion_point(destructor:np2_structs.ScoreInfo) + SharedDtor(*this); +} +inline void ScoreInfo::SharedDtor(MessageLite& self) { + ScoreInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.data_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL ScoreInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) ScoreInfo(arena); +} +constexpr auto ScoreInfo::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(ScoreInfo), + alignof(ScoreInfo)); +} +constexpr auto ScoreInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<22>{ + { + &_ScoreInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &ScoreInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &ScoreInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &ScoreInfo::ByteSizeLong, + &ScoreInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(ScoreInfo, _impl_._cached_size_), + true, + }, + "np2_structs.ScoreInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<22> ScoreInfo_class_data_ = + ScoreInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +ScoreInfo::GetClassData() const { + return ScoreInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 0, 0, 2> +ScoreInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(ScoreInfo, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + ScoreInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::ScoreInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bytes data = 1; + {::_pbi::TcParser::FastBS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(ScoreInfo, _impl_.data_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bytes data = 1; + {PROTOBUF_FIELD_OFFSET(ScoreInfo, _impl_.data_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void ScoreInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.ScoreInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.data_.ClearNonDefaultToEmpty(); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL ScoreInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const ScoreInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL ScoreInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const ScoreInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.ScoreInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bytes data = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + const ::std::string& _s = this_._internal_data(); + target = stream->WriteBytesMaybeAliased(1, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.ScoreInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t ScoreInfo::ByteSizeLong(const MessageLite& base) { + const ScoreInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t ScoreInfo::ByteSizeLong() const { + const ScoreInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.ScoreInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + { + // bytes data = 1; + cached_has_bits = this_._impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_data()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void ScoreInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.ScoreInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_data().empty()) { + _this->_internal_set_data(from._internal_data()); + } else { + if (_this->_impl_.data_.IsDefault()) { + _this->_internal_set_data(""); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void ScoreInfo::CopyFrom(const ScoreInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.ScoreInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void ScoreInfo::InternalSwap(ScoreInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.data_, &other->_impl_.data_, arena); +} + +// =================================================================== + +class GetScoreResponse::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_._has_bits_); +}; + +GetScoreResponse::GetScoreResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetScoreResponse) +} +PROTOBUF_NDEBUG_INLINE GetScoreResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetScoreResponse& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + rankarray_{visibility, arena, from.rankarray_}, + commentarray_{visibility, arena, from.commentarray_}, + infoarray_{visibility, arena, from.infoarray_} {} + +GetScoreResponse::GetScoreResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetScoreResponse& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetScoreResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, lastsortdate_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, lastsortdate_), + offsetof(Impl_, totalrecord_) - + offsetof(Impl_, lastsortdate_) + + sizeof(Impl_::totalrecord_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetScoreResponse) +} +PROTOBUF_NDEBUG_INLINE GetScoreResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + rankarray_{visibility, arena}, + commentarray_{visibility, arena}, + infoarray_{visibility, arena} {} + +inline void GetScoreResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, lastsortdate_), + 0, + offsetof(Impl_, totalrecord_) - + offsetof(Impl_, lastsortdate_) + + sizeof(Impl_::totalrecord_)); +} +GetScoreResponse::~GetScoreResponse() { + // @@protoc_insertion_point(destructor:np2_structs.GetScoreResponse) + SharedDtor(*this); +} +inline void GetScoreResponse::SharedDtor(MessageLite& self) { + GetScoreResponse& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetScoreResponse::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetScoreResponse(arena); +} +constexpr auto GetScoreResponse::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.rankarray_) + + decltype(GetScoreResponse::_impl_.rankarray_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.commentarray_) + + decltype(GetScoreResponse::_impl_.commentarray_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.infoarray_) + + decltype(GetScoreResponse::_impl_.infoarray_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(GetScoreResponse), alignof(GetScoreResponse), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&GetScoreResponse::PlacementNew_, + sizeof(GetScoreResponse), + alignof(GetScoreResponse)); + } +} +constexpr auto GetScoreResponse::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<29>{ + { + &_GetScoreResponse_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetScoreResponse::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetScoreResponse::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetScoreResponse::ByteSizeLong, + &GetScoreResponse::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_._cached_size_), + true, + }, + "np2_structs.GetScoreResponse", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<29> GetScoreResponse_class_data_ = + GetScoreResponse::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetScoreResponse::GetClassData() const { + return GetScoreResponse_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 2, 49, 2> +GetScoreResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GetScoreResponse_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetScoreResponse>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // repeated .np2_structs.ScoreRankData rankArray = 1; + {::_pbi::TcParser::FastMtR1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.rankarray_)}}, + // repeated string commentArray = 2; + {::_pbi::TcParser::FastUR1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.commentarray_)}}, + // repeated .np2_structs.ScoreInfo infoArray = 3; + {::_pbi::TcParser::FastMtR1, + {26, 2, 1, + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.infoarray_)}}, + // uint64 lastSortDate = 4; + {::_pbi::TcParser::FastV64S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.lastsortdate_)}}, + // uint32 totalRecord = 5; + {::_pbi::TcParser::FastV32S1, + {40, 4, 0, + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.totalrecord_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .np2_structs.ScoreRankData rankArray = 1; + {PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.rankarray_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated string commentArray = 2; + {PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.commentarray_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcRepeated | ::_fl::kUtf8String | ::_fl::kRepSString)}, + // repeated .np2_structs.ScoreInfo infoArray = 3; + {PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.infoarray_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint64 lastSortDate = 4; + {PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.lastsortdate_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // uint32 totalRecord = 5; + {PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.totalrecord_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::ScoreRankData>()}, + {::_pbi::TcParser::GetTable<::np2_structs::ScoreInfo>()}, + }}, + {{ + "\34\0\14\0\0\0\0\0" + "np2_structs.GetScoreResponse" + "commentArray" + }}, +}; +PROTOBUF_NOINLINE void GetScoreResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetScoreResponse) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.rankarray_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.commentarray_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _impl_.infoarray_.Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000018U)) { + ::memset(&_impl_.lastsortdate_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.totalrecord_) - + reinterpret_cast(&_impl_.lastsortdate_)) + sizeof(_impl_.totalrecord_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetScoreResponse::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetScoreResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetScoreResponse::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetScoreResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetScoreResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated .np2_structs.ScoreRankData rankArray = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_rankarray_size()); + i < n; i++) { + const auto& repfield = this_._internal_rankarray().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated string commentArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (int i = 0, n = this_._internal_commentarray_size(); i < n; ++i) { + const auto& s = this_._internal_commentarray().Get(i); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + s.data(), static_cast(s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.GetScoreResponse.commentArray"); + target = stream->WriteString(2, s, target); + } + } + + // repeated .np2_structs.ScoreInfo infoArray = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_infoarray_size()); + i < n; i++) { + const auto& repfield = this_._internal_infoarray().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // uint64 lastSortDate = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_lastsortdate() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 4, this_._internal_lastsortdate(), target); + } + } + + // uint32 totalRecord = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_totalrecord() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 5, this_._internal_totalrecord(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetScoreResponse) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetScoreResponse::ByteSizeLong(const MessageLite& base) { + const GetScoreResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetScoreResponse::ByteSizeLong() const { + const GetScoreResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetScoreResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // repeated .np2_structs.ScoreRankData rankArray = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_rankarray_size(); + for (const auto& msg : this_._internal_rankarray()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated string commentArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += + 1 * ::google::protobuf::internal::FromIntSize(this_._internal_commentarray().size()); + for (int i = 0, n = this_._internal_commentarray().size(); i < n; ++i) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_commentarray().Get(i)); + } + } + // repeated .np2_structs.ScoreInfo infoArray = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + total_size += 1UL * this_._internal_infoarray_size(); + for (const auto& msg : this_._internal_infoarray()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint64 lastSortDate = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_lastsortdate() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_lastsortdate()); + } + } + // uint32 totalRecord = 5; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_totalrecord() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_totalrecord()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetScoreResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetScoreResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_rankarray()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_rankarray()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_commentarray()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_commentarray()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) { + _this->_internal_mutable_infoarray()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_infoarray()); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_lastsortdate() != 0) { + _this->_impl_.lastsortdate_ = from._impl_.lastsortdate_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_totalrecord() != 0) { + _this->_impl_.totalrecord_ = from._impl_.totalrecord_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetScoreResponse::CopyFrom(const GetScoreResponse& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetScoreResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetScoreResponse::InternalSwap(GetScoreResponse* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.rankarray_.InternalSwap(&other->_impl_.rankarray_); + _impl_.commentarray_.InternalSwap(&other->_impl_.commentarray_); + _impl_.infoarray_.InternalSwap(&other->_impl_.infoarray_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.totalrecord_) + + sizeof(GetScoreResponse::_impl_.totalrecord_) + - PROTOBUF_FIELD_OFFSET(GetScoreResponse, _impl_.lastsortdate_)>( + reinterpret_cast(&_impl_.lastsortdate_), + reinterpret_cast(&other->_impl_.lastsortdate_)); +} + +// =================================================================== + +class RecordScoreGameDataRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_._has_bits_); +}; + +RecordScoreGameDataRequest::RecordScoreGameDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RecordScoreGameDataRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RecordScoreGameDataRequest) +} +RecordScoreGameDataRequest::RecordScoreGameDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RecordScoreGameDataRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RecordScoreGameDataRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(from._impl_) { + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} +PROTOBUF_NDEBUG_INLINE RecordScoreGameDataRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void RecordScoreGameDataRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, boardid_), + 0, + offsetof(Impl_, score_) - + offsetof(Impl_, boardid_) + + sizeof(Impl_::score_)); +} +RecordScoreGameDataRequest::~RecordScoreGameDataRequest() { + // @@protoc_insertion_point(destructor:np2_structs.RecordScoreGameDataRequest) + SharedDtor(*this); +} +inline void RecordScoreGameDataRequest::SharedDtor(MessageLite& self) { + RecordScoreGameDataRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RecordScoreGameDataRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RecordScoreGameDataRequest(arena); +} +constexpr auto RecordScoreGameDataRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(RecordScoreGameDataRequest), + alignof(RecordScoreGameDataRequest)); +} +constexpr auto RecordScoreGameDataRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<39>{ + { + &_RecordScoreGameDataRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RecordScoreGameDataRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RecordScoreGameDataRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RecordScoreGameDataRequest::ByteSizeLong, + &RecordScoreGameDataRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_._cached_size_), + true, + }, + "np2_structs.RecordScoreGameDataRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<39> RecordScoreGameDataRequest_class_data_ = + RecordScoreGameDataRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RecordScoreGameDataRequest::GetClassData() const { + return RecordScoreGameDataRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 0, 0, 2> +RecordScoreGameDataRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + RecordScoreGameDataRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RecordScoreGameDataRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 boardId = 1; + {::_pbi::TcParser::FastV32S1, + {8, 0, 0, + PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_.boardid_)}}, + // int32 pcId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_.pcid_)}}, + // int64 score = 3; + {::_pbi::TcParser::FastV64S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_.score_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 boardId = 1; + {PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_.boardid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // int32 pcId = 2; + {PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_.pcid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // int64 score = 3; + {PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_.score_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt64)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void RecordScoreGameDataRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RecordScoreGameDataRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + ::memset(&_impl_.boardid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.score_) - + reinterpret_cast(&_impl_.boardid_)) + sizeof(_impl_.score_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RecordScoreGameDataRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RecordScoreGameDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RecordScoreGameDataRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RecordScoreGameDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RecordScoreGameDataRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_boardid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_boardid(), target); + } + } + + // int32 pcId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_pcid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_pcid(), target); + } + } + + // int64 score = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_score() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt64ToArrayWithField<3>( + stream, this_._internal_score(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RecordScoreGameDataRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RecordScoreGameDataRequest::ByteSizeLong(const MessageLite& base) { + const RecordScoreGameDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RecordScoreGameDataRequest::ByteSizeLong() const { + const RecordScoreGameDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RecordScoreGameDataRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_boardid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_boardid()); + } + } + // int32 pcId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_pcid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_pcid()); + } + } + // int64 score = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_score() != 0) { + total_size += ::_pbi::WireFormatLite::Int64SizePlusOne( + this_._internal_score()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RecordScoreGameDataRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RecordScoreGameDataRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (from._internal_boardid() != 0) { + _this->_impl_.boardid_ = from._impl_.boardid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_pcid() != 0) { + _this->_impl_.pcid_ = from._impl_.pcid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_score() != 0) { + _this->_impl_.score_ = from._impl_.score_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RecordScoreGameDataRequest::CopyFrom(const RecordScoreGameDataRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RecordScoreGameDataRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RecordScoreGameDataRequest::InternalSwap(RecordScoreGameDataRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_.score_) + + sizeof(RecordScoreGameDataRequest::_impl_.score_) + - PROTOBUF_FIELD_OFFSET(RecordScoreGameDataRequest, _impl_.boardid_)>( + reinterpret_cast(&_impl_.boardid_), + reinterpret_cast(&other->_impl_.boardid_)); +} + +// =================================================================== + +class GetScoreGameDataRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_._has_bits_); +}; + +GetScoreGameDataRequest::GetScoreGameDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreGameDataRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetScoreGameDataRequest) +} +PROTOBUF_NDEBUG_INLINE GetScoreGameDataRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetScoreGameDataRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + npid_(arena, from.npid_) {} + +GetScoreGameDataRequest::GetScoreGameDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetScoreGameDataRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetScoreGameDataRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetScoreGameDataRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, boardid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, boardid_), + offsetof(Impl_, pcid_) - + offsetof(Impl_, boardid_) + + sizeof(Impl_::pcid_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetScoreGameDataRequest) +} +PROTOBUF_NDEBUG_INLINE GetScoreGameDataRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + npid_(arena) {} + +inline void GetScoreGameDataRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, boardid_), + 0, + offsetof(Impl_, pcid_) - + offsetof(Impl_, boardid_) + + sizeof(Impl_::pcid_)); +} +GetScoreGameDataRequest::~GetScoreGameDataRequest() { + // @@protoc_insertion_point(destructor:np2_structs.GetScoreGameDataRequest) + SharedDtor(*this); +} +inline void GetScoreGameDataRequest::SharedDtor(MessageLite& self) { + GetScoreGameDataRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.npid_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetScoreGameDataRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetScoreGameDataRequest(arena); +} +constexpr auto GetScoreGameDataRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(GetScoreGameDataRequest), + alignof(GetScoreGameDataRequest)); +} +constexpr auto GetScoreGameDataRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<36>{ + { + &_GetScoreGameDataRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetScoreGameDataRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetScoreGameDataRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetScoreGameDataRequest::ByteSizeLong, + &GetScoreGameDataRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_._cached_size_), + true, + }, + "np2_structs.GetScoreGameDataRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<36> GetScoreGameDataRequest_class_data_ = + GetScoreGameDataRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetScoreGameDataRequest::GetClassData() const { + return GetScoreGameDataRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 0, 48, 2> +GetScoreGameDataRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + GetScoreGameDataRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetScoreGameDataRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 boardId = 1; + {::_pbi::TcParser::FastV32S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_.boardid_)}}, + // string npId = 2; + {::_pbi::TcParser::FastUS1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_.npid_)}}, + // int32 pcId = 3; + {::_pbi::TcParser::FastV32S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_.pcid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 boardId = 1; + {PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_.boardid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // string npId = 2; + {PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_.npid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // int32 pcId = 3; + {PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_.pcid_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + }}, + // no aux_entries + {{ + "\43\0\4\0\0\0\0\0" + "np2_structs.GetScoreGameDataRequest" + "npId" + }}, +}; +PROTOBUF_NOINLINE void GetScoreGameDataRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetScoreGameDataRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.npid_.ClearNonDefaultToEmpty(); + } + if (BatchCheckHasBit(cached_has_bits, 0x00000006U)) { + ::memset(&_impl_.boardid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.pcid_) - + reinterpret_cast(&_impl_.boardid_)) + sizeof(_impl_.pcid_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetScoreGameDataRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetScoreGameDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetScoreGameDataRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetScoreGameDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetScoreGameDataRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_boardid() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_boardid(), target); + } + } + + // string npId = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + const ::std::string& _s = this_._internal_npid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.GetScoreGameDataRequest.npId"); + target = stream->WriteStringMaybeAliased(2, _s, target); + } + } + + // int32 pcId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_pcid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<3>( + stream, this_._internal_pcid(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetScoreGameDataRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetScoreGameDataRequest::ByteSizeLong(const MessageLite& base) { + const GetScoreGameDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetScoreGameDataRequest::ByteSizeLong() const { + const GetScoreGameDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetScoreGameDataRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // string npId = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_npid()); + } + } + // uint32 boardId = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_boardid() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_boardid()); + } + } + // int32 pcId = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_pcid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_pcid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetScoreGameDataRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetScoreGameDataRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_npid().empty()) { + _this->_internal_set_npid(from._internal_npid()); + } else { + if (_this->_impl_.npid_.IsDefault()) { + _this->_internal_set_npid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_boardid() != 0) { + _this->_impl_.boardid_ = from._impl_.boardid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_pcid() != 0) { + _this->_impl_.pcid_ = from._impl_.pcid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetScoreGameDataRequest::CopyFrom(const GetScoreGameDataRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetScoreGameDataRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetScoreGameDataRequest::InternalSwap(GetScoreGameDataRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.npid_, &other->_impl_.npid_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_.pcid_) + + sizeof(GetScoreGameDataRequest::_impl_.pcid_) + - PROTOBUF_FIELD_OFFSET(GetScoreGameDataRequest, _impl_.boardid_)>( + reinterpret_cast(&_impl_.boardid_), + reinterpret_cast(&other->_impl_.boardid_)); +} + +// =================================================================== + +class TusUser::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusUser, _impl_._has_bits_); +}; + +TusUser::TusUser(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusUser_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusUser) +} +PROTOBUF_NDEBUG_INLINE TusUser::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusUser& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + npid_(arena, from.npid_) {} + +TusUser::TusUser( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusUser& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusUser_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusUser* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + _impl_.vuser_ = from._impl_.vuser_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusUser) +} +PROTOBUF_NDEBUG_INLINE TusUser::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + npid_(arena) {} + +inline void TusUser::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.vuser_ = {}; +} +TusUser::~TusUser() { + // @@protoc_insertion_point(destructor:np2_structs.TusUser) + SharedDtor(*this); +} +inline void TusUser::SharedDtor(MessageLite& self) { + TusUser& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.npid_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusUser::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusUser(arena); +} +constexpr auto TusUser::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(TusUser), + alignof(TusUser)); +} +constexpr auto TusUser::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<20>{ + { + &_TusUser_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusUser::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusUser::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusUser::ByteSizeLong, + &TusUser::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusUser, _impl_._cached_size_), + true, + }, + "np2_structs.TusUser", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<20> TusUser_class_data_ = + TusUser::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusUser::GetClassData() const { + return TusUser_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 0, 32, 2> +TusUser::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusUser, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + TusUser_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusUser>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // string npid = 2; + {::_pbi::TcParser::FastUS1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(TusUser, _impl_.npid_)}}, + // bool vuser = 1; + {::_pbi::TcParser::FastV8S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(TusUser, _impl_.vuser_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bool vuser = 1; + {PROTOBUF_FIELD_OFFSET(TusUser, _impl_.vuser_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // string npid = 2; + {PROTOBUF_FIELD_OFFSET(TusUser, _impl_.npid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + }}, + // no aux_entries + {{ + "\23\0\4\0\0\0\0\0" + "np2_structs.TusUser" + "npid" + }}, +}; +PROTOBUF_NOINLINE void TusUser::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusUser) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.npid_.ClearNonDefaultToEmpty(); + } + _impl_.vuser_ = false; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusUser::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusUser& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusUser::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusUser& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusUser) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bool vuser = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_vuser() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 1, this_._internal_vuser(), target); + } + } + + // string npid = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + const ::std::string& _s = this_._internal_npid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.TusUser.npid"); + target = stream->WriteStringMaybeAliased(2, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusUser) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusUser::ByteSizeLong(const MessageLite& base) { + const TusUser& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusUser::ByteSizeLong() const { + const TusUser& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusUser) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // string npid = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_npid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_npid()); + } + } + // bool vuser = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_vuser() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusUser::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusUser) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_npid().empty()) { + _this->_internal_set_npid(from._internal_npid()); + } else { + if (_this->_impl_.npid_.IsDefault()) { + _this->_internal_set_npid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_vuser() != 0) { + _this->_impl_.vuser_ = from._impl_.vuser_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusUser::CopyFrom(const TusUser& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusUser) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusUser::InternalSwap(TusUser* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.npid_, &other->_impl_.npid_, arena); + swap(_impl_.vuser_, other->_impl_.vuser_); +} + +// =================================================================== + +class TusVariable::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusVariable, _impl_._has_bits_); +}; + +TusVariable::TusVariable(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusVariable_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusVariable) +} +PROTOBUF_NDEBUG_INLINE TusVariable::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusVariable& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + ownerid_(arena, from.ownerid_), + lastchangedauthorid_(arena, from.lastchangedauthorid_) {} + +TusVariable::TusVariable( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusVariable& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusVariable_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusVariable* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, lastchangeddate_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, lastchangeddate_), + offsetof(Impl_, hasdata_) - + offsetof(Impl_, lastchangeddate_) + + sizeof(Impl_::hasdata_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusVariable) +} +PROTOBUF_NDEBUG_INLINE TusVariable::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + ownerid_(arena), + lastchangedauthorid_(arena) {} + +inline void TusVariable::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, lastchangeddate_), + 0, + offsetof(Impl_, hasdata_) - + offsetof(Impl_, lastchangeddate_) + + sizeof(Impl_::hasdata_)); +} +TusVariable::~TusVariable() { + // @@protoc_insertion_point(destructor:np2_structs.TusVariable) + SharedDtor(*this); +} +inline void TusVariable::SharedDtor(MessageLite& self) { + TusVariable& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.ownerid_.Destroy(); + this_._impl_.lastchangedauthorid_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusVariable::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusVariable(arena); +} +constexpr auto TusVariable::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(TusVariable), + alignof(TusVariable)); +} +constexpr auto TusVariable::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<24>{ + { + &_TusVariable_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusVariable::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusVariable::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusVariable::ByteSizeLong, + &TusVariable::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusVariable, _impl_._cached_size_), + true, + }, + "np2_structs.TusVariable", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<24> TusVariable_class_data_ = + TusVariable::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusVariable::GetClassData() const { + return TusVariable_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 6, 0, 58, 2> +TusVariable::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusVariable, _impl_._has_bits_), + 0, // no _extensions_ + 6, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967232, // skipmap + offsetof(decltype(_table_), field_entries), + 6, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + TusVariable_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusVariable>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // string ownerId = 1; + {::_pbi::TcParser::FastUS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.ownerid_)}}, + // bool hasData = 2; + {::_pbi::TcParser::FastV8S1, + {16, 5, 0, + PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.hasdata_)}}, + // uint64 lastChangedDate = 3; + {::_pbi::TcParser::FastV64S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.lastchangeddate_)}}, + // string lastChangedAuthorId = 4; + {::_pbi::TcParser::FastUS1, + {34, 1, 0, + PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.lastchangedauthorid_)}}, + // int64 variable = 5; + {::_pbi::TcParser::FastV64S1, + {40, 3, 0, + PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.variable_)}}, + // int64 oldVariable = 6; + {::_pbi::TcParser::FastV64S1, + {48, 4, 0, + PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.oldvariable_)}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // string ownerId = 1; + {PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.ownerid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // bool hasData = 2; + {PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.hasdata_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // uint64 lastChangedDate = 3; + {PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.lastchangeddate_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // string lastChangedAuthorId = 4; + {PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.lastchangedauthorid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // int64 variable = 5; + {PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.variable_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt64)}, + // int64 oldVariable = 6; + {PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.oldvariable_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt64)}, + }}, + // no aux_entries + {{ + "\27\7\0\0\23\0\0\0" + "np2_structs.TusVariable" + "ownerId" + "lastChangedAuthorId" + }}, +}; +PROTOBUF_NOINLINE void TusVariable::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusVariable) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.ownerid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.lastchangedauthorid_.ClearNonDefaultToEmpty(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000003cU)) { + ::memset(&_impl_.lastchangeddate_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.hasdata_) - + reinterpret_cast(&_impl_.lastchangeddate_)) + sizeof(_impl_.hasdata_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusVariable::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusVariable& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusVariable::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusVariable& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusVariable) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // string ownerId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_ownerid().empty()) { + const ::std::string& _s = this_._internal_ownerid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.TusVariable.ownerId"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + } + + // bool hasData = 2; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_hasdata() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 2, this_._internal_hasdata(), target); + } + } + + // uint64 lastChangedDate = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_lastchangeddate() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 3, this_._internal_lastchangeddate(), target); + } + } + + // string lastChangedAuthorId = 4; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_lastchangedauthorid().empty()) { + const ::std::string& _s = this_._internal_lastchangedauthorid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.TusVariable.lastChangedAuthorId"); + target = stream->WriteStringMaybeAliased(4, _s, target); + } + } + + // int64 variable = 5; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_variable() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt64ToArrayWithField<5>( + stream, this_._internal_variable(), target); + } + } + + // int64 oldVariable = 6; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_oldvariable() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt64ToArrayWithField<6>( + stream, this_._internal_oldvariable(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusVariable) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusVariable::ByteSizeLong(const MessageLite& base) { + const TusVariable& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusVariable::ByteSizeLong() const { + const TusVariable& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusVariable) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) { + // string ownerId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_ownerid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_ownerid()); + } + } + // string lastChangedAuthorId = 4; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_lastchangedauthorid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_lastchangedauthorid()); + } + } + // uint64 lastChangedDate = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_lastchangeddate() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_lastchangeddate()); + } + } + // int64 variable = 5; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_variable() != 0) { + total_size += ::_pbi::WireFormatLite::Int64SizePlusOne( + this_._internal_variable()); + } + } + // int64 oldVariable = 6; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_oldvariable() != 0) { + total_size += ::_pbi::WireFormatLite::Int64SizePlusOne( + this_._internal_oldvariable()); + } + } + // bool hasData = 2; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_hasdata() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusVariable::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusVariable) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_ownerid().empty()) { + _this->_internal_set_ownerid(from._internal_ownerid()); + } else { + if (_this->_impl_.ownerid_.IsDefault()) { + _this->_internal_set_ownerid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_lastchangedauthorid().empty()) { + _this->_internal_set_lastchangedauthorid(from._internal_lastchangedauthorid()); + } else { + if (_this->_impl_.lastchangedauthorid_.IsDefault()) { + _this->_internal_set_lastchangedauthorid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_lastchangeddate() != 0) { + _this->_impl_.lastchangeddate_ = from._impl_.lastchangeddate_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_variable() != 0) { + _this->_impl_.variable_ = from._impl_.variable_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_oldvariable() != 0) { + _this->_impl_.oldvariable_ = from._impl_.oldvariable_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (from._internal_hasdata() != 0) { + _this->_impl_.hasdata_ = from._impl_.hasdata_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusVariable::CopyFrom(const TusVariable& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusVariable) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusVariable::InternalSwap(TusVariable* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.ownerid_, &other->_impl_.ownerid_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.lastchangedauthorid_, &other->_impl_.lastchangedauthorid_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.hasdata_) + + sizeof(TusVariable::_impl_.hasdata_) + - PROTOBUF_FIELD_OFFSET(TusVariable, _impl_.lastchangeddate_)>( + reinterpret_cast(&_impl_.lastchangeddate_), + reinterpret_cast(&other->_impl_.lastchangeddate_)); +} + +// =================================================================== + +class TusVarResponse::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusVarResponse, _impl_._has_bits_); +}; + +TusVarResponse::TusVarResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusVarResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusVarResponse) +} +PROTOBUF_NDEBUG_INLINE TusVarResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusVarResponse& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + vars_{visibility, arena, from.vars_} {} + +TusVarResponse::TusVarResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusVarResponse& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusVarResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusVarResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusVarResponse) +} +PROTOBUF_NDEBUG_INLINE TusVarResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + vars_{visibility, arena} {} + +inline void TusVarResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +TusVarResponse::~TusVarResponse() { + // @@protoc_insertion_point(destructor:np2_structs.TusVarResponse) + SharedDtor(*this); +} +inline void TusVarResponse::SharedDtor(MessageLite& self) { + TusVarResponse& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusVarResponse::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusVarResponse(arena); +} +constexpr auto TusVarResponse::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusVarResponse, _impl_.vars_) + + decltype(TusVarResponse::_impl_.vars_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(TusVarResponse), alignof(TusVarResponse), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusVarResponse::PlacementNew_, + sizeof(TusVarResponse), + alignof(TusVarResponse)); + } +} +constexpr auto TusVarResponse::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<27>{ + { + &_TusVarResponse_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusVarResponse::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusVarResponse::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusVarResponse::ByteSizeLong, + &TusVarResponse::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusVarResponse, _impl_._cached_size_), + true, + }, + "np2_structs.TusVarResponse", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<27> TusVarResponse_class_data_ = + TusVarResponse::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusVarResponse::GetClassData() const { + return TusVarResponse_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 1, 0, 2> +TusVarResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusVarResponse, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusVarResponse_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusVarResponse>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.TusVariable vars = 1; + {::_pbi::TcParser::FastMtR1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(TusVarResponse, _impl_.vars_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .np2_structs.TusVariable vars = 1; + {PROTOBUF_FIELD_OFFSET(TusVarResponse, _impl_.vars_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusVariable>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusVarResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusVarResponse) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.vars_.Clear(); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusVarResponse::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusVarResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusVarResponse::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusVarResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusVarResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated .np2_structs.TusVariable vars = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_vars_size()); + i < n; i++) { + const auto& repfield = this_._internal_vars().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusVarResponse) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusVarResponse::ByteSizeLong(const MessageLite& base) { + const TusVarResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusVarResponse::ByteSizeLong() const { + const TusVarResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusVarResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + { + // repeated .np2_structs.TusVariable vars = 1; + cached_has_bits = this_._impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_vars_size(); + for (const auto& msg : this_._internal_vars()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusVarResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusVarResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_vars()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_vars()); + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusVarResponse::CopyFrom(const TusVarResponse& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusVarResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusVarResponse::InternalSwap(TusVarResponse* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.vars_.InternalSwap(&other->_impl_.vars_); +} + +// =================================================================== + +class TusSetMultiSlotVariableRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_._has_bits_); +}; + +TusSetMultiSlotVariableRequest::TusSetMultiSlotVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusSetMultiSlotVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusSetMultiSlotVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusSetMultiSlotVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusSetMultiSlotVariableRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + slotidarray_{visibility, arena, from.slotidarray_}, + _slotidarray_cached_byte_size_{0}, + variablearray_{visibility, arena, from.variablearray_}, + _variablearray_cached_byte_size_{0} {} + +TusSetMultiSlotVariableRequest::TusSetMultiSlotVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusSetMultiSlotVariableRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusSetMultiSlotVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusSetMultiSlotVariableRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.user_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusSetMultiSlotVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusSetMultiSlotVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + slotidarray_{visibility, arena}, + _slotidarray_cached_byte_size_{0}, + variablearray_{visibility, arena}, + _variablearray_cached_byte_size_{0} {} + +inline void TusSetMultiSlotVariableRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.user_ = {}; +} +TusSetMultiSlotVariableRequest::~TusSetMultiSlotVariableRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusSetMultiSlotVariableRequest) + SharedDtor(*this); +} +inline void TusSetMultiSlotVariableRequest::SharedDtor(MessageLite& self) { + TusSetMultiSlotVariableRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.user_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusSetMultiSlotVariableRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusSetMultiSlotVariableRequest(arena); +} +constexpr auto TusSetMultiSlotVariableRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_.slotidarray_) + + decltype(TusSetMultiSlotVariableRequest::_impl_.slotidarray_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_.variablearray_) + + decltype(TusSetMultiSlotVariableRequest::_impl_.variablearray_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(TusSetMultiSlotVariableRequest), alignof(TusSetMultiSlotVariableRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusSetMultiSlotVariableRequest::PlacementNew_, + sizeof(TusSetMultiSlotVariableRequest), + alignof(TusSetMultiSlotVariableRequest)); + } +} +constexpr auto TusSetMultiSlotVariableRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<43>{ + { + &_TusSetMultiSlotVariableRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusSetMultiSlotVariableRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusSetMultiSlotVariableRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusSetMultiSlotVariableRequest::ByteSizeLong, + &TusSetMultiSlotVariableRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusSetMultiSlotVariableRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<43> TusSetMultiSlotVariableRequest_class_data_ = + TusSetMultiSlotVariableRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusSetMultiSlotVariableRequest::GetClassData() const { + return TusSetMultiSlotVariableRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 1, 0, 2> +TusSetMultiSlotVariableRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusSetMultiSlotVariableRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusSetMultiSlotVariableRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.TusUser user = 1; + {::_pbi::TcParser::FastMtS1, + {10, 2, 0, + PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_.user_)}}, + // repeated int32 slotIdArray = 2; + {::_pbi::TcParser::FastV32P1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_.slotidarray_)}}, + // repeated int64 variableArray = 3; + {::_pbi::TcParser::FastV64P1, + {26, 1, 0, + PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_.variablearray_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusUser user = 1; + {PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_.user_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated int32 slotIdArray = 2; + {PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_.slotidarray_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt32)}, + // repeated int64 variableArray = 3; + {PROTOBUF_FIELD_OFFSET(TusSetMultiSlotVariableRequest, _impl_.variablearray_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt64)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusSetMultiSlotVariableRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusSetMultiSlotVariableRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.slotidarray_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.variablearray_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.user_ != nullptr); + _impl_.user_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusSetMultiSlotVariableRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusSetMultiSlotVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusSetMultiSlotVariableRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusSetMultiSlotVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusSetMultiSlotVariableRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.user_, this_._impl_.user_->GetCachedSize(), target, + stream); + } + + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + { + int byte_size = this_._impl_._slotidarray_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteInt32Packed( + 2, this_._internal_slotidarray(), byte_size, target); + } + } + } + + // repeated int64 variableArray = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + { + int byte_size = this_._impl_._variablearray_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteInt64Packed( + 3, this_._internal_variablearray(), byte_size, target); + } + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusSetMultiSlotVariableRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusSetMultiSlotVariableRequest::ByteSizeLong(const MessageLite& base) { + const TusSetMultiSlotVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusSetMultiSlotVariableRequest::ByteSizeLong() const { + const TusSetMultiSlotVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusSetMultiSlotVariableRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + ::_pbi::WireFormatLite::Int32SizeWithPackedTagSize( + this_._internal_slotidarray(), 1, + this_._impl_._slotidarray_cached_byte_size_); + } + // repeated int64 variableArray = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += + ::_pbi::WireFormatLite::Int64SizeWithPackedTagSize( + this_._internal_variablearray(), 1, + this_._impl_._variablearray_cached_byte_size_); + } + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.user_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusSetMultiSlotVariableRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusSetMultiSlotVariableRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_slotidarray()->MergeFrom(from._internal_slotidarray()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_variablearray()->MergeFrom(from._internal_variablearray()); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.user_ != nullptr); + if (_this->_impl_.user_ == nullptr) { + _this->_impl_.user_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_); + } else { + _this->_impl_.user_->MergeFrom(*from._impl_.user_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusSetMultiSlotVariableRequest::CopyFrom(const TusSetMultiSlotVariableRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusSetMultiSlotVariableRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusSetMultiSlotVariableRequest::InternalSwap(TusSetMultiSlotVariableRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.slotidarray_.InternalSwap(&other->_impl_.slotidarray_); + _impl_.variablearray_.InternalSwap(&other->_impl_.variablearray_); + swap(_impl_.user_, other->_impl_.user_); +} + +// =================================================================== + +class TusGetMultiSlotVariableRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusGetMultiSlotVariableRequest, _impl_._has_bits_); +}; + +TusGetMultiSlotVariableRequest::TusGetMultiSlotVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetMultiSlotVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusGetMultiSlotVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetMultiSlotVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusGetMultiSlotVariableRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + slotidarray_{visibility, arena, from.slotidarray_}, + _slotidarray_cached_byte_size_{0} {} + +TusGetMultiSlotVariableRequest::TusGetMultiSlotVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusGetMultiSlotVariableRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetMultiSlotVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusGetMultiSlotVariableRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.user_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusGetMultiSlotVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetMultiSlotVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + slotidarray_{visibility, arena}, + _slotidarray_cached_byte_size_{0} {} + +inline void TusGetMultiSlotVariableRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.user_ = {}; +} +TusGetMultiSlotVariableRequest::~TusGetMultiSlotVariableRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusGetMultiSlotVariableRequest) + SharedDtor(*this); +} +inline void TusGetMultiSlotVariableRequest::SharedDtor(MessageLite& self) { + TusGetMultiSlotVariableRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.user_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusGetMultiSlotVariableRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusGetMultiSlotVariableRequest(arena); +} +constexpr auto TusGetMultiSlotVariableRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotVariableRequest, _impl_.slotidarray_) + + decltype(TusGetMultiSlotVariableRequest::_impl_.slotidarray_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(TusGetMultiSlotVariableRequest), alignof(TusGetMultiSlotVariableRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusGetMultiSlotVariableRequest::PlacementNew_, + sizeof(TusGetMultiSlotVariableRequest), + alignof(TusGetMultiSlotVariableRequest)); + } +} +constexpr auto TusGetMultiSlotVariableRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<43>{ + { + &_TusGetMultiSlotVariableRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusGetMultiSlotVariableRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusGetMultiSlotVariableRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusGetMultiSlotVariableRequest::ByteSizeLong, + &TusGetMultiSlotVariableRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotVariableRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusGetMultiSlotVariableRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<43> TusGetMultiSlotVariableRequest_class_data_ = + TusGetMultiSlotVariableRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusGetMultiSlotVariableRequest::GetClassData() const { + return TusGetMultiSlotVariableRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +TusGetMultiSlotVariableRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotVariableRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusGetMultiSlotVariableRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusGetMultiSlotVariableRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated int32 slotIdArray = 2; + {::_pbi::TcParser::FastV32P1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotVariableRequest, _impl_.slotidarray_)}}, + // .np2_structs.TusUser user = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotVariableRequest, _impl_.user_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusUser user = 1; + {PROTOBUF_FIELD_OFFSET(TusGetMultiSlotVariableRequest, _impl_.user_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated int32 slotIdArray = 2; + {PROTOBUF_FIELD_OFFSET(TusGetMultiSlotVariableRequest, _impl_.slotidarray_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusGetMultiSlotVariableRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusGetMultiSlotVariableRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.slotidarray_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.user_ != nullptr); + _impl_.user_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusGetMultiSlotVariableRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusGetMultiSlotVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusGetMultiSlotVariableRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusGetMultiSlotVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusGetMultiSlotVariableRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.user_, this_._impl_.user_->GetCachedSize(), target, + stream); + } + + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + { + int byte_size = this_._impl_._slotidarray_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteInt32Packed( + 2, this_._internal_slotidarray(), byte_size, target); + } + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusGetMultiSlotVariableRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusGetMultiSlotVariableRequest::ByteSizeLong(const MessageLite& base) { + const TusGetMultiSlotVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusGetMultiSlotVariableRequest::ByteSizeLong() const { + const TusGetMultiSlotVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusGetMultiSlotVariableRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + ::_pbi::WireFormatLite::Int32SizeWithPackedTagSize( + this_._internal_slotidarray(), 1, + this_._impl_._slotidarray_cached_byte_size_); + } + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.user_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusGetMultiSlotVariableRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusGetMultiSlotVariableRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_slotidarray()->MergeFrom(from._internal_slotidarray()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.user_ != nullptr); + if (_this->_impl_.user_ == nullptr) { + _this->_impl_.user_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_); + } else { + _this->_impl_.user_->MergeFrom(*from._impl_.user_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusGetMultiSlotVariableRequest::CopyFrom(const TusGetMultiSlotVariableRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusGetMultiSlotVariableRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusGetMultiSlotVariableRequest::InternalSwap(TusGetMultiSlotVariableRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.slotidarray_.InternalSwap(&other->_impl_.slotidarray_); + swap(_impl_.user_, other->_impl_.user_); +} + +// =================================================================== + +class TusGetMultiUserVariableRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusGetMultiUserVariableRequest, _impl_._has_bits_); +}; + +TusGetMultiUserVariableRequest::TusGetMultiUserVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetMultiUserVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusGetMultiUserVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetMultiUserVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusGetMultiUserVariableRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + users_{visibility, arena, from.users_} {} + +TusGetMultiUserVariableRequest::TusGetMultiUserVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusGetMultiUserVariableRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetMultiUserVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusGetMultiUserVariableRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + _impl_.slotid_ = from._impl_.slotid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusGetMultiUserVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetMultiUserVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + users_{visibility, arena} {} + +inline void TusGetMultiUserVariableRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.slotid_ = {}; +} +TusGetMultiUserVariableRequest::~TusGetMultiUserVariableRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusGetMultiUserVariableRequest) + SharedDtor(*this); +} +inline void TusGetMultiUserVariableRequest::SharedDtor(MessageLite& self) { + TusGetMultiUserVariableRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusGetMultiUserVariableRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusGetMultiUserVariableRequest(arena); +} +constexpr auto TusGetMultiUserVariableRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusGetMultiUserVariableRequest, _impl_.users_) + + decltype(TusGetMultiUserVariableRequest::_impl_.users_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(TusGetMultiUserVariableRequest), alignof(TusGetMultiUserVariableRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusGetMultiUserVariableRequest::PlacementNew_, + sizeof(TusGetMultiUserVariableRequest), + alignof(TusGetMultiUserVariableRequest)); + } +} +constexpr auto TusGetMultiUserVariableRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<43>{ + { + &_TusGetMultiUserVariableRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusGetMultiUserVariableRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusGetMultiUserVariableRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusGetMultiUserVariableRequest::ByteSizeLong, + &TusGetMultiUserVariableRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusGetMultiUserVariableRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusGetMultiUserVariableRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<43> TusGetMultiUserVariableRequest_class_data_ = + TusGetMultiUserVariableRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusGetMultiUserVariableRequest::GetClassData() const { + return TusGetMultiUserVariableRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +TusGetMultiUserVariableRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusGetMultiUserVariableRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusGetMultiUserVariableRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusGetMultiUserVariableRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // int32 slotId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(TusGetMultiUserVariableRequest, _impl_.slotid_)}}, + // repeated .np2_structs.TusUser users = 1; + {::_pbi::TcParser::FastMtR1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(TusGetMultiUserVariableRequest, _impl_.users_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .np2_structs.TusUser users = 1; + {PROTOBUF_FIELD_OFFSET(TusGetMultiUserVariableRequest, _impl_.users_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // int32 slotId = 2; + {PROTOBUF_FIELD_OFFSET(TusGetMultiUserVariableRequest, _impl_.slotid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusGetMultiUserVariableRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusGetMultiUserVariableRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.users_.Clear(); + } + _impl_.slotid_ = 0; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusGetMultiUserVariableRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusGetMultiUserVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusGetMultiUserVariableRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusGetMultiUserVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusGetMultiUserVariableRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated .np2_structs.TusUser users = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_users_size()); + i < n; i++) { + const auto& repfield = this_._internal_users().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_slotid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_slotid(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusGetMultiUserVariableRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusGetMultiUserVariableRequest::ByteSizeLong(const MessageLite& base) { + const TusGetMultiUserVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusGetMultiUserVariableRequest::ByteSizeLong() const { + const TusGetMultiUserVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusGetMultiUserVariableRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated .np2_structs.TusUser users = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_users_size(); + for (const auto& msg : this_._internal_users()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_slotid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_slotid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusGetMultiUserVariableRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusGetMultiUserVariableRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_users()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_users()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_slotid() != 0) { + _this->_impl_.slotid_ = from._impl_.slotid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusGetMultiUserVariableRequest::CopyFrom(const TusGetMultiUserVariableRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusGetMultiUserVariableRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusGetMultiUserVariableRequest::InternalSwap(TusGetMultiUserVariableRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.users_.InternalSwap(&other->_impl_.users_); + swap(_impl_.slotid_, other->_impl_.slotid_); +} + +// =================================================================== + +class TusGetFriendsVariableRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_._has_bits_); +}; + +TusGetFriendsVariableRequest::TusGetFriendsVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetFriendsVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusGetFriendsVariableRequest) +} +TusGetFriendsVariableRequest::TusGetFriendsVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusGetFriendsVariableRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetFriendsVariableRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(from._impl_) { + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} +PROTOBUF_NDEBUG_INLINE TusGetFriendsVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void TusGetFriendsVariableRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, slotid_), + 0, + offsetof(Impl_, arraynum_) - + offsetof(Impl_, slotid_) + + sizeof(Impl_::arraynum_)); +} +TusGetFriendsVariableRequest::~TusGetFriendsVariableRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusGetFriendsVariableRequest) + SharedDtor(*this); +} +inline void TusGetFriendsVariableRequest::SharedDtor(MessageLite& self) { + TusGetFriendsVariableRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusGetFriendsVariableRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusGetFriendsVariableRequest(arena); +} +constexpr auto TusGetFriendsVariableRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(TusGetFriendsVariableRequest), + alignof(TusGetFriendsVariableRequest)); +} +constexpr auto TusGetFriendsVariableRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<41>{ + { + &_TusGetFriendsVariableRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusGetFriendsVariableRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusGetFriendsVariableRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusGetFriendsVariableRequest::ByteSizeLong, + &TusGetFriendsVariableRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusGetFriendsVariableRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<41> TusGetFriendsVariableRequest_class_data_ = + TusGetFriendsVariableRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusGetFriendsVariableRequest::GetClassData() const { + return TusGetFriendsVariableRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 0, 0, 2> +TusGetFriendsVariableRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + TusGetFriendsVariableRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusGetFriendsVariableRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // uint32 arrayNum = 4; + {::_pbi::TcParser::FastV32S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.arraynum_)}}, + // int32 slotId = 1; + {::_pbi::TcParser::FastV32S1, + {8, 0, 0, + PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.slotid_)}}, + // bool includeSelf = 2; + {::_pbi::TcParser::FastV8S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.includeself_)}}, + // int32 sortType = 3; + {::_pbi::TcParser::FastV32S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.sorttype_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // int32 slotId = 1; + {PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.slotid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // bool includeSelf = 2; + {PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.includeself_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // int32 sortType = 3; + {PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.sorttype_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // uint32 arrayNum = 4; + {PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.arraynum_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void TusGetFriendsVariableRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusGetFriendsVariableRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + ::memset(&_impl_.slotid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.arraynum_) - + reinterpret_cast(&_impl_.slotid_)) + sizeof(_impl_.arraynum_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusGetFriendsVariableRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusGetFriendsVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusGetFriendsVariableRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusGetFriendsVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusGetFriendsVariableRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // int32 slotId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_slotid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<1>( + stream, this_._internal_slotid(), target); + } + } + + // bool includeSelf = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_includeself() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 2, this_._internal_includeself(), target); + } + } + + // int32 sortType = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_sorttype() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<3>( + stream, this_._internal_sorttype(), target); + } + } + + // uint32 arrayNum = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_arraynum() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 4, this_._internal_arraynum(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusGetFriendsVariableRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusGetFriendsVariableRequest::ByteSizeLong(const MessageLite& base) { + const TusGetFriendsVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusGetFriendsVariableRequest::ByteSizeLong() const { + const TusGetFriendsVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusGetFriendsVariableRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // int32 slotId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_slotid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_slotid()); + } + } + // bool includeSelf = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_includeself() != 0) { + total_size += 2; + } + } + // int32 sortType = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_sorttype() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_sorttype()); + } + } + // uint32 arrayNum = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_arraynum() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_arraynum()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusGetFriendsVariableRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusGetFriendsVariableRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (from._internal_slotid() != 0) { + _this->_impl_.slotid_ = from._impl_.slotid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_includeself() != 0) { + _this->_impl_.includeself_ = from._impl_.includeself_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_sorttype() != 0) { + _this->_impl_.sorttype_ = from._impl_.sorttype_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_arraynum() != 0) { + _this->_impl_.arraynum_ = from._impl_.arraynum_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusGetFriendsVariableRequest::CopyFrom(const TusGetFriendsVariableRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusGetFriendsVariableRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusGetFriendsVariableRequest::InternalSwap(TusGetFriendsVariableRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.arraynum_) + + sizeof(TusGetFriendsVariableRequest::_impl_.arraynum_) + - PROTOBUF_FIELD_OFFSET(TusGetFriendsVariableRequest, _impl_.slotid_)>( + reinterpret_cast(&_impl_.slotid_), + reinterpret_cast(&other->_impl_.slotid_)); +} + +// =================================================================== + +class TusAddAndGetVariableRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_._has_bits_); +}; + +TusAddAndGetVariableRequest::TusAddAndGetVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusAddAndGetVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusAddAndGetVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusAddAndGetVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusAddAndGetVariableRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + islastchangeddate_{visibility, arena, from.islastchangeddate_}, + _islastchangeddate_cached_byte_size_{0}, + islastchangedauthorid_(arena, from.islastchangedauthorid_) {} + +TusAddAndGetVariableRequest::TusAddAndGetVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusAddAndGetVariableRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusAddAndGetVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusAddAndGetVariableRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.user_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, invariable_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, invariable_), + offsetof(Impl_, slotid_) - + offsetof(Impl_, invariable_) + + sizeof(Impl_::slotid_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusAddAndGetVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusAddAndGetVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + islastchangeddate_{visibility, arena}, + _islastchangeddate_cached_byte_size_{0}, + islastchangedauthorid_(arena) {} + +inline void TusAddAndGetVariableRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, user_), + 0, + offsetof(Impl_, slotid_) - + offsetof(Impl_, user_) + + sizeof(Impl_::slotid_)); +} +TusAddAndGetVariableRequest::~TusAddAndGetVariableRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusAddAndGetVariableRequest) + SharedDtor(*this); +} +inline void TusAddAndGetVariableRequest::SharedDtor(MessageLite& self) { + TusAddAndGetVariableRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.islastchangedauthorid_.Destroy(); + delete this_._impl_.user_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusAddAndGetVariableRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusAddAndGetVariableRequest(arena); +} +constexpr auto TusAddAndGetVariableRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.islastchangeddate_) + + decltype(TusAddAndGetVariableRequest::_impl_.islastchangeddate_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(TusAddAndGetVariableRequest), alignof(TusAddAndGetVariableRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusAddAndGetVariableRequest::PlacementNew_, + sizeof(TusAddAndGetVariableRequest), + alignof(TusAddAndGetVariableRequest)); + } +} +constexpr auto TusAddAndGetVariableRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<40>{ + { + &_TusAddAndGetVariableRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusAddAndGetVariableRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusAddAndGetVariableRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusAddAndGetVariableRequest::ByteSizeLong, + &TusAddAndGetVariableRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusAddAndGetVariableRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<40> TusAddAndGetVariableRequest_class_data_ = + TusAddAndGetVariableRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusAddAndGetVariableRequest::GetClassData() const { + return TusAddAndGetVariableRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 1, 69, 2> +TusAddAndGetVariableRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusAddAndGetVariableRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusAddAndGetVariableRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.TusUser user = 1; + {::_pbi::TcParser::FastMtS1, + {10, 2, 0, + PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.user_)}}, + // int32 slotId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 4, 0, + PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.slotid_)}}, + // int64 inVariable = 3; + {::_pbi::TcParser::FastV64S1, + {24, 3, 0, + PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.invariable_)}}, + // repeated uint64 isLastChangedDate = 4; + {::_pbi::TcParser::FastV64P1, + {34, 0, 0, + PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.islastchangeddate_)}}, + // string isLastChangedAuthorId = 5; + {::_pbi::TcParser::FastUS1, + {42, 1, 0, + PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.islastchangedauthorid_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusUser user = 1; + {PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.user_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // int32 slotId = 2; + {PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.slotid_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // int64 inVariable = 3; + {PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.invariable_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt64)}, + // repeated uint64 isLastChangedDate = 4; + {PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.islastchangeddate_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedUInt64)}, + // string isLastChangedAuthorId = 5; + {PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.islastchangedauthorid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + "\47\0\0\0\0\25\0\0" + "np2_structs.TusAddAndGetVariableRequest" + "isLastChangedAuthorId" + }}, +}; +PROTOBUF_NOINLINE void TusAddAndGetVariableRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusAddAndGetVariableRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.islastchangeddate_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.islastchangedauthorid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.user_ != nullptr); + _impl_.user_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000018U)) { + ::memset(&_impl_.invariable_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.slotid_) - + reinterpret_cast(&_impl_.invariable_)) + sizeof(_impl_.slotid_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusAddAndGetVariableRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusAddAndGetVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusAddAndGetVariableRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusAddAndGetVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusAddAndGetVariableRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.user_, this_._impl_.user_->GetCachedSize(), target, + stream); + } + + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_slotid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_slotid(), target); + } + } + + // int64 inVariable = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_invariable() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt64ToArrayWithField<3>( + stream, this_._internal_invariable(), target); + } + } + + // repeated uint64 isLastChangedDate = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + { + int byte_size = this_._impl_._islastchangeddate_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteUInt64Packed( + 4, this_._internal_islastchangeddate(), byte_size, target); + } + } + } + + // string isLastChangedAuthorId = 5; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_islastchangedauthorid().empty()) { + const ::std::string& _s = this_._internal_islastchangedauthorid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.TusAddAndGetVariableRequest.isLastChangedAuthorId"); + target = stream->WriteStringMaybeAliased(5, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusAddAndGetVariableRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusAddAndGetVariableRequest::ByteSizeLong(const MessageLite& base) { + const TusAddAndGetVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusAddAndGetVariableRequest::ByteSizeLong() const { + const TusAddAndGetVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusAddAndGetVariableRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // repeated uint64 isLastChangedDate = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + ::_pbi::WireFormatLite::UInt64SizeWithPackedTagSize( + this_._internal_islastchangeddate(), 1, + this_._impl_._islastchangeddate_cached_byte_size_); + } + // string isLastChangedAuthorId = 5; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_islastchangedauthorid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_islastchangedauthorid()); + } + } + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.user_); + } + // int64 inVariable = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_invariable() != 0) { + total_size += ::_pbi::WireFormatLite::Int64SizePlusOne( + this_._internal_invariable()); + } + } + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_slotid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_slotid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusAddAndGetVariableRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusAddAndGetVariableRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_islastchangeddate()->MergeFrom(from._internal_islastchangeddate()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_islastchangedauthorid().empty()) { + _this->_internal_set_islastchangedauthorid(from._internal_islastchangedauthorid()); + } else { + if (_this->_impl_.islastchangedauthorid_.IsDefault()) { + _this->_internal_set_islastchangedauthorid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.user_ != nullptr); + if (_this->_impl_.user_ == nullptr) { + _this->_impl_.user_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_); + } else { + _this->_impl_.user_->MergeFrom(*from._impl_.user_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_invariable() != 0) { + _this->_impl_.invariable_ = from._impl_.invariable_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_slotid() != 0) { + _this->_impl_.slotid_ = from._impl_.slotid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusAddAndGetVariableRequest::CopyFrom(const TusAddAndGetVariableRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusAddAndGetVariableRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusAddAndGetVariableRequest::InternalSwap(TusAddAndGetVariableRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.islastchangeddate_.InternalSwap(&other->_impl_.islastchangeddate_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.islastchangedauthorid_, &other->_impl_.islastchangedauthorid_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.slotid_) + + sizeof(TusAddAndGetVariableRequest::_impl_.slotid_) + - PROTOBUF_FIELD_OFFSET(TusAddAndGetVariableRequest, _impl_.user_)>( + reinterpret_cast(&_impl_.user_), + reinterpret_cast(&other->_impl_.user_)); +} + +// =================================================================== + +class TusTryAndSetVariableRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_._has_bits_); +}; + +TusTryAndSetVariableRequest::TusTryAndSetVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusTryAndSetVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusTryAndSetVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusTryAndSetVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusTryAndSetVariableRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + islastchangeddate_{visibility, arena, from.islastchangeddate_}, + _islastchangeddate_cached_byte_size_{0}, + comparevalue_{visibility, arena, from.comparevalue_}, + _comparevalue_cached_byte_size_{0}, + islastchangedauthorid_(arena, from.islastchangedauthorid_) {} + +TusTryAndSetVariableRequest::TusTryAndSetVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusTryAndSetVariableRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusTryAndSetVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusTryAndSetVariableRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.user_ = (CheckHasBit(cached_has_bits, 0x00000008U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_) + : nullptr; + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, slotid_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, slotid_), + offsetof(Impl_, variable_) - + offsetof(Impl_, slotid_) + + sizeof(Impl_::variable_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusTryAndSetVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusTryAndSetVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + islastchangeddate_{visibility, arena}, + _islastchangeddate_cached_byte_size_{0}, + comparevalue_{visibility, arena}, + _comparevalue_cached_byte_size_{0}, + islastchangedauthorid_(arena) {} + +inline void TusTryAndSetVariableRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, user_), + 0, + offsetof(Impl_, variable_) - + offsetof(Impl_, user_) + + sizeof(Impl_::variable_)); +} +TusTryAndSetVariableRequest::~TusTryAndSetVariableRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusTryAndSetVariableRequest) + SharedDtor(*this); +} +inline void TusTryAndSetVariableRequest::SharedDtor(MessageLite& self) { + TusTryAndSetVariableRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.islastchangedauthorid_.Destroy(); + delete this_._impl_.user_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusTryAndSetVariableRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusTryAndSetVariableRequest(arena); +} +constexpr auto TusTryAndSetVariableRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.islastchangeddate_) + + decltype(TusTryAndSetVariableRequest::_impl_.islastchangeddate_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.comparevalue_) + + decltype(TusTryAndSetVariableRequest::_impl_.comparevalue_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(TusTryAndSetVariableRequest), alignof(TusTryAndSetVariableRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusTryAndSetVariableRequest::PlacementNew_, + sizeof(TusTryAndSetVariableRequest), + alignof(TusTryAndSetVariableRequest)); + } +} +constexpr auto TusTryAndSetVariableRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<40>{ + { + &_TusTryAndSetVariableRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusTryAndSetVariableRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusTryAndSetVariableRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusTryAndSetVariableRequest::ByteSizeLong, + &TusTryAndSetVariableRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusTryAndSetVariableRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<40> TusTryAndSetVariableRequest_class_data_ = + TusTryAndSetVariableRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusTryAndSetVariableRequest::GetClassData() const { + return TusTryAndSetVariableRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 7, 1, 69, 2> +TusTryAndSetVariableRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_._has_bits_), + 0, // no _extensions_ + 7, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967168, // skipmap + offsetof(decltype(_table_), field_entries), + 7, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusTryAndSetVariableRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusTryAndSetVariableRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.TusUser user = 1; + {::_pbi::TcParser::FastMtS1, + {10, 3, 0, + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.user_)}}, + // int32 slotId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 4, 0, + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.slotid_)}}, + // int32 opeType = 3; + {::_pbi::TcParser::FastV32S1, + {24, 5, 0, + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.opetype_)}}, + // int64 variable = 4; + {::_pbi::TcParser::FastV64S1, + {32, 6, 0, + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.variable_)}}, + // repeated uint64 isLastChangedDate = 5; + {::_pbi::TcParser::FastV64P1, + {42, 0, 0, + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.islastchangeddate_)}}, + // string isLastChangedAuthorId = 6; + {::_pbi::TcParser::FastUS1, + {50, 2, 0, + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.islastchangedauthorid_)}}, + // repeated int64 compareValue = 7; + {::_pbi::TcParser::FastV64P1, + {58, 1, 0, + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.comparevalue_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusUser user = 1; + {PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.user_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // int32 slotId = 2; + {PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.slotid_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // int32 opeType = 3; + {PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.opetype_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // int64 variable = 4; + {PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.variable_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt64)}, + // repeated uint64 isLastChangedDate = 5; + {PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.islastchangeddate_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedUInt64)}, + // string isLastChangedAuthorId = 6; + {PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.islastchangedauthorid_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // repeated int64 compareValue = 7; + {PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.comparevalue_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt64)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + "\47\0\0\0\0\0\25\0" + "np2_structs.TusTryAndSetVariableRequest" + "isLastChangedAuthorId" + }}, +}; +PROTOBUF_NOINLINE void TusTryAndSetVariableRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusTryAndSetVariableRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.islastchangeddate_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.comparevalue_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + _impl_.islastchangedauthorid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(_impl_.user_ != nullptr); + _impl_.user_->Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000070U)) { + ::memset(&_impl_.slotid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.variable_) - + reinterpret_cast(&_impl_.slotid_)) + sizeof(_impl_.variable_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusTryAndSetVariableRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusTryAndSetVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusTryAndSetVariableRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusTryAndSetVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusTryAndSetVariableRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.user_, this_._impl_.user_->GetCachedSize(), target, + stream); + } + + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_slotid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_slotid(), target); + } + } + + // int32 opeType = 3; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_opetype() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<3>( + stream, this_._internal_opetype(), target); + } + } + + // int64 variable = 4; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_variable() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt64ToArrayWithField<4>( + stream, this_._internal_variable(), target); + } + } + + // repeated uint64 isLastChangedDate = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + { + int byte_size = this_._impl_._islastchangeddate_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteUInt64Packed( + 5, this_._internal_islastchangeddate(), byte_size, target); + } + } + } + + // string isLastChangedAuthorId = 6; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_islastchangedauthorid().empty()) { + const ::std::string& _s = this_._internal_islastchangedauthorid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.TusTryAndSetVariableRequest.isLastChangedAuthorId"); + target = stream->WriteStringMaybeAliased(6, _s, target); + } + } + + // repeated int64 compareValue = 7; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + { + int byte_size = this_._impl_._comparevalue_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteInt64Packed( + 7, this_._internal_comparevalue(), byte_size, target); + } + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusTryAndSetVariableRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusTryAndSetVariableRequest::ByteSizeLong(const MessageLite& base) { + const TusTryAndSetVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusTryAndSetVariableRequest::ByteSizeLong() const { + const TusTryAndSetVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusTryAndSetVariableRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000007fU)) { + // repeated uint64 isLastChangedDate = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + ::_pbi::WireFormatLite::UInt64SizeWithPackedTagSize( + this_._internal_islastchangeddate(), 1, + this_._impl_._islastchangeddate_cached_byte_size_); + } + // repeated int64 compareValue = 7; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += + ::_pbi::WireFormatLite::Int64SizeWithPackedTagSize( + this_._internal_comparevalue(), 1, + this_._impl_._comparevalue_cached_byte_size_); + } + // string isLastChangedAuthorId = 6; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_islastchangedauthorid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_islastchangedauthorid()); + } + } + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.user_); + } + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_slotid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_slotid()); + } + } + // int32 opeType = 3; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_opetype() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_opetype()); + } + } + // int64 variable = 4; + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (this_._internal_variable() != 0) { + total_size += ::_pbi::WireFormatLite::Int64SizePlusOne( + this_._internal_variable()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusTryAndSetVariableRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusTryAndSetVariableRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000007fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_islastchangeddate()->MergeFrom(from._internal_islastchangeddate()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_comparevalue()->MergeFrom(from._internal_comparevalue()); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!from._internal_islastchangedauthorid().empty()) { + _this->_internal_set_islastchangedauthorid(from._internal_islastchangedauthorid()); + } else { + if (_this->_impl_.islastchangedauthorid_.IsDefault()) { + _this->_internal_set_islastchangedauthorid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + ABSL_DCHECK(from._impl_.user_ != nullptr); + if (_this->_impl_.user_ == nullptr) { + _this->_impl_.user_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_); + } else { + _this->_impl_.user_->MergeFrom(*from._impl_.user_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_slotid() != 0) { + _this->_impl_.slotid_ = from._impl_.slotid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (from._internal_opetype() != 0) { + _this->_impl_.opetype_ = from._impl_.opetype_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000040U)) { + if (from._internal_variable() != 0) { + _this->_impl_.variable_ = from._impl_.variable_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusTryAndSetVariableRequest::CopyFrom(const TusTryAndSetVariableRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusTryAndSetVariableRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusTryAndSetVariableRequest::InternalSwap(TusTryAndSetVariableRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.islastchangeddate_.InternalSwap(&other->_impl_.islastchangeddate_); + _impl_.comparevalue_.InternalSwap(&other->_impl_.comparevalue_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.islastchangedauthorid_, &other->_impl_.islastchangedauthorid_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.variable_) + + sizeof(TusTryAndSetVariableRequest::_impl_.variable_) + - PROTOBUF_FIELD_OFFSET(TusTryAndSetVariableRequest, _impl_.user_)>( + reinterpret_cast(&_impl_.user_), + reinterpret_cast(&other->_impl_.user_)); +} + +// =================================================================== + +class TusDeleteMultiSlotVariableRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotVariableRequest, _impl_._has_bits_); +}; + +TusDeleteMultiSlotVariableRequest::TusDeleteMultiSlotVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusDeleteMultiSlotVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusDeleteMultiSlotVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusDeleteMultiSlotVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusDeleteMultiSlotVariableRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + slotidarray_{visibility, arena, from.slotidarray_}, + _slotidarray_cached_byte_size_{0} {} + +TusDeleteMultiSlotVariableRequest::TusDeleteMultiSlotVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusDeleteMultiSlotVariableRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusDeleteMultiSlotVariableRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusDeleteMultiSlotVariableRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.user_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusDeleteMultiSlotVariableRequest) +} +PROTOBUF_NDEBUG_INLINE TusDeleteMultiSlotVariableRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + slotidarray_{visibility, arena}, + _slotidarray_cached_byte_size_{0} {} + +inline void TusDeleteMultiSlotVariableRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.user_ = {}; +} +TusDeleteMultiSlotVariableRequest::~TusDeleteMultiSlotVariableRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusDeleteMultiSlotVariableRequest) + SharedDtor(*this); +} +inline void TusDeleteMultiSlotVariableRequest::SharedDtor(MessageLite& self) { + TusDeleteMultiSlotVariableRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.user_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusDeleteMultiSlotVariableRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusDeleteMultiSlotVariableRequest(arena); +} +constexpr auto TusDeleteMultiSlotVariableRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotVariableRequest, _impl_.slotidarray_) + + decltype(TusDeleteMultiSlotVariableRequest::_impl_.slotidarray_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(TusDeleteMultiSlotVariableRequest), alignof(TusDeleteMultiSlotVariableRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusDeleteMultiSlotVariableRequest::PlacementNew_, + sizeof(TusDeleteMultiSlotVariableRequest), + alignof(TusDeleteMultiSlotVariableRequest)); + } +} +constexpr auto TusDeleteMultiSlotVariableRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<46>{ + { + &_TusDeleteMultiSlotVariableRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusDeleteMultiSlotVariableRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusDeleteMultiSlotVariableRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusDeleteMultiSlotVariableRequest::ByteSizeLong, + &TusDeleteMultiSlotVariableRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotVariableRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusDeleteMultiSlotVariableRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<46> TusDeleteMultiSlotVariableRequest_class_data_ = + TusDeleteMultiSlotVariableRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusDeleteMultiSlotVariableRequest::GetClassData() const { + return TusDeleteMultiSlotVariableRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +TusDeleteMultiSlotVariableRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotVariableRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusDeleteMultiSlotVariableRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusDeleteMultiSlotVariableRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated int32 slotIdArray = 2; + {::_pbi::TcParser::FastV32P1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotVariableRequest, _impl_.slotidarray_)}}, + // .np2_structs.TusUser user = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotVariableRequest, _impl_.user_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusUser user = 1; + {PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotVariableRequest, _impl_.user_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated int32 slotIdArray = 2; + {PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotVariableRequest, _impl_.slotidarray_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusDeleteMultiSlotVariableRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusDeleteMultiSlotVariableRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.slotidarray_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.user_ != nullptr); + _impl_.user_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusDeleteMultiSlotVariableRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusDeleteMultiSlotVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusDeleteMultiSlotVariableRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusDeleteMultiSlotVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusDeleteMultiSlotVariableRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.user_, this_._impl_.user_->GetCachedSize(), target, + stream); + } + + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + { + int byte_size = this_._impl_._slotidarray_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteInt32Packed( + 2, this_._internal_slotidarray(), byte_size, target); + } + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusDeleteMultiSlotVariableRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusDeleteMultiSlotVariableRequest::ByteSizeLong(const MessageLite& base) { + const TusDeleteMultiSlotVariableRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusDeleteMultiSlotVariableRequest::ByteSizeLong() const { + const TusDeleteMultiSlotVariableRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusDeleteMultiSlotVariableRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + ::_pbi::WireFormatLite::Int32SizeWithPackedTagSize( + this_._internal_slotidarray(), 1, + this_._impl_._slotidarray_cached_byte_size_); + } + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.user_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusDeleteMultiSlotVariableRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusDeleteMultiSlotVariableRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_slotidarray()->MergeFrom(from._internal_slotidarray()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.user_ != nullptr); + if (_this->_impl_.user_ == nullptr) { + _this->_impl_.user_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_); + } else { + _this->_impl_.user_->MergeFrom(*from._impl_.user_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusDeleteMultiSlotVariableRequest::CopyFrom(const TusDeleteMultiSlotVariableRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusDeleteMultiSlotVariableRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusDeleteMultiSlotVariableRequest::InternalSwap(TusDeleteMultiSlotVariableRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.slotidarray_.InternalSwap(&other->_impl_.slotidarray_); + swap(_impl_.user_, other->_impl_.user_); +} + +// =================================================================== + +class TusSetDataRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_._has_bits_); +}; + +TusSetDataRequest::TusSetDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusSetDataRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusSetDataRequest) +} +PROTOBUF_NDEBUG_INLINE TusSetDataRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusSetDataRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + islastchangeddate_{visibility, arena, from.islastchangeddate_}, + _islastchangeddate_cached_byte_size_{0}, + data_(arena, from.data_), + info_(arena, from.info_), + islastchangedauthorid_(arena, from.islastchangedauthorid_) {} + +TusSetDataRequest::TusSetDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusSetDataRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusSetDataRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusSetDataRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.user_ = (CheckHasBit(cached_has_bits, 0x00000010U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_) + : nullptr; + _impl_.slotid_ = from._impl_.slotid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusSetDataRequest) +} +PROTOBUF_NDEBUG_INLINE TusSetDataRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + islastchangeddate_{visibility, arena}, + _islastchangeddate_cached_byte_size_{0}, + data_(arena), + info_(arena), + islastchangedauthorid_(arena) {} + +inline void TusSetDataRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, user_), + 0, + offsetof(Impl_, slotid_) - + offsetof(Impl_, user_) + + sizeof(Impl_::slotid_)); +} +TusSetDataRequest::~TusSetDataRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusSetDataRequest) + SharedDtor(*this); +} +inline void TusSetDataRequest::SharedDtor(MessageLite& self) { + TusSetDataRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.data_.Destroy(); + this_._impl_.info_.Destroy(); + this_._impl_.islastchangedauthorid_.Destroy(); + delete this_._impl_.user_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusSetDataRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusSetDataRequest(arena); +} +constexpr auto TusSetDataRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.islastchangeddate_) + + decltype(TusSetDataRequest::_impl_.islastchangeddate_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(TusSetDataRequest), alignof(TusSetDataRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusSetDataRequest::PlacementNew_, + sizeof(TusSetDataRequest), + alignof(TusSetDataRequest)); + } +} +constexpr auto TusSetDataRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<30>{ + { + &_TusSetDataRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusSetDataRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusSetDataRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusSetDataRequest::ByteSizeLong, + &TusSetDataRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusSetDataRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<30> TusSetDataRequest_class_data_ = + TusSetDataRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusSetDataRequest::GetClassData() const { + return TusSetDataRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 6, 1, 59, 2> +TusSetDataRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_._has_bits_), + 0, // no _extensions_ + 6, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967232, // skipmap + offsetof(decltype(_table_), field_entries), + 6, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusSetDataRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusSetDataRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.TusUser user = 1; + {::_pbi::TcParser::FastMtS1, + {10, 4, 0, + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.user_)}}, + // int32 slotId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 5, 0, + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.slotid_)}}, + // bytes data = 3; + {::_pbi::TcParser::FastBS1, + {26, 1, 0, + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.data_)}}, + // bytes info = 4; + {::_pbi::TcParser::FastBS1, + {34, 2, 0, + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.info_)}}, + // repeated uint64 isLastChangedDate = 5; + {::_pbi::TcParser::FastV64P1, + {42, 0, 0, + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.islastchangeddate_)}}, + // string isLastChangedAuthorId = 6; + {::_pbi::TcParser::FastUS1, + {50, 3, 0, + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.islastchangedauthorid_)}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusUser user = 1; + {PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.user_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // int32 slotId = 2; + {PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.slotid_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // bytes data = 3; + {PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.data_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // bytes info = 4; + {PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.info_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // repeated uint64 isLastChangedDate = 5; + {PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.islastchangeddate_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedUInt64)}, + // string isLastChangedAuthorId = 6; + {PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.islastchangedauthorid_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + "\35\0\0\0\0\0\25\0" + "np2_structs.TusSetDataRequest" + "isLastChangedAuthorId" + }}, +}; +PROTOBUF_NOINLINE void TusSetDataRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusSetDataRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.islastchangeddate_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.data_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + _impl_.info_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + _impl_.islastchangedauthorid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(_impl_.user_ != nullptr); + _impl_.user_->Clear(); + } + } + _impl_.slotid_ = 0; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusSetDataRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusSetDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusSetDataRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusSetDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusSetDataRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.user_, this_._impl_.user_->GetCachedSize(), target, + stream); + } + + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_slotid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_slotid(), target); + } + } + + // bytes data = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_data().empty()) { + const ::std::string& _s = this_._internal_data(); + target = stream->WriteBytesMaybeAliased(3, _s, target); + } + } + + // bytes info = 4; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_info().empty()) { + const ::std::string& _s = this_._internal_info(); + target = stream->WriteBytesMaybeAliased(4, _s, target); + } + } + + // repeated uint64 isLastChangedDate = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + { + int byte_size = this_._impl_._islastchangeddate_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteUInt64Packed( + 5, this_._internal_islastchangeddate(), byte_size, target); + } + } + } + + // string isLastChangedAuthorId = 6; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!this_._internal_islastchangedauthorid().empty()) { + const ::std::string& _s = this_._internal_islastchangedauthorid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.TusSetDataRequest.isLastChangedAuthorId"); + target = stream->WriteStringMaybeAliased(6, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusSetDataRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusSetDataRequest::ByteSizeLong(const MessageLite& base) { + const TusSetDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusSetDataRequest::ByteSizeLong() const { + const TusSetDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusSetDataRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) { + // repeated uint64 isLastChangedDate = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + ::_pbi::WireFormatLite::UInt64SizeWithPackedTagSize( + this_._internal_islastchangeddate(), 1, + this_._impl_._islastchangeddate_cached_byte_size_); + } + // bytes data = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_data().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_data()); + } + } + // bytes info = 4; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_info().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_info()); + } + } + // string isLastChangedAuthorId = 6; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!this_._internal_islastchangedauthorid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_islastchangedauthorid()); + } + } + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.user_); + } + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (this_._internal_slotid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_slotid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusSetDataRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusSetDataRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_islastchangeddate()->MergeFrom(from._internal_islastchangeddate()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_data().empty()) { + _this->_internal_set_data(from._internal_data()); + } else { + if (_this->_impl_.data_.IsDefault()) { + _this->_internal_set_data(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!from._internal_info().empty()) { + _this->_internal_set_info(from._internal_info()); + } else { + if (_this->_impl_.info_.IsDefault()) { + _this->_internal_set_info(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!from._internal_islastchangedauthorid().empty()) { + _this->_internal_set_islastchangedauthorid(from._internal_islastchangedauthorid()); + } else { + if (_this->_impl_.islastchangedauthorid_.IsDefault()) { + _this->_internal_set_islastchangedauthorid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + ABSL_DCHECK(from._impl_.user_ != nullptr); + if (_this->_impl_.user_ == nullptr) { + _this->_impl_.user_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_); + } else { + _this->_impl_.user_->MergeFrom(*from._impl_.user_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000020U)) { + if (from._internal_slotid() != 0) { + _this->_impl_.slotid_ = from._impl_.slotid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusSetDataRequest::CopyFrom(const TusSetDataRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusSetDataRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusSetDataRequest::InternalSwap(TusSetDataRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.islastchangeddate_.InternalSwap(&other->_impl_.islastchangeddate_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.data_, &other->_impl_.data_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.info_, &other->_impl_.info_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.islastchangedauthorid_, &other->_impl_.islastchangedauthorid_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.slotid_) + + sizeof(TusSetDataRequest::_impl_.slotid_) + - PROTOBUF_FIELD_OFFSET(TusSetDataRequest, _impl_.user_)>( + reinterpret_cast(&_impl_.user_), + reinterpret_cast(&other->_impl_.user_)); +} + +// =================================================================== + +class TusDataStatus::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_._has_bits_); +}; + +TusDataStatus::TusDataStatus(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusDataStatus_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusDataStatus) +} +PROTOBUF_NDEBUG_INLINE TusDataStatus::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusDataStatus& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + ownerid_(arena, from.ownerid_), + lastchangedauthorid_(arena, from.lastchangedauthorid_), + info_(arena, from.info_) {} + +TusDataStatus::TusDataStatus( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusDataStatus& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusDataStatus_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusDataStatus* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, lastchangeddate_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, lastchangeddate_), + offsetof(Impl_, hasdata_) - + offsetof(Impl_, lastchangeddate_) + + sizeof(Impl_::hasdata_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusDataStatus) +} +PROTOBUF_NDEBUG_INLINE TusDataStatus::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + ownerid_(arena), + lastchangedauthorid_(arena), + info_(arena) {} + +inline void TusDataStatus::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, lastchangeddate_), + 0, + offsetof(Impl_, hasdata_) - + offsetof(Impl_, lastchangeddate_) + + sizeof(Impl_::hasdata_)); +} +TusDataStatus::~TusDataStatus() { + // @@protoc_insertion_point(destructor:np2_structs.TusDataStatus) + SharedDtor(*this); +} +inline void TusDataStatus::SharedDtor(MessageLite& self) { + TusDataStatus& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.ownerid_.Destroy(); + this_._impl_.lastchangedauthorid_.Destroy(); + this_._impl_.info_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusDataStatus::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusDataStatus(arena); +} +constexpr auto TusDataStatus::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(TusDataStatus), + alignof(TusDataStatus)); +} +constexpr auto TusDataStatus::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<26>{ + { + &_TusDataStatus_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusDataStatus::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusDataStatus::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusDataStatus::ByteSizeLong, + &TusDataStatus::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_._cached_size_), + true, + }, + "np2_structs.TusDataStatus", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<26> TusDataStatus_class_data_ = + TusDataStatus::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusDataStatus::GetClassData() const { + return TusDataStatus_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 0, 60, 2> +TusDataStatus::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + TusDataStatus_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusDataStatus>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // string ownerId = 1; + {::_pbi::TcParser::FastUS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.ownerid_)}}, + // bool hasData = 2; + {::_pbi::TcParser::FastV8S1, + {16, 4, 0, + PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.hasdata_)}}, + // uint64 lastChangedDate = 3; + {::_pbi::TcParser::FastV64S1, + {24, 3, 0, + PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.lastchangeddate_)}}, + // string lastChangedAuthorId = 4; + {::_pbi::TcParser::FastUS1, + {34, 1, 0, + PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.lastchangedauthorid_)}}, + // bytes info = 5; + {::_pbi::TcParser::FastBS1, + {42, 2, 0, + PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.info_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // string ownerId = 1; + {PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.ownerid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // bool hasData = 2; + {PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.hasdata_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // uint64 lastChangedDate = 3; + {PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.lastchangeddate_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // string lastChangedAuthorId = 4; + {PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.lastchangedauthorid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // bytes info = 5; + {PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.info_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + // no aux_entries + {{ + "\31\7\0\0\23\0\0\0" + "np2_structs.TusDataStatus" + "ownerId" + "lastChangedAuthorId" + }}, +}; +PROTOBUF_NOINLINE void TusDataStatus::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusDataStatus) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.ownerid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.lastchangedauthorid_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + _impl_.info_.ClearNonDefaultToEmpty(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x00000018U)) { + ::memset(&_impl_.lastchangeddate_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.hasdata_) - + reinterpret_cast(&_impl_.lastchangeddate_)) + sizeof(_impl_.hasdata_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusDataStatus::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusDataStatus& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusDataStatus::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusDataStatus& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusDataStatus) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // string ownerId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_ownerid().empty()) { + const ::std::string& _s = this_._internal_ownerid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.TusDataStatus.ownerId"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + } + + // bool hasData = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_hasdata() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 2, this_._internal_hasdata(), target); + } + } + + // uint64 lastChangedDate = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_lastchangeddate() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 3, this_._internal_lastchangeddate(), target); + } + } + + // string lastChangedAuthorId = 4; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_lastchangedauthorid().empty()) { + const ::std::string& _s = this_._internal_lastchangedauthorid(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.TusDataStatus.lastChangedAuthorId"); + target = stream->WriteStringMaybeAliased(4, _s, target); + } + } + + // bytes info = 5; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_info().empty()) { + const ::std::string& _s = this_._internal_info(); + target = stream->WriteBytesMaybeAliased(5, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusDataStatus) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusDataStatus::ByteSizeLong(const MessageLite& base) { + const TusDataStatus& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusDataStatus::ByteSizeLong() const { + const TusDataStatus& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusDataStatus) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // string ownerId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_ownerid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_ownerid()); + } + } + // string lastChangedAuthorId = 4; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_lastchangedauthorid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_lastchangedauthorid()); + } + } + // bytes info = 5; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_info().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_info()); + } + } + // uint64 lastChangedDate = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_lastchangeddate() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_lastchangeddate()); + } + } + // bool hasData = 2; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_hasdata() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusDataStatus::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusDataStatus) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_ownerid().empty()) { + _this->_internal_set_ownerid(from._internal_ownerid()); + } else { + if (_this->_impl_.ownerid_.IsDefault()) { + _this->_internal_set_ownerid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_lastchangedauthorid().empty()) { + _this->_internal_set_lastchangedauthorid(from._internal_lastchangedauthorid()); + } else { + if (_this->_impl_.lastchangedauthorid_.IsDefault()) { + _this->_internal_set_lastchangedauthorid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!from._internal_info().empty()) { + _this->_internal_set_info(from._internal_info()); + } else { + if (_this->_impl_.info_.IsDefault()) { + _this->_internal_set_info(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_lastchangeddate() != 0) { + _this->_impl_.lastchangeddate_ = from._impl_.lastchangeddate_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_hasdata() != 0) { + _this->_impl_.hasdata_ = from._impl_.hasdata_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusDataStatus::CopyFrom(const TusDataStatus& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusDataStatus) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusDataStatus::InternalSwap(TusDataStatus* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.ownerid_, &other->_impl_.ownerid_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.lastchangedauthorid_, &other->_impl_.lastchangedauthorid_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.info_, &other->_impl_.info_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.hasdata_) + + sizeof(TusDataStatus::_impl_.hasdata_) + - PROTOBUF_FIELD_OFFSET(TusDataStatus, _impl_.lastchangeddate_)>( + reinterpret_cast(&_impl_.lastchangeddate_), + reinterpret_cast(&other->_impl_.lastchangeddate_)); +} + +// =================================================================== + +class TusData::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusData, _impl_._has_bits_); +}; + +TusData::TusData(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusData_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusData) +} +PROTOBUF_NDEBUG_INLINE TusData::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusData& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + data_(arena, from.data_) {} + +TusData::TusData( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusData& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusData_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusData* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.status_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.status_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusData) +} +PROTOBUF_NDEBUG_INLINE TusData::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + data_(arena) {} + +inline void TusData::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.status_ = {}; +} +TusData::~TusData() { + // @@protoc_insertion_point(destructor:np2_structs.TusData) + SharedDtor(*this); +} +inline void TusData::SharedDtor(MessageLite& self) { + TusData& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.data_.Destroy(); + delete this_._impl_.status_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusData::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusData(arena); +} +constexpr auto TusData::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(TusData), + alignof(TusData)); +} +constexpr auto TusData::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<20>{ + { + &_TusData_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusData::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusData::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusData::ByteSizeLong, + &TusData::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusData, _impl_._cached_size_), + true, + }, + "np2_structs.TusData", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<20> TusData_class_data_ = + TusData::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusData::GetClassData() const { + return TusData_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +TusData::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusData, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusData_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusData>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bytes data = 2; + {::_pbi::TcParser::FastBS1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(TusData, _impl_.data_)}}, + // .np2_structs.TusDataStatus status = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(TusData, _impl_.status_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusDataStatus status = 1; + {PROTOBUF_FIELD_OFFSET(TusData, _impl_.status_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // bytes data = 2; + {PROTOBUF_FIELD_OFFSET(TusData, _impl_.data_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusDataStatus>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusData::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusData) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.data_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.status_ != nullptr); + _impl_.status_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusData::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusData& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusData::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusData& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusData) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusDataStatus status = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.status_, this_._impl_.status_->GetCachedSize(), target, + stream); + } + + // bytes data = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + const ::std::string& _s = this_._internal_data(); + target = stream->WriteBytesMaybeAliased(2, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusData) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusData::ByteSizeLong(const MessageLite& base) { + const TusData& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusData::ByteSizeLong() const { + const TusData& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusData) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // bytes data = 2; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_data()); + } + } + // .np2_structs.TusDataStatus status = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.status_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusData::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusData) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_data().empty()) { + _this->_internal_set_data(from._internal_data()); + } else { + if (_this->_impl_.data_.IsDefault()) { + _this->_internal_set_data(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.status_ != nullptr); + if (_this->_impl_.status_ == nullptr) { + _this->_impl_.status_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.status_); + } else { + _this->_impl_.status_->MergeFrom(*from._impl_.status_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusData::CopyFrom(const TusData& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusData) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusData::InternalSwap(TusData* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.data_, &other->_impl_.data_, arena); + swap(_impl_.status_, other->_impl_.status_); +} + +// =================================================================== + +class TusDataStatusResponse::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusDataStatusResponse, _impl_._has_bits_); +}; + +TusDataStatusResponse::TusDataStatusResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusDataStatusResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusDataStatusResponse) +} +PROTOBUF_NDEBUG_INLINE TusDataStatusResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusDataStatusResponse& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + status_{visibility, arena, from.status_} {} + +TusDataStatusResponse::TusDataStatusResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusDataStatusResponse& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusDataStatusResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusDataStatusResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusDataStatusResponse) +} +PROTOBUF_NDEBUG_INLINE TusDataStatusResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + status_{visibility, arena} {} + +inline void TusDataStatusResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +TusDataStatusResponse::~TusDataStatusResponse() { + // @@protoc_insertion_point(destructor:np2_structs.TusDataStatusResponse) + SharedDtor(*this); +} +inline void TusDataStatusResponse::SharedDtor(MessageLite& self) { + TusDataStatusResponse& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusDataStatusResponse::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusDataStatusResponse(arena); +} +constexpr auto TusDataStatusResponse::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusDataStatusResponse, _impl_.status_) + + decltype(TusDataStatusResponse::_impl_.status_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(TusDataStatusResponse), alignof(TusDataStatusResponse), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusDataStatusResponse::PlacementNew_, + sizeof(TusDataStatusResponse), + alignof(TusDataStatusResponse)); + } +} +constexpr auto TusDataStatusResponse::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<34>{ + { + &_TusDataStatusResponse_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusDataStatusResponse::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusDataStatusResponse::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusDataStatusResponse::ByteSizeLong, + &TusDataStatusResponse::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusDataStatusResponse, _impl_._cached_size_), + true, + }, + "np2_structs.TusDataStatusResponse", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<34> TusDataStatusResponse_class_data_ = + TusDataStatusResponse::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusDataStatusResponse::GetClassData() const { + return TusDataStatusResponse_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 1, 0, 2> +TusDataStatusResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusDataStatusResponse, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusDataStatusResponse_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusDataStatusResponse>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.TusDataStatus status = 1; + {::_pbi::TcParser::FastMtR1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(TusDataStatusResponse, _impl_.status_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .np2_structs.TusDataStatus status = 1; + {PROTOBUF_FIELD_OFFSET(TusDataStatusResponse, _impl_.status_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusDataStatus>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusDataStatusResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusDataStatusResponse) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.status_.Clear(); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusDataStatusResponse::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusDataStatusResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusDataStatusResponse::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusDataStatusResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusDataStatusResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated .np2_structs.TusDataStatus status = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_status_size()); + i < n; i++) { + const auto& repfield = this_._internal_status().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusDataStatusResponse) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusDataStatusResponse::ByteSizeLong(const MessageLite& base) { + const TusDataStatusResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusDataStatusResponse::ByteSizeLong() const { + const TusDataStatusResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusDataStatusResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + { + // repeated .np2_structs.TusDataStatus status = 1; + cached_has_bits = this_._impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_status_size(); + for (const auto& msg : this_._internal_status()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusDataStatusResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusDataStatusResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_status()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_status()); + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusDataStatusResponse::CopyFrom(const TusDataStatusResponse& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusDataStatusResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusDataStatusResponse::InternalSwap(TusDataStatusResponse* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.status_.InternalSwap(&other->_impl_.status_); +} + +// =================================================================== + +class TusGetDataRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusGetDataRequest, _impl_._has_bits_); +}; + +TusGetDataRequest::TusGetDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetDataRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusGetDataRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetDataRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusGetDataRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +TusGetDataRequest::TusGetDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusGetDataRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetDataRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusGetDataRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.user_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_) + : nullptr; + _impl_.slotid_ = from._impl_.slotid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusGetDataRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetDataRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void TusGetDataRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, user_), + 0, + offsetof(Impl_, slotid_) - + offsetof(Impl_, user_) + + sizeof(Impl_::slotid_)); +} +TusGetDataRequest::~TusGetDataRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusGetDataRequest) + SharedDtor(*this); +} +inline void TusGetDataRequest::SharedDtor(MessageLite& self) { + TusGetDataRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.user_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusGetDataRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusGetDataRequest(arena); +} +constexpr auto TusGetDataRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(TusGetDataRequest), + alignof(TusGetDataRequest)); +} +constexpr auto TusGetDataRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<30>{ + { + &_TusGetDataRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusGetDataRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusGetDataRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusGetDataRequest::ByteSizeLong, + &TusGetDataRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusGetDataRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusGetDataRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<30> TusGetDataRequest_class_data_ = + TusGetDataRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusGetDataRequest::GetClassData() const { + return TusGetDataRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +TusGetDataRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusGetDataRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusGetDataRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusGetDataRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // int32 slotId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(TusGetDataRequest, _impl_.slotid_)}}, + // .np2_structs.TusUser user = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(TusGetDataRequest, _impl_.user_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusUser user = 1; + {PROTOBUF_FIELD_OFFSET(TusGetDataRequest, _impl_.user_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // int32 slotId = 2; + {PROTOBUF_FIELD_OFFSET(TusGetDataRequest, _impl_.slotid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusGetDataRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusGetDataRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.user_ != nullptr); + _impl_.user_->Clear(); + } + _impl_.slotid_ = 0; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusGetDataRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusGetDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusGetDataRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusGetDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusGetDataRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.user_, this_._impl_.user_->GetCachedSize(), target, + stream); + } + + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_slotid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_slotid(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusGetDataRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusGetDataRequest::ByteSizeLong(const MessageLite& base) { + const TusGetDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusGetDataRequest::ByteSizeLong() const { + const TusGetDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusGetDataRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.user_); + } + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_slotid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_slotid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusGetDataRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusGetDataRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.user_ != nullptr); + if (_this->_impl_.user_ == nullptr) { + _this->_impl_.user_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_); + } else { + _this->_impl_.user_->MergeFrom(*from._impl_.user_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_slotid() != 0) { + _this->_impl_.slotid_ = from._impl_.slotid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusGetDataRequest::CopyFrom(const TusGetDataRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusGetDataRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusGetDataRequest::InternalSwap(TusGetDataRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(TusGetDataRequest, _impl_.slotid_) + + sizeof(TusGetDataRequest::_impl_.slotid_) + - PROTOBUF_FIELD_OFFSET(TusGetDataRequest, _impl_.user_)>( + reinterpret_cast(&_impl_.user_), + reinterpret_cast(&other->_impl_.user_)); +} + +// =================================================================== + +class TusGetMultiSlotDataStatusRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusGetMultiSlotDataStatusRequest, _impl_._has_bits_); +}; + +TusGetMultiSlotDataStatusRequest::TusGetMultiSlotDataStatusRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetMultiSlotDataStatusRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusGetMultiSlotDataStatusRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetMultiSlotDataStatusRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusGetMultiSlotDataStatusRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + slotidarray_{visibility, arena, from.slotidarray_}, + _slotidarray_cached_byte_size_{0} {} + +TusGetMultiSlotDataStatusRequest::TusGetMultiSlotDataStatusRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusGetMultiSlotDataStatusRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetMultiSlotDataStatusRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusGetMultiSlotDataStatusRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.user_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusGetMultiSlotDataStatusRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetMultiSlotDataStatusRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + slotidarray_{visibility, arena}, + _slotidarray_cached_byte_size_{0} {} + +inline void TusGetMultiSlotDataStatusRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.user_ = {}; +} +TusGetMultiSlotDataStatusRequest::~TusGetMultiSlotDataStatusRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusGetMultiSlotDataStatusRequest) + SharedDtor(*this); +} +inline void TusGetMultiSlotDataStatusRequest::SharedDtor(MessageLite& self) { + TusGetMultiSlotDataStatusRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.user_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusGetMultiSlotDataStatusRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusGetMultiSlotDataStatusRequest(arena); +} +constexpr auto TusGetMultiSlotDataStatusRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotDataStatusRequest, _impl_.slotidarray_) + + decltype(TusGetMultiSlotDataStatusRequest::_impl_.slotidarray_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(TusGetMultiSlotDataStatusRequest), alignof(TusGetMultiSlotDataStatusRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusGetMultiSlotDataStatusRequest::PlacementNew_, + sizeof(TusGetMultiSlotDataStatusRequest), + alignof(TusGetMultiSlotDataStatusRequest)); + } +} +constexpr auto TusGetMultiSlotDataStatusRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<45>{ + { + &_TusGetMultiSlotDataStatusRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusGetMultiSlotDataStatusRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusGetMultiSlotDataStatusRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusGetMultiSlotDataStatusRequest::ByteSizeLong, + &TusGetMultiSlotDataStatusRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotDataStatusRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusGetMultiSlotDataStatusRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<45> TusGetMultiSlotDataStatusRequest_class_data_ = + TusGetMultiSlotDataStatusRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusGetMultiSlotDataStatusRequest::GetClassData() const { + return TusGetMultiSlotDataStatusRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +TusGetMultiSlotDataStatusRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotDataStatusRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusGetMultiSlotDataStatusRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusGetMultiSlotDataStatusRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated int32 slotIdArray = 2; + {::_pbi::TcParser::FastV32P1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotDataStatusRequest, _impl_.slotidarray_)}}, + // .np2_structs.TusUser user = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(TusGetMultiSlotDataStatusRequest, _impl_.user_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusUser user = 1; + {PROTOBUF_FIELD_OFFSET(TusGetMultiSlotDataStatusRequest, _impl_.user_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated int32 slotIdArray = 2; + {PROTOBUF_FIELD_OFFSET(TusGetMultiSlotDataStatusRequest, _impl_.slotidarray_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusGetMultiSlotDataStatusRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusGetMultiSlotDataStatusRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.slotidarray_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.user_ != nullptr); + _impl_.user_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusGetMultiSlotDataStatusRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusGetMultiSlotDataStatusRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusGetMultiSlotDataStatusRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusGetMultiSlotDataStatusRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusGetMultiSlotDataStatusRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.user_, this_._impl_.user_->GetCachedSize(), target, + stream); + } + + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + { + int byte_size = this_._impl_._slotidarray_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteInt32Packed( + 2, this_._internal_slotidarray(), byte_size, target); + } + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusGetMultiSlotDataStatusRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusGetMultiSlotDataStatusRequest::ByteSizeLong(const MessageLite& base) { + const TusGetMultiSlotDataStatusRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusGetMultiSlotDataStatusRequest::ByteSizeLong() const { + const TusGetMultiSlotDataStatusRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusGetMultiSlotDataStatusRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + ::_pbi::WireFormatLite::Int32SizeWithPackedTagSize( + this_._internal_slotidarray(), 1, + this_._impl_._slotidarray_cached_byte_size_); + } + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.user_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusGetMultiSlotDataStatusRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusGetMultiSlotDataStatusRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_slotidarray()->MergeFrom(from._internal_slotidarray()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.user_ != nullptr); + if (_this->_impl_.user_ == nullptr) { + _this->_impl_.user_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_); + } else { + _this->_impl_.user_->MergeFrom(*from._impl_.user_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusGetMultiSlotDataStatusRequest::CopyFrom(const TusGetMultiSlotDataStatusRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusGetMultiSlotDataStatusRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusGetMultiSlotDataStatusRequest::InternalSwap(TusGetMultiSlotDataStatusRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.slotidarray_.InternalSwap(&other->_impl_.slotidarray_); + swap(_impl_.user_, other->_impl_.user_); +} + +// =================================================================== + +class TusGetMultiUserDataStatusRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusGetMultiUserDataStatusRequest, _impl_._has_bits_); +}; + +TusGetMultiUserDataStatusRequest::TusGetMultiUserDataStatusRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetMultiUserDataStatusRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusGetMultiUserDataStatusRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetMultiUserDataStatusRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusGetMultiUserDataStatusRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + users_{visibility, arena, from.users_} {} + +TusGetMultiUserDataStatusRequest::TusGetMultiUserDataStatusRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusGetMultiUserDataStatusRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetMultiUserDataStatusRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusGetMultiUserDataStatusRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + _impl_.slotid_ = from._impl_.slotid_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusGetMultiUserDataStatusRequest) +} +PROTOBUF_NDEBUG_INLINE TusGetMultiUserDataStatusRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + users_{visibility, arena} {} + +inline void TusGetMultiUserDataStatusRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.slotid_ = {}; +} +TusGetMultiUserDataStatusRequest::~TusGetMultiUserDataStatusRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusGetMultiUserDataStatusRequest) + SharedDtor(*this); +} +inline void TusGetMultiUserDataStatusRequest::SharedDtor(MessageLite& self) { + TusGetMultiUserDataStatusRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusGetMultiUserDataStatusRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusGetMultiUserDataStatusRequest(arena); +} +constexpr auto TusGetMultiUserDataStatusRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusGetMultiUserDataStatusRequest, _impl_.users_) + + decltype(TusGetMultiUserDataStatusRequest::_impl_.users_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(TusGetMultiUserDataStatusRequest), alignof(TusGetMultiUserDataStatusRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusGetMultiUserDataStatusRequest::PlacementNew_, + sizeof(TusGetMultiUserDataStatusRequest), + alignof(TusGetMultiUserDataStatusRequest)); + } +} +constexpr auto TusGetMultiUserDataStatusRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<45>{ + { + &_TusGetMultiUserDataStatusRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusGetMultiUserDataStatusRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusGetMultiUserDataStatusRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusGetMultiUserDataStatusRequest::ByteSizeLong, + &TusGetMultiUserDataStatusRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusGetMultiUserDataStatusRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusGetMultiUserDataStatusRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<45> TusGetMultiUserDataStatusRequest_class_data_ = + TusGetMultiUserDataStatusRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusGetMultiUserDataStatusRequest::GetClassData() const { + return TusGetMultiUserDataStatusRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +TusGetMultiUserDataStatusRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusGetMultiUserDataStatusRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusGetMultiUserDataStatusRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusGetMultiUserDataStatusRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // int32 slotId = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(TusGetMultiUserDataStatusRequest, _impl_.slotid_)}}, + // repeated .np2_structs.TusUser users = 1; + {::_pbi::TcParser::FastMtR1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(TusGetMultiUserDataStatusRequest, _impl_.users_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .np2_structs.TusUser users = 1; + {PROTOBUF_FIELD_OFFSET(TusGetMultiUserDataStatusRequest, _impl_.users_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // int32 slotId = 2; + {PROTOBUF_FIELD_OFFSET(TusGetMultiUserDataStatusRequest, _impl_.slotid_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusGetMultiUserDataStatusRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusGetMultiUserDataStatusRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.users_.Clear(); + } + _impl_.slotid_ = 0; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusGetMultiUserDataStatusRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusGetMultiUserDataStatusRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusGetMultiUserDataStatusRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusGetMultiUserDataStatusRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusGetMultiUserDataStatusRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated .np2_structs.TusUser users = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_users_size()); + i < n; i++) { + const auto& repfield = this_._internal_users().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_slotid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>( + stream, this_._internal_slotid(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusGetMultiUserDataStatusRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusGetMultiUserDataStatusRequest::ByteSizeLong(const MessageLite& base) { + const TusGetMultiUserDataStatusRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusGetMultiUserDataStatusRequest::ByteSizeLong() const { + const TusGetMultiUserDataStatusRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusGetMultiUserDataStatusRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated .np2_structs.TusUser users = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_users_size(); + for (const auto& msg : this_._internal_users()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // int32 slotId = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_slotid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_slotid()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusGetMultiUserDataStatusRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusGetMultiUserDataStatusRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_users()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_users()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_slotid() != 0) { + _this->_impl_.slotid_ = from._impl_.slotid_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusGetMultiUserDataStatusRequest::CopyFrom(const TusGetMultiUserDataStatusRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusGetMultiUserDataStatusRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusGetMultiUserDataStatusRequest::InternalSwap(TusGetMultiUserDataStatusRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.users_.InternalSwap(&other->_impl_.users_); + swap(_impl_.slotid_, other->_impl_.slotid_); +} + +// =================================================================== + +class TusGetFriendsDataStatusRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_._has_bits_); +}; + +TusGetFriendsDataStatusRequest::TusGetFriendsDataStatusRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetFriendsDataStatusRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusGetFriendsDataStatusRequest) +} +TusGetFriendsDataStatusRequest::TusGetFriendsDataStatusRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusGetFriendsDataStatusRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusGetFriendsDataStatusRequest_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(from._impl_) { + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} +PROTOBUF_NDEBUG_INLINE TusGetFriendsDataStatusRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void TusGetFriendsDataStatusRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, slotid_), + 0, + offsetof(Impl_, arraynum_) - + offsetof(Impl_, slotid_) + + sizeof(Impl_::arraynum_)); +} +TusGetFriendsDataStatusRequest::~TusGetFriendsDataStatusRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusGetFriendsDataStatusRequest) + SharedDtor(*this); +} +inline void TusGetFriendsDataStatusRequest::SharedDtor(MessageLite& self) { + TusGetFriendsDataStatusRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusGetFriendsDataStatusRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusGetFriendsDataStatusRequest(arena); +} +constexpr auto TusGetFriendsDataStatusRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(TusGetFriendsDataStatusRequest), + alignof(TusGetFriendsDataStatusRequest)); +} +constexpr auto TusGetFriendsDataStatusRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<43>{ + { + &_TusGetFriendsDataStatusRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusGetFriendsDataStatusRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusGetFriendsDataStatusRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusGetFriendsDataStatusRequest::ByteSizeLong, + &TusGetFriendsDataStatusRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusGetFriendsDataStatusRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<43> TusGetFriendsDataStatusRequest_class_data_ = + TusGetFriendsDataStatusRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusGetFriendsDataStatusRequest::GetClassData() const { + return TusGetFriendsDataStatusRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 0, 0, 2> +TusGetFriendsDataStatusRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + TusGetFriendsDataStatusRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusGetFriendsDataStatusRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // uint32 arrayNum = 4; + {::_pbi::TcParser::FastV32S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.arraynum_)}}, + // int32 slotId = 1; + {::_pbi::TcParser::FastV32S1, + {8, 0, 0, + PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.slotid_)}}, + // bool includeSelf = 2; + {::_pbi::TcParser::FastV8S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.includeself_)}}, + // int32 sortType = 3; + {::_pbi::TcParser::FastV32S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.sorttype_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // int32 slotId = 1; + {PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.slotid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // bool includeSelf = 2; + {PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.includeself_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // int32 sortType = 3; + {PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.sorttype_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, + // uint32 arrayNum = 4; + {PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.arraynum_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void TusGetFriendsDataStatusRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusGetFriendsDataStatusRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + ::memset(&_impl_.slotid_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.arraynum_) - + reinterpret_cast(&_impl_.slotid_)) + sizeof(_impl_.arraynum_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusGetFriendsDataStatusRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusGetFriendsDataStatusRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusGetFriendsDataStatusRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusGetFriendsDataStatusRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusGetFriendsDataStatusRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // int32 slotId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_slotid() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<1>( + stream, this_._internal_slotid(), target); + } + } + + // bool includeSelf = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_includeself() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 2, this_._internal_includeself(), target); + } + } + + // int32 sortType = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_sorttype() != 0) { + target = + ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<3>( + stream, this_._internal_sorttype(), target); + } + } + + // uint32 arrayNum = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_arraynum() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 4, this_._internal_arraynum(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusGetFriendsDataStatusRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusGetFriendsDataStatusRequest::ByteSizeLong(const MessageLite& base) { + const TusGetFriendsDataStatusRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusGetFriendsDataStatusRequest::ByteSizeLong() const { + const TusGetFriendsDataStatusRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusGetFriendsDataStatusRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // int32 slotId = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_slotid() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_slotid()); + } + } + // bool includeSelf = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_includeself() != 0) { + total_size += 2; + } + } + // int32 sortType = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_sorttype() != 0) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( + this_._internal_sorttype()); + } + } + // uint32 arrayNum = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_arraynum() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_arraynum()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusGetFriendsDataStatusRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusGetFriendsDataStatusRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (from._internal_slotid() != 0) { + _this->_impl_.slotid_ = from._impl_.slotid_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_includeself() != 0) { + _this->_impl_.includeself_ = from._impl_.includeself_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_sorttype() != 0) { + _this->_impl_.sorttype_ = from._impl_.sorttype_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_arraynum() != 0) { + _this->_impl_.arraynum_ = from._impl_.arraynum_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusGetFriendsDataStatusRequest::CopyFrom(const TusGetFriendsDataStatusRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusGetFriendsDataStatusRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusGetFriendsDataStatusRequest::InternalSwap(TusGetFriendsDataStatusRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.arraynum_) + + sizeof(TusGetFriendsDataStatusRequest::_impl_.arraynum_) + - PROTOBUF_FIELD_OFFSET(TusGetFriendsDataStatusRequest, _impl_.slotid_)>( + reinterpret_cast(&_impl_.slotid_), + reinterpret_cast(&other->_impl_.slotid_)); +} + +// =================================================================== + +class TusDeleteMultiSlotDataRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotDataRequest, _impl_._has_bits_); +}; + +TusDeleteMultiSlotDataRequest::TusDeleteMultiSlotDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusDeleteMultiSlotDataRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.TusDeleteMultiSlotDataRequest) +} +PROTOBUF_NDEBUG_INLINE TusDeleteMultiSlotDataRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::TusDeleteMultiSlotDataRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + slotidarray_{visibility, arena, from.slotidarray_}, + _slotidarray_cached_byte_size_{0} {} + +TusDeleteMultiSlotDataRequest::TusDeleteMultiSlotDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const TusDeleteMultiSlotDataRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, TusDeleteMultiSlotDataRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + TusDeleteMultiSlotDataRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.user_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.TusDeleteMultiSlotDataRequest) +} +PROTOBUF_NDEBUG_INLINE TusDeleteMultiSlotDataRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + slotidarray_{visibility, arena}, + _slotidarray_cached_byte_size_{0} {} + +inline void TusDeleteMultiSlotDataRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.user_ = {}; +} +TusDeleteMultiSlotDataRequest::~TusDeleteMultiSlotDataRequest() { + // @@protoc_insertion_point(destructor:np2_structs.TusDeleteMultiSlotDataRequest) + SharedDtor(*this); +} +inline void TusDeleteMultiSlotDataRequest::SharedDtor(MessageLite& self) { + TusDeleteMultiSlotDataRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.user_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL TusDeleteMultiSlotDataRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) TusDeleteMultiSlotDataRequest(arena); +} +constexpr auto TusDeleteMultiSlotDataRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotDataRequest, _impl_.slotidarray_) + + decltype(TusDeleteMultiSlotDataRequest::_impl_.slotidarray_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(TusDeleteMultiSlotDataRequest), alignof(TusDeleteMultiSlotDataRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&TusDeleteMultiSlotDataRequest::PlacementNew_, + sizeof(TusDeleteMultiSlotDataRequest), + alignof(TusDeleteMultiSlotDataRequest)); + } +} +constexpr auto TusDeleteMultiSlotDataRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<42>{ + { + &_TusDeleteMultiSlotDataRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &TusDeleteMultiSlotDataRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &TusDeleteMultiSlotDataRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &TusDeleteMultiSlotDataRequest::ByteSizeLong, + &TusDeleteMultiSlotDataRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotDataRequest, _impl_._cached_size_), + true, + }, + "np2_structs.TusDeleteMultiSlotDataRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<42> TusDeleteMultiSlotDataRequest_class_data_ = + TusDeleteMultiSlotDataRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +TusDeleteMultiSlotDataRequest::GetClassData() const { + return TusDeleteMultiSlotDataRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +TusDeleteMultiSlotDataRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotDataRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + TusDeleteMultiSlotDataRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::TusDeleteMultiSlotDataRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated int32 slotIdArray = 2; + {::_pbi::TcParser::FastV32P1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotDataRequest, _impl_.slotidarray_)}}, + // .np2_structs.TusUser user = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotDataRequest, _impl_.user_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.TusUser user = 1; + {PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotDataRequest, _impl_.user_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated int32 slotIdArray = 2; + {PROTOBUF_FIELD_OFFSET(TusDeleteMultiSlotDataRequest, _impl_.slotidarray_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::TusUser>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void TusDeleteMultiSlotDataRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.TusDeleteMultiSlotDataRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.slotidarray_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.user_ != nullptr); + _impl_.user_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL TusDeleteMultiSlotDataRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const TusDeleteMultiSlotDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL TusDeleteMultiSlotDataRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const TusDeleteMultiSlotDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.TusDeleteMultiSlotDataRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.user_, this_._impl_.user_->GetCachedSize(), target, + stream); + } + + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + { + int byte_size = this_._impl_._slotidarray_cached_byte_size_.Get(); + if (byte_size > 0) { + target = stream->WriteInt32Packed( + 2, this_._internal_slotidarray(), byte_size, target); + } + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.TusDeleteMultiSlotDataRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t TusDeleteMultiSlotDataRequest::ByteSizeLong(const MessageLite& base) { + const TusDeleteMultiSlotDataRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t TusDeleteMultiSlotDataRequest::ByteSizeLong() const { + const TusDeleteMultiSlotDataRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.TusDeleteMultiSlotDataRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated int32 slotIdArray = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += + ::_pbi::WireFormatLite::Int32SizeWithPackedTagSize( + this_._internal_slotidarray(), 1, + this_._impl_._slotidarray_cached_byte_size_); + } + // .np2_structs.TusUser user = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.user_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void TusDeleteMultiSlotDataRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.TusDeleteMultiSlotDataRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_slotidarray()->MergeFrom(from._internal_slotidarray()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.user_ != nullptr); + if (_this->_impl_.user_ == nullptr) { + _this->_impl_.user_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.user_); + } else { + _this->_impl_.user_->MergeFrom(*from._impl_.user_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void TusDeleteMultiSlotDataRequest::CopyFrom(const TusDeleteMultiSlotDataRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.TusDeleteMultiSlotDataRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void TusDeleteMultiSlotDataRequest::InternalSwap(TusDeleteMultiSlotDataRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.slotidarray_.InternalSwap(&other->_impl_.slotidarray_); + swap(_impl_.user_, other->_impl_.user_); +} + +// =================================================================== + +class SetPresenceRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_._has_bits_); +}; + +SetPresenceRequest::SetPresenceRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetPresenceRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SetPresenceRequest) +} +PROTOBUF_NDEBUG_INLINE SetPresenceRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SetPresenceRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + title_(arena, from.title_), + status_(arena, from.status_), + comment_(arena, from.comment_), + data_(arena, from.data_) {} + +SetPresenceRequest::SetPresenceRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SetPresenceRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetPresenceRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SetPresenceRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.SetPresenceRequest) +} +PROTOBUF_NDEBUG_INLINE SetPresenceRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + title_(arena), + status_(arena), + comment_(arena), + data_(arena) {} + +inline void SetPresenceRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +SetPresenceRequest::~SetPresenceRequest() { + // @@protoc_insertion_point(destructor:np2_structs.SetPresenceRequest) + SharedDtor(*this); +} +inline void SetPresenceRequest::SharedDtor(MessageLite& self) { + SetPresenceRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.title_.Destroy(); + this_._impl_.status_.Destroy(); + this_._impl_.comment_.Destroy(); + this_._impl_.data_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SetPresenceRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SetPresenceRequest(arena); +} +constexpr auto SetPresenceRequest::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(SetPresenceRequest), + alignof(SetPresenceRequest)); +} +constexpr auto SetPresenceRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<31>{ + { + &_SetPresenceRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SetPresenceRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SetPresenceRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SetPresenceRequest::ByteSizeLong, + &SetPresenceRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_._cached_size_), + true, + }, + "np2_structs.SetPresenceRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<31> SetPresenceRequest_class_data_ = + SetPresenceRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SetPresenceRequest::GetClassData() const { + return SetPresenceRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 0, 57, 2> +SetPresenceRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + SetPresenceRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SetPresenceRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bytes data = 4; + {::_pbi::TcParser::FastBS1, + {34, 3, 0, + PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_.data_)}}, + // string title = 1; + {::_pbi::TcParser::FastUS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_.title_)}}, + // string status = 2; + {::_pbi::TcParser::FastUS1, + {18, 1, 0, + PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_.status_)}}, + // string comment = 3; + {::_pbi::TcParser::FastUS1, + {26, 2, 0, + PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_.comment_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // string title = 1; + {PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_.title_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // string status = 2; + {PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_.status_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // string comment = 3; + {PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_.comment_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // bytes data = 4; + {PROTOBUF_FIELD_OFFSET(SetPresenceRequest, _impl_.data_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + // no aux_entries + {{ + "\36\5\6\7\0\0\0\0" + "np2_structs.SetPresenceRequest" + "title" + "status" + "comment" + }}, +}; +PROTOBUF_NOINLINE void SetPresenceRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SetPresenceRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.title_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.status_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + _impl_.comment_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + _impl_.data_.ClearNonDefaultToEmpty(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SetPresenceRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SetPresenceRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SetPresenceRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SetPresenceRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SetPresenceRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // string title = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_title().empty()) { + const ::std::string& _s = this_._internal_title(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.SetPresenceRequest.title"); + target = stream->WriteStringMaybeAliased(1, _s, target); + } + } + + // string status = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_status().empty()) { + const ::std::string& _s = this_._internal_status(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.SetPresenceRequest.status"); + target = stream->WriteStringMaybeAliased(2, _s, target); + } + } + + // string comment = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_comment().empty()) { + const ::std::string& _s = this_._internal_comment(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.SetPresenceRequest.comment"); + target = stream->WriteStringMaybeAliased(3, _s, target); + } + } + + // bytes data = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!this_._internal_data().empty()) { + const ::std::string& _s = this_._internal_data(); + target = stream->WriteBytesMaybeAliased(4, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SetPresenceRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SetPresenceRequest::ByteSizeLong(const MessageLite& base) { + const SetPresenceRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SetPresenceRequest::ByteSizeLong() const { + const SetPresenceRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SetPresenceRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // string title = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_title().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_title()); + } + } + // string status = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_status().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_status()); + } + } + // string comment = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_comment().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_comment()); + } + } + // bytes data = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!this_._internal_data().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_data()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SetPresenceRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SetPresenceRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_title().empty()) { + _this->_internal_set_title(from._internal_title()); + } else { + if (_this->_impl_.title_.IsDefault()) { + _this->_internal_set_title(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_status().empty()) { + _this->_internal_set_status(from._internal_status()); + } else { + if (_this->_impl_.status_.IsDefault()) { + _this->_internal_set_status(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!from._internal_comment().empty()) { + _this->_internal_set_comment(from._internal_comment()); + } else { + if (_this->_impl_.comment_.IsDefault()) { + _this->_internal_set_comment(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!from._internal_data().empty()) { + _this->_internal_set_data(from._internal_data()); + } else { + if (_this->_impl_.data_.IsDefault()) { + _this->_internal_set_data(""); + } + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SetPresenceRequest::CopyFrom(const SetPresenceRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SetPresenceRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SetPresenceRequest::InternalSwap(SetPresenceRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.title_, &other->_impl_.title_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.status_, &other->_impl_.status_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.comment_, &other->_impl_.comment_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.data_, &other->_impl_.data_, arena); +} + +// =================================================================== + +class MatchingSearchCondition::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_._has_bits_); +}; + +MatchingSearchCondition::MatchingSearchCondition(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingSearchCondition_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.MatchingSearchCondition) +} +MatchingSearchCondition::MatchingSearchCondition( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MatchingSearchCondition& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingSearchCondition_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(from._impl_) { + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} +PROTOBUF_NDEBUG_INLINE MatchingSearchCondition::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void MatchingSearchCondition::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, attr_type_), + 0, + offsetof(Impl_, comp_value_) - + offsetof(Impl_, attr_type_) + + sizeof(Impl_::comp_value_)); +} +MatchingSearchCondition::~MatchingSearchCondition() { + // @@protoc_insertion_point(destructor:np2_structs.MatchingSearchCondition) + SharedDtor(*this); +} +inline void MatchingSearchCondition::SharedDtor(MessageLite& self) { + MatchingSearchCondition& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL MatchingSearchCondition::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) MatchingSearchCondition(arena); +} +constexpr auto MatchingSearchCondition::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(MatchingSearchCondition), + alignof(MatchingSearchCondition)); +} +constexpr auto MatchingSearchCondition::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<36>{ + { + &_MatchingSearchCondition_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &MatchingSearchCondition::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &MatchingSearchCondition::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &MatchingSearchCondition::ByteSizeLong, + &MatchingSearchCondition::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_._cached_size_), + true, + }, + "np2_structs.MatchingSearchCondition", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<36> MatchingSearchCondition_class_data_ = + MatchingSearchCondition::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +MatchingSearchCondition::GetClassData() const { + return MatchingSearchCondition_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 0, 0, 2> +MatchingSearchCondition::_table_ = { + { + PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + MatchingSearchCondition_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::MatchingSearchCondition>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // uint32 comp_value = 4; + {::_pbi::TcParser::FastV32S1, + {32, 3, 0, + PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.comp_value_)}}, + // uint32 attr_type = 1; + {::_pbi::TcParser::FastV32S1, + {8, 0, 0, + PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.attr_type_)}}, + // uint32 attr_id = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.attr_id_)}}, + // uint32 comp_op = 3; + {::_pbi::TcParser::FastV32S1, + {24, 2, 0, + PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.comp_op_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 attr_type = 1; + {PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.attr_type_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 attr_id = 2; + {PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.attr_id_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 comp_op = 3; + {PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.comp_op_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 comp_value = 4; + {PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.comp_value_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void MatchingSearchCondition::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.MatchingSearchCondition) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + ::memset(&_impl_.attr_type_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.comp_value_) - + reinterpret_cast(&_impl_.attr_type_)) + sizeof(_impl_.comp_value_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL MatchingSearchCondition::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const MatchingSearchCondition& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL MatchingSearchCondition::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const MatchingSearchCondition& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.MatchingSearchCondition) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 attr_type = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_attr_type() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_attr_type(), target); + } + } + + // uint32 attr_id = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_attr_id() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_attr_id(), target); + } + } + + // uint32 comp_op = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_comp_op() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 3, this_._internal_comp_op(), target); + } + } + + // uint32 comp_value = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_comp_value() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 4, this_._internal_comp_value(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.MatchingSearchCondition) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t MatchingSearchCondition::ByteSizeLong(const MessageLite& base) { + const MatchingSearchCondition& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t MatchingSearchCondition::ByteSizeLong() const { + const MatchingSearchCondition& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.MatchingSearchCondition) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // uint32 attr_type = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (this_._internal_attr_type() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_attr_type()); + } + } + // uint32 attr_id = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_attr_id() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_attr_id()); + } + } + // uint32 comp_op = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_comp_op() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_comp_op()); + } + } + // uint32 comp_value = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_comp_value() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_comp_value()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void MatchingSearchCondition::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.MatchingSearchCondition) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (from._internal_attr_type() != 0) { + _this->_impl_.attr_type_ = from._impl_.attr_type_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_attr_id() != 0) { + _this->_impl_.attr_id_ = from._impl_.attr_id_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_comp_op() != 0) { + _this->_impl_.comp_op_ = from._impl_.comp_op_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_comp_value() != 0) { + _this->_impl_.comp_value_ = from._impl_.comp_value_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void MatchingSearchCondition::CopyFrom(const MatchingSearchCondition& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.MatchingSearchCondition) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void MatchingSearchCondition::InternalSwap(MatchingSearchCondition* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.comp_value_) + + sizeof(MatchingSearchCondition::_impl_.comp_value_) + - PROTOBUF_FIELD_OFFSET(MatchingSearchCondition, _impl_.attr_type_)>( + reinterpret_cast(&_impl_.attr_type_), + reinterpret_cast(&other->_impl_.attr_type_)); +} + +// =================================================================== + +class MatchingAttr::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_._has_bits_); +}; + +MatchingAttr::MatchingAttr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingAttr_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.MatchingAttr) +} +PROTOBUF_NDEBUG_INLINE MatchingAttr::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::MatchingAttr& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + data_(arena, from.data_) {} + +MatchingAttr::MatchingAttr( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const MatchingAttr& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingAttr_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + MatchingAttr* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, attr_type_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, attr_type_), + offsetof(Impl_, num_) - + offsetof(Impl_, attr_type_) + + sizeof(Impl_::num_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.MatchingAttr) +} +PROTOBUF_NDEBUG_INLINE MatchingAttr::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + data_(arena) {} + +inline void MatchingAttr::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, attr_type_), + 0, + offsetof(Impl_, num_) - + offsetof(Impl_, attr_type_) + + sizeof(Impl_::num_)); +} +MatchingAttr::~MatchingAttr() { + // @@protoc_insertion_point(destructor:np2_structs.MatchingAttr) + SharedDtor(*this); +} +inline void MatchingAttr::SharedDtor(MessageLite& self) { + MatchingAttr& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.data_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL MatchingAttr::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) MatchingAttr(arena); +} +constexpr auto MatchingAttr::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(MatchingAttr), + alignof(MatchingAttr)); +} +constexpr auto MatchingAttr::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<25>{ + { + &_MatchingAttr_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &MatchingAttr::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &MatchingAttr::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &MatchingAttr::ByteSizeLong, + &MatchingAttr::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_._cached_size_), + true, + }, + "np2_structs.MatchingAttr", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<25> MatchingAttr_class_data_ = + MatchingAttr::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +MatchingAttr::GetClassData() const { + return MatchingAttr_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 0, 0, 2> +MatchingAttr::_table_ = { + { + PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + MatchingAttr_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::MatchingAttr>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bytes data = 4; + {::_pbi::TcParser::FastBS1, + {34, 0, 0, + PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.data_)}}, + // uint32 attr_type = 1; + {::_pbi::TcParser::FastV32S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.attr_type_)}}, + // uint32 attr_id = 2; + {::_pbi::TcParser::FastV32S1, + {16, 2, 0, + PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.attr_id_)}}, + // uint32 num = 3; + {::_pbi::TcParser::FastV32S1, + {24, 3, 0, + PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.num_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 attr_type = 1; + {PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.attr_type_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 attr_id = 2; + {PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.attr_id_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 num = 3; + {PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.num_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // bytes data = 4; + {PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.data_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void MatchingAttr::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.MatchingAttr) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.data_.ClearNonDefaultToEmpty(); + } + if (BatchCheckHasBit(cached_has_bits, 0x0000000eU)) { + ::memset(&_impl_.attr_type_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.num_) - + reinterpret_cast(&_impl_.attr_type_)) + sizeof(_impl_.num_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL MatchingAttr::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const MatchingAttr& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL MatchingAttr::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const MatchingAttr& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.MatchingAttr) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 attr_type = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_attr_type() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_attr_type(), target); + } + } + + // uint32 attr_id = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_attr_id() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_attr_id(), target); + } + } + + // uint32 num = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_num() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 3, this_._internal_num(), target); + } + } + + // bytes data = 4; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + const ::std::string& _s = this_._internal_data(); + target = stream->WriteBytesMaybeAliased(4, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.MatchingAttr) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t MatchingAttr::ByteSizeLong(const MessageLite& base) { + const MatchingAttr& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t MatchingAttr::ByteSizeLong() const { + const MatchingAttr& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.MatchingAttr) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // bytes data = 4; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_data().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_data()); + } + } + // uint32 attr_type = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_attr_type() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_attr_type()); + } + } + // uint32 attr_id = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_attr_id() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_attr_id()); + } + } + // uint32 num = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_num() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_num()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void MatchingAttr::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.MatchingAttr) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_data().empty()) { + _this->_internal_set_data(from._internal_data()); + } else { + if (_this->_impl_.data_.IsDefault()) { + _this->_internal_set_data(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_attr_type() != 0) { + _this->_impl_.attr_type_ = from._impl_.attr_type_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_attr_id() != 0) { + _this->_impl_.attr_id_ = from._impl_.attr_id_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_num() != 0) { + _this->_impl_.num_ = from._impl_.num_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void MatchingAttr::CopyFrom(const MatchingAttr& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.MatchingAttr) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void MatchingAttr::InternalSwap(MatchingAttr* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.data_, &other->_impl_.data_, arena); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.num_) + + sizeof(MatchingAttr::_impl_.num_) + - PROTOBUF_FIELD_OFFSET(MatchingAttr, _impl_.attr_type_)>( + reinterpret_cast(&_impl_.attr_type_), + reinterpret_cast(&other->_impl_.attr_type_)); +} + +// =================================================================== + +class CreateRoomGUIRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_._has_bits_); +}; + +CreateRoomGUIRequest::CreateRoomGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, CreateRoomGUIRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.CreateRoomGUIRequest) +} +PROTOBUF_NDEBUG_INLINE CreateRoomGUIRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::CreateRoomGUIRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + game_attrs_{visibility, arena, from.game_attrs_} {} + +CreateRoomGUIRequest::CreateRoomGUIRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const CreateRoomGUIRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, CreateRoomGUIRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + CreateRoomGUIRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, total_slots_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, total_slots_), + offsetof(Impl_, stealth_) - + offsetof(Impl_, total_slots_) + + sizeof(Impl_::stealth_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.CreateRoomGUIRequest) +} +PROTOBUF_NDEBUG_INLINE CreateRoomGUIRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + game_attrs_{visibility, arena} {} + +inline void CreateRoomGUIRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, total_slots_), + 0, + offsetof(Impl_, stealth_) - + offsetof(Impl_, total_slots_) + + sizeof(Impl_::stealth_)); +} +CreateRoomGUIRequest::~CreateRoomGUIRequest() { + // @@protoc_insertion_point(destructor:np2_structs.CreateRoomGUIRequest) + SharedDtor(*this); +} +inline void CreateRoomGUIRequest::SharedDtor(MessageLite& self) { + CreateRoomGUIRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL CreateRoomGUIRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) CreateRoomGUIRequest(arena); +} +constexpr auto CreateRoomGUIRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.game_attrs_) + + decltype(CreateRoomGUIRequest::_impl_.game_attrs_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(CreateRoomGUIRequest), alignof(CreateRoomGUIRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&CreateRoomGUIRequest::PlacementNew_, + sizeof(CreateRoomGUIRequest), + alignof(CreateRoomGUIRequest)); + } +} +constexpr auto CreateRoomGUIRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<33>{ + { + &_CreateRoomGUIRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &CreateRoomGUIRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &CreateRoomGUIRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &CreateRoomGUIRequest::ByteSizeLong, + &CreateRoomGUIRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_._cached_size_), + true, + }, + "np2_structs.CreateRoomGUIRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<33> CreateRoomGUIRequest_class_data_ = + CreateRoomGUIRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +CreateRoomGUIRequest::GetClassData() const { + return CreateRoomGUIRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<3, 5, 1, 0, 2> +CreateRoomGUIRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_._has_bits_), + 0, // no _extensions_ + 5, 56, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967264, // skipmap + offsetof(decltype(_table_), field_entries), + 5, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + CreateRoomGUIRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::CreateRoomGUIRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 total_slots = 1; + {::_pbi::TcParser::FastV32S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.total_slots_)}}, + // uint32 private_slots = 2; + {::_pbi::TcParser::FastV32S1, + {16, 2, 0, + PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.private_slots_)}}, + // bool privilege_grant = 3; + {::_pbi::TcParser::FastV8S1, + {24, 3, 0, + PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.privilege_grant_)}}, + // bool stealth = 4; + {::_pbi::TcParser::FastV8S1, + {32, 4, 0, + PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.stealth_)}}, + // repeated .np2_structs.MatchingAttr game_attrs = 5; + {::_pbi::TcParser::FastMtR1, + {42, 0, 0, + PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.game_attrs_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 total_slots = 1; + {PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.total_slots_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 private_slots = 2; + {PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.private_slots_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // bool privilege_grant = 3; + {PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.privilege_grant_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // bool stealth = 4; + {PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.stealth_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + // repeated .np2_structs.MatchingAttr game_attrs = 5; + {PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.game_attrs_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::MatchingAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void CreateRoomGUIRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.CreateRoomGUIRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.game_attrs_.Clear(); + } + if (BatchCheckHasBit(cached_has_bits, 0x0000001eU)) { + ::memset(&_impl_.total_slots_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.stealth_) - + reinterpret_cast(&_impl_.total_slots_)) + sizeof(_impl_.stealth_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL CreateRoomGUIRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const CreateRoomGUIRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL CreateRoomGUIRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const CreateRoomGUIRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.CreateRoomGUIRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 total_slots = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_total_slots() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_total_slots(), target); + } + } + + // uint32 private_slots = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_private_slots() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_private_slots(), target); + } + } + + // bool privilege_grant = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_privilege_grant() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 3, this_._internal_privilege_grant(), target); + } + } + + // bool stealth = 4; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_stealth() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 4, this_._internal_stealth(), target); + } + } + + // repeated .np2_structs.MatchingAttr game_attrs = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_game_attrs_size()); + i < n; i++) { + const auto& repfield = this_._internal_game_attrs().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 5, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.CreateRoomGUIRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t CreateRoomGUIRequest::ByteSizeLong(const MessageLite& base) { + const CreateRoomGUIRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t CreateRoomGUIRequest::ByteSizeLong() const { + const CreateRoomGUIRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.CreateRoomGUIRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + // repeated .np2_structs.MatchingAttr game_attrs = 5; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_game_attrs_size(); + for (const auto& msg : this_._internal_game_attrs()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint32 total_slots = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_total_slots() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_total_slots()); + } + } + // uint32 private_slots = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_private_slots() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_private_slots()); + } + } + // bool privilege_grant = 3; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_privilege_grant() != 0) { + total_size += 2; + } + } + // bool stealth = 4; + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (this_._internal_stealth() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void CreateRoomGUIRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.CreateRoomGUIRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_game_attrs()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_game_attrs()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_total_slots() != 0) { + _this->_impl_.total_slots_ = from._impl_.total_slots_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_private_slots() != 0) { + _this->_impl_.private_slots_ = from._impl_.private_slots_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_privilege_grant() != 0) { + _this->_impl_.privilege_grant_ = from._impl_.privilege_grant_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000010U)) { + if (from._internal_stealth() != 0) { + _this->_impl_.stealth_ = from._impl_.stealth_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void CreateRoomGUIRequest::CopyFrom(const CreateRoomGUIRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.CreateRoomGUIRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void CreateRoomGUIRequest::InternalSwap(CreateRoomGUIRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.game_attrs_.InternalSwap(&other->_impl_.game_attrs_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.stealth_) + + sizeof(CreateRoomGUIRequest::_impl_.stealth_) + - PROTOBUF_FIELD_OFFSET(CreateRoomGUIRequest, _impl_.total_slots_)>( + reinterpret_cast(&_impl_.total_slots_), + reinterpret_cast(&other->_impl_.total_slots_)); +} + +// =================================================================== + +class GUIUserInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GUIUserInfo, _impl_._has_bits_); +}; + +GUIUserInfo::GUIUserInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GUIUserInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GUIUserInfo) +} +PROTOBUF_NDEBUG_INLINE GUIUserInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GUIUserInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +GUIUserInfo::GUIUserInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GUIUserInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GUIUserInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GUIUserInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.info_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.info_) + : nullptr; + _impl_.owner_ = from._impl_.owner_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.GUIUserInfo) +} +PROTOBUF_NDEBUG_INLINE GUIUserInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void GUIUserInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, info_), + 0, + offsetof(Impl_, owner_) - + offsetof(Impl_, info_) + + sizeof(Impl_::owner_)); +} +GUIUserInfo::~GUIUserInfo() { + // @@protoc_insertion_point(destructor:np2_structs.GUIUserInfo) + SharedDtor(*this); +} +inline void GUIUserInfo::SharedDtor(MessageLite& self) { + GUIUserInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.info_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GUIUserInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GUIUserInfo(arena); +} +constexpr auto GUIUserInfo::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(GUIUserInfo), + alignof(GUIUserInfo)); +} +constexpr auto GUIUserInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<24>{ + { + &_GUIUserInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GUIUserInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GUIUserInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GUIUserInfo::ByteSizeLong, + &GUIUserInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GUIUserInfo, _impl_._cached_size_), + true, + }, + "np2_structs.GUIUserInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<24> GUIUserInfo_class_data_ = + GUIUserInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GUIUserInfo::GetClassData() const { + return GUIUserInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +GUIUserInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GUIUserInfo, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GUIUserInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GUIUserInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bool owner = 2; + {::_pbi::TcParser::FastV8S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(GUIUserInfo, _impl_.owner_)}}, + // .np2_structs.UserInfo info = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(GUIUserInfo, _impl_.info_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.UserInfo info = 1; + {PROTOBUF_FIELD_OFFSET(GUIUserInfo, _impl_.info_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // bool owner = 2; + {PROTOBUF_FIELD_OFFSET(GUIUserInfo, _impl_.owner_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::UserInfo>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void GUIUserInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GUIUserInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.info_ != nullptr); + _impl_.info_->Clear(); + } + _impl_.owner_ = false; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GUIUserInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GUIUserInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GUIUserInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GUIUserInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GUIUserInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.UserInfo info = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.info_, this_._impl_.info_->GetCachedSize(), target, + stream); + } + + // bool owner = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_owner() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 2, this_._internal_owner(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GUIUserInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GUIUserInfo::ByteSizeLong(const MessageLite& base) { + const GUIUserInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GUIUserInfo::ByteSizeLong() const { + const GUIUserInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GUIUserInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.UserInfo info = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.info_); + } + // bool owner = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_owner() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GUIUserInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GUIUserInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.info_ != nullptr); + if (_this->_impl_.info_ == nullptr) { + _this->_impl_.info_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.info_); + } else { + _this->_impl_.info_->MergeFrom(*from._impl_.info_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_owner() != 0) { + _this->_impl_.owner_ = from._impl_.owner_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GUIUserInfo::CopyFrom(const GUIUserInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GUIUserInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GUIUserInfo::InternalSwap(GUIUserInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GUIUserInfo, _impl_.owner_) + + sizeof(GUIUserInfo::_impl_.owner_) + - PROTOBUF_FIELD_OFFSET(GUIUserInfo, _impl_.info_)>( + reinterpret_cast(&_impl_.info_), + reinterpret_cast(&other->_impl_.info_)); +} + +// =================================================================== + +class MatchingRoomStatus::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_._has_bits_); +}; + +MatchingRoomStatus::MatchingRoomStatus(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingRoomStatus_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.MatchingRoomStatus) +} +PROTOBUF_NDEBUG_INLINE MatchingRoomStatus::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::MatchingRoomStatus& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + members_{visibility, arena, from.members_}, + id_(arena, from.id_), + kick_actor_(arena, from.kick_actor_), + opt_(arena, from.opt_) {} + +MatchingRoomStatus::MatchingRoomStatus( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const MatchingRoomStatus& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingRoomStatus_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + MatchingRoomStatus* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.MatchingRoomStatus) +} +PROTOBUF_NDEBUG_INLINE MatchingRoomStatus::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + members_{visibility, arena}, + id_(arena), + kick_actor_(arena), + opt_(arena) {} + +inline void MatchingRoomStatus::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +MatchingRoomStatus::~MatchingRoomStatus() { + // @@protoc_insertion_point(destructor:np2_structs.MatchingRoomStatus) + SharedDtor(*this); +} +inline void MatchingRoomStatus::SharedDtor(MessageLite& self) { + MatchingRoomStatus& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.id_.Destroy(); + this_._impl_.kick_actor_.Destroy(); + this_._impl_.opt_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL MatchingRoomStatus::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) MatchingRoomStatus(arena); +} +constexpr auto MatchingRoomStatus::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_.members_) + + decltype(MatchingRoomStatus::_impl_.members_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(MatchingRoomStatus), alignof(MatchingRoomStatus), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&MatchingRoomStatus::PlacementNew_, + sizeof(MatchingRoomStatus), + alignof(MatchingRoomStatus)); + } +} +constexpr auto MatchingRoomStatus::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<31>{ + { + &_MatchingRoomStatus_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &MatchingRoomStatus::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &MatchingRoomStatus::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &MatchingRoomStatus::ByteSizeLong, + &MatchingRoomStatus::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_._cached_size_), + true, + }, + "np2_structs.MatchingRoomStatus", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<31> MatchingRoomStatus_class_data_ = + MatchingRoomStatus::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +MatchingRoomStatus::GetClassData() const { + return MatchingRoomStatus_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 1, 49, 2> +MatchingRoomStatus::_table_ = { + { + PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + MatchingRoomStatus_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::MatchingRoomStatus>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bytes opt = 4; + {::_pbi::TcParser::FastBS1, + {34, 3, 0, + PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_.opt_)}}, + // bytes id = 1; + {::_pbi::TcParser::FastBS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_.id_)}}, + // repeated .np2_structs.GUIUserInfo members = 2; + {::_pbi::TcParser::FastMtR1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_.members_)}}, + // string kick_actor = 3; + {::_pbi::TcParser::FastUS1, + {26, 2, 0, + PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_.kick_actor_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bytes id = 1; + {PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_.id_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // repeated .np2_structs.GUIUserInfo members = 2; + {PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_.members_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // string kick_actor = 3; + {PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_.kick_actor_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, + // bytes opt = 4; + {PROTOBUF_FIELD_OFFSET(MatchingRoomStatus, _impl_.opt_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::GUIUserInfo>()}, + }}, + {{ + "\36\0\0\12\0\0\0\0" + "np2_structs.MatchingRoomStatus" + "kick_actor" + }}, +}; +PROTOBUF_NOINLINE void MatchingRoomStatus::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.MatchingRoomStatus) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.members_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.id_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + _impl_.kick_actor_.ClearNonDefaultToEmpty(); + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + _impl_.opt_.ClearNonDefaultToEmpty(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL MatchingRoomStatus::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const MatchingRoomStatus& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL MatchingRoomStatus::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const MatchingRoomStatus& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.MatchingRoomStatus) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bytes id = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_id().empty()) { + const ::std::string& _s = this_._internal_id(); + target = stream->WriteBytesMaybeAliased(1, _s, target); + } + } + + // repeated .np2_structs.GUIUserInfo members = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_members_size()); + i < n; i++) { + const auto& repfield = this_._internal_members().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // string kick_actor = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_kick_actor().empty()) { + const ::std::string& _s = this_._internal_kick_actor(); + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "np2_structs.MatchingRoomStatus.kick_actor"); + target = stream->WriteStringMaybeAliased(3, _s, target); + } + } + + // bytes opt = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!this_._internal_opt().empty()) { + const ::std::string& _s = this_._internal_opt(); + target = stream->WriteBytesMaybeAliased(4, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.MatchingRoomStatus) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t MatchingRoomStatus::ByteSizeLong(const MessageLite& base) { + const MatchingRoomStatus& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t MatchingRoomStatus::ByteSizeLong() const { + const MatchingRoomStatus& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.MatchingRoomStatus) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // repeated .np2_structs.GUIUserInfo members = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_members_size(); + for (const auto& msg : this_._internal_members()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // bytes id = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_id().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_id()); + } + } + // string kick_actor = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!this_._internal_kick_actor().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( + this_._internal_kick_actor()); + } + } + // bytes opt = 4; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!this_._internal_opt().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_opt()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void MatchingRoomStatus::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.MatchingRoomStatus) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_members()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_members()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_id().empty()) { + _this->_internal_set_id(from._internal_id()); + } else { + if (_this->_impl_.id_.IsDefault()) { + _this->_internal_set_id(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (!from._internal_kick_actor().empty()) { + _this->_internal_set_kick_actor(from._internal_kick_actor()); + } else { + if (_this->_impl_.kick_actor_.IsDefault()) { + _this->_internal_set_kick_actor(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (!from._internal_opt().empty()) { + _this->_internal_set_opt(from._internal_opt()); + } else { + if (_this->_impl_.opt_.IsDefault()) { + _this->_internal_set_opt(""); + } + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void MatchingRoomStatus::CopyFrom(const MatchingRoomStatus& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.MatchingRoomStatus) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void MatchingRoomStatus::InternalSwap(MatchingRoomStatus* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.members_.InternalSwap(&other->_impl_.members_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.id_, &other->_impl_.id_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.kick_actor_, &other->_impl_.kick_actor_, arena); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.opt_, &other->_impl_.opt_, arena); +} + +// =================================================================== + +class GetRoomListGUIRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_._has_bits_); +}; + +GetRoomListGUIRequest::GetRoomListGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomListGUIRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetRoomListGUIRequest) +} +PROTOBUF_NDEBUG_INLINE GetRoomListGUIRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetRoomListGUIRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + conds_{visibility, arena, from.conds_}, + attrs_{visibility, arena, from.attrs_} {} + +GetRoomListGUIRequest::GetRoomListGUIRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetRoomListGUIRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomListGUIRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetRoomListGUIRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, range_start_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, range_start_), + offsetof(Impl_, range_max_) - + offsetof(Impl_, range_start_) + + sizeof(Impl_::range_max_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetRoomListGUIRequest) +} +PROTOBUF_NDEBUG_INLINE GetRoomListGUIRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + conds_{visibility, arena}, + attrs_{visibility, arena} {} + +inline void GetRoomListGUIRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, range_start_), + 0, + offsetof(Impl_, range_max_) - + offsetof(Impl_, range_start_) + + sizeof(Impl_::range_max_)); +} +GetRoomListGUIRequest::~GetRoomListGUIRequest() { + // @@protoc_insertion_point(destructor:np2_structs.GetRoomListGUIRequest) + SharedDtor(*this); +} +inline void GetRoomListGUIRequest::SharedDtor(MessageLite& self) { + GetRoomListGUIRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetRoomListGUIRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetRoomListGUIRequest(arena); +} +constexpr auto GetRoomListGUIRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.conds_) + + decltype(GetRoomListGUIRequest::_impl_.conds_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.attrs_) + + decltype(GetRoomListGUIRequest::_impl_.attrs_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(GetRoomListGUIRequest), alignof(GetRoomListGUIRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&GetRoomListGUIRequest::PlacementNew_, + sizeof(GetRoomListGUIRequest), + alignof(GetRoomListGUIRequest)); + } +} +constexpr auto GetRoomListGUIRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<34>{ + { + &_GetRoomListGUIRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetRoomListGUIRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetRoomListGUIRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetRoomListGUIRequest::ByteSizeLong, + &GetRoomListGUIRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_._cached_size_), + true, + }, + "np2_structs.GetRoomListGUIRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<34> GetRoomListGUIRequest_class_data_ = + GetRoomListGUIRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetRoomListGUIRequest::GetClassData() const { + return GetRoomListGUIRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 4, 2, 0, 2> +GetRoomListGUIRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_._has_bits_), + 0, // no _extensions_ + 4, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967280, // skipmap + offsetof(decltype(_table_), field_entries), + 4, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GetRoomListGUIRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetRoomListGUIRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.MatchingAttr attrs = 4; + {::_pbi::TcParser::FastMtR1, + {34, 1, 1, + PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.attrs_)}}, + // uint32 range_start = 1; + {::_pbi::TcParser::FastV32S1, + {8, 2, 0, + PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.range_start_)}}, + // uint32 range_max = 2; + {::_pbi::TcParser::FastV32S1, + {16, 3, 0, + PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.range_max_)}}, + // repeated .np2_structs.MatchingSearchCondition conds = 3; + {::_pbi::TcParser::FastMtR1, + {26, 0, 0, + PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.conds_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 range_start = 1; + {PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.range_start_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 range_max = 2; + {PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.range_max_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.MatchingSearchCondition conds = 3; + {PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.conds_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.MatchingAttr attrs = 4; + {PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.attrs_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::MatchingSearchCondition>()}, + {::_pbi::TcParser::GetTable<::np2_structs::MatchingAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void GetRoomListGUIRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetRoomListGUIRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.conds_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.attrs_.Clear(); + } + } + if (BatchCheckHasBit(cached_has_bits, 0x0000000cU)) { + ::memset(&_impl_.range_start_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.range_max_) - + reinterpret_cast(&_impl_.range_start_)) + sizeof(_impl_.range_max_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetRoomListGUIRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetRoomListGUIRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetRoomListGUIRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetRoomListGUIRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetRoomListGUIRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 range_start = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_range_start() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_range_start(), target); + } + } + + // uint32 range_max = 2; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_range_max() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_range_max(), target); + } + } + + // repeated .np2_structs.MatchingSearchCondition conds = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_conds_size()); + i < n; i++) { + const auto& repfield = this_._internal_conds().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.MatchingAttr attrs = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_attrs_size()); + i < n; i++) { + const auto& repfield = this_._internal_attrs().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 4, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetRoomListGUIRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetRoomListGUIRequest::ByteSizeLong(const MessageLite& base) { + const GetRoomListGUIRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetRoomListGUIRequest::ByteSizeLong() const { + const GetRoomListGUIRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetRoomListGUIRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + // repeated .np2_structs.MatchingSearchCondition conds = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_conds_size(); + for (const auto& msg : this_._internal_conds()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.MatchingAttr attrs = 4; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += 1UL * this_._internal_attrs_size(); + for (const auto& msg : this_._internal_attrs()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint32 range_start = 1; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_range_start() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_range_start()); + } + } + // uint32 range_max = 2; + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (this_._internal_range_max() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_range_max()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetRoomListGUIRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetRoomListGUIRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_conds()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_conds()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_attrs()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_attrs()); + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_range_start() != 0) { + _this->_impl_.range_start_ = from._impl_.range_start_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000008U)) { + if (from._internal_range_max() != 0) { + _this->_impl_.range_max_ = from._impl_.range_max_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetRoomListGUIRequest::CopyFrom(const GetRoomListGUIRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetRoomListGUIRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetRoomListGUIRequest::InternalSwap(GetRoomListGUIRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.conds_.InternalSwap(&other->_impl_.conds_); + _impl_.attrs_.InternalSwap(&other->_impl_.attrs_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.range_max_) + + sizeof(GetRoomListGUIRequest::_impl_.range_max_) + - PROTOBUF_FIELD_OFFSET(GetRoomListGUIRequest, _impl_.range_start_)>( + reinterpret_cast(&_impl_.range_start_), + reinterpret_cast(&other->_impl_.range_start_)); +} + +// =================================================================== + +class MatchingRoom::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MatchingRoom, _impl_._has_bits_); +}; + +MatchingRoom::MatchingRoom(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingRoom_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.MatchingRoom) +} +PROTOBUF_NDEBUG_INLINE MatchingRoom::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::MatchingRoom& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + attr_{visibility, arena, from.attr_}, + id_(arena, from.id_) {} + +MatchingRoom::MatchingRoom( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const MatchingRoom& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingRoom_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + MatchingRoom* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.MatchingRoom) +} +PROTOBUF_NDEBUG_INLINE MatchingRoom::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + attr_{visibility, arena}, + id_(arena) {} + +inline void MatchingRoom::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +MatchingRoom::~MatchingRoom() { + // @@protoc_insertion_point(destructor:np2_structs.MatchingRoom) + SharedDtor(*this); +} +inline void MatchingRoom::SharedDtor(MessageLite& self) { + MatchingRoom& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.id_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL MatchingRoom::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) MatchingRoom(arena); +} +constexpr auto MatchingRoom::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(MatchingRoom, _impl_.attr_) + + decltype(MatchingRoom::_impl_.attr_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::CopyInit( + sizeof(MatchingRoom), alignof(MatchingRoom), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&MatchingRoom::PlacementNew_, + sizeof(MatchingRoom), + alignof(MatchingRoom)); + } +} +constexpr auto MatchingRoom::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<25>{ + { + &_MatchingRoom_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &MatchingRoom::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &MatchingRoom::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &MatchingRoom::ByteSizeLong, + &MatchingRoom::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(MatchingRoom, _impl_._cached_size_), + true, + }, + "np2_structs.MatchingRoom", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<25> MatchingRoom_class_data_ = + MatchingRoom::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +MatchingRoom::GetClassData() const { + return MatchingRoom_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +MatchingRoom::_table_ = { + { + PROTOBUF_FIELD_OFFSET(MatchingRoom, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + MatchingRoom_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::MatchingRoom>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.MatchingAttr attr = 2; + {::_pbi::TcParser::FastMtR1, + {18, 0, 0, + PROTOBUF_FIELD_OFFSET(MatchingRoom, _impl_.attr_)}}, + // bytes id = 1; + {::_pbi::TcParser::FastBS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(MatchingRoom, _impl_.id_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bytes id = 1; + {PROTOBUF_FIELD_OFFSET(MatchingRoom, _impl_.id_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // repeated .np2_structs.MatchingAttr attr = 2; + {PROTOBUF_FIELD_OFFSET(MatchingRoom, _impl_.attr_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::MatchingAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void MatchingRoom::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.MatchingRoom) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.attr_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + _impl_.id_.ClearNonDefaultToEmpty(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL MatchingRoom::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const MatchingRoom& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL MatchingRoom::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const MatchingRoom& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.MatchingRoom) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bytes id = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_id().empty()) { + const ::std::string& _s = this_._internal_id(); + target = stream->WriteBytesMaybeAliased(1, _s, target); + } + } + + // repeated .np2_structs.MatchingAttr attr = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_attr_size()); + i < n; i++) { + const auto& repfield = this_._internal_attr().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.MatchingRoom) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t MatchingRoom::ByteSizeLong(const MessageLite& base) { + const MatchingRoom& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t MatchingRoom::ByteSizeLong() const { + const MatchingRoom& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.MatchingRoom) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated .np2_structs.MatchingAttr attr = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_attr_size(); + for (const auto& msg : this_._internal_attr()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // bytes id = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!this_._internal_id().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_id()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void MatchingRoom::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.MatchingRoom) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_attr()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_attr()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (!from._internal_id().empty()) { + _this->_internal_set_id(from._internal_id()); + } else { + if (_this->_impl_.id_.IsDefault()) { + _this->_internal_set_id(""); + } + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void MatchingRoom::CopyFrom(const MatchingRoom& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.MatchingRoom) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void MatchingRoom::InternalSwap(MatchingRoom* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.attr_.InternalSwap(&other->_impl_.attr_); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.id_, &other->_impl_.id_, arena); +} + +// =================================================================== + +class MatchingRoomList::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_._has_bits_); +}; + +MatchingRoomList::MatchingRoomList(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingRoomList_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.MatchingRoomList) +} +PROTOBUF_NDEBUG_INLINE MatchingRoomList::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::MatchingRoomList& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + rooms_{visibility, arena, from.rooms_} {} + +MatchingRoomList::MatchingRoomList( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const MatchingRoomList& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingRoomList_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + MatchingRoomList* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::memcpy(reinterpret_cast(&_impl_) + + offsetof(Impl_, start_), + reinterpret_cast(&from._impl_) + + offsetof(Impl_, start_), + offsetof(Impl_, total_) - + offsetof(Impl_, start_) + + sizeof(Impl_::total_)); + + // @@protoc_insertion_point(copy_constructor:np2_structs.MatchingRoomList) +} +PROTOBUF_NDEBUG_INLINE MatchingRoomList::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + rooms_{visibility, arena} {} + +inline void MatchingRoomList::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, start_), + 0, + offsetof(Impl_, total_) - + offsetof(Impl_, start_) + + sizeof(Impl_::total_)); +} +MatchingRoomList::~MatchingRoomList() { + // @@protoc_insertion_point(destructor:np2_structs.MatchingRoomList) + SharedDtor(*this); +} +inline void MatchingRoomList::SharedDtor(MessageLite& self) { + MatchingRoomList& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL MatchingRoomList::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) MatchingRoomList(arena); +} +constexpr auto MatchingRoomList::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_.rooms_) + + decltype(MatchingRoomList::_impl_.rooms_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(MatchingRoomList), alignof(MatchingRoomList), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&MatchingRoomList::PlacementNew_, + sizeof(MatchingRoomList), + alignof(MatchingRoomList)); + } +} +constexpr auto MatchingRoomList::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<29>{ + { + &_MatchingRoomList_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &MatchingRoomList::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &MatchingRoomList::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &MatchingRoomList::ByteSizeLong, + &MatchingRoomList::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_._cached_size_), + true, + }, + "np2_structs.MatchingRoomList", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<29> MatchingRoomList_class_data_ = + MatchingRoomList::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +MatchingRoomList::GetClassData() const { + return MatchingRoomList_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 1, 0, 2> +MatchingRoomList::_table_ = { + { + PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + MatchingRoomList_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::MatchingRoomList>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // uint32 start = 1; + {::_pbi::TcParser::FastV32S1, + {8, 1, 0, + PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_.start_)}}, + // uint32 total = 2; + {::_pbi::TcParser::FastV32S1, + {16, 2, 0, + PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_.total_)}}, + // repeated .np2_structs.MatchingRoom rooms = 3; + {::_pbi::TcParser::FastMtR1, + {26, 0, 0, + PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_.rooms_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // uint32 start = 1; + {PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_.start_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // uint32 total = 2; + {PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_.total_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + // repeated .np2_structs.MatchingRoom rooms = 3; + {PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_.rooms_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::MatchingRoom>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void MatchingRoomList::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.MatchingRoomList) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.rooms_.Clear(); + } + if (BatchCheckHasBit(cached_has_bits, 0x00000006U)) { + ::memset(&_impl_.start_, 0, static_cast<::size_t>( + reinterpret_cast(&_impl_.total_) - + reinterpret_cast(&_impl_.start_)) + sizeof(_impl_.total_)); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL MatchingRoomList::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const MatchingRoomList& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL MatchingRoomList::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const MatchingRoomList& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.MatchingRoomList) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // uint32 start = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_start() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 1, this_._internal_start(), target); + } + } + + // uint32 total = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_total() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_total(), target); + } + } + + // repeated .np2_structs.MatchingRoom rooms = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_rooms_size()); + i < n; i++) { + const auto& repfield = this_._internal_rooms().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.MatchingRoomList) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t MatchingRoomList::ByteSizeLong(const MessageLite& base) { + const MatchingRoomList& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t MatchingRoomList::ByteSizeLong() const { + const MatchingRoomList& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.MatchingRoomList) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // repeated .np2_structs.MatchingRoom rooms = 3; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_rooms_size(); + for (const auto& msg : this_._internal_rooms()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint32 start = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_start() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_start()); + } + } + // uint32 total = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_total() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_total()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void MatchingRoomList::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.MatchingRoomList) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_rooms()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_rooms()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_start() != 0) { + _this->_impl_.start_ = from._impl_.start_; + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_total() != 0) { + _this->_impl_.total_ = from._impl_.total_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void MatchingRoomList::CopyFrom(const MatchingRoomList& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.MatchingRoomList) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void MatchingRoomList::InternalSwap(MatchingRoomList* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.rooms_.InternalSwap(&other->_impl_.rooms_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_.total_) + + sizeof(MatchingRoomList::_impl_.total_) + - PROTOBUF_FIELD_OFFSET(MatchingRoomList, _impl_.start_)>( + reinterpret_cast(&_impl_.start_), + reinterpret_cast(&other->_impl_.start_)); +} + +// =================================================================== + +class MatchingGuiRoomId::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MatchingGuiRoomId, _impl_._has_bits_); +}; + +MatchingGuiRoomId::MatchingGuiRoomId(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingGuiRoomId_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.MatchingGuiRoomId) +} +PROTOBUF_NDEBUG_INLINE MatchingGuiRoomId::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::MatchingGuiRoomId& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + id_(arena, from.id_) {} + +MatchingGuiRoomId::MatchingGuiRoomId( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const MatchingGuiRoomId& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingGuiRoomId_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + MatchingGuiRoomId* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.MatchingGuiRoomId) +} +PROTOBUF_NDEBUG_INLINE MatchingGuiRoomId::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + id_(arena) {} + +inline void MatchingGuiRoomId::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +MatchingGuiRoomId::~MatchingGuiRoomId() { + // @@protoc_insertion_point(destructor:np2_structs.MatchingGuiRoomId) + SharedDtor(*this); +} +inline void MatchingGuiRoomId::SharedDtor(MessageLite& self) { + MatchingGuiRoomId& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.id_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL MatchingGuiRoomId::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) MatchingGuiRoomId(arena); +} +constexpr auto MatchingGuiRoomId::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(MatchingGuiRoomId), + alignof(MatchingGuiRoomId)); +} +constexpr auto MatchingGuiRoomId::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<30>{ + { + &_MatchingGuiRoomId_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &MatchingGuiRoomId::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &MatchingGuiRoomId::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &MatchingGuiRoomId::ByteSizeLong, + &MatchingGuiRoomId::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(MatchingGuiRoomId, _impl_._cached_size_), + true, + }, + "np2_structs.MatchingGuiRoomId", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<30> MatchingGuiRoomId_class_data_ = + MatchingGuiRoomId::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +MatchingGuiRoomId::GetClassData() const { + return MatchingGuiRoomId_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 0, 0, 2> +MatchingGuiRoomId::_table_ = { + { + PROTOBUF_FIELD_OFFSET(MatchingGuiRoomId, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + MatchingGuiRoomId_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::MatchingGuiRoomId>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bytes id = 1; + {::_pbi::TcParser::FastBS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(MatchingGuiRoomId, _impl_.id_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bytes id = 1; + {PROTOBUF_FIELD_OFFSET(MatchingGuiRoomId, _impl_.id_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void MatchingGuiRoomId::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.MatchingGuiRoomId) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.id_.ClearNonDefaultToEmpty(); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL MatchingGuiRoomId::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const MatchingGuiRoomId& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL MatchingGuiRoomId::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const MatchingGuiRoomId& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.MatchingGuiRoomId) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bytes id = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_id().empty()) { + const ::std::string& _s = this_._internal_id(); + target = stream->WriteBytesMaybeAliased(1, _s, target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.MatchingGuiRoomId) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t MatchingGuiRoomId::ByteSizeLong(const MessageLite& base) { + const MatchingGuiRoomId& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t MatchingGuiRoomId::ByteSizeLong() const { + const MatchingGuiRoomId& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.MatchingGuiRoomId) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + { + // bytes id = 1; + cached_has_bits = this_._impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_id().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_id()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void MatchingGuiRoomId::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.MatchingGuiRoomId) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_id().empty()) { + _this->_internal_set_id(from._internal_id()); + } else { + if (_this->_impl_.id_.IsDefault()) { + _this->_internal_set_id(""); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void MatchingGuiRoomId::CopyFrom(const MatchingGuiRoomId& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.MatchingGuiRoomId) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void MatchingGuiRoomId::InternalSwap(MatchingGuiRoomId* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.id_, &other->_impl_.id_, arena); +} + +// =================================================================== + +class SetRoomSearchFlagGUI::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SetRoomSearchFlagGUI, _impl_._has_bits_); +}; + +SetRoomSearchFlagGUI::SetRoomSearchFlagGUI(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetRoomSearchFlagGUI_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SetRoomSearchFlagGUI) +} +PROTOBUF_NDEBUG_INLINE SetRoomSearchFlagGUI::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SetRoomSearchFlagGUI& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + roomid_(arena, from.roomid_) {} + +SetRoomSearchFlagGUI::SetRoomSearchFlagGUI( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SetRoomSearchFlagGUI& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SetRoomSearchFlagGUI_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SetRoomSearchFlagGUI* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + _impl_.stealth_ = from._impl_.stealth_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.SetRoomSearchFlagGUI) +} +PROTOBUF_NDEBUG_INLINE SetRoomSearchFlagGUI::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + roomid_(arena) {} + +inline void SetRoomSearchFlagGUI::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.stealth_ = {}; +} +SetRoomSearchFlagGUI::~SetRoomSearchFlagGUI() { + // @@protoc_insertion_point(destructor:np2_structs.SetRoomSearchFlagGUI) + SharedDtor(*this); +} +inline void SetRoomSearchFlagGUI::SharedDtor(MessageLite& self) { + SetRoomSearchFlagGUI& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.roomid_.Destroy(); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SetRoomSearchFlagGUI::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SetRoomSearchFlagGUI(arena); +} +constexpr auto SetRoomSearchFlagGUI::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(SetRoomSearchFlagGUI), + alignof(SetRoomSearchFlagGUI)); +} +constexpr auto SetRoomSearchFlagGUI::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<33>{ + { + &_SetRoomSearchFlagGUI_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SetRoomSearchFlagGUI::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SetRoomSearchFlagGUI::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SetRoomSearchFlagGUI::ByteSizeLong, + &SetRoomSearchFlagGUI::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SetRoomSearchFlagGUI, _impl_._cached_size_), + true, + }, + "np2_structs.SetRoomSearchFlagGUI", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<33> SetRoomSearchFlagGUI_class_data_ = + SetRoomSearchFlagGUI::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SetRoomSearchFlagGUI::GetClassData() const { + return SetRoomSearchFlagGUI_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 0, 0, 2> +SetRoomSearchFlagGUI::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SetRoomSearchFlagGUI, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 0, // num_aux_entries + offsetof(decltype(_table_), field_names), // no aux_entries + SetRoomSearchFlagGUI_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SetRoomSearchFlagGUI>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // bool stealth = 2; + {::_pbi::TcParser::FastV8S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(SetRoomSearchFlagGUI, _impl_.stealth_)}}, + // bytes roomid = 1; + {::_pbi::TcParser::FastBS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(SetRoomSearchFlagGUI, _impl_.roomid_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // bytes roomid = 1; + {PROTOBUF_FIELD_OFFSET(SetRoomSearchFlagGUI, _impl_.roomid_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)}, + // bool stealth = 2; + {PROTOBUF_FIELD_OFFSET(SetRoomSearchFlagGUI, _impl_.stealth_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)}, + }}, + // no aux_entries + {{ + }}, +}; +PROTOBUF_NOINLINE void SetRoomSearchFlagGUI::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SetRoomSearchFlagGUI) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + _impl_.roomid_.ClearNonDefaultToEmpty(); + } + _impl_.stealth_ = false; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SetRoomSearchFlagGUI::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SetRoomSearchFlagGUI& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SetRoomSearchFlagGUI::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SetRoomSearchFlagGUI& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SetRoomSearchFlagGUI) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // bytes roomid = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_roomid().empty()) { + const ::std::string& _s = this_._internal_roomid(); + target = stream->WriteBytesMaybeAliased(1, _s, target); + } + } + + // bool stealth = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_stealth() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteBoolToArray( + 2, this_._internal_stealth(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SetRoomSearchFlagGUI) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SetRoomSearchFlagGUI::ByteSizeLong(const MessageLite& base) { + const SetRoomSearchFlagGUI& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SetRoomSearchFlagGUI::ByteSizeLong() const { + const SetRoomSearchFlagGUI& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SetRoomSearchFlagGUI) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // bytes roomid = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!this_._internal_roomid().empty()) { + total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( + this_._internal_roomid()); + } + } + // bool stealth = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_stealth() != 0) { + total_size += 2; + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SetRoomSearchFlagGUI::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SetRoomSearchFlagGUI) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + if (!from._internal_roomid().empty()) { + _this->_internal_set_roomid(from._internal_roomid()); + } else { + if (_this->_impl_.roomid_.IsDefault()) { + _this->_internal_set_roomid(""); + } + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_stealth() != 0) { + _this->_impl_.stealth_ = from._impl_.stealth_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SetRoomSearchFlagGUI::CopyFrom(const SetRoomSearchFlagGUI& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SetRoomSearchFlagGUI) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SetRoomSearchFlagGUI::InternalSwap(SetRoomSearchFlagGUI* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + auto* arena = GetArena(); + ABSL_DCHECK_EQ(arena, other->GetArena()); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.roomid_, &other->_impl_.roomid_, arena); + swap(_impl_.stealth_, other->_impl_.stealth_); +} + +// =================================================================== + +class QuickMatchGUIRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(QuickMatchGUIRequest, _impl_._has_bits_); +}; + +QuickMatchGUIRequest::QuickMatchGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, QuickMatchGUIRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.QuickMatchGUIRequest) +} +PROTOBUF_NDEBUG_INLINE QuickMatchGUIRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::QuickMatchGUIRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + conds_{visibility, arena, from.conds_} {} + +QuickMatchGUIRequest::QuickMatchGUIRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const QuickMatchGUIRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, QuickMatchGUIRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + QuickMatchGUIRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + _impl_.available_num_ = from._impl_.available_num_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.QuickMatchGUIRequest) +} +PROTOBUF_NDEBUG_INLINE QuickMatchGUIRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + conds_{visibility, arena} {} + +inline void QuickMatchGUIRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.available_num_ = {}; +} +QuickMatchGUIRequest::~QuickMatchGUIRequest() { + // @@protoc_insertion_point(destructor:np2_structs.QuickMatchGUIRequest) + SharedDtor(*this); +} +inline void QuickMatchGUIRequest::SharedDtor(MessageLite& self) { + QuickMatchGUIRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL QuickMatchGUIRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) QuickMatchGUIRequest(arena); +} +constexpr auto QuickMatchGUIRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(QuickMatchGUIRequest, _impl_.conds_) + + decltype(QuickMatchGUIRequest::_impl_.conds_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(QuickMatchGUIRequest), alignof(QuickMatchGUIRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&QuickMatchGUIRequest::PlacementNew_, + sizeof(QuickMatchGUIRequest), + alignof(QuickMatchGUIRequest)); + } +} +constexpr auto QuickMatchGUIRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<33>{ + { + &_QuickMatchGUIRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &QuickMatchGUIRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &QuickMatchGUIRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &QuickMatchGUIRequest::ByteSizeLong, + &QuickMatchGUIRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(QuickMatchGUIRequest, _impl_._cached_size_), + true, + }, + "np2_structs.QuickMatchGUIRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<33> QuickMatchGUIRequest_class_data_ = + QuickMatchGUIRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +QuickMatchGUIRequest::GetClassData() const { + return QuickMatchGUIRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 1, 0, 2> +QuickMatchGUIRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(QuickMatchGUIRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + QuickMatchGUIRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::QuickMatchGUIRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // uint32 available_num = 2; + {::_pbi::TcParser::FastV32S1, + {16, 1, 0, + PROTOBUF_FIELD_OFFSET(QuickMatchGUIRequest, _impl_.available_num_)}}, + // repeated .np2_structs.MatchingSearchCondition conds = 1; + {::_pbi::TcParser::FastMtR1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(QuickMatchGUIRequest, _impl_.conds_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .np2_structs.MatchingSearchCondition conds = 1; + {PROTOBUF_FIELD_OFFSET(QuickMatchGUIRequest, _impl_.conds_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint32 available_num = 2; + {PROTOBUF_FIELD_OFFSET(QuickMatchGUIRequest, _impl_.available_num_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt32)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::MatchingSearchCondition>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void QuickMatchGUIRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.QuickMatchGUIRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.conds_.Clear(); + } + _impl_.available_num_ = 0u; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL QuickMatchGUIRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const QuickMatchGUIRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL QuickMatchGUIRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const QuickMatchGUIRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.QuickMatchGUIRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated .np2_structs.MatchingSearchCondition conds = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_conds_size()); + i < n; i++) { + const auto& repfield = this_._internal_conds().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // uint32 available_num = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_available_num() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt32ToArray( + 2, this_._internal_available_num(), target); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.QuickMatchGUIRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t QuickMatchGUIRequest::ByteSizeLong(const MessageLite& base) { + const QuickMatchGUIRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t QuickMatchGUIRequest::ByteSizeLong() const { + const QuickMatchGUIRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.QuickMatchGUIRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated .np2_structs.MatchingSearchCondition conds = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_conds_size(); + for (const auto& msg : this_._internal_conds()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // uint32 available_num = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (this_._internal_available_num() != 0) { + total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne( + this_._internal_available_num()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void QuickMatchGUIRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.QuickMatchGUIRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_conds()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_conds()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + if (from._internal_available_num() != 0) { + _this->_impl_.available_num_ = from._impl_.available_num_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void QuickMatchGUIRequest::CopyFrom(const QuickMatchGUIRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.QuickMatchGUIRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void QuickMatchGUIRequest::InternalSwap(QuickMatchGUIRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.conds_.InternalSwap(&other->_impl_.conds_); + swap(_impl_.available_num_, other->_impl_.available_num_); +} + +// =================================================================== + +class SearchJoinRoomGUIRequest::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(SearchJoinRoomGUIRequest, _impl_._has_bits_); +}; + +SearchJoinRoomGUIRequest::SearchJoinRoomGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SearchJoinRoomGUIRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.SearchJoinRoomGUIRequest) +} +PROTOBUF_NDEBUG_INLINE SearchJoinRoomGUIRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::SearchJoinRoomGUIRequest& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + conds_{visibility, arena, from.conds_}, + attrs_{visibility, arena, from.attrs_} {} + +SearchJoinRoomGUIRequest::SearchJoinRoomGUIRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const SearchJoinRoomGUIRequest& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, SearchJoinRoomGUIRequest_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SearchJoinRoomGUIRequest* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.SearchJoinRoomGUIRequest) +} +PROTOBUF_NDEBUG_INLINE SearchJoinRoomGUIRequest::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + conds_{visibility, arena}, + attrs_{visibility, arena} {} + +inline void SearchJoinRoomGUIRequest::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +SearchJoinRoomGUIRequest::~SearchJoinRoomGUIRequest() { + // @@protoc_insertion_point(destructor:np2_structs.SearchJoinRoomGUIRequest) + SharedDtor(*this); +} +inline void SearchJoinRoomGUIRequest::SharedDtor(MessageLite& self) { + SearchJoinRoomGUIRequest& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL SearchJoinRoomGUIRequest::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) SearchJoinRoomGUIRequest(arena); +} +constexpr auto SearchJoinRoomGUIRequest::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(SearchJoinRoomGUIRequest, _impl_.conds_) + + decltype(SearchJoinRoomGUIRequest::_impl_.conds_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + PROTOBUF_FIELD_OFFSET(SearchJoinRoomGUIRequest, _impl_.attrs_) + + decltype(SearchJoinRoomGUIRequest::_impl_.attrs_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(SearchJoinRoomGUIRequest), alignof(SearchJoinRoomGUIRequest), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&SearchJoinRoomGUIRequest::PlacementNew_, + sizeof(SearchJoinRoomGUIRequest), + alignof(SearchJoinRoomGUIRequest)); + } +} +constexpr auto SearchJoinRoomGUIRequest::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<37>{ + { + &_SearchJoinRoomGUIRequest_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &SearchJoinRoomGUIRequest::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &SearchJoinRoomGUIRequest::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &SearchJoinRoomGUIRequest::ByteSizeLong, + &SearchJoinRoomGUIRequest::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(SearchJoinRoomGUIRequest, _impl_._cached_size_), + true, + }, + "np2_structs.SearchJoinRoomGUIRequest", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<37> SearchJoinRoomGUIRequest_class_data_ = + SearchJoinRoomGUIRequest::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +SearchJoinRoomGUIRequest::GetClassData() const { + return SearchJoinRoomGUIRequest_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 2, 0, 2> +SearchJoinRoomGUIRequest::_table_ = { + { + PROTOBUF_FIELD_OFFSET(SearchJoinRoomGUIRequest, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + SearchJoinRoomGUIRequest_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::SearchJoinRoomGUIRequest>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.MatchingAttr attrs = 2; + {::_pbi::TcParser::FastMtR1, + {18, 1, 1, + PROTOBUF_FIELD_OFFSET(SearchJoinRoomGUIRequest, _impl_.attrs_)}}, + // repeated .np2_structs.MatchingSearchCondition conds = 1; + {::_pbi::TcParser::FastMtR1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(SearchJoinRoomGUIRequest, _impl_.conds_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .np2_structs.MatchingSearchCondition conds = 1; + {PROTOBUF_FIELD_OFFSET(SearchJoinRoomGUIRequest, _impl_.conds_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.MatchingAttr attrs = 2; + {PROTOBUF_FIELD_OFFSET(SearchJoinRoomGUIRequest, _impl_.attrs_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::MatchingSearchCondition>()}, + {::_pbi::TcParser::GetTable<::np2_structs::MatchingAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void SearchJoinRoomGUIRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.SearchJoinRoomGUIRequest) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.conds_.Clear(); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _impl_.attrs_.Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL SearchJoinRoomGUIRequest::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const SearchJoinRoomGUIRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL SearchJoinRoomGUIRequest::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const SearchJoinRoomGUIRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.SearchJoinRoomGUIRequest) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated .np2_structs.MatchingSearchCondition conds = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_conds_size()); + i < n; i++) { + const auto& repfield = this_._internal_conds().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + // repeated .np2_structs.MatchingAttr attrs = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_attrs_size()); + i < n; i++) { + const auto& repfield = this_._internal_attrs().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.SearchJoinRoomGUIRequest) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t SearchJoinRoomGUIRequest::ByteSizeLong(const MessageLite& base) { + const SearchJoinRoomGUIRequest& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t SearchJoinRoomGUIRequest::ByteSizeLong() const { + const SearchJoinRoomGUIRequest& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.SearchJoinRoomGUIRequest) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated .np2_structs.MatchingSearchCondition conds = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_conds_size(); + for (const auto& msg : this_._internal_conds()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // repeated .np2_structs.MatchingAttr attrs = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + total_size += 1UL * this_._internal_attrs_size(); + for (const auto& msg : this_._internal_attrs()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void SearchJoinRoomGUIRequest::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.SearchJoinRoomGUIRequest) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_conds()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_conds()); + } + if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) { + _this->_internal_mutable_attrs()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_attrs()); + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void SearchJoinRoomGUIRequest::CopyFrom(const SearchJoinRoomGUIRequest& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.SearchJoinRoomGUIRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void SearchJoinRoomGUIRequest::InternalSwap(SearchJoinRoomGUIRequest* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.conds_.InternalSwap(&other->_impl_.conds_); + _impl_.attrs_.InternalSwap(&other->_impl_.attrs_); +} + +// =================================================================== + +class MatchingSearchJoinRoomInfo::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MatchingSearchJoinRoomInfo, _impl_._has_bits_); +}; + +MatchingSearchJoinRoomInfo::MatchingSearchJoinRoomInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingSearchJoinRoomInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.MatchingSearchJoinRoomInfo) +} +PROTOBUF_NDEBUG_INLINE MatchingSearchJoinRoomInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::MatchingSearchJoinRoomInfo& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + attr_{visibility, arena, from.attr_} {} + +MatchingSearchJoinRoomInfo::MatchingSearchJoinRoomInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const MatchingSearchJoinRoomInfo& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, MatchingSearchJoinRoomInfo_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + MatchingSearchJoinRoomInfo* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.room_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.room_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.MatchingSearchJoinRoomInfo) +} +PROTOBUF_NDEBUG_INLINE MatchingSearchJoinRoomInfo::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + attr_{visibility, arena} {} + +inline void MatchingSearchJoinRoomInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + _impl_.room_ = {}; +} +MatchingSearchJoinRoomInfo::~MatchingSearchJoinRoomInfo() { + // @@protoc_insertion_point(destructor:np2_structs.MatchingSearchJoinRoomInfo) + SharedDtor(*this); +} +inline void MatchingSearchJoinRoomInfo::SharedDtor(MessageLite& self) { + MatchingSearchJoinRoomInfo& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.room_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL MatchingSearchJoinRoomInfo::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) MatchingSearchJoinRoomInfo(arena); +} +constexpr auto MatchingSearchJoinRoomInfo::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(MatchingSearchJoinRoomInfo, _impl_.attr_) + + decltype(MatchingSearchJoinRoomInfo::_impl_.attr_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(MatchingSearchJoinRoomInfo), alignof(MatchingSearchJoinRoomInfo), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&MatchingSearchJoinRoomInfo::PlacementNew_, + sizeof(MatchingSearchJoinRoomInfo), + alignof(MatchingSearchJoinRoomInfo)); + } +} +constexpr auto MatchingSearchJoinRoomInfo::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<39>{ + { + &_MatchingSearchJoinRoomInfo_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &MatchingSearchJoinRoomInfo::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &MatchingSearchJoinRoomInfo::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &MatchingSearchJoinRoomInfo::ByteSizeLong, + &MatchingSearchJoinRoomInfo::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(MatchingSearchJoinRoomInfo, _impl_._cached_size_), + true, + }, + "np2_structs.MatchingSearchJoinRoomInfo", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<39> MatchingSearchJoinRoomInfo_class_data_ = + MatchingSearchJoinRoomInfo::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +MatchingSearchJoinRoomInfo::GetClassData() const { + return MatchingSearchJoinRoomInfo_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 2, 0, 2> +MatchingSearchJoinRoomInfo::_table_ = { + { + PROTOBUF_FIELD_OFFSET(MatchingSearchJoinRoomInfo, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + MatchingSearchJoinRoomInfo_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::MatchingSearchJoinRoomInfo>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.MatchingAttr attr = 2; + {::_pbi::TcParser::FastMtR1, + {18, 0, 1, + PROTOBUF_FIELD_OFFSET(MatchingSearchJoinRoomInfo, _impl_.attr_)}}, + // .np2_structs.MatchingRoomStatus room = 1; + {::_pbi::TcParser::FastMtS1, + {10, 1, 0, + PROTOBUF_FIELD_OFFSET(MatchingSearchJoinRoomInfo, _impl_.room_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.MatchingRoomStatus room = 1; + {PROTOBUF_FIELD_OFFSET(MatchingSearchJoinRoomInfo, _impl_.room_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // repeated .np2_structs.MatchingAttr attr = 2; + {PROTOBUF_FIELD_OFFSET(MatchingSearchJoinRoomInfo, _impl_.attr_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::MatchingRoomStatus>()}, + {::_pbi::TcParser::GetTable<::np2_structs::MatchingAttr>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void MatchingSearchJoinRoomInfo::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.MatchingSearchJoinRoomInfo) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.attr_.Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.room_ != nullptr); + _impl_.room_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL MatchingSearchJoinRoomInfo::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const MatchingSearchJoinRoomInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL MatchingSearchJoinRoomInfo::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const MatchingSearchJoinRoomInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.MatchingSearchJoinRoomInfo) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.MatchingRoomStatus room = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.room_, this_._impl_.room_->GetCachedSize(), target, + stream); + } + + // repeated .np2_structs.MatchingAttr attr = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_attr_size()); + i < n; i++) { + const auto& repfield = this_._internal_attr().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.MatchingSearchJoinRoomInfo) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t MatchingSearchJoinRoomInfo::ByteSizeLong(const MessageLite& base) { + const MatchingSearchJoinRoomInfo& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t MatchingSearchJoinRoomInfo::ByteSizeLong() const { + const MatchingSearchJoinRoomInfo& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.MatchingSearchJoinRoomInfo) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // repeated .np2_structs.MatchingAttr attr = 2; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_attr_size(); + for (const auto& msg : this_._internal_attr()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + // .np2_structs.MatchingRoomStatus room = 1; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.room_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void MatchingSearchJoinRoomInfo::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.MatchingSearchJoinRoomInfo) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_attr()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_attr()); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.room_ != nullptr); + if (_this->_impl_.room_ == nullptr) { + _this->_impl_.room_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.room_); + } else { + _this->_impl_.room_->MergeFrom(*from._impl_.room_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void MatchingSearchJoinRoomInfo::CopyFrom(const MatchingSearchJoinRoomInfo& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.MatchingSearchJoinRoomInfo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void MatchingSearchJoinRoomInfo::InternalSwap(MatchingSearchJoinRoomInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.attr_.InternalSwap(&other->_impl_.attr_); + swap(_impl_.room_, other->_impl_.room_); +} + +// @@protoc_insertion_point(namespace_scope) +} // namespace np2_structs +namespace google { +namespace protobuf { +} // namespace protobuf +} // namespace google +// @@protoc_insertion_point(global_scope) +#include "google/protobuf/port_undef.inc" diff --git a/rpcs3/Emu/NP/generated/np2_structs.pb.h b/rpcs3/Emu/NP/generated/np2_structs.pb.h new file mode 100644 index 0000000000..f662c0a1a0 --- /dev/null +++ b/rpcs3/Emu/NP/generated/np2_structs.pb.h @@ -0,0 +1,38096 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// NO CHECKED-IN PROTOBUF GENCODE +// source: np2_structs.proto +// Protobuf C++ Version: 6.33.4 + +#ifndef np2_5fstructs_2eproto_2epb_2eh +#define np2_5fstructs_2eproto_2epb_2eh + +#include +#include +#include +#include + +#include "google/protobuf/runtime_version.h" +#if PROTOBUF_VERSION != 6033004 +#error "Protobuf C++ gencode is built with an incompatible version of" +#error "Protobuf C++ headers/runtime. See" +#error "https://protobuf.dev/support/cross-version-runtime-guarantee/#cpp" +#endif +#include "google/protobuf/io/coded_stream.h" +#include "google/protobuf/arena.h" +#include "google/protobuf/arenastring.h" +#include "google/protobuf/generated_message_tctable_decl.h" +#include "google/protobuf/generated_message_util.h" +#include "google/protobuf/metadata_lite.h" +#include "google/protobuf/message_lite.h" +#include "google/protobuf/repeated_field.h" // IWYU pragma: export +#include "google/protobuf/extension_set.h" // IWYU pragma: export +// @@protoc_insertion_point(includes) + +// Must be included last. +#include "google/protobuf/port_def.inc" + +#define PROTOBUF_INTERNAL_EXPORT_np2_5fstructs_2eproto + +namespace google { +namespace protobuf { +namespace internal { +template +::absl::string_view GetAnyMessageName(); +} // namespace internal +} // namespace protobuf +} // namespace google + +// Internal implementation detail -- do not use these members. +struct TableStruct_np2_5fstructs_2eproto { + static const ::uint32_t offsets[]; +}; +namespace np2_structs { +class BinAttr; +struct BinAttrDefaultTypeInternal; +extern BinAttrDefaultTypeInternal _BinAttr_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<20> BinAttr_class_data_; +class BinAttrInternal; +struct BinAttrInternalDefaultTypeInternal; +extern BinAttrInternalDefaultTypeInternal _BinAttrInternal_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<28> BinAttrInternal_class_data_; +class BinSearchFilter; +struct BinSearchFilterDefaultTypeInternal; +extern BinSearchFilterDefaultTypeInternal _BinSearchFilter_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<28> BinSearchFilter_class_data_; +class BoardInfo; +struct BoardInfoDefaultTypeInternal; +extern BoardInfoDefaultTypeInternal _BoardInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<22> BoardInfo_class_data_; +class CreateJoinRoomRequest; +struct CreateJoinRoomRequestDefaultTypeInternal; +extern CreateJoinRoomRequestDefaultTypeInternal _CreateJoinRoomRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<34> CreateJoinRoomRequest_class_data_; +class CreateRoomGUIRequest; +struct CreateRoomGUIRequestDefaultTypeInternal; +extern CreateRoomGUIRequestDefaultTypeInternal _CreateRoomGUIRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<33> CreateRoomGUIRequest_class_data_; +class GUIUserInfo; +struct GUIUserInfoDefaultTypeInternal; +extern GUIUserInfoDefaultTypeInternal _GUIUserInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<24> GUIUserInfo_class_data_; +class GetPingInfoResponse; +struct GetPingInfoResponseDefaultTypeInternal; +extern GetPingInfoResponseDefaultTypeInternal _GetPingInfoResponse_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<32> GetPingInfoResponse_class_data_; +class GetRoomDataExternalListRequest; +struct GetRoomDataExternalListRequestDefaultTypeInternal; +extern GetRoomDataExternalListRequestDefaultTypeInternal _GetRoomDataExternalListRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<43> GetRoomDataExternalListRequest_class_data_; +class GetRoomDataExternalListResponse; +struct GetRoomDataExternalListResponseDefaultTypeInternal; +extern GetRoomDataExternalListResponseDefaultTypeInternal _GetRoomDataExternalListResponse_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<44> GetRoomDataExternalListResponse_class_data_; +class GetRoomDataInternalRequest; +struct GetRoomDataInternalRequestDefaultTypeInternal; +extern GetRoomDataInternalRequestDefaultTypeInternal _GetRoomDataInternalRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<39> GetRoomDataInternalRequest_class_data_; +class GetRoomListGUIRequest; +struct GetRoomListGUIRequestDefaultTypeInternal; +extern GetRoomListGUIRequestDefaultTypeInternal _GetRoomListGUIRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<34> GetRoomListGUIRequest_class_data_; +class GetRoomMemberDataInternalRequest; +struct GetRoomMemberDataInternalRequestDefaultTypeInternal; +extern GetRoomMemberDataInternalRequestDefaultTypeInternal _GetRoomMemberDataInternalRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<45> GetRoomMemberDataInternalRequest_class_data_; +class GetScoreFriendsRequest; +struct GetScoreFriendsRequestDefaultTypeInternal; +extern GetScoreFriendsRequestDefaultTypeInternal _GetScoreFriendsRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<35> GetScoreFriendsRequest_class_data_; +class GetScoreGameDataRequest; +struct GetScoreGameDataRequestDefaultTypeInternal; +extern GetScoreGameDataRequestDefaultTypeInternal _GetScoreGameDataRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<36> GetScoreGameDataRequest_class_data_; +class GetScoreNpIdRequest; +struct GetScoreNpIdRequestDefaultTypeInternal; +extern GetScoreNpIdRequestDefaultTypeInternal _GetScoreNpIdRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<32> GetScoreNpIdRequest_class_data_; +class GetScoreRangeRequest; +struct GetScoreRangeRequestDefaultTypeInternal; +extern GetScoreRangeRequestDefaultTypeInternal _GetScoreRangeRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<33> GetScoreRangeRequest_class_data_; +class GetScoreResponse; +struct GetScoreResponseDefaultTypeInternal; +extern GetScoreResponseDefaultTypeInternal _GetScoreResponse_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<29> GetScoreResponse_class_data_; +class GroupConfig; +struct GroupConfigDefaultTypeInternal; +extern GroupConfigDefaultTypeInternal _GroupConfig_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<24> GroupConfig_class_data_; +class IntAttr; +struct IntAttrDefaultTypeInternal; +extern IntAttrDefaultTypeInternal _IntAttr_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<20> IntAttr_class_data_; +class IntSearchFilter; +struct IntSearchFilterDefaultTypeInternal; +extern IntSearchFilterDefaultTypeInternal _IntSearchFilter_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<28> IntSearchFilter_class_data_; +class JoinRoomRequest; +struct JoinRoomRequestDefaultTypeInternal; +extern JoinRoomRequestDefaultTypeInternal _JoinRoomRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<28> JoinRoomRequest_class_data_; +class JoinRoomResponse; +struct JoinRoomResponseDefaultTypeInternal; +extern JoinRoomResponseDefaultTypeInternal _JoinRoomResponse_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<29> JoinRoomResponse_class_data_; +class LeaveRoomRequest; +struct LeaveRoomRequestDefaultTypeInternal; +extern LeaveRoomRequestDefaultTypeInternal _LeaveRoomRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<29> LeaveRoomRequest_class_data_; +class Matching2SignalingInfo; +struct Matching2SignalingInfoDefaultTypeInternal; +extern Matching2SignalingInfoDefaultTypeInternal _Matching2SignalingInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<35> Matching2SignalingInfo_class_data_; +class MatchingAttr; +struct MatchingAttrDefaultTypeInternal; +extern MatchingAttrDefaultTypeInternal _MatchingAttr_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<25> MatchingAttr_class_data_; +class MatchingGuiRoomId; +struct MatchingGuiRoomIdDefaultTypeInternal; +extern MatchingGuiRoomIdDefaultTypeInternal _MatchingGuiRoomId_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<30> MatchingGuiRoomId_class_data_; +class MatchingRoom; +struct MatchingRoomDefaultTypeInternal; +extern MatchingRoomDefaultTypeInternal _MatchingRoom_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<25> MatchingRoom_class_data_; +class MatchingRoomList; +struct MatchingRoomListDefaultTypeInternal; +extern MatchingRoomListDefaultTypeInternal _MatchingRoomList_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<29> MatchingRoomList_class_data_; +class MatchingRoomStatus; +struct MatchingRoomStatusDefaultTypeInternal; +extern MatchingRoomStatusDefaultTypeInternal _MatchingRoomStatus_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<31> MatchingRoomStatus_class_data_; +class MatchingSearchCondition; +struct MatchingSearchConditionDefaultTypeInternal; +extern MatchingSearchConditionDefaultTypeInternal _MatchingSearchCondition_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<36> MatchingSearchCondition_class_data_; +class MatchingSearchJoinRoomInfo; +struct MatchingSearchJoinRoomInfoDefaultTypeInternal; +extern MatchingSearchJoinRoomInfoDefaultTypeInternal _MatchingSearchJoinRoomInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<39> MatchingSearchJoinRoomInfo_class_data_; +class MatchingSignalingInfo; +struct MatchingSignalingInfoDefaultTypeInternal; +extern MatchingSignalingInfoDefaultTypeInternal _MatchingSignalingInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<34> MatchingSignalingInfo_class_data_; +class MessageDetails; +struct MessageDetailsDefaultTypeInternal; +extern MessageDetailsDefaultTypeInternal _MessageDetails_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<27> MessageDetails_class_data_; +class NotificationUserJoinedRoom; +struct NotificationUserJoinedRoomDefaultTypeInternal; +extern NotificationUserJoinedRoomDefaultTypeInternal _NotificationUserJoinedRoom_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<39> NotificationUserJoinedRoom_class_data_; +class OptParam; +struct OptParamDefaultTypeInternal; +extern OptParamDefaultTypeInternal _OptParam_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<21> OptParam_class_data_; +class PresenceOptionData; +struct PresenceOptionDataDefaultTypeInternal; +extern PresenceOptionDataDefaultTypeInternal _PresenceOptionData_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<31> PresenceOptionData_class_data_; +class QuickMatchGUIRequest; +struct QuickMatchGUIRequestDefaultTypeInternal; +extern QuickMatchGUIRequestDefaultTypeInternal _QuickMatchGUIRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<33> QuickMatchGUIRequest_class_data_; +class RecordScoreGameDataRequest; +struct RecordScoreGameDataRequestDefaultTypeInternal; +extern RecordScoreGameDataRequestDefaultTypeInternal _RecordScoreGameDataRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<39> RecordScoreGameDataRequest_class_data_; +class RecordScoreRequest; +struct RecordScoreRequestDefaultTypeInternal; +extern RecordScoreRequestDefaultTypeInternal _RecordScoreRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<31> RecordScoreRequest_class_data_; +class RoomDataExternal; +struct RoomDataExternalDefaultTypeInternal; +extern RoomDataExternalDefaultTypeInternal _RoomDataExternal_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<29> RoomDataExternal_class_data_; +class RoomDataInternal; +struct RoomDataInternalDefaultTypeInternal; +extern RoomDataInternalDefaultTypeInternal _RoomDataInternal_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<29> RoomDataInternal_class_data_; +class RoomDataInternalUpdateInfo; +struct RoomDataInternalUpdateInfoDefaultTypeInternal; +extern RoomDataInternalUpdateInfoDefaultTypeInternal _RoomDataInternalUpdateInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<39> RoomDataInternalUpdateInfo_class_data_; +class RoomGroup; +struct RoomGroupDefaultTypeInternal; +extern RoomGroupDefaultTypeInternal _RoomGroup_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<22> RoomGroup_class_data_; +class RoomGroupPasswordConfig; +struct RoomGroupPasswordConfigDefaultTypeInternal; +extern RoomGroupPasswordConfigDefaultTypeInternal _RoomGroupPasswordConfig_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<36> RoomGroupPasswordConfig_class_data_; +class RoomMemberBinAttrInternal; +struct RoomMemberBinAttrInternalDefaultTypeInternal; +extern RoomMemberBinAttrInternalDefaultTypeInternal _RoomMemberBinAttrInternal_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<38> RoomMemberBinAttrInternal_class_data_; +class RoomMemberDataInternal; +struct RoomMemberDataInternalDefaultTypeInternal; +extern RoomMemberDataInternalDefaultTypeInternal _RoomMemberDataInternal_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<35> RoomMemberDataInternal_class_data_; +class RoomMemberDataInternalUpdateInfo; +struct RoomMemberDataInternalUpdateInfoDefaultTypeInternal; +extern RoomMemberDataInternalUpdateInfoDefaultTypeInternal _RoomMemberDataInternalUpdateInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<45> RoomMemberDataInternalUpdateInfo_class_data_; +class RoomMemberUpdateInfo; +struct RoomMemberUpdateInfoDefaultTypeInternal; +extern RoomMemberUpdateInfoDefaultTypeInternal _RoomMemberUpdateInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<33> RoomMemberUpdateInfo_class_data_; +class RoomMessageInfo; +struct RoomMessageInfoDefaultTypeInternal; +extern RoomMessageInfoDefaultTypeInternal _RoomMessageInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<28> RoomMessageInfo_class_data_; +class RoomUpdateInfo; +struct RoomUpdateInfoDefaultTypeInternal; +extern RoomUpdateInfoDefaultTypeInternal _RoomUpdateInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<27> RoomUpdateInfo_class_data_; +class ScoreInfo; +struct ScoreInfoDefaultTypeInternal; +extern ScoreInfoDefaultTypeInternal _ScoreInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<22> ScoreInfo_class_data_; +class ScoreNpIdPcId; +struct ScoreNpIdPcIdDefaultTypeInternal; +extern ScoreNpIdPcIdDefaultTypeInternal _ScoreNpIdPcId_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<26> ScoreNpIdPcId_class_data_; +class ScoreRankData; +struct ScoreRankDataDefaultTypeInternal; +extern ScoreRankDataDefaultTypeInternal _ScoreRankData_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<26> ScoreRankData_class_data_; +class SearchJoinRoomGUIRequest; +struct SearchJoinRoomGUIRequestDefaultTypeInternal; +extern SearchJoinRoomGUIRequestDefaultTypeInternal _SearchJoinRoomGUIRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<37> SearchJoinRoomGUIRequest_class_data_; +class SearchRoomRequest; +struct SearchRoomRequestDefaultTypeInternal; +extern SearchRoomRequestDefaultTypeInternal _SearchRoomRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<30> SearchRoomRequest_class_data_; +class SearchRoomResponse; +struct SearchRoomResponseDefaultTypeInternal; +extern SearchRoomResponseDefaultTypeInternal _SearchRoomResponse_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<31> SearchRoomResponse_class_data_; +class SendMessageRequest; +struct SendMessageRequestDefaultTypeInternal; +extern SendMessageRequestDefaultTypeInternal _SendMessageRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<31> SendMessageRequest_class_data_; +class SendRoomMessageRequest; +struct SendRoomMessageRequestDefaultTypeInternal; +extern SendRoomMessageRequestDefaultTypeInternal _SendRoomMessageRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<35> SendRoomMessageRequest_class_data_; +class SetPresenceRequest; +struct SetPresenceRequestDefaultTypeInternal; +extern SetPresenceRequestDefaultTypeInternal _SetPresenceRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<31> SetPresenceRequest_class_data_; +class SetRoomDataExternalRequest; +struct SetRoomDataExternalRequestDefaultTypeInternal; +extern SetRoomDataExternalRequestDefaultTypeInternal _SetRoomDataExternalRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<39> SetRoomDataExternalRequest_class_data_; +class SetRoomDataInternalRequest; +struct SetRoomDataInternalRequestDefaultTypeInternal; +extern SetRoomDataInternalRequestDefaultTypeInternal _SetRoomDataInternalRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<39> SetRoomDataInternalRequest_class_data_; +class SetRoomMemberDataInternalRequest; +struct SetRoomMemberDataInternalRequestDefaultTypeInternal; +extern SetRoomMemberDataInternalRequestDefaultTypeInternal _SetRoomMemberDataInternalRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<45> SetRoomMemberDataInternalRequest_class_data_; +class SetRoomSearchFlagGUI; +struct SetRoomSearchFlagGUIDefaultTypeInternal; +extern SetRoomSearchFlagGUIDefaultTypeInternal _SetRoomSearchFlagGUI_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<33> SetRoomSearchFlagGUI_class_data_; +class SetUserInfo; +struct SetUserInfoDefaultTypeInternal; +extern SetUserInfoDefaultTypeInternal _SetUserInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<24> SetUserInfo_class_data_; +class SignalingAddr; +struct SignalingAddrDefaultTypeInternal; +extern SignalingAddrDefaultTypeInternal _SignalingAddr_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<26> SignalingAddr_class_data_; +class TusAddAndGetVariableRequest; +struct TusAddAndGetVariableRequestDefaultTypeInternal; +extern TusAddAndGetVariableRequestDefaultTypeInternal _TusAddAndGetVariableRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<40> TusAddAndGetVariableRequest_class_data_; +class TusData; +struct TusDataDefaultTypeInternal; +extern TusDataDefaultTypeInternal _TusData_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<20> TusData_class_data_; +class TusDataStatus; +struct TusDataStatusDefaultTypeInternal; +extern TusDataStatusDefaultTypeInternal _TusDataStatus_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<26> TusDataStatus_class_data_; +class TusDataStatusResponse; +struct TusDataStatusResponseDefaultTypeInternal; +extern TusDataStatusResponseDefaultTypeInternal _TusDataStatusResponse_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<34> TusDataStatusResponse_class_data_; +class TusDeleteMultiSlotDataRequest; +struct TusDeleteMultiSlotDataRequestDefaultTypeInternal; +extern TusDeleteMultiSlotDataRequestDefaultTypeInternal _TusDeleteMultiSlotDataRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<42> TusDeleteMultiSlotDataRequest_class_data_; +class TusDeleteMultiSlotVariableRequest; +struct TusDeleteMultiSlotVariableRequestDefaultTypeInternal; +extern TusDeleteMultiSlotVariableRequestDefaultTypeInternal _TusDeleteMultiSlotVariableRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<46> TusDeleteMultiSlotVariableRequest_class_data_; +class TusGetDataRequest; +struct TusGetDataRequestDefaultTypeInternal; +extern TusGetDataRequestDefaultTypeInternal _TusGetDataRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<30> TusGetDataRequest_class_data_; +class TusGetFriendsDataStatusRequest; +struct TusGetFriendsDataStatusRequestDefaultTypeInternal; +extern TusGetFriendsDataStatusRequestDefaultTypeInternal _TusGetFriendsDataStatusRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<43> TusGetFriendsDataStatusRequest_class_data_; +class TusGetFriendsVariableRequest; +struct TusGetFriendsVariableRequestDefaultTypeInternal; +extern TusGetFriendsVariableRequestDefaultTypeInternal _TusGetFriendsVariableRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<41> TusGetFriendsVariableRequest_class_data_; +class TusGetMultiSlotDataStatusRequest; +struct TusGetMultiSlotDataStatusRequestDefaultTypeInternal; +extern TusGetMultiSlotDataStatusRequestDefaultTypeInternal _TusGetMultiSlotDataStatusRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<45> TusGetMultiSlotDataStatusRequest_class_data_; +class TusGetMultiSlotVariableRequest; +struct TusGetMultiSlotVariableRequestDefaultTypeInternal; +extern TusGetMultiSlotVariableRequestDefaultTypeInternal _TusGetMultiSlotVariableRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<43> TusGetMultiSlotVariableRequest_class_data_; +class TusGetMultiUserDataStatusRequest; +struct TusGetMultiUserDataStatusRequestDefaultTypeInternal; +extern TusGetMultiUserDataStatusRequestDefaultTypeInternal _TusGetMultiUserDataStatusRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<45> TusGetMultiUserDataStatusRequest_class_data_; +class TusGetMultiUserVariableRequest; +struct TusGetMultiUserVariableRequestDefaultTypeInternal; +extern TusGetMultiUserVariableRequestDefaultTypeInternal _TusGetMultiUserVariableRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<43> TusGetMultiUserVariableRequest_class_data_; +class TusSetDataRequest; +struct TusSetDataRequestDefaultTypeInternal; +extern TusSetDataRequestDefaultTypeInternal _TusSetDataRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<30> TusSetDataRequest_class_data_; +class TusSetMultiSlotVariableRequest; +struct TusSetMultiSlotVariableRequestDefaultTypeInternal; +extern TusSetMultiSlotVariableRequestDefaultTypeInternal _TusSetMultiSlotVariableRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<43> TusSetMultiSlotVariableRequest_class_data_; +class TusTryAndSetVariableRequest; +struct TusTryAndSetVariableRequestDefaultTypeInternal; +extern TusTryAndSetVariableRequestDefaultTypeInternal _TusTryAndSetVariableRequest_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<40> TusTryAndSetVariableRequest_class_data_; +class TusUser; +struct TusUserDefaultTypeInternal; +extern TusUserDefaultTypeInternal _TusUser_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<20> TusUser_class_data_; +class TusVarResponse; +struct TusVarResponseDefaultTypeInternal; +extern TusVarResponseDefaultTypeInternal _TusVarResponse_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<27> TusVarResponse_class_data_; +class TusVariable; +struct TusVariableDefaultTypeInternal; +extern TusVariableDefaultTypeInternal _TusVariable_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<24> TusVariable_class_data_; +class UserInfo; +struct UserInfoDefaultTypeInternal; +extern UserInfoDefaultTypeInternal _UserInfo_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<21> UserInfo_class_data_; +class uint16; +struct uint16DefaultTypeInternal; +extern uint16DefaultTypeInternal _uint16_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<19> uint16_class_data_; +class uint8; +struct uint8DefaultTypeInternal; +extern uint8DefaultTypeInternal _uint8_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<18> uint8_class_data_; +} // namespace np2_structs +namespace google { +namespace protobuf { +} // namespace protobuf +} // namespace google + +namespace np2_structs { + +// =================================================================== + + +// ------------------------------------------------------------------- + +class uint8 final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.uint8) */ { + public: + inline uint8() : uint8(nullptr) {} + ~uint8() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(uint8* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(uint8)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR uint8(::google::protobuf::internal::ConstantInitialized); + + inline uint8(const uint8& from) : uint8(nullptr, from) {} + inline uint8(uint8&& from) noexcept + : uint8(nullptr, ::std::move(from)) {} + inline uint8& operator=(const uint8& from) { + CopyFrom(from); + return *this; + } + inline uint8& operator=(uint8&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const uint8& default_instance() { + return *reinterpret_cast( + &_uint8_default_instance_); + } + static constexpr int kIndexInFileMessages = 0; + friend void swap(uint8& a, uint8& b) { a.Swap(&b); } + inline void Swap(uint8* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(uint8* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + uint8* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const uint8& from); + void MergeFrom(const uint8& from) { uint8::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(uint8* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.uint8"; } + + explicit uint8(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + uint8(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const uint8& from); + uint8( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, uint8&& from) noexcept + : uint8(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kValueFieldNumber = 1, + }; + // uint32 value = 1; + void clear_value() ; + ::uint32_t value() const; + void set_value(::uint32_t value); + + private: + ::uint32_t _internal_value() const; + void _internal_set_value(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.uint8) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<0, 1, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const uint8& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t value_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<18> uint8_class_data_; +// ------------------------------------------------------------------- + +class uint16 final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.uint16) */ { + public: + inline uint16() : uint16(nullptr) {} + ~uint16() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(uint16* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(uint16)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR uint16(::google::protobuf::internal::ConstantInitialized); + + inline uint16(const uint16& from) : uint16(nullptr, from) {} + inline uint16(uint16&& from) noexcept + : uint16(nullptr, ::std::move(from)) {} + inline uint16& operator=(const uint16& from) { + CopyFrom(from); + return *this; + } + inline uint16& operator=(uint16&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const uint16& default_instance() { + return *reinterpret_cast( + &_uint16_default_instance_); + } + static constexpr int kIndexInFileMessages = 1; + friend void swap(uint16& a, uint16& b) { a.Swap(&b); } + inline void Swap(uint16* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(uint16* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + uint16* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const uint16& from); + void MergeFrom(const uint16& from) { uint16::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(uint16* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.uint16"; } + + explicit uint16(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + uint16(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const uint16& from); + uint16( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, uint16&& from) noexcept + : uint16(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kValueFieldNumber = 1, + }; + // uint32 value = 1; + void clear_value() ; + ::uint32_t value() const; + void set_value(::uint32_t value); + + private: + ::uint32_t _internal_value() const; + void _internal_set_value(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.uint16) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<0, 1, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const uint16& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t value_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<19> uint16_class_data_; +// ------------------------------------------------------------------- + +class UserInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.UserInfo) */ { + public: + inline UserInfo() : UserInfo(nullptr) {} + ~UserInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(UserInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(UserInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR UserInfo(::google::protobuf::internal::ConstantInitialized); + + inline UserInfo(const UserInfo& from) : UserInfo(nullptr, from) {} + inline UserInfo(UserInfo&& from) noexcept + : UserInfo(nullptr, ::std::move(from)) {} + inline UserInfo& operator=(const UserInfo& from) { + CopyFrom(from); + return *this; + } + inline UserInfo& operator=(UserInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const UserInfo& default_instance() { + return *reinterpret_cast( + &_UserInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 11; + friend void swap(UserInfo& a, UserInfo& b) { a.Swap(&b); } + inline void Swap(UserInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(UserInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + UserInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const UserInfo& from); + void MergeFrom(const UserInfo& from) { UserInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(UserInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.UserInfo"; } + + explicit UserInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + UserInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const UserInfo& from); + UserInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, UserInfo&& from) noexcept + : UserInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNpIdFieldNumber = 1, + kOnlineNameFieldNumber = 2, + kAvatarUrlFieldNumber = 3, + }; + // string npId = 1; + void clear_npid() ; + const ::std::string& npid() const; + template + void set_npid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_npid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_npid(); + void set_allocated_npid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_npid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_npid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_npid(); + + public: + // string onlineName = 2; + void clear_onlinename() ; + const ::std::string& onlinename() const; + template + void set_onlinename(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_onlinename(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_onlinename(); + void set_allocated_onlinename(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_onlinename() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_onlinename(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_onlinename(); + + public: + // string avatarUrl = 3; + void clear_avatarurl() ; + const ::std::string& avatarurl() const; + template + void set_avatarurl(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_avatarurl(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_avatarurl(); + void set_allocated_avatarurl(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_avatarurl() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_avatarurl(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_avatarurl(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.UserInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 0, 52, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const UserInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr npid_; + ::google::protobuf::internal::ArenaStringPtr onlinename_; + ::google::protobuf::internal::ArenaStringPtr avatarurl_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<21> UserInfo_class_data_; +// ------------------------------------------------------------------- + +class TusVariable final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusVariable) */ { + public: + inline TusVariable() : TusVariable(nullptr) {} + ~TusVariable() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusVariable* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusVariable)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusVariable(::google::protobuf::internal::ConstantInitialized); + + inline TusVariable(const TusVariable& from) : TusVariable(nullptr, from) {} + inline TusVariable(TusVariable&& from) noexcept + : TusVariable(nullptr, ::std::move(from)) {} + inline TusVariable& operator=(const TusVariable& from) { + CopyFrom(from); + return *this; + } + inline TusVariable& operator=(TusVariable&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusVariable& default_instance() { + return *reinterpret_cast( + &_TusVariable_default_instance_); + } + static constexpr int kIndexInFileMessages = 56; + friend void swap(TusVariable& a, TusVariable& b) { a.Swap(&b); } + inline void Swap(TusVariable* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusVariable* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusVariable* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusVariable& from); + void MergeFrom(const TusVariable& from) { TusVariable::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusVariable* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusVariable"; } + + explicit TusVariable(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusVariable(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusVariable& from); + TusVariable( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusVariable&& from) noexcept + : TusVariable(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kOwnerIdFieldNumber = 1, + kLastChangedAuthorIdFieldNumber = 4, + kLastChangedDateFieldNumber = 3, + kVariableFieldNumber = 5, + kOldVariableFieldNumber = 6, + kHasDataFieldNumber = 2, + }; + // string ownerId = 1; + void clear_ownerid() ; + const ::std::string& ownerid() const; + template + void set_ownerid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_ownerid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_ownerid(); + void set_allocated_ownerid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_ownerid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_ownerid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_ownerid(); + + public: + // string lastChangedAuthorId = 4; + void clear_lastchangedauthorid() ; + const ::std::string& lastchangedauthorid() const; + template + void set_lastchangedauthorid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_lastchangedauthorid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_lastchangedauthorid(); + void set_allocated_lastchangedauthorid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_lastchangedauthorid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_lastchangedauthorid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_lastchangedauthorid(); + + public: + // uint64 lastChangedDate = 3; + void clear_lastchangeddate() ; + ::uint64_t lastchangeddate() const; + void set_lastchangeddate(::uint64_t value); + + private: + ::uint64_t _internal_lastchangeddate() const; + void _internal_set_lastchangeddate(::uint64_t value); + + public: + // int64 variable = 5; + void clear_variable() ; + ::int64_t variable() const; + void set_variable(::int64_t value); + + private: + ::int64_t _internal_variable() const; + void _internal_set_variable(::int64_t value); + + public: + // int64 oldVariable = 6; + void clear_oldvariable() ; + ::int64_t oldvariable() const; + void set_oldvariable(::int64_t value); + + private: + ::int64_t _internal_oldvariable() const; + void _internal_set_oldvariable(::int64_t value); + + public: + // bool hasData = 2; + void clear_hasdata() ; + bool hasdata() const; + void set_hasdata(bool value); + + private: + bool _internal_hasdata() const; + void _internal_set_hasdata(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusVariable) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 6, + 0, 58, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusVariable& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr ownerid_; + ::google::protobuf::internal::ArenaStringPtr lastchangedauthorid_; + ::uint64_t lastchangeddate_; + ::int64_t variable_; + ::int64_t oldvariable_; + bool hasdata_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<24> TusVariable_class_data_; +// ------------------------------------------------------------------- + +class TusUser final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusUser) */ { + public: + inline TusUser() : TusUser(nullptr) {} + ~TusUser() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusUser* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusUser)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusUser(::google::protobuf::internal::ConstantInitialized); + + inline TusUser(const TusUser& from) : TusUser(nullptr, from) {} + inline TusUser(TusUser&& from) noexcept + : TusUser(nullptr, ::std::move(from)) {} + inline TusUser& operator=(const TusUser& from) { + CopyFrom(from); + return *this; + } + inline TusUser& operator=(TusUser&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusUser& default_instance() { + return *reinterpret_cast( + &_TusUser_default_instance_); + } + static constexpr int kIndexInFileMessages = 55; + friend void swap(TusUser& a, TusUser& b) { a.Swap(&b); } + inline void Swap(TusUser* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusUser* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusUser* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusUser& from); + void MergeFrom(const TusUser& from) { TusUser::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusUser* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusUser"; } + + explicit TusUser(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusUser(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusUser& from); + TusUser( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusUser&& from) noexcept + : TusUser(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNpidFieldNumber = 2, + kVuserFieldNumber = 1, + }; + // string npid = 2; + void clear_npid() ; + const ::std::string& npid() const; + template + void set_npid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_npid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_npid(); + void set_allocated_npid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_npid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_npid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_npid(); + + public: + // bool vuser = 1; + void clear_vuser() ; + bool vuser() const; + void set_vuser(bool value); + + private: + bool _internal_vuser() const; + void _internal_set_vuser(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusUser) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 0, 32, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusUser& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr npid_; + bool vuser_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<20> TusUser_class_data_; +// ------------------------------------------------------------------- + +class TusGetFriendsVariableRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusGetFriendsVariableRequest) */ { + public: + inline TusGetFriendsVariableRequest() : TusGetFriendsVariableRequest(nullptr) {} + ~TusGetFriendsVariableRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusGetFriendsVariableRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusGetFriendsVariableRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusGetFriendsVariableRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusGetFriendsVariableRequest(const TusGetFriendsVariableRequest& from) : TusGetFriendsVariableRequest(nullptr, from) {} + inline TusGetFriendsVariableRequest(TusGetFriendsVariableRequest&& from) noexcept + : TusGetFriendsVariableRequest(nullptr, ::std::move(from)) {} + inline TusGetFriendsVariableRequest& operator=(const TusGetFriendsVariableRequest& from) { + CopyFrom(from); + return *this; + } + inline TusGetFriendsVariableRequest& operator=(TusGetFriendsVariableRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusGetFriendsVariableRequest& default_instance() { + return *reinterpret_cast( + &_TusGetFriendsVariableRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 61; + friend void swap(TusGetFriendsVariableRequest& a, TusGetFriendsVariableRequest& b) { a.Swap(&b); } + inline void Swap(TusGetFriendsVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusGetFriendsVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusGetFriendsVariableRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusGetFriendsVariableRequest& from); + void MergeFrom(const TusGetFriendsVariableRequest& from) { TusGetFriendsVariableRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusGetFriendsVariableRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusGetFriendsVariableRequest"; } + + explicit TusGetFriendsVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusGetFriendsVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusGetFriendsVariableRequest& from); + TusGetFriendsVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusGetFriendsVariableRequest&& from) noexcept + : TusGetFriendsVariableRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSlotIdFieldNumber = 1, + kIncludeSelfFieldNumber = 2, + kSortTypeFieldNumber = 3, + kArrayNumFieldNumber = 4, + }; + // int32 slotId = 1; + void clear_slotid() ; + ::int32_t slotid() const; + void set_slotid(::int32_t value); + + private: + ::int32_t _internal_slotid() const; + void _internal_set_slotid(::int32_t value); + + public: + // bool includeSelf = 2; + void clear_includeself() ; + bool includeself() const; + void set_includeself(bool value); + + private: + bool _internal_includeself() const; + void _internal_set_includeself(bool value); + + public: + // int32 sortType = 3; + void clear_sorttype() ; + ::int32_t sorttype() const; + void set_sorttype(::int32_t value); + + private: + ::int32_t _internal_sorttype() const; + void _internal_set_sorttype(::int32_t value); + + public: + // uint32 arrayNum = 4; + void clear_arraynum() ; + ::uint32_t arraynum() const; + void set_arraynum(::uint32_t value); + + private: + ::uint32_t _internal_arraynum() const; + void _internal_set_arraynum(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusGetFriendsVariableRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusGetFriendsVariableRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::int32_t slotid_; + bool includeself_; + ::int32_t sorttype_; + ::uint32_t arraynum_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<41> TusGetFriendsVariableRequest_class_data_; +// ------------------------------------------------------------------- + +class TusGetFriendsDataStatusRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusGetFriendsDataStatusRequest) */ { + public: + inline TusGetFriendsDataStatusRequest() : TusGetFriendsDataStatusRequest(nullptr) {} + ~TusGetFriendsDataStatusRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusGetFriendsDataStatusRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusGetFriendsDataStatusRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusGetFriendsDataStatusRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusGetFriendsDataStatusRequest(const TusGetFriendsDataStatusRequest& from) : TusGetFriendsDataStatusRequest(nullptr, from) {} + inline TusGetFriendsDataStatusRequest(TusGetFriendsDataStatusRequest&& from) noexcept + : TusGetFriendsDataStatusRequest(nullptr, ::std::move(from)) {} + inline TusGetFriendsDataStatusRequest& operator=(const TusGetFriendsDataStatusRequest& from) { + CopyFrom(from); + return *this; + } + inline TusGetFriendsDataStatusRequest& operator=(TusGetFriendsDataStatusRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusGetFriendsDataStatusRequest& default_instance() { + return *reinterpret_cast( + &_TusGetFriendsDataStatusRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 72; + friend void swap(TusGetFriendsDataStatusRequest& a, TusGetFriendsDataStatusRequest& b) { a.Swap(&b); } + inline void Swap(TusGetFriendsDataStatusRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusGetFriendsDataStatusRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusGetFriendsDataStatusRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusGetFriendsDataStatusRequest& from); + void MergeFrom(const TusGetFriendsDataStatusRequest& from) { TusGetFriendsDataStatusRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusGetFriendsDataStatusRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusGetFriendsDataStatusRequest"; } + + explicit TusGetFriendsDataStatusRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusGetFriendsDataStatusRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusGetFriendsDataStatusRequest& from); + TusGetFriendsDataStatusRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusGetFriendsDataStatusRequest&& from) noexcept + : TusGetFriendsDataStatusRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSlotIdFieldNumber = 1, + kIncludeSelfFieldNumber = 2, + kSortTypeFieldNumber = 3, + kArrayNumFieldNumber = 4, + }; + // int32 slotId = 1; + void clear_slotid() ; + ::int32_t slotid() const; + void set_slotid(::int32_t value); + + private: + ::int32_t _internal_slotid() const; + void _internal_set_slotid(::int32_t value); + + public: + // bool includeSelf = 2; + void clear_includeself() ; + bool includeself() const; + void set_includeself(bool value); + + private: + bool _internal_includeself() const; + void _internal_set_includeself(bool value); + + public: + // int32 sortType = 3; + void clear_sorttype() ; + ::int32_t sorttype() const; + void set_sorttype(::int32_t value); + + private: + ::int32_t _internal_sorttype() const; + void _internal_set_sorttype(::int32_t value); + + public: + // uint32 arrayNum = 4; + void clear_arraynum() ; + ::uint32_t arraynum() const; + void set_arraynum(::uint32_t value); + + private: + ::uint32_t _internal_arraynum() const; + void _internal_set_arraynum(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusGetFriendsDataStatusRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusGetFriendsDataStatusRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::int32_t slotid_; + bool includeself_; + ::int32_t sorttype_; + ::uint32_t arraynum_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<43> TusGetFriendsDataStatusRequest_class_data_; +// ------------------------------------------------------------------- + +class TusDataStatus final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusDataStatus) */ { + public: + inline TusDataStatus() : TusDataStatus(nullptr) {} + ~TusDataStatus() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusDataStatus* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusDataStatus)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusDataStatus(::google::protobuf::internal::ConstantInitialized); + + inline TusDataStatus(const TusDataStatus& from) : TusDataStatus(nullptr, from) {} + inline TusDataStatus(TusDataStatus&& from) noexcept + : TusDataStatus(nullptr, ::std::move(from)) {} + inline TusDataStatus& operator=(const TusDataStatus& from) { + CopyFrom(from); + return *this; + } + inline TusDataStatus& operator=(TusDataStatus&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusDataStatus& default_instance() { + return *reinterpret_cast( + &_TusDataStatus_default_instance_); + } + static constexpr int kIndexInFileMessages = 66; + friend void swap(TusDataStatus& a, TusDataStatus& b) { a.Swap(&b); } + inline void Swap(TusDataStatus* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusDataStatus* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusDataStatus* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusDataStatus& from); + void MergeFrom(const TusDataStatus& from) { TusDataStatus::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusDataStatus* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusDataStatus"; } + + explicit TusDataStatus(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusDataStatus(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusDataStatus& from); + TusDataStatus( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusDataStatus&& from) noexcept + : TusDataStatus(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kOwnerIdFieldNumber = 1, + kLastChangedAuthorIdFieldNumber = 4, + kInfoFieldNumber = 5, + kLastChangedDateFieldNumber = 3, + kHasDataFieldNumber = 2, + }; + // string ownerId = 1; + void clear_ownerid() ; + const ::std::string& ownerid() const; + template + void set_ownerid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_ownerid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_ownerid(); + void set_allocated_ownerid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_ownerid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_ownerid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_ownerid(); + + public: + // string lastChangedAuthorId = 4; + void clear_lastchangedauthorid() ; + const ::std::string& lastchangedauthorid() const; + template + void set_lastchangedauthorid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_lastchangedauthorid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_lastchangedauthorid(); + void set_allocated_lastchangedauthorid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_lastchangedauthorid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_lastchangedauthorid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_lastchangedauthorid(); + + public: + // bytes info = 5; + void clear_info() ; + const ::std::string& info() const; + template + void set_info(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_info(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_info(); + void set_allocated_info(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_info() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_info(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_info(); + + public: + // uint64 lastChangedDate = 3; + void clear_lastchangeddate() ; + ::uint64_t lastchangeddate() const; + void set_lastchangeddate(::uint64_t value); + + private: + ::uint64_t _internal_lastchangeddate() const; + void _internal_set_lastchangeddate(::uint64_t value); + + public: + // bool hasData = 2; + void clear_hasdata() ; + bool hasdata() const; + void set_hasdata(bool value); + + private: + bool _internal_hasdata() const; + void _internal_set_hasdata(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusDataStatus) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 0, 60, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusDataStatus& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr ownerid_; + ::google::protobuf::internal::ArenaStringPtr lastchangedauthorid_; + ::google::protobuf::internal::ArenaStringPtr info_; + ::uint64_t lastchangeddate_; + bool hasdata_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<26> TusDataStatus_class_data_; +// ------------------------------------------------------------------- + +class SetRoomSearchFlagGUI final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SetRoomSearchFlagGUI) */ { + public: + inline SetRoomSearchFlagGUI() : SetRoomSearchFlagGUI(nullptr) {} + ~SetRoomSearchFlagGUI() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SetRoomSearchFlagGUI* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SetRoomSearchFlagGUI)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SetRoomSearchFlagGUI(::google::protobuf::internal::ConstantInitialized); + + inline SetRoomSearchFlagGUI(const SetRoomSearchFlagGUI& from) : SetRoomSearchFlagGUI(nullptr, from) {} + inline SetRoomSearchFlagGUI(SetRoomSearchFlagGUI&& from) noexcept + : SetRoomSearchFlagGUI(nullptr, ::std::move(from)) {} + inline SetRoomSearchFlagGUI& operator=(const SetRoomSearchFlagGUI& from) { + CopyFrom(from); + return *this; + } + inline SetRoomSearchFlagGUI& operator=(SetRoomSearchFlagGUI&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SetRoomSearchFlagGUI& default_instance() { + return *reinterpret_cast( + &_SetRoomSearchFlagGUI_default_instance_); + } + static constexpr int kIndexInFileMessages = 84; + friend void swap(SetRoomSearchFlagGUI& a, SetRoomSearchFlagGUI& b) { a.Swap(&b); } + inline void Swap(SetRoomSearchFlagGUI* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SetRoomSearchFlagGUI* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SetRoomSearchFlagGUI* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SetRoomSearchFlagGUI& from); + void MergeFrom(const SetRoomSearchFlagGUI& from) { SetRoomSearchFlagGUI::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SetRoomSearchFlagGUI* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SetRoomSearchFlagGUI"; } + + explicit SetRoomSearchFlagGUI(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SetRoomSearchFlagGUI(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SetRoomSearchFlagGUI& from); + SetRoomSearchFlagGUI( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SetRoomSearchFlagGUI&& from) noexcept + : SetRoomSearchFlagGUI(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomidFieldNumber = 1, + kStealthFieldNumber = 2, + }; + // bytes roomid = 1; + void clear_roomid() ; + const ::std::string& roomid() const; + template + void set_roomid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_roomid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_roomid(); + void set_allocated_roomid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_roomid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_roomid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_roomid(); + + public: + // bool stealth = 2; + void clear_stealth() ; + bool stealth() const; + void set_stealth(bool value); + + private: + bool _internal_stealth() const; + void _internal_set_stealth(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SetRoomSearchFlagGUI) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SetRoomSearchFlagGUI& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr roomid_; + bool stealth_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<33> SetRoomSearchFlagGUI_class_data_; +// ------------------------------------------------------------------- + +class SetPresenceRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SetPresenceRequest) */ { + public: + inline SetPresenceRequest() : SetPresenceRequest(nullptr) {} + ~SetPresenceRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SetPresenceRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SetPresenceRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SetPresenceRequest(::google::protobuf::internal::ConstantInitialized); + + inline SetPresenceRequest(const SetPresenceRequest& from) : SetPresenceRequest(nullptr, from) {} + inline SetPresenceRequest(SetPresenceRequest&& from) noexcept + : SetPresenceRequest(nullptr, ::std::move(from)) {} + inline SetPresenceRequest& operator=(const SetPresenceRequest& from) { + CopyFrom(from); + return *this; + } + inline SetPresenceRequest& operator=(SetPresenceRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SetPresenceRequest& default_instance() { + return *reinterpret_cast( + &_SetPresenceRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 74; + friend void swap(SetPresenceRequest& a, SetPresenceRequest& b) { a.Swap(&b); } + inline void Swap(SetPresenceRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SetPresenceRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SetPresenceRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SetPresenceRequest& from); + void MergeFrom(const SetPresenceRequest& from) { SetPresenceRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SetPresenceRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SetPresenceRequest"; } + + explicit SetPresenceRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SetPresenceRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SetPresenceRequest& from); + SetPresenceRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SetPresenceRequest&& from) noexcept + : SetPresenceRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kTitleFieldNumber = 1, + kStatusFieldNumber = 2, + kCommentFieldNumber = 3, + kDataFieldNumber = 4, + }; + // string title = 1; + void clear_title() ; + const ::std::string& title() const; + template + void set_title(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_title(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_title(); + void set_allocated_title(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_title() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_title(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_title(); + + public: + // string status = 2; + void clear_status() ; + const ::std::string& status() const; + template + void set_status(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_status(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_status(); + void set_allocated_status(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_status() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_status(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_status(); + + public: + // string comment = 3; + void clear_comment() ; + const ::std::string& comment() const; + template + void set_comment(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_comment(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_comment(); + void set_allocated_comment(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_comment() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_comment(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_comment(); + + public: + // bytes data = 4; + void clear_data() ; + const ::std::string& data() const; + template + void set_data(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_data(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_data(); + void set_allocated_data(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_data() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_data(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SetPresenceRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 0, 57, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SetPresenceRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr title_; + ::google::protobuf::internal::ArenaStringPtr status_; + ::google::protobuf::internal::ArenaStringPtr comment_; + ::google::protobuf::internal::ArenaStringPtr data_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<31> SetPresenceRequest_class_data_; +// ------------------------------------------------------------------- + +class SendMessageRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SendMessageRequest) */ { + public: + inline SendMessageRequest() : SendMessageRequest(nullptr) {} + ~SendMessageRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SendMessageRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SendMessageRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SendMessageRequest(::google::protobuf::internal::ConstantInitialized); + + inline SendMessageRequest(const SendMessageRequest& from) : SendMessageRequest(nullptr, from) {} + inline SendMessageRequest(SendMessageRequest&& from) noexcept + : SendMessageRequest(nullptr, ::std::move(from)) {} + inline SendMessageRequest& operator=(const SendMessageRequest& from) { + CopyFrom(from); + return *this; + } + inline SendMessageRequest& operator=(SendMessageRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SendMessageRequest& default_instance() { + return *reinterpret_cast( + &_SendMessageRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 43; + friend void swap(SendMessageRequest& a, SendMessageRequest& b) { a.Swap(&b); } + inline void Swap(SendMessageRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SendMessageRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SendMessageRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SendMessageRequest& from); + void MergeFrom(const SendMessageRequest& from) { SendMessageRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SendMessageRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SendMessageRequest"; } + + explicit SendMessageRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SendMessageRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SendMessageRequest& from); + SendMessageRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SendMessageRequest&& from) noexcept + : SendMessageRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNpidsFieldNumber = 2, + kMessageFieldNumber = 1, + }; + // repeated string npids = 2; + int npids_size() const; + private: + int _internal_npids_size() const; + + public: + void clear_npids() ; + const ::std::string& npids(int index) const; + ::std::string* PROTOBUF_NONNULL mutable_npids(int index); + template + void set_npids(int index, Arg_&& value, Args_... args); + ::std::string* PROTOBUF_NONNULL add_npids(); + template + void add_npids(Arg_&& value, Args_... args); + const ::google::protobuf::RepeatedPtrField<::std::string>& npids() const; + ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL mutable_npids(); + + private: + const ::google::protobuf::RepeatedPtrField<::std::string>& _internal_npids() const; + ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL _internal_mutable_npids(); + + public: + // bytes message = 1; + void clear_message() ; + const ::std::string& message() const; + template + void set_message(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_message(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_message(); + void set_allocated_message(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_message() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_message(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_message(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SendMessageRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 0, 44, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SendMessageRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField<::std::string> npids_; + ::google::protobuf::internal::ArenaStringPtr message_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<31> SendMessageRequest_class_data_; +// ------------------------------------------------------------------- + +class ScoreRankData final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.ScoreRankData) */ { + public: + inline ScoreRankData() : ScoreRankData(nullptr) {} + ~ScoreRankData() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(ScoreRankData* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(ScoreRankData)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR ScoreRankData(::google::protobuf::internal::ConstantInitialized); + + inline ScoreRankData(const ScoreRankData& from) : ScoreRankData(nullptr, from) {} + inline ScoreRankData(ScoreRankData&& from) noexcept + : ScoreRankData(nullptr, ::std::move(from)) {} + inline ScoreRankData& operator=(const ScoreRankData& from) { + CopyFrom(from); + return *this; + } + inline ScoreRankData& operator=(ScoreRankData&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const ScoreRankData& default_instance() { + return *reinterpret_cast( + &_ScoreRankData_default_instance_); + } + static constexpr int kIndexInFileMessages = 50; + friend void swap(ScoreRankData& a, ScoreRankData& b) { a.Swap(&b); } + inline void Swap(ScoreRankData* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(ScoreRankData* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + ScoreRankData* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const ScoreRankData& from); + void MergeFrom(const ScoreRankData& from) { ScoreRankData::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(ScoreRankData* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.ScoreRankData"; } + + explicit ScoreRankData(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + ScoreRankData(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const ScoreRankData& from); + ScoreRankData( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, ScoreRankData&& from) noexcept + : ScoreRankData(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNpIdFieldNumber = 1, + kOnlineNameFieldNumber = 2, + kPcIdFieldNumber = 3, + kRankFieldNumber = 4, + kScoreFieldNumber = 5, + kRecordDateFieldNumber = 7, + kHasGameDataFieldNumber = 6, + }; + // string npId = 1; + void clear_npid() ; + const ::std::string& npid() const; + template + void set_npid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_npid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_npid(); + void set_allocated_npid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_npid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_npid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_npid(); + + public: + // string onlineName = 2; + void clear_onlinename() ; + const ::std::string& onlinename() const; + template + void set_onlinename(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_onlinename(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_onlinename(); + void set_allocated_onlinename(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_onlinename() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_onlinename(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_onlinename(); + + public: + // int32 pcId = 3; + void clear_pcid() ; + ::int32_t pcid() const; + void set_pcid(::int32_t value); + + private: + ::int32_t _internal_pcid() const; + void _internal_set_pcid(::int32_t value); + + public: + // uint32 rank = 4; + void clear_rank() ; + ::uint32_t rank() const; + void set_rank(::uint32_t value); + + private: + ::uint32_t _internal_rank() const; + void _internal_set_rank(::uint32_t value); + + public: + // int64 score = 5; + void clear_score() ; + ::int64_t score() const; + void set_score(::int64_t value); + + private: + ::int64_t _internal_score() const; + void _internal_set_score(::int64_t value); + + public: + // uint64 recordDate = 7; + void clear_recorddate() ; + ::uint64_t recorddate() const; + void set_recorddate(::uint64_t value); + + private: + ::uint64_t _internal_recorddate() const; + void _internal_set_recorddate(::uint64_t value); + + public: + // bool hasGameData = 6; + void clear_hasgamedata() ; + bool hasgamedata() const; + void set_hasgamedata(bool value); + + private: + bool _internal_hasgamedata() const; + void _internal_set_hasgamedata(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.ScoreRankData) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 7, + 0, 48, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const ScoreRankData& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr npid_; + ::google::protobuf::internal::ArenaStringPtr onlinename_; + ::int32_t pcid_; + ::uint32_t rank_; + ::int64_t score_; + ::uint64_t recorddate_; + bool hasgamedata_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<26> ScoreRankData_class_data_; +// ------------------------------------------------------------------- + +class ScoreNpIdPcId final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.ScoreNpIdPcId) */ { + public: + inline ScoreNpIdPcId() : ScoreNpIdPcId(nullptr) {} + ~ScoreNpIdPcId() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(ScoreNpIdPcId* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(ScoreNpIdPcId)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR ScoreNpIdPcId(::google::protobuf::internal::ConstantInitialized); + + inline ScoreNpIdPcId(const ScoreNpIdPcId& from) : ScoreNpIdPcId(nullptr, from) {} + inline ScoreNpIdPcId(ScoreNpIdPcId&& from) noexcept + : ScoreNpIdPcId(nullptr, ::std::move(from)) {} + inline ScoreNpIdPcId& operator=(const ScoreNpIdPcId& from) { + CopyFrom(from); + return *this; + } + inline ScoreNpIdPcId& operator=(ScoreNpIdPcId&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const ScoreNpIdPcId& default_instance() { + return *reinterpret_cast( + &_ScoreNpIdPcId_default_instance_); + } + static constexpr int kIndexInFileMessages = 47; + friend void swap(ScoreNpIdPcId& a, ScoreNpIdPcId& b) { a.Swap(&b); } + inline void Swap(ScoreNpIdPcId* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(ScoreNpIdPcId* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + ScoreNpIdPcId* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const ScoreNpIdPcId& from); + void MergeFrom(const ScoreNpIdPcId& from) { ScoreNpIdPcId::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(ScoreNpIdPcId* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.ScoreNpIdPcId"; } + + explicit ScoreNpIdPcId(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + ScoreNpIdPcId(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const ScoreNpIdPcId& from); + ScoreNpIdPcId( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, ScoreNpIdPcId&& from) noexcept + : ScoreNpIdPcId(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNpidFieldNumber = 1, + kPcIdFieldNumber = 2, + }; + // string npid = 1; + void clear_npid() ; + const ::std::string& npid() const; + template + void set_npid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_npid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_npid(); + void set_allocated_npid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_npid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_npid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_npid(); + + public: + // int32 pcId = 2; + void clear_pcid() ; + ::int32_t pcid() const; + void set_pcid(::int32_t value); + + private: + ::int32_t _internal_pcid() const; + void _internal_set_pcid(::int32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.ScoreNpIdPcId) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 0, 38, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const ScoreNpIdPcId& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr npid_; + ::int32_t pcid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<26> ScoreNpIdPcId_class_data_; +// ------------------------------------------------------------------- + +class ScoreInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.ScoreInfo) */ { + public: + inline ScoreInfo() : ScoreInfo(nullptr) {} + ~ScoreInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(ScoreInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(ScoreInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR ScoreInfo(::google::protobuf::internal::ConstantInitialized); + + inline ScoreInfo(const ScoreInfo& from) : ScoreInfo(nullptr, from) {} + inline ScoreInfo(ScoreInfo&& from) noexcept + : ScoreInfo(nullptr, ::std::move(from)) {} + inline ScoreInfo& operator=(const ScoreInfo& from) { + CopyFrom(from); + return *this; + } + inline ScoreInfo& operator=(ScoreInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const ScoreInfo& default_instance() { + return *reinterpret_cast( + &_ScoreInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 51; + friend void swap(ScoreInfo& a, ScoreInfo& b) { a.Swap(&b); } + inline void Swap(ScoreInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(ScoreInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + ScoreInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const ScoreInfo& from); + void MergeFrom(const ScoreInfo& from) { ScoreInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(ScoreInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.ScoreInfo"; } + + explicit ScoreInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + ScoreInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const ScoreInfo& from); + ScoreInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, ScoreInfo&& from) noexcept + : ScoreInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kDataFieldNumber = 1, + }; + // bytes data = 1; + void clear_data() ; + const ::std::string& data() const; + template + void set_data(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_data(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_data(); + void set_allocated_data(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_data() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_data(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.ScoreInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<0, 1, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const ScoreInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr data_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<22> ScoreInfo_class_data_; +// ------------------------------------------------------------------- + +class RecordScoreRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RecordScoreRequest) */ { + public: + inline RecordScoreRequest() : RecordScoreRequest(nullptr) {} + ~RecordScoreRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RecordScoreRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RecordScoreRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RecordScoreRequest(::google::protobuf::internal::ConstantInitialized); + + inline RecordScoreRequest(const RecordScoreRequest& from) : RecordScoreRequest(nullptr, from) {} + inline RecordScoreRequest(RecordScoreRequest&& from) noexcept + : RecordScoreRequest(nullptr, ::std::move(from)) {} + inline RecordScoreRequest& operator=(const RecordScoreRequest& from) { + CopyFrom(from); + return *this; + } + inline RecordScoreRequest& operator=(RecordScoreRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RecordScoreRequest& default_instance() { + return *reinterpret_cast( + &_RecordScoreRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 45; + friend void swap(RecordScoreRequest& a, RecordScoreRequest& b) { a.Swap(&b); } + inline void Swap(RecordScoreRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RecordScoreRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RecordScoreRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RecordScoreRequest& from); + void MergeFrom(const RecordScoreRequest& from) { RecordScoreRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RecordScoreRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RecordScoreRequest"; } + + explicit RecordScoreRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RecordScoreRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RecordScoreRequest& from); + RecordScoreRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RecordScoreRequest&& from) noexcept + : RecordScoreRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kCommentFieldNumber = 4, + kDataFieldNumber = 5, + kBoardIdFieldNumber = 1, + kPcIdFieldNumber = 2, + kScoreFieldNumber = 3, + }; + // string comment = 4; + void clear_comment() ; + const ::std::string& comment() const; + template + void set_comment(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_comment(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_comment(); + void set_allocated_comment(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_comment() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_comment(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_comment(); + + public: + // bytes data = 5; + void clear_data() ; + const ::std::string& data() const; + template + void set_data(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_data(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_data(); + void set_allocated_data(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_data() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_data(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // uint32 boardId = 1; + void clear_boardid() ; + ::uint32_t boardid() const; + void set_boardid(::uint32_t value); + + private: + ::uint32_t _internal_boardid() const; + void _internal_set_boardid(::uint32_t value); + + public: + // int32 pcId = 2; + void clear_pcid() ; + ::int32_t pcid() const; + void set_pcid(::int32_t value); + + private: + ::int32_t _internal_pcid() const; + void _internal_set_pcid(::int32_t value); + + public: + // int64 score = 3; + void clear_score() ; + ::int64_t score() const; + void set_score(::int64_t value); + + private: + ::int64_t _internal_score() const; + void _internal_set_score(::int64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RecordScoreRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 0, 46, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RecordScoreRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr comment_; + ::google::protobuf::internal::ArenaStringPtr data_; + ::uint32_t boardid_; + ::int32_t pcid_; + ::int64_t score_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<31> RecordScoreRequest_class_data_; +// ------------------------------------------------------------------- + +class RecordScoreGameDataRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RecordScoreGameDataRequest) */ { + public: + inline RecordScoreGameDataRequest() : RecordScoreGameDataRequest(nullptr) {} + ~RecordScoreGameDataRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RecordScoreGameDataRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RecordScoreGameDataRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RecordScoreGameDataRequest(::google::protobuf::internal::ConstantInitialized); + + inline RecordScoreGameDataRequest(const RecordScoreGameDataRequest& from) : RecordScoreGameDataRequest(nullptr, from) {} + inline RecordScoreGameDataRequest(RecordScoreGameDataRequest&& from) noexcept + : RecordScoreGameDataRequest(nullptr, ::std::move(from)) {} + inline RecordScoreGameDataRequest& operator=(const RecordScoreGameDataRequest& from) { + CopyFrom(from); + return *this; + } + inline RecordScoreGameDataRequest& operator=(RecordScoreGameDataRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RecordScoreGameDataRequest& default_instance() { + return *reinterpret_cast( + &_RecordScoreGameDataRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 53; + friend void swap(RecordScoreGameDataRequest& a, RecordScoreGameDataRequest& b) { a.Swap(&b); } + inline void Swap(RecordScoreGameDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RecordScoreGameDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RecordScoreGameDataRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RecordScoreGameDataRequest& from); + void MergeFrom(const RecordScoreGameDataRequest& from) { RecordScoreGameDataRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RecordScoreGameDataRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RecordScoreGameDataRequest"; } + + explicit RecordScoreGameDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RecordScoreGameDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RecordScoreGameDataRequest& from); + RecordScoreGameDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RecordScoreGameDataRequest&& from) noexcept + : RecordScoreGameDataRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kBoardIdFieldNumber = 1, + kPcIdFieldNumber = 2, + kScoreFieldNumber = 3, + }; + // uint32 boardId = 1; + void clear_boardid() ; + ::uint32_t boardid() const; + void set_boardid(::uint32_t value); + + private: + ::uint32_t _internal_boardid() const; + void _internal_set_boardid(::uint32_t value); + + public: + // int32 pcId = 2; + void clear_pcid() ; + ::int32_t pcid() const; + void set_pcid(::int32_t value); + + private: + ::int32_t _internal_pcid() const; + void _internal_set_pcid(::int32_t value); + + public: + // int64 score = 3; + void clear_score() ; + ::int64_t score() const; + void set_score(::int64_t value); + + private: + ::int64_t _internal_score() const; + void _internal_set_score(::int64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RecordScoreGameDataRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RecordScoreGameDataRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t boardid_; + ::int32_t pcid_; + ::int64_t score_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<39> RecordScoreGameDataRequest_class_data_; +// ------------------------------------------------------------------- + +class PresenceOptionData final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.PresenceOptionData) */ { + public: + inline PresenceOptionData() : PresenceOptionData(nullptr) {} + ~PresenceOptionData() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(PresenceOptionData* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(PresenceOptionData)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR PresenceOptionData(::google::protobuf::internal::ConstantInitialized); + + inline PresenceOptionData(const PresenceOptionData& from) : PresenceOptionData(nullptr, from) {} + inline PresenceOptionData(PresenceOptionData&& from) noexcept + : PresenceOptionData(nullptr, ::std::move(from)) {} + inline PresenceOptionData& operator=(const PresenceOptionData& from) { + CopyFrom(from); + return *this; + } + inline PresenceOptionData& operator=(PresenceOptionData&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const PresenceOptionData& default_instance() { + return *reinterpret_cast( + &_PresenceOptionData_default_instance_); + } + static constexpr int kIndexInFileMessages = 18; + friend void swap(PresenceOptionData& a, PresenceOptionData& b) { a.Swap(&b); } + inline void Swap(PresenceOptionData* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(PresenceOptionData* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + PresenceOptionData* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const PresenceOptionData& from); + void MergeFrom(const PresenceOptionData& from) { PresenceOptionData::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(PresenceOptionData* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.PresenceOptionData"; } + + explicit PresenceOptionData(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + PresenceOptionData(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const PresenceOptionData& from); + PresenceOptionData( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, PresenceOptionData&& from) noexcept + : PresenceOptionData(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kDataFieldNumber = 1, + kLenFieldNumber = 2, + }; + // bytes data = 1; + void clear_data() ; + const ::std::string& data() const; + template + void set_data(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_data(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_data(); + void set_allocated_data(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_data() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_data(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // uint32 len = 2; + void clear_len() ; + ::uint32_t len() const; + void set_len(::uint32_t value); + + private: + ::uint32_t _internal_len() const; + void _internal_set_len(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.PresenceOptionData) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const PresenceOptionData& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr data_; + ::uint32_t len_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<31> PresenceOptionData_class_data_; +// ------------------------------------------------------------------- + +class MatchingSearchCondition final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.MatchingSearchCondition) */ { + public: + inline MatchingSearchCondition() : MatchingSearchCondition(nullptr) {} + ~MatchingSearchCondition() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(MatchingSearchCondition* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(MatchingSearchCondition)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR MatchingSearchCondition(::google::protobuf::internal::ConstantInitialized); + + inline MatchingSearchCondition(const MatchingSearchCondition& from) : MatchingSearchCondition(nullptr, from) {} + inline MatchingSearchCondition(MatchingSearchCondition&& from) noexcept + : MatchingSearchCondition(nullptr, ::std::move(from)) {} + inline MatchingSearchCondition& operator=(const MatchingSearchCondition& from) { + CopyFrom(from); + return *this; + } + inline MatchingSearchCondition& operator=(MatchingSearchCondition&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const MatchingSearchCondition& default_instance() { + return *reinterpret_cast( + &_MatchingSearchCondition_default_instance_); + } + static constexpr int kIndexInFileMessages = 75; + friend void swap(MatchingSearchCondition& a, MatchingSearchCondition& b) { a.Swap(&b); } + inline void Swap(MatchingSearchCondition* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(MatchingSearchCondition* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + MatchingSearchCondition* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const MatchingSearchCondition& from); + void MergeFrom(const MatchingSearchCondition& from) { MatchingSearchCondition::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(MatchingSearchCondition* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.MatchingSearchCondition"; } + + explicit MatchingSearchCondition(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + MatchingSearchCondition(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MatchingSearchCondition& from); + MatchingSearchCondition( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, MatchingSearchCondition&& from) noexcept + : MatchingSearchCondition(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kAttrTypeFieldNumber = 1, + kAttrIdFieldNumber = 2, + kCompOpFieldNumber = 3, + kCompValueFieldNumber = 4, + }; + // uint32 attr_type = 1; + void clear_attr_type() ; + ::uint32_t attr_type() const; + void set_attr_type(::uint32_t value); + + private: + ::uint32_t _internal_attr_type() const; + void _internal_set_attr_type(::uint32_t value); + + public: + // uint32 attr_id = 2; + void clear_attr_id() ; + ::uint32_t attr_id() const; + void set_attr_id(::uint32_t value); + + private: + ::uint32_t _internal_attr_id() const; + void _internal_set_attr_id(::uint32_t value); + + public: + // uint32 comp_op = 3; + void clear_comp_op() ; + ::uint32_t comp_op() const; + void set_comp_op(::uint32_t value); + + private: + ::uint32_t _internal_comp_op() const; + void _internal_set_comp_op(::uint32_t value); + + public: + // uint32 comp_value = 4; + void clear_comp_value() ; + ::uint32_t comp_value() const; + void set_comp_value(::uint32_t value); + + private: + ::uint32_t _internal_comp_value() const; + void _internal_set_comp_value(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.MatchingSearchCondition) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const MatchingSearchCondition& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t attr_type_; + ::uint32_t attr_id_; + ::uint32_t comp_op_; + ::uint32_t comp_value_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<36> MatchingSearchCondition_class_data_; +// ------------------------------------------------------------------- + +class MatchingGuiRoomId final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.MatchingGuiRoomId) */ { + public: + inline MatchingGuiRoomId() : MatchingGuiRoomId(nullptr) {} + ~MatchingGuiRoomId() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(MatchingGuiRoomId* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(MatchingGuiRoomId)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR MatchingGuiRoomId(::google::protobuf::internal::ConstantInitialized); + + inline MatchingGuiRoomId(const MatchingGuiRoomId& from) : MatchingGuiRoomId(nullptr, from) {} + inline MatchingGuiRoomId(MatchingGuiRoomId&& from) noexcept + : MatchingGuiRoomId(nullptr, ::std::move(from)) {} + inline MatchingGuiRoomId& operator=(const MatchingGuiRoomId& from) { + CopyFrom(from); + return *this; + } + inline MatchingGuiRoomId& operator=(MatchingGuiRoomId&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const MatchingGuiRoomId& default_instance() { + return *reinterpret_cast( + &_MatchingGuiRoomId_default_instance_); + } + static constexpr int kIndexInFileMessages = 83; + friend void swap(MatchingGuiRoomId& a, MatchingGuiRoomId& b) { a.Swap(&b); } + inline void Swap(MatchingGuiRoomId* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(MatchingGuiRoomId* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + MatchingGuiRoomId* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const MatchingGuiRoomId& from); + void MergeFrom(const MatchingGuiRoomId& from) { MatchingGuiRoomId::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(MatchingGuiRoomId* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.MatchingGuiRoomId"; } + + explicit MatchingGuiRoomId(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + MatchingGuiRoomId(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MatchingGuiRoomId& from); + MatchingGuiRoomId( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, MatchingGuiRoomId&& from) noexcept + : MatchingGuiRoomId(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kIdFieldNumber = 1, + }; + // bytes id = 1; + void clear_id() ; + const ::std::string& id() const; + template + void set_id(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_id(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_id(); + void set_allocated_id(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_id() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_id(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_id(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.MatchingGuiRoomId) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<0, 1, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const MatchingGuiRoomId& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr id_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<30> MatchingGuiRoomId_class_data_; +// ------------------------------------------------------------------- + +class MatchingAttr final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.MatchingAttr) */ { + public: + inline MatchingAttr() : MatchingAttr(nullptr) {} + ~MatchingAttr() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(MatchingAttr* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(MatchingAttr)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR MatchingAttr(::google::protobuf::internal::ConstantInitialized); + + inline MatchingAttr(const MatchingAttr& from) : MatchingAttr(nullptr, from) {} + inline MatchingAttr(MatchingAttr&& from) noexcept + : MatchingAttr(nullptr, ::std::move(from)) {} + inline MatchingAttr& operator=(const MatchingAttr& from) { + CopyFrom(from); + return *this; + } + inline MatchingAttr& operator=(MatchingAttr&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const MatchingAttr& default_instance() { + return *reinterpret_cast( + &_MatchingAttr_default_instance_); + } + static constexpr int kIndexInFileMessages = 76; + friend void swap(MatchingAttr& a, MatchingAttr& b) { a.Swap(&b); } + inline void Swap(MatchingAttr* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(MatchingAttr* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + MatchingAttr* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const MatchingAttr& from); + void MergeFrom(const MatchingAttr& from) { MatchingAttr::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(MatchingAttr* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.MatchingAttr"; } + + explicit MatchingAttr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + MatchingAttr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MatchingAttr& from); + MatchingAttr( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, MatchingAttr&& from) noexcept + : MatchingAttr(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kDataFieldNumber = 4, + kAttrTypeFieldNumber = 1, + kAttrIdFieldNumber = 2, + kNumFieldNumber = 3, + }; + // bytes data = 4; + void clear_data() ; + const ::std::string& data() const; + template + void set_data(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_data(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_data(); + void set_allocated_data(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_data() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_data(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // uint32 attr_type = 1; + void clear_attr_type() ; + ::uint32_t attr_type() const; + void set_attr_type(::uint32_t value); + + private: + ::uint32_t _internal_attr_type() const; + void _internal_set_attr_type(::uint32_t value); + + public: + // uint32 attr_id = 2; + void clear_attr_id() ; + ::uint32_t attr_id() const; + void set_attr_id(::uint32_t value); + + private: + ::uint32_t _internal_attr_id() const; + void _internal_set_attr_id(::uint32_t value); + + public: + // uint32 num = 3; + void clear_num() ; + ::uint32_t num() const; + void set_num(::uint32_t value); + + private: + ::uint32_t _internal_num() const; + void _internal_set_num(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.MatchingAttr) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const MatchingAttr& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr data_; + ::uint32_t attr_type_; + ::uint32_t attr_id_; + ::uint32_t num_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<25> MatchingAttr_class_data_; +// ------------------------------------------------------------------- + +class GroupConfig final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GroupConfig) */ { + public: + inline GroupConfig() : GroupConfig(nullptr) {} + ~GroupConfig() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GroupConfig* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GroupConfig)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GroupConfig(::google::protobuf::internal::ConstantInitialized); + + inline GroupConfig(const GroupConfig& from) : GroupConfig(nullptr, from) {} + inline GroupConfig(GroupConfig&& from) noexcept + : GroupConfig(nullptr, ::std::move(from)) {} + inline GroupConfig& operator=(const GroupConfig& from) { + CopyFrom(from); + return *this; + } + inline GroupConfig& operator=(GroupConfig&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GroupConfig& default_instance() { + return *reinterpret_cast( + &_GroupConfig_default_instance_); + } + static constexpr int kIndexInFileMessages = 10; + friend void swap(GroupConfig& a, GroupConfig& b) { a.Swap(&b); } + inline void Swap(GroupConfig* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GroupConfig* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GroupConfig* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GroupConfig& from); + void MergeFrom(const GroupConfig& from) { GroupConfig::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GroupConfig* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GroupConfig"; } + + explicit GroupConfig(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GroupConfig(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GroupConfig& from); + GroupConfig( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GroupConfig&& from) noexcept + : GroupConfig(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kLabelFieldNumber = 2, + kSlotNumFieldNumber = 1, + kWithPasswordFieldNumber = 3, + }; + // bytes label = 2; + void clear_label() ; + const ::std::string& label() const; + template + void set_label(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_label(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_label(); + void set_allocated_label(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_label() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_label(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_label(); + + public: + // uint32 slotNum = 1; + void clear_slotnum() ; + ::uint32_t slotnum() const; + void set_slotnum(::uint32_t value); + + private: + ::uint32_t _internal_slotnum() const; + void _internal_set_slotnum(::uint32_t value); + + public: + // bool withPassword = 3; + void clear_withpassword() ; + bool withpassword() const; + void set_withpassword(bool value); + + private: + bool _internal_withpassword() const; + void _internal_set_withpassword(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GroupConfig) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GroupConfig& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr label_; + ::uint32_t slotnum_; + bool withpassword_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<24> GroupConfig_class_data_; +// ------------------------------------------------------------------- + +class GetScoreRangeRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetScoreRangeRequest) */ { + public: + inline GetScoreRangeRequest() : GetScoreRangeRequest(nullptr) {} + ~GetScoreRangeRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetScoreRangeRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetScoreRangeRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetScoreRangeRequest(::google::protobuf::internal::ConstantInitialized); + + inline GetScoreRangeRequest(const GetScoreRangeRequest& from) : GetScoreRangeRequest(nullptr, from) {} + inline GetScoreRangeRequest(GetScoreRangeRequest&& from) noexcept + : GetScoreRangeRequest(nullptr, ::std::move(from)) {} + inline GetScoreRangeRequest& operator=(const GetScoreRangeRequest& from) { + CopyFrom(from); + return *this; + } + inline GetScoreRangeRequest& operator=(GetScoreRangeRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetScoreRangeRequest& default_instance() { + return *reinterpret_cast( + &_GetScoreRangeRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 46; + friend void swap(GetScoreRangeRequest& a, GetScoreRangeRequest& b) { a.Swap(&b); } + inline void Swap(GetScoreRangeRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetScoreRangeRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetScoreRangeRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetScoreRangeRequest& from); + void MergeFrom(const GetScoreRangeRequest& from) { GetScoreRangeRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetScoreRangeRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetScoreRangeRequest"; } + + explicit GetScoreRangeRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetScoreRangeRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetScoreRangeRequest& from); + GetScoreRangeRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetScoreRangeRequest&& from) noexcept + : GetScoreRangeRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kBoardIdFieldNumber = 1, + kStartRankFieldNumber = 2, + kNumRanksFieldNumber = 3, + kWithCommentFieldNumber = 4, + kWithGameInfoFieldNumber = 5, + }; + // uint32 boardId = 1; + void clear_boardid() ; + ::uint32_t boardid() const; + void set_boardid(::uint32_t value); + + private: + ::uint32_t _internal_boardid() const; + void _internal_set_boardid(::uint32_t value); + + public: + // uint32 startRank = 2; + void clear_startrank() ; + ::uint32_t startrank() const; + void set_startrank(::uint32_t value); + + private: + ::uint32_t _internal_startrank() const; + void _internal_set_startrank(::uint32_t value); + + public: + // uint32 numRanks = 3; + void clear_numranks() ; + ::uint32_t numranks() const; + void set_numranks(::uint32_t value); + + private: + ::uint32_t _internal_numranks() const; + void _internal_set_numranks(::uint32_t value); + + public: + // bool withComment = 4; + void clear_withcomment() ; + bool withcomment() const; + void set_withcomment(bool value); + + private: + bool _internal_withcomment() const; + void _internal_set_withcomment(bool value); + + public: + // bool withGameInfo = 5; + void clear_withgameinfo() ; + bool withgameinfo() const; + void set_withgameinfo(bool value); + + private: + bool _internal_withgameinfo() const; + void _internal_set_withgameinfo(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GetScoreRangeRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetScoreRangeRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t boardid_; + ::uint32_t startrank_; + ::uint32_t numranks_; + bool withcomment_; + bool withgameinfo_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<33> GetScoreRangeRequest_class_data_; +// ------------------------------------------------------------------- + +class GetScoreGameDataRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetScoreGameDataRequest) */ { + public: + inline GetScoreGameDataRequest() : GetScoreGameDataRequest(nullptr) {} + ~GetScoreGameDataRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetScoreGameDataRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetScoreGameDataRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetScoreGameDataRequest(::google::protobuf::internal::ConstantInitialized); + + inline GetScoreGameDataRequest(const GetScoreGameDataRequest& from) : GetScoreGameDataRequest(nullptr, from) {} + inline GetScoreGameDataRequest(GetScoreGameDataRequest&& from) noexcept + : GetScoreGameDataRequest(nullptr, ::std::move(from)) {} + inline GetScoreGameDataRequest& operator=(const GetScoreGameDataRequest& from) { + CopyFrom(from); + return *this; + } + inline GetScoreGameDataRequest& operator=(GetScoreGameDataRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetScoreGameDataRequest& default_instance() { + return *reinterpret_cast( + &_GetScoreGameDataRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 54; + friend void swap(GetScoreGameDataRequest& a, GetScoreGameDataRequest& b) { a.Swap(&b); } + inline void Swap(GetScoreGameDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetScoreGameDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetScoreGameDataRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetScoreGameDataRequest& from); + void MergeFrom(const GetScoreGameDataRequest& from) { GetScoreGameDataRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetScoreGameDataRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetScoreGameDataRequest"; } + + explicit GetScoreGameDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetScoreGameDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetScoreGameDataRequest& from); + GetScoreGameDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetScoreGameDataRequest&& from) noexcept + : GetScoreGameDataRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNpIdFieldNumber = 2, + kBoardIdFieldNumber = 1, + kPcIdFieldNumber = 3, + }; + // string npId = 2; + void clear_npid() ; + const ::std::string& npid() const; + template + void set_npid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_npid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_npid(); + void set_allocated_npid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_npid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_npid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_npid(); + + public: + // uint32 boardId = 1; + void clear_boardid() ; + ::uint32_t boardid() const; + void set_boardid(::uint32_t value); + + private: + ::uint32_t _internal_boardid() const; + void _internal_set_boardid(::uint32_t value); + + public: + // int32 pcId = 3; + void clear_pcid() ; + ::int32_t pcid() const; + void set_pcid(::int32_t value); + + private: + ::int32_t _internal_pcid() const; + void _internal_set_pcid(::int32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GetScoreGameDataRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 0, 48, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetScoreGameDataRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr npid_; + ::uint32_t boardid_; + ::int32_t pcid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<36> GetScoreGameDataRequest_class_data_; +// ------------------------------------------------------------------- + +class GetScoreFriendsRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetScoreFriendsRequest) */ { + public: + inline GetScoreFriendsRequest() : GetScoreFriendsRequest(nullptr) {} + ~GetScoreFriendsRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetScoreFriendsRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetScoreFriendsRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetScoreFriendsRequest(::google::protobuf::internal::ConstantInitialized); + + inline GetScoreFriendsRequest(const GetScoreFriendsRequest& from) : GetScoreFriendsRequest(nullptr, from) {} + inline GetScoreFriendsRequest(GetScoreFriendsRequest&& from) noexcept + : GetScoreFriendsRequest(nullptr, ::std::move(from)) {} + inline GetScoreFriendsRequest& operator=(const GetScoreFriendsRequest& from) { + CopyFrom(from); + return *this; + } + inline GetScoreFriendsRequest& operator=(GetScoreFriendsRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetScoreFriendsRequest& default_instance() { + return *reinterpret_cast( + &_GetScoreFriendsRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 49; + friend void swap(GetScoreFriendsRequest& a, GetScoreFriendsRequest& b) { a.Swap(&b); } + inline void Swap(GetScoreFriendsRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetScoreFriendsRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetScoreFriendsRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetScoreFriendsRequest& from); + void MergeFrom(const GetScoreFriendsRequest& from) { GetScoreFriendsRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetScoreFriendsRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetScoreFriendsRequest"; } + + explicit GetScoreFriendsRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetScoreFriendsRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetScoreFriendsRequest& from); + GetScoreFriendsRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetScoreFriendsRequest&& from) noexcept + : GetScoreFriendsRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kBoardIdFieldNumber = 1, + kMaxFieldNumber = 3, + kIncludeSelfFieldNumber = 2, + kWithCommentFieldNumber = 4, + kWithGameInfoFieldNumber = 5, + }; + // uint32 boardId = 1; + void clear_boardid() ; + ::uint32_t boardid() const; + void set_boardid(::uint32_t value); + + private: + ::uint32_t _internal_boardid() const; + void _internal_set_boardid(::uint32_t value); + + public: + // uint32 max = 3; + void clear_max() ; + ::uint32_t max() const; + void set_max(::uint32_t value); + + private: + ::uint32_t _internal_max() const; + void _internal_set_max(::uint32_t value); + + public: + // bool include_self = 2; + void clear_include_self() ; + bool include_self() const; + void set_include_self(bool value); + + private: + bool _internal_include_self() const; + void _internal_set_include_self(bool value); + + public: + // bool withComment = 4; + void clear_withcomment() ; + bool withcomment() const; + void set_withcomment(bool value); + + private: + bool _internal_withcomment() const; + void _internal_set_withcomment(bool value); + + public: + // bool withGameInfo = 5; + void clear_withgameinfo() ; + bool withgameinfo() const; + void set_withgameinfo(bool value); + + private: + bool _internal_withgameinfo() const; + void _internal_set_withgameinfo(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GetScoreFriendsRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetScoreFriendsRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t boardid_; + ::uint32_t max_; + bool include_self_; + bool withcomment_; + bool withgameinfo_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<35> GetScoreFriendsRequest_class_data_; +// ------------------------------------------------------------------- + +class BoardInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.BoardInfo) */ { + public: + inline BoardInfo() : BoardInfo(nullptr) {} + ~BoardInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(BoardInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(BoardInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR BoardInfo(::google::protobuf::internal::ConstantInitialized); + + inline BoardInfo(const BoardInfo& from) : BoardInfo(nullptr, from) {} + inline BoardInfo(BoardInfo&& from) noexcept + : BoardInfo(nullptr, ::std::move(from)) {} + inline BoardInfo& operator=(const BoardInfo& from) { + CopyFrom(from); + return *this; + } + inline BoardInfo& operator=(BoardInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const BoardInfo& default_instance() { + return *reinterpret_cast( + &_BoardInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 44; + friend void swap(BoardInfo& a, BoardInfo& b) { a.Swap(&b); } + inline void Swap(BoardInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(BoardInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + BoardInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const BoardInfo& from); + void MergeFrom(const BoardInfo& from) { BoardInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(BoardInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.BoardInfo"; } + + explicit BoardInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + BoardInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const BoardInfo& from); + BoardInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, BoardInfo&& from) noexcept + : BoardInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRankLimitFieldNumber = 1, + kUpdateModeFieldNumber = 2, + kSortModeFieldNumber = 3, + kUploadNumLimitFieldNumber = 4, + kUploadSizeLimitFieldNumber = 5, + }; + // uint32 rankLimit = 1; + void clear_ranklimit() ; + ::uint32_t ranklimit() const; + void set_ranklimit(::uint32_t value); + + private: + ::uint32_t _internal_ranklimit() const; + void _internal_set_ranklimit(::uint32_t value); + + public: + // uint32 updateMode = 2; + void clear_updatemode() ; + ::uint32_t updatemode() const; + void set_updatemode(::uint32_t value); + + private: + ::uint32_t _internal_updatemode() const; + void _internal_set_updatemode(::uint32_t value); + + public: + // uint32 sortMode = 3; + void clear_sortmode() ; + ::uint32_t sortmode() const; + void set_sortmode(::uint32_t value); + + private: + ::uint32_t _internal_sortmode() const; + void _internal_set_sortmode(::uint32_t value); + + public: + // uint32 uploadNumLimit = 4; + void clear_uploadnumlimit() ; + ::uint32_t uploadnumlimit() const; + void set_uploadnumlimit(::uint32_t value); + + private: + ::uint32_t _internal_uploadnumlimit() const; + void _internal_set_uploadnumlimit(::uint32_t value); + + public: + // uint32 uploadSizeLimit = 5; + void clear_uploadsizelimit() ; + ::uint32_t uploadsizelimit() const; + void set_uploadsizelimit(::uint32_t value); + + private: + ::uint32_t _internal_uploadsizelimit() const; + void _internal_set_uploadsizelimit(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.BoardInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 0, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const BoardInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::uint32_t ranklimit_; + ::uint32_t updatemode_; + ::uint32_t sortmode_; + ::uint32_t uploadnumlimit_; + ::uint32_t uploadsizelimit_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<22> BoardInfo_class_data_; +// ------------------------------------------------------------------- + +class TusVarResponse final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusVarResponse) */ { + public: + inline TusVarResponse() : TusVarResponse(nullptr) {} + ~TusVarResponse() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusVarResponse* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusVarResponse)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusVarResponse(::google::protobuf::internal::ConstantInitialized); + + inline TusVarResponse(const TusVarResponse& from) : TusVarResponse(nullptr, from) {} + inline TusVarResponse(TusVarResponse&& from) noexcept + : TusVarResponse(nullptr, ::std::move(from)) {} + inline TusVarResponse& operator=(const TusVarResponse& from) { + CopyFrom(from); + return *this; + } + inline TusVarResponse& operator=(TusVarResponse&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusVarResponse& default_instance() { + return *reinterpret_cast( + &_TusVarResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = 57; + friend void swap(TusVarResponse& a, TusVarResponse& b) { a.Swap(&b); } + inline void Swap(TusVarResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusVarResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusVarResponse* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusVarResponse& from); + void MergeFrom(const TusVarResponse& from) { TusVarResponse::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusVarResponse* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusVarResponse"; } + + explicit TusVarResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusVarResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusVarResponse& from); + TusVarResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusVarResponse&& from) noexcept + : TusVarResponse(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kVarsFieldNumber = 1, + }; + // repeated .np2_structs.TusVariable vars = 1; + int vars_size() const; + private: + int _internal_vars_size() const; + + public: + void clear_vars() ; + ::np2_structs::TusVariable* PROTOBUF_NONNULL mutable_vars(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::TusVariable>* PROTOBUF_NONNULL mutable_vars(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::TusVariable>& _internal_vars() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::TusVariable>* PROTOBUF_NONNULL _internal_mutable_vars(); + public: + const ::np2_structs::TusVariable& vars(int index) const; + ::np2_structs::TusVariable* PROTOBUF_NONNULL add_vars(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::TusVariable>& vars() const; + // @@protoc_insertion_point(class_scope:np2_structs.TusVarResponse) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<0, 1, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusVarResponse& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::TusVariable > vars_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<27> TusVarResponse_class_data_; +// ------------------------------------------------------------------- + +class TusTryAndSetVariableRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusTryAndSetVariableRequest) */ { + public: + inline TusTryAndSetVariableRequest() : TusTryAndSetVariableRequest(nullptr) {} + ~TusTryAndSetVariableRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusTryAndSetVariableRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusTryAndSetVariableRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusTryAndSetVariableRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusTryAndSetVariableRequest(const TusTryAndSetVariableRequest& from) : TusTryAndSetVariableRequest(nullptr, from) {} + inline TusTryAndSetVariableRequest(TusTryAndSetVariableRequest&& from) noexcept + : TusTryAndSetVariableRequest(nullptr, ::std::move(from)) {} + inline TusTryAndSetVariableRequest& operator=(const TusTryAndSetVariableRequest& from) { + CopyFrom(from); + return *this; + } + inline TusTryAndSetVariableRequest& operator=(TusTryAndSetVariableRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusTryAndSetVariableRequest& default_instance() { + return *reinterpret_cast( + &_TusTryAndSetVariableRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 63; + friend void swap(TusTryAndSetVariableRequest& a, TusTryAndSetVariableRequest& b) { a.Swap(&b); } + inline void Swap(TusTryAndSetVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusTryAndSetVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusTryAndSetVariableRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusTryAndSetVariableRequest& from); + void MergeFrom(const TusTryAndSetVariableRequest& from) { TusTryAndSetVariableRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusTryAndSetVariableRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusTryAndSetVariableRequest"; } + + explicit TusTryAndSetVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusTryAndSetVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusTryAndSetVariableRequest& from); + TusTryAndSetVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusTryAndSetVariableRequest&& from) noexcept + : TusTryAndSetVariableRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kIsLastChangedDateFieldNumber = 5, + kCompareValueFieldNumber = 7, + kIsLastChangedAuthorIdFieldNumber = 6, + kUserFieldNumber = 1, + kSlotIdFieldNumber = 2, + kOpeTypeFieldNumber = 3, + kVariableFieldNumber = 4, + }; + // repeated uint64 isLastChangedDate = 5; + int islastchangeddate_size() const; + private: + int _internal_islastchangeddate_size() const; + + public: + void clear_islastchangeddate() ; + ::uint64_t islastchangeddate(int index) const; + void set_islastchangeddate(int index, ::uint64_t value); + void add_islastchangeddate(::uint64_t value); + const ::google::protobuf::RepeatedField<::uint64_t>& islastchangeddate() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL mutable_islastchangeddate(); + + private: + const ::google::protobuf::RepeatedField<::uint64_t>& _internal_islastchangeddate() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL _internal_mutable_islastchangeddate(); + + public: + // repeated int64 compareValue = 7; + int comparevalue_size() const; + private: + int _internal_comparevalue_size() const; + + public: + void clear_comparevalue() ; + ::int64_t comparevalue(int index) const; + void set_comparevalue(int index, ::int64_t value); + void add_comparevalue(::int64_t value); + const ::google::protobuf::RepeatedField<::int64_t>& comparevalue() const; + ::google::protobuf::RepeatedField<::int64_t>* PROTOBUF_NONNULL mutable_comparevalue(); + + private: + const ::google::protobuf::RepeatedField<::int64_t>& _internal_comparevalue() const; + ::google::protobuf::RepeatedField<::int64_t>* PROTOBUF_NONNULL _internal_mutable_comparevalue(); + + public: + // string isLastChangedAuthorId = 6; + void clear_islastchangedauthorid() ; + const ::std::string& islastchangedauthorid() const; + template + void set_islastchangedauthorid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_islastchangedauthorid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_islastchangedauthorid(); + void set_allocated_islastchangedauthorid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_islastchangedauthorid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_islastchangedauthorid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_islastchangedauthorid(); + + public: + // .np2_structs.TusUser user = 1; + bool has_user() const; + void clear_user() ; + const ::np2_structs::TusUser& user() const; + [[nodiscard]] ::np2_structs::TusUser* PROTOBUF_NULLABLE release_user(); + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_user(); + void set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + ::np2_structs::TusUser* PROTOBUF_NULLABLE unsafe_arena_release_user(); + + private: + const ::np2_structs::TusUser& _internal_user() const; + ::np2_structs::TusUser* PROTOBUF_NONNULL _internal_mutable_user(); + + public: + // int32 slotId = 2; + void clear_slotid() ; + ::int32_t slotid() const; + void set_slotid(::int32_t value); + + private: + ::int32_t _internal_slotid() const; + void _internal_set_slotid(::int32_t value); + + public: + // int32 opeType = 3; + void clear_opetype() ; + ::int32_t opetype() const; + void set_opetype(::int32_t value); + + private: + ::int32_t _internal_opetype() const; + void _internal_set_opetype(::int32_t value); + + public: + // int64 variable = 4; + void clear_variable() ; + ::int64_t variable() const; + void set_variable(::int64_t value); + + private: + ::int64_t _internal_variable() const; + void _internal_set_variable(::int64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusTryAndSetVariableRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 7, + 1, 69, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusTryAndSetVariableRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedField<::uint64_t> islastchangeddate_; + ::google::protobuf::internal::CachedSize _islastchangeddate_cached_byte_size_; + ::google::protobuf::RepeatedField<::int64_t> comparevalue_; + ::google::protobuf::internal::CachedSize _comparevalue_cached_byte_size_; + ::google::protobuf::internal::ArenaStringPtr islastchangedauthorid_; + ::np2_structs::TusUser* PROTOBUF_NULLABLE user_; + ::int32_t slotid_; + ::int32_t opetype_; + ::int64_t variable_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<40> TusTryAndSetVariableRequest_class_data_; +// ------------------------------------------------------------------- + +class TusSetMultiSlotVariableRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusSetMultiSlotVariableRequest) */ { + public: + inline TusSetMultiSlotVariableRequest() : TusSetMultiSlotVariableRequest(nullptr) {} + ~TusSetMultiSlotVariableRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusSetMultiSlotVariableRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusSetMultiSlotVariableRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusSetMultiSlotVariableRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusSetMultiSlotVariableRequest(const TusSetMultiSlotVariableRequest& from) : TusSetMultiSlotVariableRequest(nullptr, from) {} + inline TusSetMultiSlotVariableRequest(TusSetMultiSlotVariableRequest&& from) noexcept + : TusSetMultiSlotVariableRequest(nullptr, ::std::move(from)) {} + inline TusSetMultiSlotVariableRequest& operator=(const TusSetMultiSlotVariableRequest& from) { + CopyFrom(from); + return *this; + } + inline TusSetMultiSlotVariableRequest& operator=(TusSetMultiSlotVariableRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusSetMultiSlotVariableRequest& default_instance() { + return *reinterpret_cast( + &_TusSetMultiSlotVariableRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 58; + friend void swap(TusSetMultiSlotVariableRequest& a, TusSetMultiSlotVariableRequest& b) { a.Swap(&b); } + inline void Swap(TusSetMultiSlotVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusSetMultiSlotVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusSetMultiSlotVariableRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusSetMultiSlotVariableRequest& from); + void MergeFrom(const TusSetMultiSlotVariableRequest& from) { TusSetMultiSlotVariableRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusSetMultiSlotVariableRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusSetMultiSlotVariableRequest"; } + + explicit TusSetMultiSlotVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusSetMultiSlotVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusSetMultiSlotVariableRequest& from); + TusSetMultiSlotVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusSetMultiSlotVariableRequest&& from) noexcept + : TusSetMultiSlotVariableRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSlotIdArrayFieldNumber = 2, + kVariableArrayFieldNumber = 3, + kUserFieldNumber = 1, + }; + // repeated int32 slotIdArray = 2; + int slotidarray_size() const; + private: + int _internal_slotidarray_size() const; + + public: + void clear_slotidarray() ; + ::int32_t slotidarray(int index) const; + void set_slotidarray(int index, ::int32_t value); + void add_slotidarray(::int32_t value); + const ::google::protobuf::RepeatedField<::int32_t>& slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL mutable_slotidarray(); + + private: + const ::google::protobuf::RepeatedField<::int32_t>& _internal_slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL _internal_mutable_slotidarray(); + + public: + // repeated int64 variableArray = 3; + int variablearray_size() const; + private: + int _internal_variablearray_size() const; + + public: + void clear_variablearray() ; + ::int64_t variablearray(int index) const; + void set_variablearray(int index, ::int64_t value); + void add_variablearray(::int64_t value); + const ::google::protobuf::RepeatedField<::int64_t>& variablearray() const; + ::google::protobuf::RepeatedField<::int64_t>* PROTOBUF_NONNULL mutable_variablearray(); + + private: + const ::google::protobuf::RepeatedField<::int64_t>& _internal_variablearray() const; + ::google::protobuf::RepeatedField<::int64_t>* PROTOBUF_NONNULL _internal_mutable_variablearray(); + + public: + // .np2_structs.TusUser user = 1; + bool has_user() const; + void clear_user() ; + const ::np2_structs::TusUser& user() const; + [[nodiscard]] ::np2_structs::TusUser* PROTOBUF_NULLABLE release_user(); + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_user(); + void set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + ::np2_structs::TusUser* PROTOBUF_NULLABLE unsafe_arena_release_user(); + + private: + const ::np2_structs::TusUser& _internal_user() const; + ::np2_structs::TusUser* PROTOBUF_NONNULL _internal_mutable_user(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusSetMultiSlotVariableRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusSetMultiSlotVariableRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedField<::int32_t> slotidarray_; + ::google::protobuf::internal::CachedSize _slotidarray_cached_byte_size_; + ::google::protobuf::RepeatedField<::int64_t> variablearray_; + ::google::protobuf::internal::CachedSize _variablearray_cached_byte_size_; + ::np2_structs::TusUser* PROTOBUF_NULLABLE user_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<43> TusSetMultiSlotVariableRequest_class_data_; +// ------------------------------------------------------------------- + +class TusSetDataRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusSetDataRequest) */ { + public: + inline TusSetDataRequest() : TusSetDataRequest(nullptr) {} + ~TusSetDataRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusSetDataRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusSetDataRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusSetDataRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusSetDataRequest(const TusSetDataRequest& from) : TusSetDataRequest(nullptr, from) {} + inline TusSetDataRequest(TusSetDataRequest&& from) noexcept + : TusSetDataRequest(nullptr, ::std::move(from)) {} + inline TusSetDataRequest& operator=(const TusSetDataRequest& from) { + CopyFrom(from); + return *this; + } + inline TusSetDataRequest& operator=(TusSetDataRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusSetDataRequest& default_instance() { + return *reinterpret_cast( + &_TusSetDataRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 65; + friend void swap(TusSetDataRequest& a, TusSetDataRequest& b) { a.Swap(&b); } + inline void Swap(TusSetDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusSetDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusSetDataRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusSetDataRequest& from); + void MergeFrom(const TusSetDataRequest& from) { TusSetDataRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusSetDataRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusSetDataRequest"; } + + explicit TusSetDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusSetDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusSetDataRequest& from); + TusSetDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusSetDataRequest&& from) noexcept + : TusSetDataRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kIsLastChangedDateFieldNumber = 5, + kDataFieldNumber = 3, + kInfoFieldNumber = 4, + kIsLastChangedAuthorIdFieldNumber = 6, + kUserFieldNumber = 1, + kSlotIdFieldNumber = 2, + }; + // repeated uint64 isLastChangedDate = 5; + int islastchangeddate_size() const; + private: + int _internal_islastchangeddate_size() const; + + public: + void clear_islastchangeddate() ; + ::uint64_t islastchangeddate(int index) const; + void set_islastchangeddate(int index, ::uint64_t value); + void add_islastchangeddate(::uint64_t value); + const ::google::protobuf::RepeatedField<::uint64_t>& islastchangeddate() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL mutable_islastchangeddate(); + + private: + const ::google::protobuf::RepeatedField<::uint64_t>& _internal_islastchangeddate() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL _internal_mutable_islastchangeddate(); + + public: + // bytes data = 3; + void clear_data() ; + const ::std::string& data() const; + template + void set_data(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_data(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_data(); + void set_allocated_data(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_data() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_data(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // bytes info = 4; + void clear_info() ; + const ::std::string& info() const; + template + void set_info(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_info(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_info(); + void set_allocated_info(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_info() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_info(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_info(); + + public: + // string isLastChangedAuthorId = 6; + void clear_islastchangedauthorid() ; + const ::std::string& islastchangedauthorid() const; + template + void set_islastchangedauthorid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_islastchangedauthorid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_islastchangedauthorid(); + void set_allocated_islastchangedauthorid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_islastchangedauthorid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_islastchangedauthorid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_islastchangedauthorid(); + + public: + // .np2_structs.TusUser user = 1; + bool has_user() const; + void clear_user() ; + const ::np2_structs::TusUser& user() const; + [[nodiscard]] ::np2_structs::TusUser* PROTOBUF_NULLABLE release_user(); + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_user(); + void set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + ::np2_structs::TusUser* PROTOBUF_NULLABLE unsafe_arena_release_user(); + + private: + const ::np2_structs::TusUser& _internal_user() const; + ::np2_structs::TusUser* PROTOBUF_NONNULL _internal_mutable_user(); + + public: + // int32 slotId = 2; + void clear_slotid() ; + ::int32_t slotid() const; + void set_slotid(::int32_t value); + + private: + ::int32_t _internal_slotid() const; + void _internal_set_slotid(::int32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusSetDataRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 6, + 1, 59, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusSetDataRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedField<::uint64_t> islastchangeddate_; + ::google::protobuf::internal::CachedSize _islastchangeddate_cached_byte_size_; + ::google::protobuf::internal::ArenaStringPtr data_; + ::google::protobuf::internal::ArenaStringPtr info_; + ::google::protobuf::internal::ArenaStringPtr islastchangedauthorid_; + ::np2_structs::TusUser* PROTOBUF_NULLABLE user_; + ::int32_t slotid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<30> TusSetDataRequest_class_data_; +// ------------------------------------------------------------------- + +class TusGetMultiUserVariableRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusGetMultiUserVariableRequest) */ { + public: + inline TusGetMultiUserVariableRequest() : TusGetMultiUserVariableRequest(nullptr) {} + ~TusGetMultiUserVariableRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusGetMultiUserVariableRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusGetMultiUserVariableRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusGetMultiUserVariableRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusGetMultiUserVariableRequest(const TusGetMultiUserVariableRequest& from) : TusGetMultiUserVariableRequest(nullptr, from) {} + inline TusGetMultiUserVariableRequest(TusGetMultiUserVariableRequest&& from) noexcept + : TusGetMultiUserVariableRequest(nullptr, ::std::move(from)) {} + inline TusGetMultiUserVariableRequest& operator=(const TusGetMultiUserVariableRequest& from) { + CopyFrom(from); + return *this; + } + inline TusGetMultiUserVariableRequest& operator=(TusGetMultiUserVariableRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusGetMultiUserVariableRequest& default_instance() { + return *reinterpret_cast( + &_TusGetMultiUserVariableRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 60; + friend void swap(TusGetMultiUserVariableRequest& a, TusGetMultiUserVariableRequest& b) { a.Swap(&b); } + inline void Swap(TusGetMultiUserVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusGetMultiUserVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusGetMultiUserVariableRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusGetMultiUserVariableRequest& from); + void MergeFrom(const TusGetMultiUserVariableRequest& from) { TusGetMultiUserVariableRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusGetMultiUserVariableRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusGetMultiUserVariableRequest"; } + + explicit TusGetMultiUserVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusGetMultiUserVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusGetMultiUserVariableRequest& from); + TusGetMultiUserVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusGetMultiUserVariableRequest&& from) noexcept + : TusGetMultiUserVariableRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kUsersFieldNumber = 1, + kSlotIdFieldNumber = 2, + }; + // repeated .np2_structs.TusUser users = 1; + int users_size() const; + private: + int _internal_users_size() const; + + public: + void clear_users() ; + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_users(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>* PROTOBUF_NONNULL mutable_users(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>& _internal_users() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>* PROTOBUF_NONNULL _internal_mutable_users(); + public: + const ::np2_structs::TusUser& users(int index) const; + ::np2_structs::TusUser* PROTOBUF_NONNULL add_users(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>& users() const; + // int32 slotId = 2; + void clear_slotid() ; + ::int32_t slotid() const; + void set_slotid(::int32_t value); + + private: + ::int32_t _internal_slotid() const; + void _internal_set_slotid(::int32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusGetMultiUserVariableRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusGetMultiUserVariableRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::TusUser > users_; + ::int32_t slotid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<43> TusGetMultiUserVariableRequest_class_data_; +// ------------------------------------------------------------------- + +class TusGetMultiUserDataStatusRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusGetMultiUserDataStatusRequest) */ { + public: + inline TusGetMultiUserDataStatusRequest() : TusGetMultiUserDataStatusRequest(nullptr) {} + ~TusGetMultiUserDataStatusRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusGetMultiUserDataStatusRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusGetMultiUserDataStatusRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusGetMultiUserDataStatusRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusGetMultiUserDataStatusRequest(const TusGetMultiUserDataStatusRequest& from) : TusGetMultiUserDataStatusRequest(nullptr, from) {} + inline TusGetMultiUserDataStatusRequest(TusGetMultiUserDataStatusRequest&& from) noexcept + : TusGetMultiUserDataStatusRequest(nullptr, ::std::move(from)) {} + inline TusGetMultiUserDataStatusRequest& operator=(const TusGetMultiUserDataStatusRequest& from) { + CopyFrom(from); + return *this; + } + inline TusGetMultiUserDataStatusRequest& operator=(TusGetMultiUserDataStatusRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusGetMultiUserDataStatusRequest& default_instance() { + return *reinterpret_cast( + &_TusGetMultiUserDataStatusRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 71; + friend void swap(TusGetMultiUserDataStatusRequest& a, TusGetMultiUserDataStatusRequest& b) { a.Swap(&b); } + inline void Swap(TusGetMultiUserDataStatusRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusGetMultiUserDataStatusRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusGetMultiUserDataStatusRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusGetMultiUserDataStatusRequest& from); + void MergeFrom(const TusGetMultiUserDataStatusRequest& from) { TusGetMultiUserDataStatusRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusGetMultiUserDataStatusRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusGetMultiUserDataStatusRequest"; } + + explicit TusGetMultiUserDataStatusRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusGetMultiUserDataStatusRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusGetMultiUserDataStatusRequest& from); + TusGetMultiUserDataStatusRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusGetMultiUserDataStatusRequest&& from) noexcept + : TusGetMultiUserDataStatusRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kUsersFieldNumber = 1, + kSlotIdFieldNumber = 2, + }; + // repeated .np2_structs.TusUser users = 1; + int users_size() const; + private: + int _internal_users_size() const; + + public: + void clear_users() ; + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_users(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>* PROTOBUF_NONNULL mutable_users(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>& _internal_users() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>* PROTOBUF_NONNULL _internal_mutable_users(); + public: + const ::np2_structs::TusUser& users(int index) const; + ::np2_structs::TusUser* PROTOBUF_NONNULL add_users(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>& users() const; + // int32 slotId = 2; + void clear_slotid() ; + ::int32_t slotid() const; + void set_slotid(::int32_t value); + + private: + ::int32_t _internal_slotid() const; + void _internal_set_slotid(::int32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusGetMultiUserDataStatusRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusGetMultiUserDataStatusRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::TusUser > users_; + ::int32_t slotid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<45> TusGetMultiUserDataStatusRequest_class_data_; +// ------------------------------------------------------------------- + +class TusGetMultiSlotVariableRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusGetMultiSlotVariableRequest) */ { + public: + inline TusGetMultiSlotVariableRequest() : TusGetMultiSlotVariableRequest(nullptr) {} + ~TusGetMultiSlotVariableRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusGetMultiSlotVariableRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusGetMultiSlotVariableRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusGetMultiSlotVariableRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusGetMultiSlotVariableRequest(const TusGetMultiSlotVariableRequest& from) : TusGetMultiSlotVariableRequest(nullptr, from) {} + inline TusGetMultiSlotVariableRequest(TusGetMultiSlotVariableRequest&& from) noexcept + : TusGetMultiSlotVariableRequest(nullptr, ::std::move(from)) {} + inline TusGetMultiSlotVariableRequest& operator=(const TusGetMultiSlotVariableRequest& from) { + CopyFrom(from); + return *this; + } + inline TusGetMultiSlotVariableRequest& operator=(TusGetMultiSlotVariableRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusGetMultiSlotVariableRequest& default_instance() { + return *reinterpret_cast( + &_TusGetMultiSlotVariableRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 59; + friend void swap(TusGetMultiSlotVariableRequest& a, TusGetMultiSlotVariableRequest& b) { a.Swap(&b); } + inline void Swap(TusGetMultiSlotVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusGetMultiSlotVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusGetMultiSlotVariableRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusGetMultiSlotVariableRequest& from); + void MergeFrom(const TusGetMultiSlotVariableRequest& from) { TusGetMultiSlotVariableRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusGetMultiSlotVariableRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusGetMultiSlotVariableRequest"; } + + explicit TusGetMultiSlotVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusGetMultiSlotVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusGetMultiSlotVariableRequest& from); + TusGetMultiSlotVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusGetMultiSlotVariableRequest&& from) noexcept + : TusGetMultiSlotVariableRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSlotIdArrayFieldNumber = 2, + kUserFieldNumber = 1, + }; + // repeated int32 slotIdArray = 2; + int slotidarray_size() const; + private: + int _internal_slotidarray_size() const; + + public: + void clear_slotidarray() ; + ::int32_t slotidarray(int index) const; + void set_slotidarray(int index, ::int32_t value); + void add_slotidarray(::int32_t value); + const ::google::protobuf::RepeatedField<::int32_t>& slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL mutable_slotidarray(); + + private: + const ::google::protobuf::RepeatedField<::int32_t>& _internal_slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL _internal_mutable_slotidarray(); + + public: + // .np2_structs.TusUser user = 1; + bool has_user() const; + void clear_user() ; + const ::np2_structs::TusUser& user() const; + [[nodiscard]] ::np2_structs::TusUser* PROTOBUF_NULLABLE release_user(); + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_user(); + void set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + ::np2_structs::TusUser* PROTOBUF_NULLABLE unsafe_arena_release_user(); + + private: + const ::np2_structs::TusUser& _internal_user() const; + ::np2_structs::TusUser* PROTOBUF_NONNULL _internal_mutable_user(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusGetMultiSlotVariableRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusGetMultiSlotVariableRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedField<::int32_t> slotidarray_; + ::google::protobuf::internal::CachedSize _slotidarray_cached_byte_size_; + ::np2_structs::TusUser* PROTOBUF_NULLABLE user_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<43> TusGetMultiSlotVariableRequest_class_data_; +// ------------------------------------------------------------------- + +class TusGetMultiSlotDataStatusRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusGetMultiSlotDataStatusRequest) */ { + public: + inline TusGetMultiSlotDataStatusRequest() : TusGetMultiSlotDataStatusRequest(nullptr) {} + ~TusGetMultiSlotDataStatusRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusGetMultiSlotDataStatusRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusGetMultiSlotDataStatusRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusGetMultiSlotDataStatusRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusGetMultiSlotDataStatusRequest(const TusGetMultiSlotDataStatusRequest& from) : TusGetMultiSlotDataStatusRequest(nullptr, from) {} + inline TusGetMultiSlotDataStatusRequest(TusGetMultiSlotDataStatusRequest&& from) noexcept + : TusGetMultiSlotDataStatusRequest(nullptr, ::std::move(from)) {} + inline TusGetMultiSlotDataStatusRequest& operator=(const TusGetMultiSlotDataStatusRequest& from) { + CopyFrom(from); + return *this; + } + inline TusGetMultiSlotDataStatusRequest& operator=(TusGetMultiSlotDataStatusRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusGetMultiSlotDataStatusRequest& default_instance() { + return *reinterpret_cast( + &_TusGetMultiSlotDataStatusRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 70; + friend void swap(TusGetMultiSlotDataStatusRequest& a, TusGetMultiSlotDataStatusRequest& b) { a.Swap(&b); } + inline void Swap(TusGetMultiSlotDataStatusRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusGetMultiSlotDataStatusRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusGetMultiSlotDataStatusRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusGetMultiSlotDataStatusRequest& from); + void MergeFrom(const TusGetMultiSlotDataStatusRequest& from) { TusGetMultiSlotDataStatusRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusGetMultiSlotDataStatusRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusGetMultiSlotDataStatusRequest"; } + + explicit TusGetMultiSlotDataStatusRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusGetMultiSlotDataStatusRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusGetMultiSlotDataStatusRequest& from); + TusGetMultiSlotDataStatusRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusGetMultiSlotDataStatusRequest&& from) noexcept + : TusGetMultiSlotDataStatusRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSlotIdArrayFieldNumber = 2, + kUserFieldNumber = 1, + }; + // repeated int32 slotIdArray = 2; + int slotidarray_size() const; + private: + int _internal_slotidarray_size() const; + + public: + void clear_slotidarray() ; + ::int32_t slotidarray(int index) const; + void set_slotidarray(int index, ::int32_t value); + void add_slotidarray(::int32_t value); + const ::google::protobuf::RepeatedField<::int32_t>& slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL mutable_slotidarray(); + + private: + const ::google::protobuf::RepeatedField<::int32_t>& _internal_slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL _internal_mutable_slotidarray(); + + public: + // .np2_structs.TusUser user = 1; + bool has_user() const; + void clear_user() ; + const ::np2_structs::TusUser& user() const; + [[nodiscard]] ::np2_structs::TusUser* PROTOBUF_NULLABLE release_user(); + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_user(); + void set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + ::np2_structs::TusUser* PROTOBUF_NULLABLE unsafe_arena_release_user(); + + private: + const ::np2_structs::TusUser& _internal_user() const; + ::np2_structs::TusUser* PROTOBUF_NONNULL _internal_mutable_user(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusGetMultiSlotDataStatusRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusGetMultiSlotDataStatusRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedField<::int32_t> slotidarray_; + ::google::protobuf::internal::CachedSize _slotidarray_cached_byte_size_; + ::np2_structs::TusUser* PROTOBUF_NULLABLE user_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<45> TusGetMultiSlotDataStatusRequest_class_data_; +// ------------------------------------------------------------------- + +class TusGetDataRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusGetDataRequest) */ { + public: + inline TusGetDataRequest() : TusGetDataRequest(nullptr) {} + ~TusGetDataRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusGetDataRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusGetDataRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusGetDataRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusGetDataRequest(const TusGetDataRequest& from) : TusGetDataRequest(nullptr, from) {} + inline TusGetDataRequest(TusGetDataRequest&& from) noexcept + : TusGetDataRequest(nullptr, ::std::move(from)) {} + inline TusGetDataRequest& operator=(const TusGetDataRequest& from) { + CopyFrom(from); + return *this; + } + inline TusGetDataRequest& operator=(TusGetDataRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusGetDataRequest& default_instance() { + return *reinterpret_cast( + &_TusGetDataRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 69; + friend void swap(TusGetDataRequest& a, TusGetDataRequest& b) { a.Swap(&b); } + inline void Swap(TusGetDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusGetDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusGetDataRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusGetDataRequest& from); + void MergeFrom(const TusGetDataRequest& from) { TusGetDataRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusGetDataRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusGetDataRequest"; } + + explicit TusGetDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusGetDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusGetDataRequest& from); + TusGetDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusGetDataRequest&& from) noexcept + : TusGetDataRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kUserFieldNumber = 1, + kSlotIdFieldNumber = 2, + }; + // .np2_structs.TusUser user = 1; + bool has_user() const; + void clear_user() ; + const ::np2_structs::TusUser& user() const; + [[nodiscard]] ::np2_structs::TusUser* PROTOBUF_NULLABLE release_user(); + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_user(); + void set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + ::np2_structs::TusUser* PROTOBUF_NULLABLE unsafe_arena_release_user(); + + private: + const ::np2_structs::TusUser& _internal_user() const; + ::np2_structs::TusUser* PROTOBUF_NONNULL _internal_mutable_user(); + + public: + // int32 slotId = 2; + void clear_slotid() ; + ::int32_t slotid() const; + void set_slotid(::int32_t value); + + private: + ::int32_t _internal_slotid() const; + void _internal_set_slotid(::int32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusGetDataRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusGetDataRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::TusUser* PROTOBUF_NULLABLE user_; + ::int32_t slotid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<30> TusGetDataRequest_class_data_; +// ------------------------------------------------------------------- + +class TusDeleteMultiSlotVariableRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusDeleteMultiSlotVariableRequest) */ { + public: + inline TusDeleteMultiSlotVariableRequest() : TusDeleteMultiSlotVariableRequest(nullptr) {} + ~TusDeleteMultiSlotVariableRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusDeleteMultiSlotVariableRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusDeleteMultiSlotVariableRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusDeleteMultiSlotVariableRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusDeleteMultiSlotVariableRequest(const TusDeleteMultiSlotVariableRequest& from) : TusDeleteMultiSlotVariableRequest(nullptr, from) {} + inline TusDeleteMultiSlotVariableRequest(TusDeleteMultiSlotVariableRequest&& from) noexcept + : TusDeleteMultiSlotVariableRequest(nullptr, ::std::move(from)) {} + inline TusDeleteMultiSlotVariableRequest& operator=(const TusDeleteMultiSlotVariableRequest& from) { + CopyFrom(from); + return *this; + } + inline TusDeleteMultiSlotVariableRequest& operator=(TusDeleteMultiSlotVariableRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusDeleteMultiSlotVariableRequest& default_instance() { + return *reinterpret_cast( + &_TusDeleteMultiSlotVariableRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 64; + friend void swap(TusDeleteMultiSlotVariableRequest& a, TusDeleteMultiSlotVariableRequest& b) { a.Swap(&b); } + inline void Swap(TusDeleteMultiSlotVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusDeleteMultiSlotVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusDeleteMultiSlotVariableRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusDeleteMultiSlotVariableRequest& from); + void MergeFrom(const TusDeleteMultiSlotVariableRequest& from) { TusDeleteMultiSlotVariableRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusDeleteMultiSlotVariableRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusDeleteMultiSlotVariableRequest"; } + + explicit TusDeleteMultiSlotVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusDeleteMultiSlotVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusDeleteMultiSlotVariableRequest& from); + TusDeleteMultiSlotVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusDeleteMultiSlotVariableRequest&& from) noexcept + : TusDeleteMultiSlotVariableRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSlotIdArrayFieldNumber = 2, + kUserFieldNumber = 1, + }; + // repeated int32 slotIdArray = 2; + int slotidarray_size() const; + private: + int _internal_slotidarray_size() const; + + public: + void clear_slotidarray() ; + ::int32_t slotidarray(int index) const; + void set_slotidarray(int index, ::int32_t value); + void add_slotidarray(::int32_t value); + const ::google::protobuf::RepeatedField<::int32_t>& slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL mutable_slotidarray(); + + private: + const ::google::protobuf::RepeatedField<::int32_t>& _internal_slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL _internal_mutable_slotidarray(); + + public: + // .np2_structs.TusUser user = 1; + bool has_user() const; + void clear_user() ; + const ::np2_structs::TusUser& user() const; + [[nodiscard]] ::np2_structs::TusUser* PROTOBUF_NULLABLE release_user(); + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_user(); + void set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + ::np2_structs::TusUser* PROTOBUF_NULLABLE unsafe_arena_release_user(); + + private: + const ::np2_structs::TusUser& _internal_user() const; + ::np2_structs::TusUser* PROTOBUF_NONNULL _internal_mutable_user(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusDeleteMultiSlotVariableRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusDeleteMultiSlotVariableRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedField<::int32_t> slotidarray_; + ::google::protobuf::internal::CachedSize _slotidarray_cached_byte_size_; + ::np2_structs::TusUser* PROTOBUF_NULLABLE user_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<46> TusDeleteMultiSlotVariableRequest_class_data_; +// ------------------------------------------------------------------- + +class TusDeleteMultiSlotDataRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusDeleteMultiSlotDataRequest) */ { + public: + inline TusDeleteMultiSlotDataRequest() : TusDeleteMultiSlotDataRequest(nullptr) {} + ~TusDeleteMultiSlotDataRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusDeleteMultiSlotDataRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusDeleteMultiSlotDataRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusDeleteMultiSlotDataRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusDeleteMultiSlotDataRequest(const TusDeleteMultiSlotDataRequest& from) : TusDeleteMultiSlotDataRequest(nullptr, from) {} + inline TusDeleteMultiSlotDataRequest(TusDeleteMultiSlotDataRequest&& from) noexcept + : TusDeleteMultiSlotDataRequest(nullptr, ::std::move(from)) {} + inline TusDeleteMultiSlotDataRequest& operator=(const TusDeleteMultiSlotDataRequest& from) { + CopyFrom(from); + return *this; + } + inline TusDeleteMultiSlotDataRequest& operator=(TusDeleteMultiSlotDataRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusDeleteMultiSlotDataRequest& default_instance() { + return *reinterpret_cast( + &_TusDeleteMultiSlotDataRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 73; + friend void swap(TusDeleteMultiSlotDataRequest& a, TusDeleteMultiSlotDataRequest& b) { a.Swap(&b); } + inline void Swap(TusDeleteMultiSlotDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusDeleteMultiSlotDataRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusDeleteMultiSlotDataRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusDeleteMultiSlotDataRequest& from); + void MergeFrom(const TusDeleteMultiSlotDataRequest& from) { TusDeleteMultiSlotDataRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusDeleteMultiSlotDataRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusDeleteMultiSlotDataRequest"; } + + explicit TusDeleteMultiSlotDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusDeleteMultiSlotDataRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusDeleteMultiSlotDataRequest& from); + TusDeleteMultiSlotDataRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusDeleteMultiSlotDataRequest&& from) noexcept + : TusDeleteMultiSlotDataRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSlotIdArrayFieldNumber = 2, + kUserFieldNumber = 1, + }; + // repeated int32 slotIdArray = 2; + int slotidarray_size() const; + private: + int _internal_slotidarray_size() const; + + public: + void clear_slotidarray() ; + ::int32_t slotidarray(int index) const; + void set_slotidarray(int index, ::int32_t value); + void add_slotidarray(::int32_t value); + const ::google::protobuf::RepeatedField<::int32_t>& slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL mutable_slotidarray(); + + private: + const ::google::protobuf::RepeatedField<::int32_t>& _internal_slotidarray() const; + ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL _internal_mutable_slotidarray(); + + public: + // .np2_structs.TusUser user = 1; + bool has_user() const; + void clear_user() ; + const ::np2_structs::TusUser& user() const; + [[nodiscard]] ::np2_structs::TusUser* PROTOBUF_NULLABLE release_user(); + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_user(); + void set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + ::np2_structs::TusUser* PROTOBUF_NULLABLE unsafe_arena_release_user(); + + private: + const ::np2_structs::TusUser& _internal_user() const; + ::np2_structs::TusUser* PROTOBUF_NONNULL _internal_mutable_user(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusDeleteMultiSlotDataRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusDeleteMultiSlotDataRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedField<::int32_t> slotidarray_; + ::google::protobuf::internal::CachedSize _slotidarray_cached_byte_size_; + ::np2_structs::TusUser* PROTOBUF_NULLABLE user_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<42> TusDeleteMultiSlotDataRequest_class_data_; +// ------------------------------------------------------------------- + +class TusDataStatusResponse final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusDataStatusResponse) */ { + public: + inline TusDataStatusResponse() : TusDataStatusResponse(nullptr) {} + ~TusDataStatusResponse() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusDataStatusResponse* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusDataStatusResponse)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusDataStatusResponse(::google::protobuf::internal::ConstantInitialized); + + inline TusDataStatusResponse(const TusDataStatusResponse& from) : TusDataStatusResponse(nullptr, from) {} + inline TusDataStatusResponse(TusDataStatusResponse&& from) noexcept + : TusDataStatusResponse(nullptr, ::std::move(from)) {} + inline TusDataStatusResponse& operator=(const TusDataStatusResponse& from) { + CopyFrom(from); + return *this; + } + inline TusDataStatusResponse& operator=(TusDataStatusResponse&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusDataStatusResponse& default_instance() { + return *reinterpret_cast( + &_TusDataStatusResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = 68; + friend void swap(TusDataStatusResponse& a, TusDataStatusResponse& b) { a.Swap(&b); } + inline void Swap(TusDataStatusResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusDataStatusResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusDataStatusResponse* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusDataStatusResponse& from); + void MergeFrom(const TusDataStatusResponse& from) { TusDataStatusResponse::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusDataStatusResponse* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusDataStatusResponse"; } + + explicit TusDataStatusResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusDataStatusResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusDataStatusResponse& from); + TusDataStatusResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusDataStatusResponse&& from) noexcept + : TusDataStatusResponse(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kStatusFieldNumber = 1, + }; + // repeated .np2_structs.TusDataStatus status = 1; + int status_size() const; + private: + int _internal_status_size() const; + + public: + void clear_status() ; + ::np2_structs::TusDataStatus* PROTOBUF_NONNULL mutable_status(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::TusDataStatus>* PROTOBUF_NONNULL mutable_status(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::TusDataStatus>& _internal_status() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::TusDataStatus>* PROTOBUF_NONNULL _internal_mutable_status(); + public: + const ::np2_structs::TusDataStatus& status(int index) const; + ::np2_structs::TusDataStatus* PROTOBUF_NONNULL add_status(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::TusDataStatus>& status() const; + // @@protoc_insertion_point(class_scope:np2_structs.TusDataStatusResponse) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<0, 1, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusDataStatusResponse& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::TusDataStatus > status_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<34> TusDataStatusResponse_class_data_; +// ------------------------------------------------------------------- + +class TusData final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusData) */ { + public: + inline TusData() : TusData(nullptr) {} + ~TusData() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusData* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusData)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusData(::google::protobuf::internal::ConstantInitialized); + + inline TusData(const TusData& from) : TusData(nullptr, from) {} + inline TusData(TusData&& from) noexcept + : TusData(nullptr, ::std::move(from)) {} + inline TusData& operator=(const TusData& from) { + CopyFrom(from); + return *this; + } + inline TusData& operator=(TusData&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusData& default_instance() { + return *reinterpret_cast( + &_TusData_default_instance_); + } + static constexpr int kIndexInFileMessages = 67; + friend void swap(TusData& a, TusData& b) { a.Swap(&b); } + inline void Swap(TusData* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusData* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusData* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusData& from); + void MergeFrom(const TusData& from) { TusData::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusData* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusData"; } + + explicit TusData(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusData(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusData& from); + TusData( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusData&& from) noexcept + : TusData(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kDataFieldNumber = 2, + kStatusFieldNumber = 1, + }; + // bytes data = 2; + void clear_data() ; + const ::std::string& data() const; + template + void set_data(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_data(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_data(); + void set_allocated_data(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_data() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_data(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // .np2_structs.TusDataStatus status = 1; + bool has_status() const; + void clear_status() ; + const ::np2_structs::TusDataStatus& status() const; + [[nodiscard]] ::np2_structs::TusDataStatus* PROTOBUF_NULLABLE release_status(); + ::np2_structs::TusDataStatus* PROTOBUF_NONNULL mutable_status(); + void set_allocated_status(::np2_structs::TusDataStatus* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_status(::np2_structs::TusDataStatus* PROTOBUF_NULLABLE value); + ::np2_structs::TusDataStatus* PROTOBUF_NULLABLE unsafe_arena_release_status(); + + private: + const ::np2_structs::TusDataStatus& _internal_status() const; + ::np2_structs::TusDataStatus* PROTOBUF_NONNULL _internal_mutable_status(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusData) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusData& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr data_; + ::np2_structs::TusDataStatus* PROTOBUF_NULLABLE status_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<20> TusData_class_data_; +// ------------------------------------------------------------------- + +class TusAddAndGetVariableRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.TusAddAndGetVariableRequest) */ { + public: + inline TusAddAndGetVariableRequest() : TusAddAndGetVariableRequest(nullptr) {} + ~TusAddAndGetVariableRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(TusAddAndGetVariableRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(TusAddAndGetVariableRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR TusAddAndGetVariableRequest(::google::protobuf::internal::ConstantInitialized); + + inline TusAddAndGetVariableRequest(const TusAddAndGetVariableRequest& from) : TusAddAndGetVariableRequest(nullptr, from) {} + inline TusAddAndGetVariableRequest(TusAddAndGetVariableRequest&& from) noexcept + : TusAddAndGetVariableRequest(nullptr, ::std::move(from)) {} + inline TusAddAndGetVariableRequest& operator=(const TusAddAndGetVariableRequest& from) { + CopyFrom(from); + return *this; + } + inline TusAddAndGetVariableRequest& operator=(TusAddAndGetVariableRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const TusAddAndGetVariableRequest& default_instance() { + return *reinterpret_cast( + &_TusAddAndGetVariableRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 62; + friend void swap(TusAddAndGetVariableRequest& a, TusAddAndGetVariableRequest& b) { a.Swap(&b); } + inline void Swap(TusAddAndGetVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(TusAddAndGetVariableRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + TusAddAndGetVariableRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const TusAddAndGetVariableRequest& from); + void MergeFrom(const TusAddAndGetVariableRequest& from) { TusAddAndGetVariableRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(TusAddAndGetVariableRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.TusAddAndGetVariableRequest"; } + + explicit TusAddAndGetVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + TusAddAndGetVariableRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const TusAddAndGetVariableRequest& from); + TusAddAndGetVariableRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, TusAddAndGetVariableRequest&& from) noexcept + : TusAddAndGetVariableRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kIsLastChangedDateFieldNumber = 4, + kIsLastChangedAuthorIdFieldNumber = 5, + kUserFieldNumber = 1, + kInVariableFieldNumber = 3, + kSlotIdFieldNumber = 2, + }; + // repeated uint64 isLastChangedDate = 4; + int islastchangeddate_size() const; + private: + int _internal_islastchangeddate_size() const; + + public: + void clear_islastchangeddate() ; + ::uint64_t islastchangeddate(int index) const; + void set_islastchangeddate(int index, ::uint64_t value); + void add_islastchangeddate(::uint64_t value); + const ::google::protobuf::RepeatedField<::uint64_t>& islastchangeddate() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL mutable_islastchangeddate(); + + private: + const ::google::protobuf::RepeatedField<::uint64_t>& _internal_islastchangeddate() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL _internal_mutable_islastchangeddate(); + + public: + // string isLastChangedAuthorId = 5; + void clear_islastchangedauthorid() ; + const ::std::string& islastchangedauthorid() const; + template + void set_islastchangedauthorid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_islastchangedauthorid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_islastchangedauthorid(); + void set_allocated_islastchangedauthorid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_islastchangedauthorid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_islastchangedauthorid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_islastchangedauthorid(); + + public: + // .np2_structs.TusUser user = 1; + bool has_user() const; + void clear_user() ; + const ::np2_structs::TusUser& user() const; + [[nodiscard]] ::np2_structs::TusUser* PROTOBUF_NULLABLE release_user(); + ::np2_structs::TusUser* PROTOBUF_NONNULL mutable_user(); + void set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value); + ::np2_structs::TusUser* PROTOBUF_NULLABLE unsafe_arena_release_user(); + + private: + const ::np2_structs::TusUser& _internal_user() const; + ::np2_structs::TusUser* PROTOBUF_NONNULL _internal_mutable_user(); + + public: + // int64 inVariable = 3; + void clear_invariable() ; + ::int64_t invariable() const; + void set_invariable(::int64_t value); + + private: + ::int64_t _internal_invariable() const; + void _internal_set_invariable(::int64_t value); + + public: + // int32 slotId = 2; + void clear_slotid() ; + ::int32_t slotid() const; + void set_slotid(::int32_t value); + + private: + ::int32_t _internal_slotid() const; + void _internal_set_slotid(::int32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.TusAddAndGetVariableRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 1, 69, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const TusAddAndGetVariableRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedField<::uint64_t> islastchangeddate_; + ::google::protobuf::internal::CachedSize _islastchangeddate_cached_byte_size_; + ::google::protobuf::internal::ArenaStringPtr islastchangedauthorid_; + ::np2_structs::TusUser* PROTOBUF_NULLABLE user_; + ::int64_t invariable_; + ::int32_t slotid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<40> TusAddAndGetVariableRequest_class_data_; +// ------------------------------------------------------------------- + +class SignalingAddr final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SignalingAddr) */ { + public: + inline SignalingAddr() : SignalingAddr(nullptr) {} + ~SignalingAddr() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SignalingAddr* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SignalingAddr)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SignalingAddr(::google::protobuf::internal::ConstantInitialized); + + inline SignalingAddr(const SignalingAddr& from) : SignalingAddr(nullptr, from) {} + inline SignalingAddr(SignalingAddr&& from) noexcept + : SignalingAddr(nullptr, ::std::move(from)) {} + inline SignalingAddr& operator=(const SignalingAddr& from) { + CopyFrom(from); + return *this; + } + inline SignalingAddr& operator=(SignalingAddr&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SignalingAddr& default_instance() { + return *reinterpret_cast( + &_SignalingAddr_default_instance_); + } + static constexpr int kIndexInFileMessages = 2; + friend void swap(SignalingAddr& a, SignalingAddr& b) { a.Swap(&b); } + inline void Swap(SignalingAddr* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SignalingAddr* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SignalingAddr* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SignalingAddr& from); + void MergeFrom(const SignalingAddr& from) { SignalingAddr::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SignalingAddr* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SignalingAddr"; } + + explicit SignalingAddr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SignalingAddr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SignalingAddr& from); + SignalingAddr( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SignalingAddr&& from) noexcept + : SignalingAddr(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kIpFieldNumber = 1, + kPortFieldNumber = 2, + }; + // bytes ip = 1; + void clear_ip() ; + const ::std::string& ip() const; + template + void set_ip(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_ip(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_ip(); + void set_allocated_ip(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_ip() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_ip(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_ip(); + + public: + // .np2_structs.uint16 port = 2; + bool has_port() const; + void clear_port() ; + const ::np2_structs::uint16& port() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_port(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_port(); + void set_allocated_port(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_port(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_port(); + + private: + const ::np2_structs::uint16& _internal_port() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_port(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SignalingAddr) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SignalingAddr& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr ip_; + ::np2_structs::uint16* PROTOBUF_NULLABLE port_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<26> SignalingAddr_class_data_; +// ------------------------------------------------------------------- + +class SendRoomMessageRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SendRoomMessageRequest) */ { + public: + inline SendRoomMessageRequest() : SendRoomMessageRequest(nullptr) {} + ~SendRoomMessageRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SendRoomMessageRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SendRoomMessageRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SendRoomMessageRequest(::google::protobuf::internal::ConstantInitialized); + + inline SendRoomMessageRequest(const SendRoomMessageRequest& from) : SendRoomMessageRequest(nullptr, from) {} + inline SendRoomMessageRequest(SendRoomMessageRequest&& from) noexcept + : SendRoomMessageRequest(nullptr, ::std::move(from)) {} + inline SendRoomMessageRequest& operator=(const SendRoomMessageRequest& from) { + CopyFrom(from); + return *this; + } + inline SendRoomMessageRequest& operator=(SendRoomMessageRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SendRoomMessageRequest& default_instance() { + return *reinterpret_cast( + &_SendRoomMessageRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 40; + friend void swap(SendRoomMessageRequest& a, SendRoomMessageRequest& b) { a.Swap(&b); } + inline void Swap(SendRoomMessageRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SendRoomMessageRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SendRoomMessageRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SendRoomMessageRequest& from); + void MergeFrom(const SendRoomMessageRequest& from) { SendRoomMessageRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SendRoomMessageRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SendRoomMessageRequest"; } + + explicit SendRoomMessageRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SendRoomMessageRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SendRoomMessageRequest& from); + SendRoomMessageRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SendRoomMessageRequest&& from) noexcept + : SendRoomMessageRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kDstFieldNumber = 3, + kMsgFieldNumber = 4, + kCastTypeFieldNumber = 2, + kOptionFieldNumber = 5, + kRoomIdFieldNumber = 1, + }; + // repeated .np2_structs.uint16 dst = 3; + int dst_size() const; + private: + int _internal_dst_size() const; + + public: + void clear_dst() ; + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_dst(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL mutable_dst(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& _internal_dst() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL _internal_mutable_dst(); + public: + const ::np2_structs::uint16& dst(int index) const; + ::np2_structs::uint16* PROTOBUF_NONNULL add_dst(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& dst() const; + // bytes msg = 4; + void clear_msg() ; + const ::std::string& msg() const; + template + void set_msg(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_msg(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_msg(); + void set_allocated_msg(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_msg() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_msg(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_msg(); + + public: + // .np2_structs.uint8 castType = 2; + bool has_casttype() const; + void clear_casttype() ; + const ::np2_structs::uint8& casttype() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_casttype(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_casttype(); + void set_allocated_casttype(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_casttype(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_casttype(); + + private: + const ::np2_structs::uint8& _internal_casttype() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_casttype(); + + public: + // .np2_structs.uint8 option = 5; + bool has_option() const; + void clear_option() ; + const ::np2_structs::uint8& option() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_option(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_option(); + void set_allocated_option(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_option(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_option(); + + private: + const ::np2_structs::uint8& _internal_option() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_option(); + + public: + // uint64 roomId = 1; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SendRoomMessageRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SendRoomMessageRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::uint16 > dst_; + ::google::protobuf::internal::ArenaStringPtr msg_; + ::np2_structs::uint8* PROTOBUF_NULLABLE casttype_; + ::np2_structs::uint8* PROTOBUF_NULLABLE option_; + ::uint64_t roomid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<35> SendRoomMessageRequest_class_data_; +// ------------------------------------------------------------------- + +class SearchJoinRoomGUIRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SearchJoinRoomGUIRequest) */ { + public: + inline SearchJoinRoomGUIRequest() : SearchJoinRoomGUIRequest(nullptr) {} + ~SearchJoinRoomGUIRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SearchJoinRoomGUIRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SearchJoinRoomGUIRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SearchJoinRoomGUIRequest(::google::protobuf::internal::ConstantInitialized); + + inline SearchJoinRoomGUIRequest(const SearchJoinRoomGUIRequest& from) : SearchJoinRoomGUIRequest(nullptr, from) {} + inline SearchJoinRoomGUIRequest(SearchJoinRoomGUIRequest&& from) noexcept + : SearchJoinRoomGUIRequest(nullptr, ::std::move(from)) {} + inline SearchJoinRoomGUIRequest& operator=(const SearchJoinRoomGUIRequest& from) { + CopyFrom(from); + return *this; + } + inline SearchJoinRoomGUIRequest& operator=(SearchJoinRoomGUIRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SearchJoinRoomGUIRequest& default_instance() { + return *reinterpret_cast( + &_SearchJoinRoomGUIRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 86; + friend void swap(SearchJoinRoomGUIRequest& a, SearchJoinRoomGUIRequest& b) { a.Swap(&b); } + inline void Swap(SearchJoinRoomGUIRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SearchJoinRoomGUIRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SearchJoinRoomGUIRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SearchJoinRoomGUIRequest& from); + void MergeFrom(const SearchJoinRoomGUIRequest& from) { SearchJoinRoomGUIRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SearchJoinRoomGUIRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SearchJoinRoomGUIRequest"; } + + explicit SearchJoinRoomGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SearchJoinRoomGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SearchJoinRoomGUIRequest& from); + SearchJoinRoomGUIRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SearchJoinRoomGUIRequest&& from) noexcept + : SearchJoinRoomGUIRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kCondsFieldNumber = 1, + kAttrsFieldNumber = 2, + }; + // repeated .np2_structs.MatchingSearchCondition conds = 1; + int conds_size() const; + private: + int _internal_conds_size() const; + + public: + void clear_conds() ; + ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL mutable_conds(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL mutable_conds(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& _internal_conds() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL _internal_mutable_conds(); + public: + const ::np2_structs::MatchingSearchCondition& conds(int index) const; + ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL add_conds(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& conds() const; + // repeated .np2_structs.MatchingAttr attrs = 2; + int attrs_size() const; + private: + int _internal_attrs_size() const; + + public: + void clear_attrs() ; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL mutable_attrs(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL mutable_attrs(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& _internal_attrs() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL _internal_mutable_attrs(); + public: + const ::np2_structs::MatchingAttr& attrs(int index) const; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL add_attrs(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& attrs() const; + // @@protoc_insertion_point(class_scope:np2_structs.SearchJoinRoomGUIRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SearchJoinRoomGUIRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::MatchingSearchCondition > conds_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::MatchingAttr > attrs_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<37> SearchJoinRoomGUIRequest_class_data_; +// ------------------------------------------------------------------- + +class RoomUpdateInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomUpdateInfo) */ { + public: + inline RoomUpdateInfo() : RoomUpdateInfo(nullptr) {} + ~RoomUpdateInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomUpdateInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomUpdateInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomUpdateInfo(::google::protobuf::internal::ConstantInitialized); + + inline RoomUpdateInfo(const RoomUpdateInfo& from) : RoomUpdateInfo(nullptr, from) {} + inline RoomUpdateInfo(RoomUpdateInfo&& from) noexcept + : RoomUpdateInfo(nullptr, ::std::move(from)) {} + inline RoomUpdateInfo& operator=(const RoomUpdateInfo& from) { + CopyFrom(from); + return *this; + } + inline RoomUpdateInfo& operator=(RoomUpdateInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomUpdateInfo& default_instance() { + return *reinterpret_cast( + &_RoomUpdateInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 36; + friend void swap(RoomUpdateInfo& a, RoomUpdateInfo& b) { a.Swap(&b); } + inline void Swap(RoomUpdateInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomUpdateInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomUpdateInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomUpdateInfo& from); + void MergeFrom(const RoomUpdateInfo& from) { RoomUpdateInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomUpdateInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomUpdateInfo"; } + + explicit RoomUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomUpdateInfo& from); + RoomUpdateInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomUpdateInfo&& from) noexcept + : RoomUpdateInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kEventCauseFieldNumber = 1, + kOptDataFieldNumber = 3, + kErrorCodeFieldNumber = 2, + }; + // .np2_structs.uint8 eventCause = 1; + bool has_eventcause() const; + void clear_eventcause() ; + const ::np2_structs::uint8& eventcause() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_eventcause(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_eventcause(); + void set_allocated_eventcause(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_eventcause(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_eventcause(); + + private: + const ::np2_structs::uint8& _internal_eventcause() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_eventcause(); + + public: + // .np2_structs.PresenceOptionData optData = 3; + bool has_optdata() const; + void clear_optdata() ; + const ::np2_structs::PresenceOptionData& optdata() const; + [[nodiscard]] ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE release_optdata(); + ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL mutable_optdata(); + void set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value); + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE unsafe_arena_release_optdata(); + + private: + const ::np2_structs::PresenceOptionData& _internal_optdata() const; + ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL _internal_mutable_optdata(); + + public: + // int32 errorCode = 2; + void clear_errorcode() ; + ::int32_t errorcode() const; + void set_errorcode(::int32_t value); + + private: + ::int32_t _internal_errorcode() const; + void _internal_set_errorcode(::int32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomUpdateInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomUpdateInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::uint8* PROTOBUF_NULLABLE eventcause_; + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE optdata_; + ::int32_t errorcode_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<27> RoomUpdateInfo_class_data_; +// ------------------------------------------------------------------- + +class RoomMessageInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomMessageInfo) */ { + public: + inline RoomMessageInfo() : RoomMessageInfo(nullptr) {} + ~RoomMessageInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomMessageInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomMessageInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomMessageInfo(::google::protobuf::internal::ConstantInitialized); + + inline RoomMessageInfo(const RoomMessageInfo& from) : RoomMessageInfo(nullptr, from) {} + inline RoomMessageInfo(RoomMessageInfo&& from) noexcept + : RoomMessageInfo(nullptr, ::std::move(from)) {} + inline RoomMessageInfo& operator=(const RoomMessageInfo& from) { + CopyFrom(from); + return *this; + } + inline RoomMessageInfo& operator=(RoomMessageInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomMessageInfo& default_instance() { + return *reinterpret_cast( + &_RoomMessageInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 41; + friend void swap(RoomMessageInfo& a, RoomMessageInfo& b) { a.Swap(&b); } + inline void Swap(RoomMessageInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomMessageInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomMessageInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomMessageInfo& from); + void MergeFrom(const RoomMessageInfo& from) { RoomMessageInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomMessageInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomMessageInfo"; } + + explicit RoomMessageInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomMessageInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomMessageInfo& from); + RoomMessageInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomMessageInfo&& from) noexcept + : RoomMessageInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kDstFieldNumber = 3, + kMsgFieldNumber = 5, + kCastTypeFieldNumber = 2, + kSrcMemberFieldNumber = 4, + kFilteredFieldNumber = 1, + }; + // repeated .np2_structs.uint16 dst = 3; + int dst_size() const; + private: + int _internal_dst_size() const; + + public: + void clear_dst() ; + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_dst(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL mutable_dst(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& _internal_dst() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL _internal_mutable_dst(); + public: + const ::np2_structs::uint16& dst(int index) const; + ::np2_structs::uint16* PROTOBUF_NONNULL add_dst(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& dst() const; + // bytes msg = 5; + void clear_msg() ; + const ::std::string& msg() const; + template + void set_msg(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_msg(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_msg(); + void set_allocated_msg(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_msg() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_msg(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_msg(); + + public: + // .np2_structs.uint8 castType = 2; + bool has_casttype() const; + void clear_casttype() ; + const ::np2_structs::uint8& casttype() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_casttype(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_casttype(); + void set_allocated_casttype(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_casttype(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_casttype(); + + private: + const ::np2_structs::uint8& _internal_casttype() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_casttype(); + + public: + // .np2_structs.UserInfo srcMember = 4; + bool has_srcmember() const; + void clear_srcmember() ; + const ::np2_structs::UserInfo& srcmember() const; + [[nodiscard]] ::np2_structs::UserInfo* PROTOBUF_NULLABLE release_srcmember(); + ::np2_structs::UserInfo* PROTOBUF_NONNULL mutable_srcmember(); + void set_allocated_srcmember(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_srcmember(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + ::np2_structs::UserInfo* PROTOBUF_NULLABLE unsafe_arena_release_srcmember(); + + private: + const ::np2_structs::UserInfo& _internal_srcmember() const; + ::np2_structs::UserInfo* PROTOBUF_NONNULL _internal_mutable_srcmember(); + + public: + // bool filtered = 1; + void clear_filtered() ; + bool filtered() const; + void set_filtered(bool value); + + private: + bool _internal_filtered() const; + void _internal_set_filtered(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomMessageInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomMessageInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::uint16 > dst_; + ::google::protobuf::internal::ArenaStringPtr msg_; + ::np2_structs::uint8* PROTOBUF_NULLABLE casttype_; + ::np2_structs::UserInfo* PROTOBUF_NULLABLE srcmember_; + bool filtered_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<28> RoomMessageInfo_class_data_; +// ------------------------------------------------------------------- + +class RoomGroupPasswordConfig final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomGroupPasswordConfig) */ { + public: + inline RoomGroupPasswordConfig() : RoomGroupPasswordConfig(nullptr) {} + ~RoomGroupPasswordConfig() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomGroupPasswordConfig* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomGroupPasswordConfig)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomGroupPasswordConfig(::google::protobuf::internal::ConstantInitialized); + + inline RoomGroupPasswordConfig(const RoomGroupPasswordConfig& from) : RoomGroupPasswordConfig(nullptr, from) {} + inline RoomGroupPasswordConfig(RoomGroupPasswordConfig&& from) noexcept + : RoomGroupPasswordConfig(nullptr, ::std::move(from)) {} + inline RoomGroupPasswordConfig& operator=(const RoomGroupPasswordConfig& from) { + CopyFrom(from); + return *this; + } + inline RoomGroupPasswordConfig& operator=(RoomGroupPasswordConfig&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomGroupPasswordConfig& default_instance() { + return *reinterpret_cast( + &_RoomGroupPasswordConfig_default_instance_); + } + static constexpr int kIndexInFileMessages = 19; + friend void swap(RoomGroupPasswordConfig& a, RoomGroupPasswordConfig& b) { a.Swap(&b); } + inline void Swap(RoomGroupPasswordConfig* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomGroupPasswordConfig* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomGroupPasswordConfig* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomGroupPasswordConfig& from); + void MergeFrom(const RoomGroupPasswordConfig& from) { RoomGroupPasswordConfig::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomGroupPasswordConfig* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomGroupPasswordConfig"; } + + explicit RoomGroupPasswordConfig(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomGroupPasswordConfig(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomGroupPasswordConfig& from); + RoomGroupPasswordConfig( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomGroupPasswordConfig&& from) noexcept + : RoomGroupPasswordConfig(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kGroupIdFieldNumber = 1, + kWithPasswordFieldNumber = 2, + }; + // .np2_structs.uint8 groupId = 1; + bool has_groupid() const; + void clear_groupid() ; + const ::np2_structs::uint8& groupid() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_groupid(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_groupid(); + void set_allocated_groupid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_groupid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_groupid(); + + private: + const ::np2_structs::uint8& _internal_groupid() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_groupid(); + + public: + // bool withPassword = 2; + void clear_withpassword() ; + bool withpassword() const; + void set_withpassword(bool value); + + private: + bool _internal_withpassword() const; + void _internal_set_withpassword(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomGroupPasswordConfig) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomGroupPasswordConfig& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::uint8* PROTOBUF_NULLABLE groupid_; + bool withpassword_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<36> RoomGroupPasswordConfig_class_data_; +// ------------------------------------------------------------------- + +class RoomGroup final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomGroup) */ { + public: + inline RoomGroup() : RoomGroup(nullptr) {} + ~RoomGroup() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomGroup* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomGroup)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomGroup(::google::protobuf::internal::ConstantInitialized); + + inline RoomGroup(const RoomGroup& from) : RoomGroup(nullptr, from) {} + inline RoomGroup(RoomGroup&& from) noexcept + : RoomGroup(nullptr, ::std::move(from)) {} + inline RoomGroup& operator=(const RoomGroup& from) { + CopyFrom(from); + return *this; + } + inline RoomGroup& operator=(RoomGroup&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomGroup& default_instance() { + return *reinterpret_cast( + &_RoomGroup_default_instance_); + } + static constexpr int kIndexInFileMessages = 13; + friend void swap(RoomGroup& a, RoomGroup& b) { a.Swap(&b); } + inline void Swap(RoomGroup* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomGroup* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomGroup* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomGroup& from); + void MergeFrom(const RoomGroup& from) { RoomGroup::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomGroup* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomGroup"; } + + explicit RoomGroup(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomGroup(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomGroup& from); + RoomGroup( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomGroup&& from) noexcept + : RoomGroup(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kLabelFieldNumber = 3, + kGroupIdFieldNumber = 1, + kWithPasswordFieldNumber = 2, + kSlotNumFieldNumber = 4, + kCurGroupMemberNumFieldNumber = 5, + }; + // bytes label = 3; + void clear_label() ; + const ::std::string& label() const; + template + void set_label(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_label(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_label(); + void set_allocated_label(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_label() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_label(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_label(); + + public: + // .np2_structs.uint8 groupId = 1; + bool has_groupid() const; + void clear_groupid() ; + const ::np2_structs::uint8& groupid() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_groupid(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_groupid(); + void set_allocated_groupid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_groupid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_groupid(); + + private: + const ::np2_structs::uint8& _internal_groupid() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_groupid(); + + public: + // bool withPassword = 2; + void clear_withpassword() ; + bool withpassword() const; + void set_withpassword(bool value); + + private: + bool _internal_withpassword() const; + void _internal_set_withpassword(bool value); + + public: + // uint32 slotNum = 4; + void clear_slotnum() ; + ::uint32_t slotnum() const; + void set_slotnum(::uint32_t value); + + private: + ::uint32_t _internal_slotnum() const; + void _internal_set_slotnum(::uint32_t value); + + public: + // uint32 curGroupMemberNum = 5; + void clear_curgroupmembernum() ; + ::uint32_t curgroupmembernum() const; + void set_curgroupmembernum(::uint32_t value); + + private: + ::uint32_t _internal_curgroupmembernum() const; + void _internal_set_curgroupmembernum(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomGroup) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomGroup& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr label_; + ::np2_structs::uint8* PROTOBUF_NULLABLE groupid_; + bool withpassword_; + ::uint32_t slotnum_; + ::uint32_t curgroupmembernum_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<22> RoomGroup_class_data_; +// ------------------------------------------------------------------- + +class QuickMatchGUIRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.QuickMatchGUIRequest) */ { + public: + inline QuickMatchGUIRequest() : QuickMatchGUIRequest(nullptr) {} + ~QuickMatchGUIRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(QuickMatchGUIRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(QuickMatchGUIRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR QuickMatchGUIRequest(::google::protobuf::internal::ConstantInitialized); + + inline QuickMatchGUIRequest(const QuickMatchGUIRequest& from) : QuickMatchGUIRequest(nullptr, from) {} + inline QuickMatchGUIRequest(QuickMatchGUIRequest&& from) noexcept + : QuickMatchGUIRequest(nullptr, ::std::move(from)) {} + inline QuickMatchGUIRequest& operator=(const QuickMatchGUIRequest& from) { + CopyFrom(from); + return *this; + } + inline QuickMatchGUIRequest& operator=(QuickMatchGUIRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const QuickMatchGUIRequest& default_instance() { + return *reinterpret_cast( + &_QuickMatchGUIRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 85; + friend void swap(QuickMatchGUIRequest& a, QuickMatchGUIRequest& b) { a.Swap(&b); } + inline void Swap(QuickMatchGUIRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(QuickMatchGUIRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + QuickMatchGUIRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const QuickMatchGUIRequest& from); + void MergeFrom(const QuickMatchGUIRequest& from) { QuickMatchGUIRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(QuickMatchGUIRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.QuickMatchGUIRequest"; } + + explicit QuickMatchGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + QuickMatchGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const QuickMatchGUIRequest& from); + QuickMatchGUIRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, QuickMatchGUIRequest&& from) noexcept + : QuickMatchGUIRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kCondsFieldNumber = 1, + kAvailableNumFieldNumber = 2, + }; + // repeated .np2_structs.MatchingSearchCondition conds = 1; + int conds_size() const; + private: + int _internal_conds_size() const; + + public: + void clear_conds() ; + ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL mutable_conds(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL mutable_conds(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& _internal_conds() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL _internal_mutable_conds(); + public: + const ::np2_structs::MatchingSearchCondition& conds(int index) const; + ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL add_conds(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& conds() const; + // uint32 available_num = 2; + void clear_available_num() ; + ::uint32_t available_num() const; + void set_available_num(::uint32_t value); + + private: + ::uint32_t _internal_available_num() const; + void _internal_set_available_num(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.QuickMatchGUIRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const QuickMatchGUIRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::MatchingSearchCondition > conds_; + ::uint32_t available_num_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<33> QuickMatchGUIRequest_class_data_; +// ------------------------------------------------------------------- + +class OptParam final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.OptParam) */ { + public: + inline OptParam() : OptParam(nullptr) {} + ~OptParam() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(OptParam* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(OptParam)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR OptParam(::google::protobuf::internal::ConstantInitialized); + + inline OptParam(const OptParam& from) : OptParam(nullptr, from) {} + inline OptParam(OptParam&& from) noexcept + : OptParam(nullptr, ::std::move(from)) {} + inline OptParam& operator=(const OptParam& from) { + CopyFrom(from); + return *this; + } + inline OptParam& operator=(OptParam&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const OptParam& default_instance() { + return *reinterpret_cast( + &_OptParam_default_instance_); + } + static constexpr int kIndexInFileMessages = 9; + friend void swap(OptParam& a, OptParam& b) { a.Swap(&b); } + inline void Swap(OptParam* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(OptParam* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + OptParam* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const OptParam& from); + void MergeFrom(const OptParam& from) { OptParam::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(OptParam* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.OptParam"; } + + explicit OptParam(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + OptParam(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const OptParam& from); + OptParam( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, OptParam&& from) noexcept + : OptParam(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kTypeFieldNumber = 1, + kFlagFieldNumber = 2, + kHubMemberIdFieldNumber = 3, + }; + // .np2_structs.uint8 type = 1; + bool has_type() const; + void clear_type() ; + const ::np2_structs::uint8& type() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_type(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_type(); + void set_allocated_type(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_type(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_type(); + + private: + const ::np2_structs::uint8& _internal_type() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_type(); + + public: + // .np2_structs.uint8 flag = 2; + bool has_flag() const; + void clear_flag() ; + const ::np2_structs::uint8& flag() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_flag(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_flag(); + void set_allocated_flag(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_flag(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_flag(); + + private: + const ::np2_structs::uint8& _internal_flag() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_flag(); + + public: + // .np2_structs.uint16 hubMemberId = 3; + bool has_hubmemberid() const; + void clear_hubmemberid() ; + const ::np2_structs::uint16& hubmemberid() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_hubmemberid(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_hubmemberid(); + void set_allocated_hubmemberid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_hubmemberid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_hubmemberid(); + + private: + const ::np2_structs::uint16& _internal_hubmemberid() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_hubmemberid(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.OptParam) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const OptParam& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::uint8* PROTOBUF_NULLABLE type_; + ::np2_structs::uint8* PROTOBUF_NULLABLE flag_; + ::np2_structs::uint16* PROTOBUF_NULLABLE hubmemberid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<21> OptParam_class_data_; +// ------------------------------------------------------------------- + +class MessageDetails final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.MessageDetails) */ { + public: + inline MessageDetails() : MessageDetails(nullptr) {} + ~MessageDetails() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(MessageDetails* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(MessageDetails)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR MessageDetails(::google::protobuf::internal::ConstantInitialized); + + inline MessageDetails(const MessageDetails& from) : MessageDetails(nullptr, from) {} + inline MessageDetails(MessageDetails&& from) noexcept + : MessageDetails(nullptr, ::std::move(from)) {} + inline MessageDetails& operator=(const MessageDetails& from) { + CopyFrom(from); + return *this; + } + inline MessageDetails& operator=(MessageDetails&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const MessageDetails& default_instance() { + return *reinterpret_cast( + &_MessageDetails_default_instance_); + } + static constexpr int kIndexInFileMessages = 42; + friend void swap(MessageDetails& a, MessageDetails& b) { a.Swap(&b); } + inline void Swap(MessageDetails* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(MessageDetails* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + MessageDetails* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const MessageDetails& from); + void MergeFrom(const MessageDetails& from) { MessageDetails::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(MessageDetails* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.MessageDetails"; } + + explicit MessageDetails(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + MessageDetails(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MessageDetails& from); + MessageDetails( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, MessageDetails&& from) noexcept + : MessageDetails(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kCommunicationIdFieldNumber = 1, + kSubjectFieldNumber = 6, + kBodyFieldNumber = 7, + kDataFieldNumber = 8, + kMainTypeFieldNumber = 3, + kSubTypeFieldNumber = 4, + kMsgIdFieldNumber = 2, + kMsgFeaturesFieldNumber = 5, + }; + // string communicationId = 1; + void clear_communicationid() ; + const ::std::string& communicationid() const; + template + void set_communicationid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_communicationid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_communicationid(); + void set_allocated_communicationid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_communicationid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_communicationid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_communicationid(); + + public: + // string subject = 6; + void clear_subject() ; + const ::std::string& subject() const; + template + void set_subject(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_subject(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_subject(); + void set_allocated_subject(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_subject() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_subject(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_subject(); + + public: + // string body = 7; + void clear_body() ; + const ::std::string& body() const; + template + void set_body(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_body(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_body(); + void set_allocated_body(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_body() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_body(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_body(); + + public: + // bytes data = 8; + void clear_data() ; + const ::std::string& data() const; + template + void set_data(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_data(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_data(); + void set_allocated_data(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_data() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_data(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // .np2_structs.uint16 mainType = 3; + bool has_maintype() const; + void clear_maintype() ; + const ::np2_structs::uint16& maintype() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_maintype(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_maintype(); + void set_allocated_maintype(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_maintype(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_maintype(); + + private: + const ::np2_structs::uint16& _internal_maintype() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_maintype(); + + public: + // .np2_structs.uint16 subType = 4; + bool has_subtype() const; + void clear_subtype() ; + const ::np2_structs::uint16& subtype() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_subtype(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_subtype(); + void set_allocated_subtype(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_subtype(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_subtype(); + + private: + const ::np2_structs::uint16& _internal_subtype() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_subtype(); + + public: + // uint64 msgId = 2; + void clear_msgid() ; + ::uint64_t msgid() const; + void set_msgid(::uint64_t value); + + private: + ::uint64_t _internal_msgid() const; + void _internal_set_msgid(::uint64_t value); + + public: + // uint32 msgFeatures = 5; + void clear_msgfeatures() ; + ::uint32_t msgfeatures() const; + void set_msgfeatures(::uint32_t value); + + private: + ::uint32_t _internal_msgfeatures() const; + void _internal_set_msgfeatures(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.MessageDetails) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 8, + 2, 69, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const MessageDetails& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr communicationid_; + ::google::protobuf::internal::ArenaStringPtr subject_; + ::google::protobuf::internal::ArenaStringPtr body_; + ::google::protobuf::internal::ArenaStringPtr data_; + ::np2_structs::uint16* PROTOBUF_NULLABLE maintype_; + ::np2_structs::uint16* PROTOBUF_NULLABLE subtype_; + ::uint64_t msgid_; + ::uint32_t msgfeatures_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<27> MessageDetails_class_data_; +// ------------------------------------------------------------------- + +class MatchingRoom final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.MatchingRoom) */ { + public: + inline MatchingRoom() : MatchingRoom(nullptr) {} + ~MatchingRoom() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(MatchingRoom* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(MatchingRoom)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR MatchingRoom(::google::protobuf::internal::ConstantInitialized); + + inline MatchingRoom(const MatchingRoom& from) : MatchingRoom(nullptr, from) {} + inline MatchingRoom(MatchingRoom&& from) noexcept + : MatchingRoom(nullptr, ::std::move(from)) {} + inline MatchingRoom& operator=(const MatchingRoom& from) { + CopyFrom(from); + return *this; + } + inline MatchingRoom& operator=(MatchingRoom&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const MatchingRoom& default_instance() { + return *reinterpret_cast( + &_MatchingRoom_default_instance_); + } + static constexpr int kIndexInFileMessages = 81; + friend void swap(MatchingRoom& a, MatchingRoom& b) { a.Swap(&b); } + inline void Swap(MatchingRoom* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(MatchingRoom* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + MatchingRoom* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const MatchingRoom& from); + void MergeFrom(const MatchingRoom& from) { MatchingRoom::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(MatchingRoom* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.MatchingRoom"; } + + explicit MatchingRoom(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + MatchingRoom(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MatchingRoom& from); + MatchingRoom( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, MatchingRoom&& from) noexcept + : MatchingRoom(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kAttrFieldNumber = 2, + kIdFieldNumber = 1, + }; + // repeated .np2_structs.MatchingAttr attr = 2; + int attr_size() const; + private: + int _internal_attr_size() const; + + public: + void clear_attr() ; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL mutable_attr(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL mutable_attr(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& _internal_attr() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL _internal_mutable_attr(); + public: + const ::np2_structs::MatchingAttr& attr(int index) const; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL add_attr(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& attr() const; + // bytes id = 1; + void clear_id() ; + const ::std::string& id() const; + template + void set_id(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_id(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_id(); + void set_allocated_id(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_id() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_id(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_id(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.MatchingRoom) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const MatchingRoom& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::MatchingAttr > attr_; + ::google::protobuf::internal::ArenaStringPtr id_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<25> MatchingRoom_class_data_; +// ------------------------------------------------------------------- + +class LeaveRoomRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.LeaveRoomRequest) */ { + public: + inline LeaveRoomRequest() : LeaveRoomRequest(nullptr) {} + ~LeaveRoomRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(LeaveRoomRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(LeaveRoomRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR LeaveRoomRequest(::google::protobuf::internal::ConstantInitialized); + + inline LeaveRoomRequest(const LeaveRoomRequest& from) : LeaveRoomRequest(nullptr, from) {} + inline LeaveRoomRequest(LeaveRoomRequest&& from) noexcept + : LeaveRoomRequest(nullptr, ::std::move(from)) {} + inline LeaveRoomRequest& operator=(const LeaveRoomRequest& from) { + CopyFrom(from); + return *this; + } + inline LeaveRoomRequest& operator=(LeaveRoomRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const LeaveRoomRequest& default_instance() { + return *reinterpret_cast( + &_LeaveRoomRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 25; + friend void swap(LeaveRoomRequest& a, LeaveRoomRequest& b) { a.Swap(&b); } + inline void Swap(LeaveRoomRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(LeaveRoomRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + LeaveRoomRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const LeaveRoomRequest& from); + void MergeFrom(const LeaveRoomRequest& from) { LeaveRoomRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(LeaveRoomRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.LeaveRoomRequest"; } + + explicit LeaveRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + LeaveRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const LeaveRoomRequest& from); + LeaveRoomRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, LeaveRoomRequest&& from) noexcept + : LeaveRoomRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kOptDataFieldNumber = 2, + kRoomIdFieldNumber = 1, + }; + // .np2_structs.PresenceOptionData optData = 2; + bool has_optdata() const; + void clear_optdata() ; + const ::np2_structs::PresenceOptionData& optdata() const; + [[nodiscard]] ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE release_optdata(); + ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL mutable_optdata(); + void set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value); + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE unsafe_arena_release_optdata(); + + private: + const ::np2_structs::PresenceOptionData& _internal_optdata() const; + ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL _internal_mutable_optdata(); + + public: + // uint64 roomId = 1; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.LeaveRoomRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const LeaveRoomRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE optdata_; + ::uint64_t roomid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<29> LeaveRoomRequest_class_data_; +// ------------------------------------------------------------------- + +class IntAttr final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.IntAttr) */ { + public: + inline IntAttr() : IntAttr(nullptr) {} + ~IntAttr() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(IntAttr* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(IntAttr)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR IntAttr(::google::protobuf::internal::ConstantInitialized); + + inline IntAttr(const IntAttr& from) : IntAttr(nullptr, from) {} + inline IntAttr(IntAttr&& from) noexcept + : IntAttr(nullptr, ::std::move(from)) {} + inline IntAttr& operator=(const IntAttr& from) { + CopyFrom(from); + return *this; + } + inline IntAttr& operator=(IntAttr&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const IntAttr& default_instance() { + return *reinterpret_cast( + &_IntAttr_default_instance_); + } + static constexpr int kIndexInFileMessages = 6; + friend void swap(IntAttr& a, IntAttr& b) { a.Swap(&b); } + inline void Swap(IntAttr* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(IntAttr* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + IntAttr* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const IntAttr& from); + void MergeFrom(const IntAttr& from) { IntAttr::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(IntAttr* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.IntAttr"; } + + explicit IntAttr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + IntAttr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const IntAttr& from); + IntAttr( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, IntAttr&& from) noexcept + : IntAttr(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kIdFieldNumber = 1, + kNumFieldNumber = 2, + }; + // .np2_structs.uint16 id = 1; + bool has_id() const; + void clear_id() ; + const ::np2_structs::uint16& id() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_id(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_id(); + void set_allocated_id(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_id(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_id(); + + private: + const ::np2_structs::uint16& _internal_id() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_id(); + + public: + // uint32 num = 2; + void clear_num() ; + ::uint32_t num() const; + void set_num(::uint32_t value); + + private: + ::uint32_t _internal_num() const; + void _internal_set_num(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.IntAttr) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const IntAttr& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::uint16* PROTOBUF_NULLABLE id_; + ::uint32_t num_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<20> IntAttr_class_data_; +// ------------------------------------------------------------------- + +class GetScoreResponse final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetScoreResponse) */ { + public: + inline GetScoreResponse() : GetScoreResponse(nullptr) {} + ~GetScoreResponse() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetScoreResponse* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetScoreResponse)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetScoreResponse(::google::protobuf::internal::ConstantInitialized); + + inline GetScoreResponse(const GetScoreResponse& from) : GetScoreResponse(nullptr, from) {} + inline GetScoreResponse(GetScoreResponse&& from) noexcept + : GetScoreResponse(nullptr, ::std::move(from)) {} + inline GetScoreResponse& operator=(const GetScoreResponse& from) { + CopyFrom(from); + return *this; + } + inline GetScoreResponse& operator=(GetScoreResponse&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetScoreResponse& default_instance() { + return *reinterpret_cast( + &_GetScoreResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = 52; + friend void swap(GetScoreResponse& a, GetScoreResponse& b) { a.Swap(&b); } + inline void Swap(GetScoreResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetScoreResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetScoreResponse* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetScoreResponse& from); + void MergeFrom(const GetScoreResponse& from) { GetScoreResponse::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetScoreResponse* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetScoreResponse"; } + + explicit GetScoreResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetScoreResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetScoreResponse& from); + GetScoreResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetScoreResponse&& from) noexcept + : GetScoreResponse(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRankArrayFieldNumber = 1, + kCommentArrayFieldNumber = 2, + kInfoArrayFieldNumber = 3, + kLastSortDateFieldNumber = 4, + kTotalRecordFieldNumber = 5, + }; + // repeated .np2_structs.ScoreRankData rankArray = 1; + int rankarray_size() const; + private: + int _internal_rankarray_size() const; + + public: + void clear_rankarray() ; + ::np2_structs::ScoreRankData* PROTOBUF_NONNULL mutable_rankarray(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreRankData>* PROTOBUF_NONNULL mutable_rankarray(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreRankData>& _internal_rankarray() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreRankData>* PROTOBUF_NONNULL _internal_mutable_rankarray(); + public: + const ::np2_structs::ScoreRankData& rankarray(int index) const; + ::np2_structs::ScoreRankData* PROTOBUF_NONNULL add_rankarray(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreRankData>& rankarray() const; + // repeated string commentArray = 2; + int commentarray_size() const; + private: + int _internal_commentarray_size() const; + + public: + void clear_commentarray() ; + const ::std::string& commentarray(int index) const; + ::std::string* PROTOBUF_NONNULL mutable_commentarray(int index); + template + void set_commentarray(int index, Arg_&& value, Args_... args); + ::std::string* PROTOBUF_NONNULL add_commentarray(); + template + void add_commentarray(Arg_&& value, Args_... args); + const ::google::protobuf::RepeatedPtrField<::std::string>& commentarray() const; + ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL mutable_commentarray(); + + private: + const ::google::protobuf::RepeatedPtrField<::std::string>& _internal_commentarray() const; + ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL _internal_mutable_commentarray(); + + public: + // repeated .np2_structs.ScoreInfo infoArray = 3; + int infoarray_size() const; + private: + int _internal_infoarray_size() const; + + public: + void clear_infoarray() ; + ::np2_structs::ScoreInfo* PROTOBUF_NONNULL mutable_infoarray(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreInfo>* PROTOBUF_NONNULL mutable_infoarray(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreInfo>& _internal_infoarray() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreInfo>* PROTOBUF_NONNULL _internal_mutable_infoarray(); + public: + const ::np2_structs::ScoreInfo& infoarray(int index) const; + ::np2_structs::ScoreInfo* PROTOBUF_NONNULL add_infoarray(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreInfo>& infoarray() const; + // uint64 lastSortDate = 4; + void clear_lastsortdate() ; + ::uint64_t lastsortdate() const; + void set_lastsortdate(::uint64_t value); + + private: + ::uint64_t _internal_lastsortdate() const; + void _internal_set_lastsortdate(::uint64_t value); + + public: + // uint32 totalRecord = 5; + void clear_totalrecord() ; + ::uint32_t totalrecord() const; + void set_totalrecord(::uint32_t value); + + private: + ::uint32_t _internal_totalrecord() const; + void _internal_set_totalrecord(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GetScoreResponse) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 2, 49, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetScoreResponse& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::ScoreRankData > rankarray_; + ::google::protobuf::RepeatedPtrField<::std::string> commentarray_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::ScoreInfo > infoarray_; + ::uint64_t lastsortdate_; + ::uint32_t totalrecord_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<29> GetScoreResponse_class_data_; +// ------------------------------------------------------------------- + +class GetScoreNpIdRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetScoreNpIdRequest) */ { + public: + inline GetScoreNpIdRequest() : GetScoreNpIdRequest(nullptr) {} + ~GetScoreNpIdRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetScoreNpIdRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetScoreNpIdRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetScoreNpIdRequest(::google::protobuf::internal::ConstantInitialized); + + inline GetScoreNpIdRequest(const GetScoreNpIdRequest& from) : GetScoreNpIdRequest(nullptr, from) {} + inline GetScoreNpIdRequest(GetScoreNpIdRequest&& from) noexcept + : GetScoreNpIdRequest(nullptr, ::std::move(from)) {} + inline GetScoreNpIdRequest& operator=(const GetScoreNpIdRequest& from) { + CopyFrom(from); + return *this; + } + inline GetScoreNpIdRequest& operator=(GetScoreNpIdRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetScoreNpIdRequest& default_instance() { + return *reinterpret_cast( + &_GetScoreNpIdRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 48; + friend void swap(GetScoreNpIdRequest& a, GetScoreNpIdRequest& b) { a.Swap(&b); } + inline void Swap(GetScoreNpIdRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetScoreNpIdRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetScoreNpIdRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetScoreNpIdRequest& from); + void MergeFrom(const GetScoreNpIdRequest& from) { GetScoreNpIdRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetScoreNpIdRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetScoreNpIdRequest"; } + + explicit GetScoreNpIdRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetScoreNpIdRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetScoreNpIdRequest& from); + GetScoreNpIdRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetScoreNpIdRequest&& from) noexcept + : GetScoreNpIdRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNpidsFieldNumber = 2, + kBoardIdFieldNumber = 1, + kWithCommentFieldNumber = 3, + kWithGameInfoFieldNumber = 4, + }; + // repeated .np2_structs.ScoreNpIdPcId npids = 2; + int npids_size() const; + private: + int _internal_npids_size() const; + + public: + void clear_npids() ; + ::np2_structs::ScoreNpIdPcId* PROTOBUF_NONNULL mutable_npids(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreNpIdPcId>* PROTOBUF_NONNULL mutable_npids(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreNpIdPcId>& _internal_npids() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreNpIdPcId>* PROTOBUF_NONNULL _internal_mutable_npids(); + public: + const ::np2_structs::ScoreNpIdPcId& npids(int index) const; + ::np2_structs::ScoreNpIdPcId* PROTOBUF_NONNULL add_npids(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreNpIdPcId>& npids() const; + // uint32 boardId = 1; + void clear_boardid() ; + ::uint32_t boardid() const; + void set_boardid(::uint32_t value); + + private: + ::uint32_t _internal_boardid() const; + void _internal_set_boardid(::uint32_t value); + + public: + // bool withComment = 3; + void clear_withcomment() ; + bool withcomment() const; + void set_withcomment(bool value); + + private: + bool _internal_withcomment() const; + void _internal_set_withcomment(bool value); + + public: + // bool withGameInfo = 4; + void clear_withgameinfo() ; + bool withgameinfo() const; + void set_withgameinfo(bool value); + + private: + bool _internal_withgameinfo() const; + void _internal_set_withgameinfo(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GetScoreNpIdRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetScoreNpIdRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::ScoreNpIdPcId > npids_; + ::uint32_t boardid_; + bool withcomment_; + bool withgameinfo_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<32> GetScoreNpIdRequest_class_data_; +// ------------------------------------------------------------------- + +class GetRoomMemberDataInternalRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetRoomMemberDataInternalRequest) */ { + public: + inline GetRoomMemberDataInternalRequest() : GetRoomMemberDataInternalRequest(nullptr) {} + ~GetRoomMemberDataInternalRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetRoomMemberDataInternalRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetRoomMemberDataInternalRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetRoomMemberDataInternalRequest(::google::protobuf::internal::ConstantInitialized); + + inline GetRoomMemberDataInternalRequest(const GetRoomMemberDataInternalRequest& from) : GetRoomMemberDataInternalRequest(nullptr, from) {} + inline GetRoomMemberDataInternalRequest(GetRoomMemberDataInternalRequest&& from) noexcept + : GetRoomMemberDataInternalRequest(nullptr, ::std::move(from)) {} + inline GetRoomMemberDataInternalRequest& operator=(const GetRoomMemberDataInternalRequest& from) { + CopyFrom(from); + return *this; + } + inline GetRoomMemberDataInternalRequest& operator=(GetRoomMemberDataInternalRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetRoomMemberDataInternalRequest& default_instance() { + return *reinterpret_cast( + &_GetRoomMemberDataInternalRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 30; + friend void swap(GetRoomMemberDataInternalRequest& a, GetRoomMemberDataInternalRequest& b) { a.Swap(&b); } + inline void Swap(GetRoomMemberDataInternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetRoomMemberDataInternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetRoomMemberDataInternalRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetRoomMemberDataInternalRequest& from); + void MergeFrom(const GetRoomMemberDataInternalRequest& from) { GetRoomMemberDataInternalRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetRoomMemberDataInternalRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetRoomMemberDataInternalRequest"; } + + explicit GetRoomMemberDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetRoomMemberDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetRoomMemberDataInternalRequest& from); + GetRoomMemberDataInternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetRoomMemberDataInternalRequest&& from) noexcept + : GetRoomMemberDataInternalRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kAttrIdFieldNumber = 3, + kMemberIdFieldNumber = 2, + kRoomIdFieldNumber = 1, + }; + // repeated .np2_structs.uint16 attrId = 3; + int attrid_size() const; + private: + int _internal_attrid_size() const; + + public: + void clear_attrid() ; + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_attrid(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL mutable_attrid(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& _internal_attrid() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL _internal_mutable_attrid(); + public: + const ::np2_structs::uint16& attrid(int index) const; + ::np2_structs::uint16* PROTOBUF_NONNULL add_attrid(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& attrid() const; + // .np2_structs.uint16 memberId = 2; + bool has_memberid() const; + void clear_memberid() ; + const ::np2_structs::uint16& memberid() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_memberid(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_memberid(); + void set_allocated_memberid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_memberid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_memberid(); + + private: + const ::np2_structs::uint16& _internal_memberid() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_memberid(); + + public: + // uint64 roomId = 1; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GetRoomMemberDataInternalRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetRoomMemberDataInternalRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::uint16 > attrid_; + ::np2_structs::uint16* PROTOBUF_NULLABLE memberid_; + ::uint64_t roomid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<45> GetRoomMemberDataInternalRequest_class_data_; +// ------------------------------------------------------------------- + +class GetRoomListGUIRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetRoomListGUIRequest) */ { + public: + inline GetRoomListGUIRequest() : GetRoomListGUIRequest(nullptr) {} + ~GetRoomListGUIRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetRoomListGUIRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetRoomListGUIRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetRoomListGUIRequest(::google::protobuf::internal::ConstantInitialized); + + inline GetRoomListGUIRequest(const GetRoomListGUIRequest& from) : GetRoomListGUIRequest(nullptr, from) {} + inline GetRoomListGUIRequest(GetRoomListGUIRequest&& from) noexcept + : GetRoomListGUIRequest(nullptr, ::std::move(from)) {} + inline GetRoomListGUIRequest& operator=(const GetRoomListGUIRequest& from) { + CopyFrom(from); + return *this; + } + inline GetRoomListGUIRequest& operator=(GetRoomListGUIRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetRoomListGUIRequest& default_instance() { + return *reinterpret_cast( + &_GetRoomListGUIRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 80; + friend void swap(GetRoomListGUIRequest& a, GetRoomListGUIRequest& b) { a.Swap(&b); } + inline void Swap(GetRoomListGUIRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetRoomListGUIRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetRoomListGUIRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetRoomListGUIRequest& from); + void MergeFrom(const GetRoomListGUIRequest& from) { GetRoomListGUIRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetRoomListGUIRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetRoomListGUIRequest"; } + + explicit GetRoomListGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetRoomListGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetRoomListGUIRequest& from); + GetRoomListGUIRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetRoomListGUIRequest&& from) noexcept + : GetRoomListGUIRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kCondsFieldNumber = 3, + kAttrsFieldNumber = 4, + kRangeStartFieldNumber = 1, + kRangeMaxFieldNumber = 2, + }; + // repeated .np2_structs.MatchingSearchCondition conds = 3; + int conds_size() const; + private: + int _internal_conds_size() const; + + public: + void clear_conds() ; + ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL mutable_conds(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL mutable_conds(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& _internal_conds() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL _internal_mutable_conds(); + public: + const ::np2_structs::MatchingSearchCondition& conds(int index) const; + ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL add_conds(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& conds() const; + // repeated .np2_structs.MatchingAttr attrs = 4; + int attrs_size() const; + private: + int _internal_attrs_size() const; + + public: + void clear_attrs() ; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL mutable_attrs(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL mutable_attrs(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& _internal_attrs() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL _internal_mutable_attrs(); + public: + const ::np2_structs::MatchingAttr& attrs(int index) const; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL add_attrs(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& attrs() const; + // uint32 range_start = 1; + void clear_range_start() ; + ::uint32_t range_start() const; + void set_range_start(::uint32_t value); + + private: + ::uint32_t _internal_range_start() const; + void _internal_set_range_start(::uint32_t value); + + public: + // uint32 range_max = 2; + void clear_range_max() ; + ::uint32_t range_max() const; + void set_range_max(::uint32_t value); + + private: + ::uint32_t _internal_range_max() const; + void _internal_set_range_max(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GetRoomListGUIRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetRoomListGUIRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::MatchingSearchCondition > conds_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::MatchingAttr > attrs_; + ::uint32_t range_start_; + ::uint32_t range_max_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<34> GetRoomListGUIRequest_class_data_; +// ------------------------------------------------------------------- + +class GetRoomDataInternalRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetRoomDataInternalRequest) */ { + public: + inline GetRoomDataInternalRequest() : GetRoomDataInternalRequest(nullptr) {} + ~GetRoomDataInternalRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetRoomDataInternalRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetRoomDataInternalRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetRoomDataInternalRequest(::google::protobuf::internal::ConstantInitialized); + + inline GetRoomDataInternalRequest(const GetRoomDataInternalRequest& from) : GetRoomDataInternalRequest(nullptr, from) {} + inline GetRoomDataInternalRequest(GetRoomDataInternalRequest&& from) noexcept + : GetRoomDataInternalRequest(nullptr, ::std::move(from)) {} + inline GetRoomDataInternalRequest& operator=(const GetRoomDataInternalRequest& from) { + CopyFrom(from); + return *this; + } + inline GetRoomDataInternalRequest& operator=(GetRoomDataInternalRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetRoomDataInternalRequest& default_instance() { + return *reinterpret_cast( + &_GetRoomDataInternalRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 33; + friend void swap(GetRoomDataInternalRequest& a, GetRoomDataInternalRequest& b) { a.Swap(&b); } + inline void Swap(GetRoomDataInternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetRoomDataInternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetRoomDataInternalRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetRoomDataInternalRequest& from); + void MergeFrom(const GetRoomDataInternalRequest& from) { GetRoomDataInternalRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetRoomDataInternalRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetRoomDataInternalRequest"; } + + explicit GetRoomDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetRoomDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetRoomDataInternalRequest& from); + GetRoomDataInternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetRoomDataInternalRequest&& from) noexcept + : GetRoomDataInternalRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kAttrIdFieldNumber = 2, + kRoomIdFieldNumber = 1, + }; + // repeated .np2_structs.uint16 attrId = 2; + int attrid_size() const; + private: + int _internal_attrid_size() const; + + public: + void clear_attrid() ; + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_attrid(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL mutable_attrid(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& _internal_attrid() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL _internal_mutable_attrid(); + public: + const ::np2_structs::uint16& attrid(int index) const; + ::np2_structs::uint16* PROTOBUF_NONNULL add_attrid(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& attrid() const; + // uint64 roomId = 1; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GetRoomDataInternalRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetRoomDataInternalRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::uint16 > attrid_; + ::uint64_t roomid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<39> GetRoomDataInternalRequest_class_data_; +// ------------------------------------------------------------------- + +class GetRoomDataExternalListRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetRoomDataExternalListRequest) */ { + public: + inline GetRoomDataExternalListRequest() : GetRoomDataExternalListRequest(nullptr) {} + ~GetRoomDataExternalListRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetRoomDataExternalListRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetRoomDataExternalListRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetRoomDataExternalListRequest(::google::protobuf::internal::ConstantInitialized); + + inline GetRoomDataExternalListRequest(const GetRoomDataExternalListRequest& from) : GetRoomDataExternalListRequest(nullptr, from) {} + inline GetRoomDataExternalListRequest(GetRoomDataExternalListRequest&& from) noexcept + : GetRoomDataExternalListRequest(nullptr, ::std::move(from)) {} + inline GetRoomDataExternalListRequest& operator=(const GetRoomDataExternalListRequest& from) { + CopyFrom(from); + return *this; + } + inline GetRoomDataExternalListRequest& operator=(GetRoomDataExternalListRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetRoomDataExternalListRequest& default_instance() { + return *reinterpret_cast( + &_GetRoomDataExternalListRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 26; + friend void swap(GetRoomDataExternalListRequest& a, GetRoomDataExternalListRequest& b) { a.Swap(&b); } + inline void Swap(GetRoomDataExternalListRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetRoomDataExternalListRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetRoomDataExternalListRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetRoomDataExternalListRequest& from); + void MergeFrom(const GetRoomDataExternalListRequest& from) { GetRoomDataExternalListRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetRoomDataExternalListRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetRoomDataExternalListRequest"; } + + explicit GetRoomDataExternalListRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetRoomDataExternalListRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetRoomDataExternalListRequest& from); + GetRoomDataExternalListRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetRoomDataExternalListRequest&& from) noexcept + : GetRoomDataExternalListRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomIdsFieldNumber = 1, + kAttrIdsFieldNumber = 2, + }; + // repeated uint64 roomIds = 1; + int roomids_size() const; + private: + int _internal_roomids_size() const; + + public: + void clear_roomids() ; + ::uint64_t roomids(int index) const; + void set_roomids(int index, ::uint64_t value); + void add_roomids(::uint64_t value); + const ::google::protobuf::RepeatedField<::uint64_t>& roomids() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL mutable_roomids(); + + private: + const ::google::protobuf::RepeatedField<::uint64_t>& _internal_roomids() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL _internal_mutable_roomids(); + + public: + // repeated .np2_structs.uint16 attrIds = 2; + int attrids_size() const; + private: + int _internal_attrids_size() const; + + public: + void clear_attrids() ; + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_attrids(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL mutable_attrids(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& _internal_attrids() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL _internal_mutable_attrids(); + public: + const ::np2_structs::uint16& attrids(int index) const; + ::np2_structs::uint16* PROTOBUF_NONNULL add_attrids(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& attrids() const; + // @@protoc_insertion_point(class_scope:np2_structs.GetRoomDataExternalListRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetRoomDataExternalListRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedField<::uint64_t> roomids_; + ::google::protobuf::internal::CachedSize _roomids_cached_byte_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::uint16 > attrids_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<43> GetRoomDataExternalListRequest_class_data_; +// ------------------------------------------------------------------- + +class GetPingInfoResponse final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetPingInfoResponse) */ { + public: + inline GetPingInfoResponse() : GetPingInfoResponse(nullptr) {} + ~GetPingInfoResponse() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetPingInfoResponse* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetPingInfoResponse)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetPingInfoResponse(::google::protobuf::internal::ConstantInitialized); + + inline GetPingInfoResponse(const GetPingInfoResponse& from) : GetPingInfoResponse(nullptr, from) {} + inline GetPingInfoResponse(GetPingInfoResponse&& from) noexcept + : GetPingInfoResponse(nullptr, ::std::move(from)) {} + inline GetPingInfoResponse& operator=(const GetPingInfoResponse& from) { + CopyFrom(from); + return *this; + } + inline GetPingInfoResponse& operator=(GetPingInfoResponse&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetPingInfoResponse& default_instance() { + return *reinterpret_cast( + &_GetPingInfoResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = 39; + friend void swap(GetPingInfoResponse& a, GetPingInfoResponse& b) { a.Swap(&b); } + inline void Swap(GetPingInfoResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetPingInfoResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetPingInfoResponse* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetPingInfoResponse& from); + void MergeFrom(const GetPingInfoResponse& from) { GetPingInfoResponse::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetPingInfoResponse* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetPingInfoResponse"; } + + explicit GetPingInfoResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetPingInfoResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetPingInfoResponse& from); + GetPingInfoResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetPingInfoResponse&& from) noexcept + : GetPingInfoResponse(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kServerIdFieldNumber = 1, + kRoomIdFieldNumber = 3, + kWorldIdFieldNumber = 2, + kRttFieldNumber = 4, + }; + // .np2_structs.uint16 serverId = 1; + bool has_serverid() const; + void clear_serverid() ; + const ::np2_structs::uint16& serverid() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_serverid(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_serverid(); + void set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_serverid(); + + private: + const ::np2_structs::uint16& _internal_serverid() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_serverid(); + + public: + // uint64 roomId = 3; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // uint32 worldId = 2; + void clear_worldid() ; + ::uint32_t worldid() const; + void set_worldid(::uint32_t value); + + private: + ::uint32_t _internal_worldid() const; + void _internal_set_worldid(::uint32_t value); + + public: + // uint32 rtt = 4; + void clear_rtt() ; + ::uint32_t rtt() const; + void set_rtt(::uint32_t value); + + private: + ::uint32_t _internal_rtt() const; + void _internal_set_rtt(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GetPingInfoResponse) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetPingInfoResponse& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::uint16* PROTOBUF_NULLABLE serverid_; + ::uint64_t roomid_; + ::uint32_t worldid_; + ::uint32_t rtt_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<32> GetPingInfoResponse_class_data_; +// ------------------------------------------------------------------- + +class GUIUserInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GUIUserInfo) */ { + public: + inline GUIUserInfo() : GUIUserInfo(nullptr) {} + ~GUIUserInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GUIUserInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GUIUserInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GUIUserInfo(::google::protobuf::internal::ConstantInitialized); + + inline GUIUserInfo(const GUIUserInfo& from) : GUIUserInfo(nullptr, from) {} + inline GUIUserInfo(GUIUserInfo&& from) noexcept + : GUIUserInfo(nullptr, ::std::move(from)) {} + inline GUIUserInfo& operator=(const GUIUserInfo& from) { + CopyFrom(from); + return *this; + } + inline GUIUserInfo& operator=(GUIUserInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GUIUserInfo& default_instance() { + return *reinterpret_cast( + &_GUIUserInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 78; + friend void swap(GUIUserInfo& a, GUIUserInfo& b) { a.Swap(&b); } + inline void Swap(GUIUserInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GUIUserInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GUIUserInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GUIUserInfo& from); + void MergeFrom(const GUIUserInfo& from) { GUIUserInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GUIUserInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GUIUserInfo"; } + + explicit GUIUserInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GUIUserInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GUIUserInfo& from); + GUIUserInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GUIUserInfo&& from) noexcept + : GUIUserInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kInfoFieldNumber = 1, + kOwnerFieldNumber = 2, + }; + // .np2_structs.UserInfo info = 1; + bool has_info() const; + void clear_info() ; + const ::np2_structs::UserInfo& info() const; + [[nodiscard]] ::np2_structs::UserInfo* PROTOBUF_NULLABLE release_info(); + ::np2_structs::UserInfo* PROTOBUF_NONNULL mutable_info(); + void set_allocated_info(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_info(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + ::np2_structs::UserInfo* PROTOBUF_NULLABLE unsafe_arena_release_info(); + + private: + const ::np2_structs::UserInfo& _internal_info() const; + ::np2_structs::UserInfo* PROTOBUF_NONNULL _internal_mutable_info(); + + public: + // bool owner = 2; + void clear_owner() ; + bool owner() const; + void set_owner(bool value); + + private: + bool _internal_owner() const; + void _internal_set_owner(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.GUIUserInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GUIUserInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::UserInfo* PROTOBUF_NULLABLE info_; + bool owner_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<24> GUIUserInfo_class_data_; +// ------------------------------------------------------------------- + +class CreateRoomGUIRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.CreateRoomGUIRequest) */ { + public: + inline CreateRoomGUIRequest() : CreateRoomGUIRequest(nullptr) {} + ~CreateRoomGUIRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(CreateRoomGUIRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(CreateRoomGUIRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR CreateRoomGUIRequest(::google::protobuf::internal::ConstantInitialized); + + inline CreateRoomGUIRequest(const CreateRoomGUIRequest& from) : CreateRoomGUIRequest(nullptr, from) {} + inline CreateRoomGUIRequest(CreateRoomGUIRequest&& from) noexcept + : CreateRoomGUIRequest(nullptr, ::std::move(from)) {} + inline CreateRoomGUIRequest& operator=(const CreateRoomGUIRequest& from) { + CopyFrom(from); + return *this; + } + inline CreateRoomGUIRequest& operator=(CreateRoomGUIRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const CreateRoomGUIRequest& default_instance() { + return *reinterpret_cast( + &_CreateRoomGUIRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 77; + friend void swap(CreateRoomGUIRequest& a, CreateRoomGUIRequest& b) { a.Swap(&b); } + inline void Swap(CreateRoomGUIRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(CreateRoomGUIRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + CreateRoomGUIRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const CreateRoomGUIRequest& from); + void MergeFrom(const CreateRoomGUIRequest& from) { CreateRoomGUIRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(CreateRoomGUIRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.CreateRoomGUIRequest"; } + + explicit CreateRoomGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + CreateRoomGUIRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const CreateRoomGUIRequest& from); + CreateRoomGUIRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, CreateRoomGUIRequest&& from) noexcept + : CreateRoomGUIRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kGameAttrsFieldNumber = 5, + kTotalSlotsFieldNumber = 1, + kPrivateSlotsFieldNumber = 2, + kPrivilegeGrantFieldNumber = 3, + kStealthFieldNumber = 4, + }; + // repeated .np2_structs.MatchingAttr game_attrs = 5; + int game_attrs_size() const; + private: + int _internal_game_attrs_size() const; + + public: + void clear_game_attrs() ; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL mutable_game_attrs(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL mutable_game_attrs(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& _internal_game_attrs() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL _internal_mutable_game_attrs(); + public: + const ::np2_structs::MatchingAttr& game_attrs(int index) const; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL add_game_attrs(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& game_attrs() const; + // uint32 total_slots = 1; + void clear_total_slots() ; + ::uint32_t total_slots() const; + void set_total_slots(::uint32_t value); + + private: + ::uint32_t _internal_total_slots() const; + void _internal_set_total_slots(::uint32_t value); + + public: + // uint32 private_slots = 2; + void clear_private_slots() ; + ::uint32_t private_slots() const; + void set_private_slots(::uint32_t value); + + private: + ::uint32_t _internal_private_slots() const; + void _internal_set_private_slots(::uint32_t value); + + public: + // bool privilege_grant = 3; + void clear_privilege_grant() ; + bool privilege_grant() const; + void set_privilege_grant(bool value); + + private: + bool _internal_privilege_grant() const; + void _internal_set_privilege_grant(bool value); + + public: + // bool stealth = 4; + void clear_stealth() ; + bool stealth() const; + void set_stealth(bool value); + + private: + bool _internal_stealth() const; + void _internal_set_stealth(bool value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.CreateRoomGUIRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const CreateRoomGUIRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::MatchingAttr > game_attrs_; + ::uint32_t total_slots_; + ::uint32_t private_slots_; + bool privilege_grant_; + bool stealth_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<33> CreateRoomGUIRequest_class_data_; +// ------------------------------------------------------------------- + +class BinAttr final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.BinAttr) */ { + public: + inline BinAttr() : BinAttr(nullptr) {} + ~BinAttr() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(BinAttr* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(BinAttr)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR BinAttr(::google::protobuf::internal::ConstantInitialized); + + inline BinAttr(const BinAttr& from) : BinAttr(nullptr, from) {} + inline BinAttr(BinAttr&& from) noexcept + : BinAttr(nullptr, ::std::move(from)) {} + inline BinAttr& operator=(const BinAttr& from) { + CopyFrom(from); + return *this; + } + inline BinAttr& operator=(BinAttr&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const BinAttr& default_instance() { + return *reinterpret_cast( + &_BinAttr_default_instance_); + } + static constexpr int kIndexInFileMessages = 5; + friend void swap(BinAttr& a, BinAttr& b) { a.Swap(&b); } + inline void Swap(BinAttr* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(BinAttr* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + BinAttr* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const BinAttr& from); + void MergeFrom(const BinAttr& from) { BinAttr::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(BinAttr* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.BinAttr"; } + + explicit BinAttr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + BinAttr(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const BinAttr& from); + BinAttr( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, BinAttr&& from) noexcept + : BinAttr(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kDataFieldNumber = 2, + kIdFieldNumber = 1, + }; + // bytes data = 2; + void clear_data() ; + const ::std::string& data() const; + template + void set_data(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_data(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_data(); + void set_allocated_data(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_data() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_data(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // .np2_structs.uint16 id = 1; + bool has_id() const; + void clear_id() ; + const ::np2_structs::uint16& id() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_id(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_id(); + void set_allocated_id(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_id(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_id(); + + private: + const ::np2_structs::uint16& _internal_id() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_id(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.BinAttr) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const BinAttr& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr data_; + ::np2_structs::uint16* PROTOBUF_NULLABLE id_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<20> BinAttr_class_data_; +// ------------------------------------------------------------------- + +class SetUserInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SetUserInfo) */ { + public: + inline SetUserInfo() : SetUserInfo(nullptr) {} + ~SetUserInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SetUserInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SetUserInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SetUserInfo(::google::protobuf::internal::ConstantInitialized); + + inline SetUserInfo(const SetUserInfo& from) : SetUserInfo(nullptr, from) {} + inline SetUserInfo(SetUserInfo&& from) noexcept + : SetUserInfo(nullptr, ::std::move(from)) {} + inline SetUserInfo& operator=(const SetUserInfo& from) { + CopyFrom(from); + return *this; + } + inline SetUserInfo& operator=(SetUserInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SetUserInfo& default_instance() { + return *reinterpret_cast( + &_SetUserInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 32; + friend void swap(SetUserInfo& a, SetUserInfo& b) { a.Swap(&b); } + inline void Swap(SetUserInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SetUserInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SetUserInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SetUserInfo& from); + void MergeFrom(const SetUserInfo& from) { SetUserInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SetUserInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SetUserInfo"; } + + explicit SetUserInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SetUserInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SetUserInfo& from); + SetUserInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SetUserInfo&& from) noexcept + : SetUserInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kUserBinAttrFieldNumber = 2, + kServerIdFieldNumber = 1, + }; + // repeated .np2_structs.BinAttr userBinAttr = 2; + int userbinattr_size() const; + private: + int _internal_userbinattr_size() const; + + public: + void clear_userbinattr() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_userbinattr(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_userbinattr(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_userbinattr() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_userbinattr(); + public: + const ::np2_structs::BinAttr& userbinattr(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_userbinattr(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& userbinattr() const; + // .np2_structs.uint16 serverId = 1; + bool has_serverid() const; + void clear_serverid() ; + const ::np2_structs::uint16& serverid() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_serverid(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_serverid(); + void set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_serverid(); + + private: + const ::np2_structs::uint16& _internal_serverid() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_serverid(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SetUserInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SetUserInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > userbinattr_; + ::np2_structs::uint16* PROTOBUF_NULLABLE serverid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<24> SetUserInfo_class_data_; +// ------------------------------------------------------------------- + +class SetRoomMemberDataInternalRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SetRoomMemberDataInternalRequest) */ { + public: + inline SetRoomMemberDataInternalRequest() : SetRoomMemberDataInternalRequest(nullptr) {} + ~SetRoomMemberDataInternalRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SetRoomMemberDataInternalRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SetRoomMemberDataInternalRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SetRoomMemberDataInternalRequest(::google::protobuf::internal::ConstantInitialized); + + inline SetRoomMemberDataInternalRequest(const SetRoomMemberDataInternalRequest& from) : SetRoomMemberDataInternalRequest(nullptr, from) {} + inline SetRoomMemberDataInternalRequest(SetRoomMemberDataInternalRequest&& from) noexcept + : SetRoomMemberDataInternalRequest(nullptr, ::std::move(from)) {} + inline SetRoomMemberDataInternalRequest& operator=(const SetRoomMemberDataInternalRequest& from) { + CopyFrom(from); + return *this; + } + inline SetRoomMemberDataInternalRequest& operator=(SetRoomMemberDataInternalRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SetRoomMemberDataInternalRequest& default_instance() { + return *reinterpret_cast( + &_SetRoomMemberDataInternalRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 31; + friend void swap(SetRoomMemberDataInternalRequest& a, SetRoomMemberDataInternalRequest& b) { a.Swap(&b); } + inline void Swap(SetRoomMemberDataInternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SetRoomMemberDataInternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SetRoomMemberDataInternalRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SetRoomMemberDataInternalRequest& from); + void MergeFrom(const SetRoomMemberDataInternalRequest& from) { SetRoomMemberDataInternalRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SetRoomMemberDataInternalRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SetRoomMemberDataInternalRequest"; } + + explicit SetRoomMemberDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SetRoomMemberDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SetRoomMemberDataInternalRequest& from); + SetRoomMemberDataInternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SetRoomMemberDataInternalRequest&& from) noexcept + : SetRoomMemberDataInternalRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomMemberBinAttrInternalFieldNumber = 4, + kMemberIdFieldNumber = 2, + kTeamIdFieldNumber = 3, + kRoomIdFieldNumber = 1, + }; + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + int roommemberbinattrinternal_size() const; + private: + int _internal_roommemberbinattrinternal_size() const; + + public: + void clear_roommemberbinattrinternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roommemberbinattrinternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roommemberbinattrinternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roommemberbinattrinternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roommemberbinattrinternal(); + public: + const ::np2_structs::BinAttr& roommemberbinattrinternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roommemberbinattrinternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roommemberbinattrinternal() const; + // .np2_structs.uint16 memberId = 2; + bool has_memberid() const; + void clear_memberid() ; + const ::np2_structs::uint16& memberid() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_memberid(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_memberid(); + void set_allocated_memberid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_memberid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_memberid(); + + private: + const ::np2_structs::uint16& _internal_memberid() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_memberid(); + + public: + // .np2_structs.uint8 teamId = 3; + bool has_teamid() const; + void clear_teamid() ; + const ::np2_structs::uint8& teamid() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_teamid(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_teamid(); + void set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_teamid(); + + private: + const ::np2_structs::uint8& _internal_teamid() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_teamid(); + + public: + // uint64 roomId = 1; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SetRoomMemberDataInternalRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SetRoomMemberDataInternalRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roommemberbinattrinternal_; + ::np2_structs::uint16* PROTOBUF_NULLABLE memberid_; + ::np2_structs::uint8* PROTOBUF_NULLABLE teamid_; + ::uint64_t roomid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<45> SetRoomMemberDataInternalRequest_class_data_; +// ------------------------------------------------------------------- + +class SetRoomDataInternalRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SetRoomDataInternalRequest) */ { + public: + inline SetRoomDataInternalRequest() : SetRoomDataInternalRequest(nullptr) {} + ~SetRoomDataInternalRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SetRoomDataInternalRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SetRoomDataInternalRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SetRoomDataInternalRequest(::google::protobuf::internal::ConstantInitialized); + + inline SetRoomDataInternalRequest(const SetRoomDataInternalRequest& from) : SetRoomDataInternalRequest(nullptr, from) {} + inline SetRoomDataInternalRequest(SetRoomDataInternalRequest&& from) noexcept + : SetRoomDataInternalRequest(nullptr, ::std::move(from)) {} + inline SetRoomDataInternalRequest& operator=(const SetRoomDataInternalRequest& from) { + CopyFrom(from); + return *this; + } + inline SetRoomDataInternalRequest& operator=(SetRoomDataInternalRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SetRoomDataInternalRequest& default_instance() { + return *reinterpret_cast( + &_SetRoomDataInternalRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 29; + friend void swap(SetRoomDataInternalRequest& a, SetRoomDataInternalRequest& b) { a.Swap(&b); } + inline void Swap(SetRoomDataInternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SetRoomDataInternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SetRoomDataInternalRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SetRoomDataInternalRequest& from); + void MergeFrom(const SetRoomDataInternalRequest& from) { SetRoomDataInternalRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SetRoomDataInternalRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SetRoomDataInternalRequest"; } + + explicit SetRoomDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SetRoomDataInternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SetRoomDataInternalRequest& from); + SetRoomDataInternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SetRoomDataInternalRequest&& from) noexcept + : SetRoomDataInternalRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomBinAttrInternalFieldNumber = 4, + kPasswordConfigFieldNumber = 5, + kPasswordSlotMaskFieldNumber = 6, + kOwnerPrivilegeRankFieldNumber = 7, + kRoomIdFieldNumber = 1, + kFlagFilterFieldNumber = 2, + kFlagAttrFieldNumber = 3, + }; + // repeated .np2_structs.BinAttr roomBinAttrInternal = 4; + int roombinattrinternal_size() const; + private: + int _internal_roombinattrinternal_size() const; + + public: + void clear_roombinattrinternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roombinattrinternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roombinattrinternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roombinattrinternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roombinattrinternal(); + public: + const ::np2_structs::BinAttr& roombinattrinternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roombinattrinternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roombinattrinternal() const; + // repeated .np2_structs.RoomGroupPasswordConfig passwordConfig = 5; + int passwordconfig_size() const; + private: + int _internal_passwordconfig_size() const; + + public: + void clear_passwordconfig() ; + ::np2_structs::RoomGroupPasswordConfig* PROTOBUF_NONNULL mutable_passwordconfig(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroupPasswordConfig>* PROTOBUF_NONNULL mutable_passwordconfig(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroupPasswordConfig>& _internal_passwordconfig() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroupPasswordConfig>* PROTOBUF_NONNULL _internal_mutable_passwordconfig(); + public: + const ::np2_structs::RoomGroupPasswordConfig& passwordconfig(int index) const; + ::np2_structs::RoomGroupPasswordConfig* PROTOBUF_NONNULL add_passwordconfig(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroupPasswordConfig>& passwordconfig() const; + // repeated uint64 passwordSlotMask = 6; + int passwordslotmask_size() const; + private: + int _internal_passwordslotmask_size() const; + + public: + void clear_passwordslotmask() ; + ::uint64_t passwordslotmask(int index) const; + void set_passwordslotmask(int index, ::uint64_t value); + void add_passwordslotmask(::uint64_t value); + const ::google::protobuf::RepeatedField<::uint64_t>& passwordslotmask() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL mutable_passwordslotmask(); + + private: + const ::google::protobuf::RepeatedField<::uint64_t>& _internal_passwordslotmask() const; + ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL _internal_mutable_passwordslotmask(); + + public: + // repeated .np2_structs.uint16 ownerPrivilegeRank = 7; + int ownerprivilegerank_size() const; + private: + int _internal_ownerprivilegerank_size() const; + + public: + void clear_ownerprivilegerank() ; + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_ownerprivilegerank(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL mutable_ownerprivilegerank(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& _internal_ownerprivilegerank() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL _internal_mutable_ownerprivilegerank(); + public: + const ::np2_structs::uint16& ownerprivilegerank(int index) const; + ::np2_structs::uint16* PROTOBUF_NONNULL add_ownerprivilegerank(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& ownerprivilegerank() const; + // uint64 roomId = 1; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // uint32 flagFilter = 2; + void clear_flagfilter() ; + ::uint32_t flagfilter() const; + void set_flagfilter(::uint32_t value); + + private: + ::uint32_t _internal_flagfilter() const; + void _internal_set_flagfilter(::uint32_t value); + + public: + // uint32 flagAttr = 3; + void clear_flagattr() ; + ::uint32_t flagattr() const; + void set_flagattr(::uint32_t value); + + private: + ::uint32_t _internal_flagattr() const; + void _internal_set_flagattr(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SetRoomDataInternalRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 7, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SetRoomDataInternalRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roombinattrinternal_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::RoomGroupPasswordConfig > passwordconfig_; + ::google::protobuf::RepeatedField<::uint64_t> passwordslotmask_; + ::google::protobuf::internal::CachedSize _passwordslotmask_cached_byte_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::uint16 > ownerprivilegerank_; + ::uint64_t roomid_; + ::uint32_t flagfilter_; + ::uint32_t flagattr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<39> SetRoomDataInternalRequest_class_data_; +// ------------------------------------------------------------------- + +class SetRoomDataExternalRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SetRoomDataExternalRequest) */ { + public: + inline SetRoomDataExternalRequest() : SetRoomDataExternalRequest(nullptr) {} + ~SetRoomDataExternalRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SetRoomDataExternalRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SetRoomDataExternalRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SetRoomDataExternalRequest(::google::protobuf::internal::ConstantInitialized); + + inline SetRoomDataExternalRequest(const SetRoomDataExternalRequest& from) : SetRoomDataExternalRequest(nullptr, from) {} + inline SetRoomDataExternalRequest(SetRoomDataExternalRequest&& from) noexcept + : SetRoomDataExternalRequest(nullptr, ::std::move(from)) {} + inline SetRoomDataExternalRequest& operator=(const SetRoomDataExternalRequest& from) { + CopyFrom(from); + return *this; + } + inline SetRoomDataExternalRequest& operator=(SetRoomDataExternalRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SetRoomDataExternalRequest& default_instance() { + return *reinterpret_cast( + &_SetRoomDataExternalRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 28; + friend void swap(SetRoomDataExternalRequest& a, SetRoomDataExternalRequest& b) { a.Swap(&b); } + inline void Swap(SetRoomDataExternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SetRoomDataExternalRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SetRoomDataExternalRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SetRoomDataExternalRequest& from); + void MergeFrom(const SetRoomDataExternalRequest& from) { SetRoomDataExternalRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SetRoomDataExternalRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SetRoomDataExternalRequest"; } + + explicit SetRoomDataExternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SetRoomDataExternalRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SetRoomDataExternalRequest& from); + SetRoomDataExternalRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SetRoomDataExternalRequest&& from) noexcept + : SetRoomDataExternalRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomSearchableIntAttrExternalFieldNumber = 2, + kRoomSearchableBinAttrExternalFieldNumber = 3, + kRoomBinAttrExternalFieldNumber = 4, + kRoomIdFieldNumber = 1, + }; + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 2; + int roomsearchableintattrexternal_size() const; + private: + int _internal_roomsearchableintattrexternal_size() const; + + public: + void clear_roomsearchableintattrexternal() ; + ::np2_structs::IntAttr* PROTOBUF_NONNULL mutable_roomsearchableintattrexternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL mutable_roomsearchableintattrexternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& _internal_roomsearchableintattrexternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL _internal_mutable_roomsearchableintattrexternal(); + public: + const ::np2_structs::IntAttr& roomsearchableintattrexternal(int index) const; + ::np2_structs::IntAttr* PROTOBUF_NONNULL add_roomsearchableintattrexternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& roomsearchableintattrexternal() const; + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 3; + int roomsearchablebinattrexternal_size() const; + private: + int _internal_roomsearchablebinattrexternal_size() const; + + public: + void clear_roomsearchablebinattrexternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roomsearchablebinattrexternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roomsearchablebinattrexternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roomsearchablebinattrexternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roomsearchablebinattrexternal(); + public: + const ::np2_structs::BinAttr& roomsearchablebinattrexternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roomsearchablebinattrexternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roomsearchablebinattrexternal() const; + // repeated .np2_structs.BinAttr roomBinAttrExternal = 4; + int roombinattrexternal_size() const; + private: + int _internal_roombinattrexternal_size() const; + + public: + void clear_roombinattrexternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roombinattrexternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roombinattrexternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roombinattrexternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roombinattrexternal(); + public: + const ::np2_structs::BinAttr& roombinattrexternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roombinattrexternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roombinattrexternal() const; + // uint64 roomId = 1; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SetRoomDataExternalRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SetRoomDataExternalRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::IntAttr > roomsearchableintattrexternal_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roomsearchablebinattrexternal_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roombinattrexternal_; + ::uint64_t roomid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<39> SetRoomDataExternalRequest_class_data_; +// ------------------------------------------------------------------- + +class RoomMemberBinAttrInternal final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomMemberBinAttrInternal) */ { + public: + inline RoomMemberBinAttrInternal() : RoomMemberBinAttrInternal(nullptr) {} + ~RoomMemberBinAttrInternal() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomMemberBinAttrInternal* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomMemberBinAttrInternal)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomMemberBinAttrInternal(::google::protobuf::internal::ConstantInitialized); + + inline RoomMemberBinAttrInternal(const RoomMemberBinAttrInternal& from) : RoomMemberBinAttrInternal(nullptr, from) {} + inline RoomMemberBinAttrInternal(RoomMemberBinAttrInternal&& from) noexcept + : RoomMemberBinAttrInternal(nullptr, ::std::move(from)) {} + inline RoomMemberBinAttrInternal& operator=(const RoomMemberBinAttrInternal& from) { + CopyFrom(from); + return *this; + } + inline RoomMemberBinAttrInternal& operator=(RoomMemberBinAttrInternal&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomMemberBinAttrInternal& default_instance() { + return *reinterpret_cast( + &_RoomMemberBinAttrInternal_default_instance_); + } + static constexpr int kIndexInFileMessages = 7; + friend void swap(RoomMemberBinAttrInternal& a, RoomMemberBinAttrInternal& b) { a.Swap(&b); } + inline void Swap(RoomMemberBinAttrInternal* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomMemberBinAttrInternal* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomMemberBinAttrInternal* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomMemberBinAttrInternal& from); + void MergeFrom(const RoomMemberBinAttrInternal& from) { RoomMemberBinAttrInternal::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomMemberBinAttrInternal* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomMemberBinAttrInternal"; } + + explicit RoomMemberBinAttrInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomMemberBinAttrInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomMemberBinAttrInternal& from); + RoomMemberBinAttrInternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomMemberBinAttrInternal&& from) noexcept + : RoomMemberBinAttrInternal(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kDataFieldNumber = 2, + kUpdateDateFieldNumber = 1, + }; + // .np2_structs.BinAttr data = 2; + bool has_data() const; + void clear_data() ; + const ::np2_structs::BinAttr& data() const; + [[nodiscard]] ::np2_structs::BinAttr* PROTOBUF_NULLABLE release_data(); + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_data(); + void set_allocated_data(::np2_structs::BinAttr* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_data(::np2_structs::BinAttr* PROTOBUF_NULLABLE value); + ::np2_structs::BinAttr* PROTOBUF_NULLABLE unsafe_arena_release_data(); + + private: + const ::np2_structs::BinAttr& _internal_data() const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // uint64 updateDate = 1; + void clear_updatedate() ; + ::uint64_t updatedate() const; + void set_updatedate(::uint64_t value); + + private: + ::uint64_t _internal_updatedate() const; + void _internal_set_updatedate(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomMemberBinAttrInternal) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomMemberBinAttrInternal& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::BinAttr* PROTOBUF_NULLABLE data_; + ::uint64_t updatedate_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<38> RoomMemberBinAttrInternal_class_data_; +// ------------------------------------------------------------------- + +class RoomDataExternal final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomDataExternal) */ { + public: + inline RoomDataExternal() : RoomDataExternal(nullptr) {} + ~RoomDataExternal() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomDataExternal* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomDataExternal)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomDataExternal(::google::protobuf::internal::ConstantInitialized); + + inline RoomDataExternal(const RoomDataExternal& from) : RoomDataExternal(nullptr, from) {} + inline RoomDataExternal(RoomDataExternal&& from) noexcept + : RoomDataExternal(nullptr, ::std::move(from)) {} + inline RoomDataExternal& operator=(const RoomDataExternal& from) { + CopyFrom(from); + return *this; + } + inline RoomDataExternal& operator=(RoomDataExternal&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomDataExternal& default_instance() { + return *reinterpret_cast( + &_RoomDataExternal_default_instance_); + } + static constexpr int kIndexInFileMessages = 15; + friend void swap(RoomDataExternal& a, RoomDataExternal& b) { a.Swap(&b); } + inline void Swap(RoomDataExternal* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomDataExternal* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomDataExternal* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomDataExternal& from); + void MergeFrom(const RoomDataExternal& from) { RoomDataExternal::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomDataExternal* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomDataExternal"; } + + explicit RoomDataExternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomDataExternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomDataExternal& from); + RoomDataExternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomDataExternal&& from) noexcept + : RoomDataExternal(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomGroupFieldNumber = 13, + kRoomSearchableIntAttrExternalFieldNumber = 15, + kRoomSearchableBinAttrExternalFieldNumber = 16, + kRoomBinAttrExternalFieldNumber = 17, + kServerIdFieldNumber = 1, + kPublicSlotNumFieldNumber = 3, + kPrivateSlotNumFieldNumber = 4, + kOpenPublicSlotNumFieldNumber = 7, + kMaxSlotFieldNumber = 8, + kOpenPrivateSlotNumFieldNumber = 9, + kCurMemberNumFieldNumber = 10, + kOwnerFieldNumber = 12, + kLobbyIdFieldNumber = 5, + kRoomIdFieldNumber = 6, + kWorldIdFieldNumber = 2, + kFlagAttrFieldNumber = 14, + kPasswordSlotMaskFieldNumber = 11, + }; + // repeated .np2_structs.RoomGroup roomGroup = 13; + int roomgroup_size() const; + private: + int _internal_roomgroup_size() const; + + public: + void clear_roomgroup() ; + ::np2_structs::RoomGroup* PROTOBUF_NONNULL mutable_roomgroup(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>* PROTOBUF_NONNULL mutable_roomgroup(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>& _internal_roomgroup() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>* PROTOBUF_NONNULL _internal_mutable_roomgroup(); + public: + const ::np2_structs::RoomGroup& roomgroup(int index) const; + ::np2_structs::RoomGroup* PROTOBUF_NONNULL add_roomgroup(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>& roomgroup() const; + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 15; + int roomsearchableintattrexternal_size() const; + private: + int _internal_roomsearchableintattrexternal_size() const; + + public: + void clear_roomsearchableintattrexternal() ; + ::np2_structs::IntAttr* PROTOBUF_NONNULL mutable_roomsearchableintattrexternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL mutable_roomsearchableintattrexternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& _internal_roomsearchableintattrexternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL _internal_mutable_roomsearchableintattrexternal(); + public: + const ::np2_structs::IntAttr& roomsearchableintattrexternal(int index) const; + ::np2_structs::IntAttr* PROTOBUF_NONNULL add_roomsearchableintattrexternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& roomsearchableintattrexternal() const; + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 16; + int roomsearchablebinattrexternal_size() const; + private: + int _internal_roomsearchablebinattrexternal_size() const; + + public: + void clear_roomsearchablebinattrexternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roomsearchablebinattrexternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roomsearchablebinattrexternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roomsearchablebinattrexternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roomsearchablebinattrexternal(); + public: + const ::np2_structs::BinAttr& roomsearchablebinattrexternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roomsearchablebinattrexternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roomsearchablebinattrexternal() const; + // repeated .np2_structs.BinAttr roomBinAttrExternal = 17; + int roombinattrexternal_size() const; + private: + int _internal_roombinattrexternal_size() const; + + public: + void clear_roombinattrexternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roombinattrexternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roombinattrexternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roombinattrexternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roombinattrexternal(); + public: + const ::np2_structs::BinAttr& roombinattrexternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roombinattrexternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roombinattrexternal() const; + // .np2_structs.uint16 serverId = 1; + bool has_serverid() const; + void clear_serverid() ; + const ::np2_structs::uint16& serverid() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_serverid(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_serverid(); + void set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_serverid(); + + private: + const ::np2_structs::uint16& _internal_serverid() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_serverid(); + + public: + // .np2_structs.uint16 publicSlotNum = 3; + bool has_publicslotnum() const; + void clear_publicslotnum() ; + const ::np2_structs::uint16& publicslotnum() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_publicslotnum(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_publicslotnum(); + void set_allocated_publicslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_publicslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_publicslotnum(); + + private: + const ::np2_structs::uint16& _internal_publicslotnum() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_publicslotnum(); + + public: + // .np2_structs.uint16 privateSlotNum = 4; + bool has_privateslotnum() const; + void clear_privateslotnum() ; + const ::np2_structs::uint16& privateslotnum() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_privateslotnum(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_privateslotnum(); + void set_allocated_privateslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_privateslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_privateslotnum(); + + private: + const ::np2_structs::uint16& _internal_privateslotnum() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_privateslotnum(); + + public: + // .np2_structs.uint16 openPublicSlotNum = 7; + bool has_openpublicslotnum() const; + void clear_openpublicslotnum() ; + const ::np2_structs::uint16& openpublicslotnum() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_openpublicslotnum(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_openpublicslotnum(); + void set_allocated_openpublicslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_openpublicslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_openpublicslotnum(); + + private: + const ::np2_structs::uint16& _internal_openpublicslotnum() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_openpublicslotnum(); + + public: + // .np2_structs.uint16 maxSlot = 8; + bool has_maxslot() const; + void clear_maxslot() ; + const ::np2_structs::uint16& maxslot() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_maxslot(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_maxslot(); + void set_allocated_maxslot(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_maxslot(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_maxslot(); + + private: + const ::np2_structs::uint16& _internal_maxslot() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_maxslot(); + + public: + // .np2_structs.uint16 openPrivateSlotNum = 9; + bool has_openprivateslotnum() const; + void clear_openprivateslotnum() ; + const ::np2_structs::uint16& openprivateslotnum() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_openprivateslotnum(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_openprivateslotnum(); + void set_allocated_openprivateslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_openprivateslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_openprivateslotnum(); + + private: + const ::np2_structs::uint16& _internal_openprivateslotnum() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_openprivateslotnum(); + + public: + // .np2_structs.uint16 curMemberNum = 10; + bool has_curmembernum() const; + void clear_curmembernum() ; + const ::np2_structs::uint16& curmembernum() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_curmembernum(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_curmembernum(); + void set_allocated_curmembernum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_curmembernum(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_curmembernum(); + + private: + const ::np2_structs::uint16& _internal_curmembernum() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_curmembernum(); + + public: + // .np2_structs.UserInfo owner = 12; + bool has_owner() const; + void clear_owner() ; + const ::np2_structs::UserInfo& owner() const; + [[nodiscard]] ::np2_structs::UserInfo* PROTOBUF_NULLABLE release_owner(); + ::np2_structs::UserInfo* PROTOBUF_NONNULL mutable_owner(); + void set_allocated_owner(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_owner(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + ::np2_structs::UserInfo* PROTOBUF_NULLABLE unsafe_arena_release_owner(); + + private: + const ::np2_structs::UserInfo& _internal_owner() const; + ::np2_structs::UserInfo* PROTOBUF_NONNULL _internal_mutable_owner(); + + public: + // uint64 lobbyId = 5; + void clear_lobbyid() ; + ::uint64_t lobbyid() const; + void set_lobbyid(::uint64_t value); + + private: + ::uint64_t _internal_lobbyid() const; + void _internal_set_lobbyid(::uint64_t value); + + public: + // uint64 roomId = 6; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // uint32 worldId = 2; + void clear_worldid() ; + ::uint32_t worldid() const; + void set_worldid(::uint32_t value); + + private: + ::uint32_t _internal_worldid() const; + void _internal_set_worldid(::uint32_t value); + + public: + // uint32 flagAttr = 14; + void clear_flagattr() ; + ::uint32_t flagattr() const; + void set_flagattr(::uint32_t value); + + private: + ::uint32_t _internal_flagattr() const; + void _internal_set_flagattr(::uint32_t value); + + public: + // uint64 passwordSlotMask = 11; + void clear_passwordslotmask() ; + ::uint64_t passwordslotmask() const; + void set_passwordslotmask(::uint64_t value); + + private: + ::uint64_t _internal_passwordslotmask() const; + void _internal_set_passwordslotmask(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomDataExternal) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<5, 17, + 12, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomDataExternal& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::RoomGroup > roomgroup_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::IntAttr > roomsearchableintattrexternal_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roomsearchablebinattrexternal_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roombinattrexternal_; + ::np2_structs::uint16* PROTOBUF_NULLABLE serverid_; + ::np2_structs::uint16* PROTOBUF_NULLABLE publicslotnum_; + ::np2_structs::uint16* PROTOBUF_NULLABLE privateslotnum_; + ::np2_structs::uint16* PROTOBUF_NULLABLE openpublicslotnum_; + ::np2_structs::uint16* PROTOBUF_NULLABLE maxslot_; + ::np2_structs::uint16* PROTOBUF_NULLABLE openprivateslotnum_; + ::np2_structs::uint16* PROTOBUF_NULLABLE curmembernum_; + ::np2_structs::UserInfo* PROTOBUF_NULLABLE owner_; + ::uint64_t lobbyid_; + ::uint64_t roomid_; + ::uint32_t worldid_; + ::uint32_t flagattr_; + ::uint64_t passwordslotmask_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<29> RoomDataExternal_class_data_; +// ------------------------------------------------------------------- + +class MatchingSignalingInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.MatchingSignalingInfo) */ { + public: + inline MatchingSignalingInfo() : MatchingSignalingInfo(nullptr) {} + ~MatchingSignalingInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(MatchingSignalingInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(MatchingSignalingInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR MatchingSignalingInfo(::google::protobuf::internal::ConstantInitialized); + + inline MatchingSignalingInfo(const MatchingSignalingInfo& from) : MatchingSignalingInfo(nullptr, from) {} + inline MatchingSignalingInfo(MatchingSignalingInfo&& from) noexcept + : MatchingSignalingInfo(nullptr, ::std::move(from)) {} + inline MatchingSignalingInfo& operator=(const MatchingSignalingInfo& from) { + CopyFrom(from); + return *this; + } + inline MatchingSignalingInfo& operator=(MatchingSignalingInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const MatchingSignalingInfo& default_instance() { + return *reinterpret_cast( + &_MatchingSignalingInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 3; + friend void swap(MatchingSignalingInfo& a, MatchingSignalingInfo& b) { a.Swap(&b); } + inline void Swap(MatchingSignalingInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(MatchingSignalingInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + MatchingSignalingInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const MatchingSignalingInfo& from); + void MergeFrom(const MatchingSignalingInfo& from) { MatchingSignalingInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(MatchingSignalingInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.MatchingSignalingInfo"; } + + explicit MatchingSignalingInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + MatchingSignalingInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MatchingSignalingInfo& from); + MatchingSignalingInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, MatchingSignalingInfo&& from) noexcept + : MatchingSignalingInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNpidFieldNumber = 1, + kAddrFieldNumber = 2, + }; + // string npid = 1; + void clear_npid() ; + const ::std::string& npid() const; + template + void set_npid(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_npid(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_npid(); + void set_allocated_npid(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_npid() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_npid(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_npid(); + + public: + // .np2_structs.SignalingAddr addr = 2; + bool has_addr() const; + void clear_addr() ; + const ::np2_structs::SignalingAddr& addr() const; + [[nodiscard]] ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE release_addr(); + ::np2_structs::SignalingAddr* PROTOBUF_NONNULL mutable_addr(); + void set_allocated_addr(::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_addr(::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value); + ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE unsafe_arena_release_addr(); + + private: + const ::np2_structs::SignalingAddr& _internal_addr() const; + ::np2_structs::SignalingAddr* PROTOBUF_NONNULL _internal_mutable_addr(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.MatchingSignalingInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 1, 46, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const MatchingSignalingInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::internal::ArenaStringPtr npid_; + ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE addr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<34> MatchingSignalingInfo_class_data_; +// ------------------------------------------------------------------- + +class MatchingRoomStatus final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.MatchingRoomStatus) */ { + public: + inline MatchingRoomStatus() : MatchingRoomStatus(nullptr) {} + ~MatchingRoomStatus() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(MatchingRoomStatus* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(MatchingRoomStatus)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR MatchingRoomStatus(::google::protobuf::internal::ConstantInitialized); + + inline MatchingRoomStatus(const MatchingRoomStatus& from) : MatchingRoomStatus(nullptr, from) {} + inline MatchingRoomStatus(MatchingRoomStatus&& from) noexcept + : MatchingRoomStatus(nullptr, ::std::move(from)) {} + inline MatchingRoomStatus& operator=(const MatchingRoomStatus& from) { + CopyFrom(from); + return *this; + } + inline MatchingRoomStatus& operator=(MatchingRoomStatus&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const MatchingRoomStatus& default_instance() { + return *reinterpret_cast( + &_MatchingRoomStatus_default_instance_); + } + static constexpr int kIndexInFileMessages = 79; + friend void swap(MatchingRoomStatus& a, MatchingRoomStatus& b) { a.Swap(&b); } + inline void Swap(MatchingRoomStatus* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(MatchingRoomStatus* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + MatchingRoomStatus* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const MatchingRoomStatus& from); + void MergeFrom(const MatchingRoomStatus& from) { MatchingRoomStatus::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(MatchingRoomStatus* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.MatchingRoomStatus"; } + + explicit MatchingRoomStatus(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + MatchingRoomStatus(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MatchingRoomStatus& from); + MatchingRoomStatus( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, MatchingRoomStatus&& from) noexcept + : MatchingRoomStatus(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kMembersFieldNumber = 2, + kIdFieldNumber = 1, + kKickActorFieldNumber = 3, + kOptFieldNumber = 4, + }; + // repeated .np2_structs.GUIUserInfo members = 2; + int members_size() const; + private: + int _internal_members_size() const; + + public: + void clear_members() ; + ::np2_structs::GUIUserInfo* PROTOBUF_NONNULL mutable_members(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::GUIUserInfo>* PROTOBUF_NONNULL mutable_members(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::GUIUserInfo>& _internal_members() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::GUIUserInfo>* PROTOBUF_NONNULL _internal_mutable_members(); + public: + const ::np2_structs::GUIUserInfo& members(int index) const; + ::np2_structs::GUIUserInfo* PROTOBUF_NONNULL add_members(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::GUIUserInfo>& members() const; + // bytes id = 1; + void clear_id() ; + const ::std::string& id() const; + template + void set_id(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_id(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_id(); + void set_allocated_id(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_id() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_id(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_id(); + + public: + // string kick_actor = 3; + void clear_kick_actor() ; + const ::std::string& kick_actor() const; + template + void set_kick_actor(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_kick_actor(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_kick_actor(); + void set_allocated_kick_actor(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_kick_actor() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_kick_actor(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_kick_actor(); + + public: + // bytes opt = 4; + void clear_opt() ; + const ::std::string& opt() const; + template + void set_opt(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_opt(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_opt(); + void set_allocated_opt(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_opt() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_opt(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_opt(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.MatchingRoomStatus) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 1, 49, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const MatchingRoomStatus& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::GUIUserInfo > members_; + ::google::protobuf::internal::ArenaStringPtr id_; + ::google::protobuf::internal::ArenaStringPtr kick_actor_; + ::google::protobuf::internal::ArenaStringPtr opt_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<31> MatchingRoomStatus_class_data_; +// ------------------------------------------------------------------- + +class MatchingRoomList final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.MatchingRoomList) */ { + public: + inline MatchingRoomList() : MatchingRoomList(nullptr) {} + ~MatchingRoomList() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(MatchingRoomList* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(MatchingRoomList)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR MatchingRoomList(::google::protobuf::internal::ConstantInitialized); + + inline MatchingRoomList(const MatchingRoomList& from) : MatchingRoomList(nullptr, from) {} + inline MatchingRoomList(MatchingRoomList&& from) noexcept + : MatchingRoomList(nullptr, ::std::move(from)) {} + inline MatchingRoomList& operator=(const MatchingRoomList& from) { + CopyFrom(from); + return *this; + } + inline MatchingRoomList& operator=(MatchingRoomList&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const MatchingRoomList& default_instance() { + return *reinterpret_cast( + &_MatchingRoomList_default_instance_); + } + static constexpr int kIndexInFileMessages = 82; + friend void swap(MatchingRoomList& a, MatchingRoomList& b) { a.Swap(&b); } + inline void Swap(MatchingRoomList* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(MatchingRoomList* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + MatchingRoomList* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const MatchingRoomList& from); + void MergeFrom(const MatchingRoomList& from) { MatchingRoomList::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(MatchingRoomList* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.MatchingRoomList"; } + + explicit MatchingRoomList(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + MatchingRoomList(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MatchingRoomList& from); + MatchingRoomList( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, MatchingRoomList&& from) noexcept + : MatchingRoomList(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomsFieldNumber = 3, + kStartFieldNumber = 1, + kTotalFieldNumber = 2, + }; + // repeated .np2_structs.MatchingRoom rooms = 3; + int rooms_size() const; + private: + int _internal_rooms_size() const; + + public: + void clear_rooms() ; + ::np2_structs::MatchingRoom* PROTOBUF_NONNULL mutable_rooms(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingRoom>* PROTOBUF_NONNULL mutable_rooms(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingRoom>& _internal_rooms() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingRoom>* PROTOBUF_NONNULL _internal_mutable_rooms(); + public: + const ::np2_structs::MatchingRoom& rooms(int index) const; + ::np2_structs::MatchingRoom* PROTOBUF_NONNULL add_rooms(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingRoom>& rooms() const; + // uint32 start = 1; + void clear_start() ; + ::uint32_t start() const; + void set_start(::uint32_t value); + + private: + ::uint32_t _internal_start() const; + void _internal_set_start(::uint32_t value); + + public: + // uint32 total = 2; + void clear_total() ; + ::uint32_t total() const; + void set_total(::uint32_t value); + + private: + ::uint32_t _internal_total() const; + void _internal_set_total(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.MatchingRoomList) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const MatchingRoomList& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::MatchingRoom > rooms_; + ::uint32_t start_; + ::uint32_t total_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<29> MatchingRoomList_class_data_; +// ------------------------------------------------------------------- + +class Matching2SignalingInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.Matching2SignalingInfo) */ { + public: + inline Matching2SignalingInfo() : Matching2SignalingInfo(nullptr) {} + ~Matching2SignalingInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(Matching2SignalingInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(Matching2SignalingInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR Matching2SignalingInfo(::google::protobuf::internal::ConstantInitialized); + + inline Matching2SignalingInfo(const Matching2SignalingInfo& from) : Matching2SignalingInfo(nullptr, from) {} + inline Matching2SignalingInfo(Matching2SignalingInfo&& from) noexcept + : Matching2SignalingInfo(nullptr, ::std::move(from)) {} + inline Matching2SignalingInfo& operator=(const Matching2SignalingInfo& from) { + CopyFrom(from); + return *this; + } + inline Matching2SignalingInfo& operator=(Matching2SignalingInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const Matching2SignalingInfo& default_instance() { + return *reinterpret_cast( + &_Matching2SignalingInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 4; + friend void swap(Matching2SignalingInfo& a, Matching2SignalingInfo& b) { a.Swap(&b); } + inline void Swap(Matching2SignalingInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(Matching2SignalingInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + Matching2SignalingInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const Matching2SignalingInfo& from); + void MergeFrom(const Matching2SignalingInfo& from) { Matching2SignalingInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(Matching2SignalingInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.Matching2SignalingInfo"; } + + explicit Matching2SignalingInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + Matching2SignalingInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Matching2SignalingInfo& from); + Matching2SignalingInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, Matching2SignalingInfo&& from) noexcept + : Matching2SignalingInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kMemberIdFieldNumber = 1, + kAddrFieldNumber = 2, + }; + // .np2_structs.uint16 member_id = 1; + bool has_member_id() const; + void clear_member_id() ; + const ::np2_structs::uint16& member_id() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_member_id(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_member_id(); + void set_allocated_member_id(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_member_id(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_member_id(); + + private: + const ::np2_structs::uint16& _internal_member_id() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_member_id(); + + public: + // .np2_structs.SignalingAddr addr = 2; + bool has_addr() const; + void clear_addr() ; + const ::np2_structs::SignalingAddr& addr() const; + [[nodiscard]] ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE release_addr(); + ::np2_structs::SignalingAddr* PROTOBUF_NONNULL mutable_addr(); + void set_allocated_addr(::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_addr(::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value); + ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE unsafe_arena_release_addr(); + + private: + const ::np2_structs::SignalingAddr& _internal_addr() const; + ::np2_structs::SignalingAddr* PROTOBUF_NONNULL _internal_mutable_addr(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.Matching2SignalingInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const Matching2SignalingInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::uint16* PROTOBUF_NULLABLE member_id_; + ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE addr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<35> Matching2SignalingInfo_class_data_; +// ------------------------------------------------------------------- + +class JoinRoomRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.JoinRoomRequest) */ { + public: + inline JoinRoomRequest() : JoinRoomRequest(nullptr) {} + ~JoinRoomRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(JoinRoomRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(JoinRoomRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR JoinRoomRequest(::google::protobuf::internal::ConstantInitialized); + + inline JoinRoomRequest(const JoinRoomRequest& from) : JoinRoomRequest(nullptr, from) {} + inline JoinRoomRequest(JoinRoomRequest&& from) noexcept + : JoinRoomRequest(nullptr, ::std::move(from)) {} + inline JoinRoomRequest& operator=(const JoinRoomRequest& from) { + CopyFrom(from); + return *this; + } + inline JoinRoomRequest& operator=(JoinRoomRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const JoinRoomRequest& default_instance() { + return *reinterpret_cast( + &_JoinRoomRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 23; + friend void swap(JoinRoomRequest& a, JoinRoomRequest& b) { a.Swap(&b); } + inline void Swap(JoinRoomRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(JoinRoomRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + JoinRoomRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const JoinRoomRequest& from); + void MergeFrom(const JoinRoomRequest& from) { JoinRoomRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(JoinRoomRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.JoinRoomRequest"; } + + explicit JoinRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + JoinRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const JoinRoomRequest& from); + JoinRoomRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, JoinRoomRequest&& from) noexcept + : JoinRoomRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomMemberBinAttrInternalFieldNumber = 4, + kRoomPasswordFieldNumber = 2, + kJoinRoomGroupLabelFieldNumber = 3, + kOptDataFieldNumber = 5, + kTeamIdFieldNumber = 6, + kRoomIdFieldNumber = 1, + }; + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; + int roommemberbinattrinternal_size() const; + private: + int _internal_roommemberbinattrinternal_size() const; + + public: + void clear_roommemberbinattrinternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roommemberbinattrinternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roommemberbinattrinternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roommemberbinattrinternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roommemberbinattrinternal(); + public: + const ::np2_structs::BinAttr& roommemberbinattrinternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roommemberbinattrinternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roommemberbinattrinternal() const; + // bytes roomPassword = 2; + void clear_roompassword() ; + const ::std::string& roompassword() const; + template + void set_roompassword(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_roompassword(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_roompassword(); + void set_allocated_roompassword(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_roompassword() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_roompassword(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_roompassword(); + + public: + // bytes joinRoomGroupLabel = 3; + void clear_joinroomgrouplabel() ; + const ::std::string& joinroomgrouplabel() const; + template + void set_joinroomgrouplabel(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_joinroomgrouplabel(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_joinroomgrouplabel(); + void set_allocated_joinroomgrouplabel(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_joinroomgrouplabel() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_joinroomgrouplabel(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_joinroomgrouplabel(); + + public: + // .np2_structs.PresenceOptionData optData = 5; + bool has_optdata() const; + void clear_optdata() ; + const ::np2_structs::PresenceOptionData& optdata() const; + [[nodiscard]] ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE release_optdata(); + ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL mutable_optdata(); + void set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value); + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE unsafe_arena_release_optdata(); + + private: + const ::np2_structs::PresenceOptionData& _internal_optdata() const; + ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL _internal_mutable_optdata(); + + public: + // .np2_structs.uint8 teamId = 6; + bool has_teamid() const; + void clear_teamid() ; + const ::np2_structs::uint8& teamid() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_teamid(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_teamid(); + void set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_teamid(); + + private: + const ::np2_structs::uint8& _internal_teamid() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_teamid(); + + public: + // uint64 roomId = 1; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.JoinRoomRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 6, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const JoinRoomRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roommemberbinattrinternal_; + ::google::protobuf::internal::ArenaStringPtr roompassword_; + ::google::protobuf::internal::ArenaStringPtr joinroomgrouplabel_; + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE optdata_; + ::np2_structs::uint8* PROTOBUF_NULLABLE teamid_; + ::uint64_t roomid_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<28> JoinRoomRequest_class_data_; +// ------------------------------------------------------------------- + +class IntSearchFilter final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.IntSearchFilter) */ { + public: + inline IntSearchFilter() : IntSearchFilter(nullptr) {} + ~IntSearchFilter() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(IntSearchFilter* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(IntSearchFilter)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR IntSearchFilter(::google::protobuf::internal::ConstantInitialized); + + inline IntSearchFilter(const IntSearchFilter& from) : IntSearchFilter(nullptr, from) {} + inline IntSearchFilter(IntSearchFilter&& from) noexcept + : IntSearchFilter(nullptr, ::std::move(from)) {} + inline IntSearchFilter& operator=(const IntSearchFilter& from) { + CopyFrom(from); + return *this; + } + inline IntSearchFilter& operator=(IntSearchFilter&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const IntSearchFilter& default_instance() { + return *reinterpret_cast( + &_IntSearchFilter_default_instance_); + } + static constexpr int kIndexInFileMessages = 16; + friend void swap(IntSearchFilter& a, IntSearchFilter& b) { a.Swap(&b); } + inline void Swap(IntSearchFilter* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(IntSearchFilter* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + IntSearchFilter* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const IntSearchFilter& from); + void MergeFrom(const IntSearchFilter& from) { IntSearchFilter::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(IntSearchFilter* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.IntSearchFilter"; } + + explicit IntSearchFilter(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + IntSearchFilter(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const IntSearchFilter& from); + IntSearchFilter( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, IntSearchFilter&& from) noexcept + : IntSearchFilter(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSearchOperatorFieldNumber = 1, + kAttrFieldNumber = 2, + }; + // .np2_structs.uint8 searchOperator = 1; + bool has_searchoperator() const; + void clear_searchoperator() ; + const ::np2_structs::uint8& searchoperator() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_searchoperator(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_searchoperator(); + void set_allocated_searchoperator(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_searchoperator(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_searchoperator(); + + private: + const ::np2_structs::uint8& _internal_searchoperator() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_searchoperator(); + + public: + // .np2_structs.IntAttr attr = 2; + bool has_attr() const; + void clear_attr() ; + const ::np2_structs::IntAttr& attr() const; + [[nodiscard]] ::np2_structs::IntAttr* PROTOBUF_NULLABLE release_attr(); + ::np2_structs::IntAttr* PROTOBUF_NONNULL mutable_attr(); + void set_allocated_attr(::np2_structs::IntAttr* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_attr(::np2_structs::IntAttr* PROTOBUF_NULLABLE value); + ::np2_structs::IntAttr* PROTOBUF_NULLABLE unsafe_arena_release_attr(); + + private: + const ::np2_structs::IntAttr& _internal_attr() const; + ::np2_structs::IntAttr* PROTOBUF_NONNULL _internal_mutable_attr(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.IntSearchFilter) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const IntSearchFilter& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::uint8* PROTOBUF_NULLABLE searchoperator_; + ::np2_structs::IntAttr* PROTOBUF_NULLABLE attr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<28> IntSearchFilter_class_data_; +// ------------------------------------------------------------------- + +class CreateJoinRoomRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.CreateJoinRoomRequest) */ { + public: + inline CreateJoinRoomRequest() : CreateJoinRoomRequest(nullptr) {} + ~CreateJoinRoomRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(CreateJoinRoomRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(CreateJoinRoomRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR CreateJoinRoomRequest(::google::protobuf::internal::ConstantInitialized); + + inline CreateJoinRoomRequest(const CreateJoinRoomRequest& from) : CreateJoinRoomRequest(nullptr, from) {} + inline CreateJoinRoomRequest(CreateJoinRoomRequest&& from) noexcept + : CreateJoinRoomRequest(nullptr, ::std::move(from)) {} + inline CreateJoinRoomRequest& operator=(const CreateJoinRoomRequest& from) { + CopyFrom(from); + return *this; + } + inline CreateJoinRoomRequest& operator=(CreateJoinRoomRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const CreateJoinRoomRequest& default_instance() { + return *reinterpret_cast( + &_CreateJoinRoomRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 22; + friend void swap(CreateJoinRoomRequest& a, CreateJoinRoomRequest& b) { a.Swap(&b); } + inline void Swap(CreateJoinRoomRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(CreateJoinRoomRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + CreateJoinRoomRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const CreateJoinRoomRequest& from); + void MergeFrom(const CreateJoinRoomRequest& from) { CreateJoinRoomRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(CreateJoinRoomRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.CreateJoinRoomRequest"; } + + explicit CreateJoinRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + CreateJoinRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const CreateJoinRoomRequest& from); + CreateJoinRoomRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, CreateJoinRoomRequest&& from) noexcept + : CreateJoinRoomRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomBinAttrInternalFieldNumber = 5, + kRoomSearchableIntAttrExternalFieldNumber = 6, + kRoomSearchableBinAttrExternalFieldNumber = 7, + kRoomBinAttrExternalFieldNumber = 8, + kGroupConfigFieldNumber = 10, + kAllowedUserFieldNumber = 12, + kBlockedUserFieldNumber = 13, + kRoomMemberBinAttrInternalFieldNumber = 15, + kRoomPasswordFieldNumber = 9, + kJoinRoomGroupLabelFieldNumber = 14, + kTeamIdFieldNumber = 16, + kSigOptParamFieldNumber = 17, + kLobbyIdFieldNumber = 2, + kWorldIdFieldNumber = 1, + kMaxSlotFieldNumber = 3, + kPasswordSlotMaskFieldNumber = 11, + kFlagAttrFieldNumber = 4, + }; + // repeated .np2_structs.BinAttr roomBinAttrInternal = 5; + int roombinattrinternal_size() const; + private: + int _internal_roombinattrinternal_size() const; + + public: + void clear_roombinattrinternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roombinattrinternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roombinattrinternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roombinattrinternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roombinattrinternal(); + public: + const ::np2_structs::BinAttr& roombinattrinternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roombinattrinternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roombinattrinternal() const; + // repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 6; + int roomsearchableintattrexternal_size() const; + private: + int _internal_roomsearchableintattrexternal_size() const; + + public: + void clear_roomsearchableintattrexternal() ; + ::np2_structs::IntAttr* PROTOBUF_NONNULL mutable_roomsearchableintattrexternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL mutable_roomsearchableintattrexternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& _internal_roomsearchableintattrexternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL _internal_mutable_roomsearchableintattrexternal(); + public: + const ::np2_structs::IntAttr& roomsearchableintattrexternal(int index) const; + ::np2_structs::IntAttr* PROTOBUF_NONNULL add_roomsearchableintattrexternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& roomsearchableintattrexternal() const; + // repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 7; + int roomsearchablebinattrexternal_size() const; + private: + int _internal_roomsearchablebinattrexternal_size() const; + + public: + void clear_roomsearchablebinattrexternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roomsearchablebinattrexternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roomsearchablebinattrexternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roomsearchablebinattrexternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roomsearchablebinattrexternal(); + public: + const ::np2_structs::BinAttr& roomsearchablebinattrexternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roomsearchablebinattrexternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roomsearchablebinattrexternal() const; + // repeated .np2_structs.BinAttr roomBinAttrExternal = 8; + int roombinattrexternal_size() const; + private: + int _internal_roombinattrexternal_size() const; + + public: + void clear_roombinattrexternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roombinattrexternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roombinattrexternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roombinattrexternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roombinattrexternal(); + public: + const ::np2_structs::BinAttr& roombinattrexternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roombinattrexternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roombinattrexternal() const; + // repeated .np2_structs.GroupConfig groupConfig = 10; + int groupconfig_size() const; + private: + int _internal_groupconfig_size() const; + + public: + void clear_groupconfig() ; + ::np2_structs::GroupConfig* PROTOBUF_NONNULL mutable_groupconfig(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::GroupConfig>* PROTOBUF_NONNULL mutable_groupconfig(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::GroupConfig>& _internal_groupconfig() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::GroupConfig>* PROTOBUF_NONNULL _internal_mutable_groupconfig(); + public: + const ::np2_structs::GroupConfig& groupconfig(int index) const; + ::np2_structs::GroupConfig* PROTOBUF_NONNULL add_groupconfig(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::GroupConfig>& groupconfig() const; + // repeated string allowedUser = 12; + int alloweduser_size() const; + private: + int _internal_alloweduser_size() const; + + public: + void clear_alloweduser() ; + const ::std::string& alloweduser(int index) const; + ::std::string* PROTOBUF_NONNULL mutable_alloweduser(int index); + template + void set_alloweduser(int index, Arg_&& value, Args_... args); + ::std::string* PROTOBUF_NONNULL add_alloweduser(); + template + void add_alloweduser(Arg_&& value, Args_... args); + const ::google::protobuf::RepeatedPtrField<::std::string>& alloweduser() const; + ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL mutable_alloweduser(); + + private: + const ::google::protobuf::RepeatedPtrField<::std::string>& _internal_alloweduser() const; + ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL _internal_mutable_alloweduser(); + + public: + // repeated string blockedUser = 13; + int blockeduser_size() const; + private: + int _internal_blockeduser_size() const; + + public: + void clear_blockeduser() ; + const ::std::string& blockeduser(int index) const; + ::std::string* PROTOBUF_NONNULL mutable_blockeduser(int index); + template + void set_blockeduser(int index, Arg_&& value, Args_... args); + ::std::string* PROTOBUF_NONNULL add_blockeduser(); + template + void add_blockeduser(Arg_&& value, Args_... args); + const ::google::protobuf::RepeatedPtrField<::std::string>& blockeduser() const; + ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL mutable_blockeduser(); + + private: + const ::google::protobuf::RepeatedPtrField<::std::string>& _internal_blockeduser() const; + ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL _internal_mutable_blockeduser(); + + public: + // repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 15; + int roommemberbinattrinternal_size() const; + private: + int _internal_roommemberbinattrinternal_size() const; + + public: + void clear_roommemberbinattrinternal() ; + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_roommemberbinattrinternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL mutable_roommemberbinattrinternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& _internal_roommemberbinattrinternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL _internal_mutable_roommemberbinattrinternal(); + public: + const ::np2_structs::BinAttr& roommemberbinattrinternal(int index) const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL add_roommemberbinattrinternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& roommemberbinattrinternal() const; + // bytes roomPassword = 9; + void clear_roompassword() ; + const ::std::string& roompassword() const; + template + void set_roompassword(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_roompassword(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_roompassword(); + void set_allocated_roompassword(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_roompassword() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_roompassword(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_roompassword(); + + public: + // bytes joinRoomGroupLabel = 14; + void clear_joinroomgrouplabel() ; + const ::std::string& joinroomgrouplabel() const; + template + void set_joinroomgrouplabel(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_joinroomgrouplabel(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_joinroomgrouplabel(); + void set_allocated_joinroomgrouplabel(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_joinroomgrouplabel() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_joinroomgrouplabel(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_joinroomgrouplabel(); + + public: + // .np2_structs.uint8 teamId = 16; + bool has_teamid() const; + void clear_teamid() ; + const ::np2_structs::uint8& teamid() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_teamid(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_teamid(); + void set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_teamid(); + + private: + const ::np2_structs::uint8& _internal_teamid() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_teamid(); + + public: + // .np2_structs.OptParam sigOptParam = 17; + bool has_sigoptparam() const; + void clear_sigoptparam() ; + const ::np2_structs::OptParam& sigoptparam() const; + [[nodiscard]] ::np2_structs::OptParam* PROTOBUF_NULLABLE release_sigoptparam(); + ::np2_structs::OptParam* PROTOBUF_NONNULL mutable_sigoptparam(); + void set_allocated_sigoptparam(::np2_structs::OptParam* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_sigoptparam(::np2_structs::OptParam* PROTOBUF_NULLABLE value); + ::np2_structs::OptParam* PROTOBUF_NULLABLE unsafe_arena_release_sigoptparam(); + + private: + const ::np2_structs::OptParam& _internal_sigoptparam() const; + ::np2_structs::OptParam* PROTOBUF_NONNULL _internal_mutable_sigoptparam(); + + public: + // uint64 lobbyId = 2; + void clear_lobbyid() ; + ::uint64_t lobbyid() const; + void set_lobbyid(::uint64_t value); + + private: + ::uint64_t _internal_lobbyid() const; + void _internal_set_lobbyid(::uint64_t value); + + public: + // uint32 worldId = 1; + void clear_worldid() ; + ::uint32_t worldid() const; + void set_worldid(::uint32_t value); + + private: + ::uint32_t _internal_worldid() const; + void _internal_set_worldid(::uint32_t value); + + public: + // uint32 maxSlot = 3; + void clear_maxslot() ; + ::uint32_t maxslot() const; + void set_maxslot(::uint32_t value); + + private: + ::uint32_t _internal_maxslot() const; + void _internal_set_maxslot(::uint32_t value); + + public: + // uint64 passwordSlotMask = 11; + void clear_passwordslotmask() ; + ::uint64_t passwordslotmask() const; + void set_passwordslotmask(::uint64_t value); + + private: + ::uint64_t _internal_passwordslotmask() const; + void _internal_set_passwordslotmask(::uint64_t value); + + public: + // uint32 flagAttr = 4; + void clear_flagattr() ; + ::uint32_t flagattr() const; + void set_flagattr(::uint32_t value); + + private: + ::uint32_t _internal_flagattr() const; + void _internal_set_flagattr(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.CreateJoinRoomRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<5, 17, + 8, 80, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const CreateJoinRoomRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roombinattrinternal_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::IntAttr > roomsearchableintattrexternal_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roomsearchablebinattrexternal_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roombinattrexternal_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::GroupConfig > groupconfig_; + ::google::protobuf::RepeatedPtrField<::std::string> alloweduser_; + ::google::protobuf::RepeatedPtrField<::std::string> blockeduser_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttr > roommemberbinattrinternal_; + ::google::protobuf::internal::ArenaStringPtr roompassword_; + ::google::protobuf::internal::ArenaStringPtr joinroomgrouplabel_; + ::np2_structs::uint8* PROTOBUF_NULLABLE teamid_; + ::np2_structs::OptParam* PROTOBUF_NULLABLE sigoptparam_; + ::uint64_t lobbyid_; + ::uint32_t worldid_; + ::uint32_t maxslot_; + ::uint64_t passwordslotmask_; + ::uint32_t flagattr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<34> CreateJoinRoomRequest_class_data_; +// ------------------------------------------------------------------- + +class BinSearchFilter final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.BinSearchFilter) */ { + public: + inline BinSearchFilter() : BinSearchFilter(nullptr) {} + ~BinSearchFilter() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(BinSearchFilter* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(BinSearchFilter)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR BinSearchFilter(::google::protobuf::internal::ConstantInitialized); + + inline BinSearchFilter(const BinSearchFilter& from) : BinSearchFilter(nullptr, from) {} + inline BinSearchFilter(BinSearchFilter&& from) noexcept + : BinSearchFilter(nullptr, ::std::move(from)) {} + inline BinSearchFilter& operator=(const BinSearchFilter& from) { + CopyFrom(from); + return *this; + } + inline BinSearchFilter& operator=(BinSearchFilter&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const BinSearchFilter& default_instance() { + return *reinterpret_cast( + &_BinSearchFilter_default_instance_); + } + static constexpr int kIndexInFileMessages = 17; + friend void swap(BinSearchFilter& a, BinSearchFilter& b) { a.Swap(&b); } + inline void Swap(BinSearchFilter* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(BinSearchFilter* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + BinSearchFilter* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const BinSearchFilter& from); + void MergeFrom(const BinSearchFilter& from) { BinSearchFilter::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(BinSearchFilter* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.BinSearchFilter"; } + + explicit BinSearchFilter(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + BinSearchFilter(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const BinSearchFilter& from); + BinSearchFilter( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, BinSearchFilter&& from) noexcept + : BinSearchFilter(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSearchOperatorFieldNumber = 1, + kAttrFieldNumber = 2, + }; + // .np2_structs.uint8 searchOperator = 1; + bool has_searchoperator() const; + void clear_searchoperator() ; + const ::np2_structs::uint8& searchoperator() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_searchoperator(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_searchoperator(); + void set_allocated_searchoperator(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_searchoperator(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_searchoperator(); + + private: + const ::np2_structs::uint8& _internal_searchoperator() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_searchoperator(); + + public: + // .np2_structs.BinAttr attr = 2; + bool has_attr() const; + void clear_attr() ; + const ::np2_structs::BinAttr& attr() const; + [[nodiscard]] ::np2_structs::BinAttr* PROTOBUF_NULLABLE release_attr(); + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_attr(); + void set_allocated_attr(::np2_structs::BinAttr* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_attr(::np2_structs::BinAttr* PROTOBUF_NULLABLE value); + ::np2_structs::BinAttr* PROTOBUF_NULLABLE unsafe_arena_release_attr(); + + private: + const ::np2_structs::BinAttr& _internal_attr() const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL _internal_mutable_attr(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.BinSearchFilter) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const BinSearchFilter& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::uint8* PROTOBUF_NULLABLE searchoperator_; + ::np2_structs::BinAttr* PROTOBUF_NULLABLE attr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<28> BinSearchFilter_class_data_; +// ------------------------------------------------------------------- + +class BinAttrInternal final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.BinAttrInternal) */ { + public: + inline BinAttrInternal() : BinAttrInternal(nullptr) {} + ~BinAttrInternal() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(BinAttrInternal* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(BinAttrInternal)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR BinAttrInternal(::google::protobuf::internal::ConstantInitialized); + + inline BinAttrInternal(const BinAttrInternal& from) : BinAttrInternal(nullptr, from) {} + inline BinAttrInternal(BinAttrInternal&& from) noexcept + : BinAttrInternal(nullptr, ::std::move(from)) {} + inline BinAttrInternal& operator=(const BinAttrInternal& from) { + CopyFrom(from); + return *this; + } + inline BinAttrInternal& operator=(BinAttrInternal&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const BinAttrInternal& default_instance() { + return *reinterpret_cast( + &_BinAttrInternal_default_instance_); + } + static constexpr int kIndexInFileMessages = 8; + friend void swap(BinAttrInternal& a, BinAttrInternal& b) { a.Swap(&b); } + inline void Swap(BinAttrInternal* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(BinAttrInternal* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + BinAttrInternal* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const BinAttrInternal& from); + void MergeFrom(const BinAttrInternal& from) { BinAttrInternal::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(BinAttrInternal* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.BinAttrInternal"; } + + explicit BinAttrInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + BinAttrInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const BinAttrInternal& from); + BinAttrInternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, BinAttrInternal&& from) noexcept + : BinAttrInternal(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kUpdateMemberIdFieldNumber = 2, + kDataFieldNumber = 3, + kUpdateDateFieldNumber = 1, + }; + // .np2_structs.uint16 updateMemberId = 2; + bool has_updatememberid() const; + void clear_updatememberid() ; + const ::np2_structs::uint16& updatememberid() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_updatememberid(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_updatememberid(); + void set_allocated_updatememberid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_updatememberid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_updatememberid(); + + private: + const ::np2_structs::uint16& _internal_updatememberid() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_updatememberid(); + + public: + // .np2_structs.BinAttr data = 3; + bool has_data() const; + void clear_data() ; + const ::np2_structs::BinAttr& data() const; + [[nodiscard]] ::np2_structs::BinAttr* PROTOBUF_NULLABLE release_data(); + ::np2_structs::BinAttr* PROTOBUF_NONNULL mutable_data(); + void set_allocated_data(::np2_structs::BinAttr* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_data(::np2_structs::BinAttr* PROTOBUF_NULLABLE value); + ::np2_structs::BinAttr* PROTOBUF_NULLABLE unsafe_arena_release_data(); + + private: + const ::np2_structs::BinAttr& _internal_data() const; + ::np2_structs::BinAttr* PROTOBUF_NONNULL _internal_mutable_data(); + + public: + // uint64 updateDate = 1; + void clear_updatedate() ; + ::uint64_t updatedate() const; + void set_updatedate(::uint64_t value); + + private: + ::uint64_t _internal_updatedate() const; + void _internal_set_updatedate(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.BinAttrInternal) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const BinAttrInternal& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::uint16* PROTOBUF_NULLABLE updatememberid_; + ::np2_structs::BinAttr* PROTOBUF_NULLABLE data_; + ::uint64_t updatedate_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<28> BinAttrInternal_class_data_; +// ------------------------------------------------------------------- + +class SearchRoomResponse final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SearchRoomResponse) */ { + public: + inline SearchRoomResponse() : SearchRoomResponse(nullptr) {} + ~SearchRoomResponse() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SearchRoomResponse* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SearchRoomResponse)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SearchRoomResponse(::google::protobuf::internal::ConstantInitialized); + + inline SearchRoomResponse(const SearchRoomResponse& from) : SearchRoomResponse(nullptr, from) {} + inline SearchRoomResponse(SearchRoomResponse&& from) noexcept + : SearchRoomResponse(nullptr, ::std::move(from)) {} + inline SearchRoomResponse& operator=(const SearchRoomResponse& from) { + CopyFrom(from); + return *this; + } + inline SearchRoomResponse& operator=(SearchRoomResponse&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SearchRoomResponse& default_instance() { + return *reinterpret_cast( + &_SearchRoomResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = 21; + friend void swap(SearchRoomResponse& a, SearchRoomResponse& b) { a.Swap(&b); } + inline void Swap(SearchRoomResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SearchRoomResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SearchRoomResponse* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SearchRoomResponse& from); + void MergeFrom(const SearchRoomResponse& from) { SearchRoomResponse::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SearchRoomResponse* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SearchRoomResponse"; } + + explicit SearchRoomResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SearchRoomResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SearchRoomResponse& from); + SearchRoomResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SearchRoomResponse&& from) noexcept + : SearchRoomResponse(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomsFieldNumber = 3, + kStartIndexFieldNumber = 1, + kTotalFieldNumber = 2, + }; + // repeated .np2_structs.RoomDataExternal rooms = 3; + int rooms_size() const; + private: + int _internal_rooms_size() const; + + public: + void clear_rooms() ; + ::np2_structs::RoomDataExternal* PROTOBUF_NONNULL mutable_rooms(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>* PROTOBUF_NONNULL mutable_rooms(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>& _internal_rooms() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>* PROTOBUF_NONNULL _internal_mutable_rooms(); + public: + const ::np2_structs::RoomDataExternal& rooms(int index) const; + ::np2_structs::RoomDataExternal* PROTOBUF_NONNULL add_rooms(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>& rooms() const; + // uint32 startIndex = 1; + void clear_startindex() ; + ::uint32_t startindex() const; + void set_startindex(::uint32_t value); + + private: + ::uint32_t _internal_startindex() const; + void _internal_set_startindex(::uint32_t value); + + public: + // uint32 total = 2; + void clear_total() ; + ::uint32_t total() const; + void set_total(::uint32_t value); + + private: + ::uint32_t _internal_total() const; + void _internal_set_total(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SearchRoomResponse) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SearchRoomResponse& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::RoomDataExternal > rooms_; + ::uint32_t startindex_; + ::uint32_t total_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<31> SearchRoomResponse_class_data_; +// ------------------------------------------------------------------- + +class SearchRoomRequest final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.SearchRoomRequest) */ { + public: + inline SearchRoomRequest() : SearchRoomRequest(nullptr) {} + ~SearchRoomRequest() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(SearchRoomRequest* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(SearchRoomRequest)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR SearchRoomRequest(::google::protobuf::internal::ConstantInitialized); + + inline SearchRoomRequest(const SearchRoomRequest& from) : SearchRoomRequest(nullptr, from) {} + inline SearchRoomRequest(SearchRoomRequest&& from) noexcept + : SearchRoomRequest(nullptr, ::std::move(from)) {} + inline SearchRoomRequest& operator=(const SearchRoomRequest& from) { + CopyFrom(from); + return *this; + } + inline SearchRoomRequest& operator=(SearchRoomRequest&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const SearchRoomRequest& default_instance() { + return *reinterpret_cast( + &_SearchRoomRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = 20; + friend void swap(SearchRoomRequest& a, SearchRoomRequest& b) { a.Swap(&b); } + inline void Swap(SearchRoomRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(SearchRoomRequest* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + SearchRoomRequest* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const SearchRoomRequest& from); + void MergeFrom(const SearchRoomRequest& from) { SearchRoomRequest::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(SearchRoomRequest* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.SearchRoomRequest"; } + + explicit SearchRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + SearchRoomRequest(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SearchRoomRequest& from); + SearchRoomRequest( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SearchRoomRequest&& from) noexcept + : SearchRoomRequest(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kIntFilterFieldNumber = 8, + kBinFilterFieldNumber = 9, + kAttrIdFieldNumber = 10, + kOptionFieldNumber = 1, + kWorldIdFieldNumber = 2, + kLobbyIdFieldNumber = 3, + kRangeFilterStartIndexFieldNumber = 4, + kRangeFilterMaxFieldNumber = 5, + kFlagFilterFieldNumber = 6, + kFlagAttrFieldNumber = 7, + }; + // repeated .np2_structs.IntSearchFilter intFilter = 8; + int intfilter_size() const; + private: + int _internal_intfilter_size() const; + + public: + void clear_intfilter() ; + ::np2_structs::IntSearchFilter* PROTOBUF_NONNULL mutable_intfilter(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::IntSearchFilter>* PROTOBUF_NONNULL mutable_intfilter(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::IntSearchFilter>& _internal_intfilter() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::IntSearchFilter>* PROTOBUF_NONNULL _internal_mutable_intfilter(); + public: + const ::np2_structs::IntSearchFilter& intfilter(int index) const; + ::np2_structs::IntSearchFilter* PROTOBUF_NONNULL add_intfilter(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::IntSearchFilter>& intfilter() const; + // repeated .np2_structs.BinSearchFilter binFilter = 9; + int binfilter_size() const; + private: + int _internal_binfilter_size() const; + + public: + void clear_binfilter() ; + ::np2_structs::BinSearchFilter* PROTOBUF_NONNULL mutable_binfilter(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinSearchFilter>* PROTOBUF_NONNULL mutable_binfilter(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinSearchFilter>& _internal_binfilter() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinSearchFilter>* PROTOBUF_NONNULL _internal_mutable_binfilter(); + public: + const ::np2_structs::BinSearchFilter& binfilter(int index) const; + ::np2_structs::BinSearchFilter* PROTOBUF_NONNULL add_binfilter(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinSearchFilter>& binfilter() const; + // repeated .np2_structs.uint16 attrId = 10; + int attrid_size() const; + private: + int _internal_attrid_size() const; + + public: + void clear_attrid() ; + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_attrid(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL mutable_attrid(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& _internal_attrid() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL _internal_mutable_attrid(); + public: + const ::np2_structs::uint16& attrid(int index) const; + ::np2_structs::uint16* PROTOBUF_NONNULL add_attrid(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& attrid() const; + // int32 option = 1; + void clear_option() ; + ::int32_t option() const; + void set_option(::int32_t value); + + private: + ::int32_t _internal_option() const; + void _internal_set_option(::int32_t value); + + public: + // uint32 worldId = 2; + void clear_worldid() ; + ::uint32_t worldid() const; + void set_worldid(::uint32_t value); + + private: + ::uint32_t _internal_worldid() const; + void _internal_set_worldid(::uint32_t value); + + public: + // uint64 lobbyId = 3; + void clear_lobbyid() ; + ::uint64_t lobbyid() const; + void set_lobbyid(::uint64_t value); + + private: + ::uint64_t _internal_lobbyid() const; + void _internal_set_lobbyid(::uint64_t value); + + public: + // uint32 rangeFilter_startIndex = 4; + void clear_rangefilter_startindex() ; + ::uint32_t rangefilter_startindex() const; + void set_rangefilter_startindex(::uint32_t value); + + private: + ::uint32_t _internal_rangefilter_startindex() const; + void _internal_set_rangefilter_startindex(::uint32_t value); + + public: + // uint32 rangeFilter_max = 5; + void clear_rangefilter_max() ; + ::uint32_t rangefilter_max() const; + void set_rangefilter_max(::uint32_t value); + + private: + ::uint32_t _internal_rangefilter_max() const; + void _internal_set_rangefilter_max(::uint32_t value); + + public: + // uint32 flagFilter = 6; + void clear_flagfilter() ; + ::uint32_t flagfilter() const; + void set_flagfilter(::uint32_t value); + + private: + ::uint32_t _internal_flagfilter() const; + void _internal_set_flagfilter(::uint32_t value); + + public: + // uint32 flagAttr = 7; + void clear_flagattr() ; + ::uint32_t flagattr() const; + void set_flagattr(::uint32_t value); + + private: + ::uint32_t _internal_flagattr() const; + void _internal_set_flagattr(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.SearchRoomRequest) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<4, 10, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const SearchRoomRequest& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::IntSearchFilter > intfilter_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinSearchFilter > binfilter_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::uint16 > attrid_; + ::int32_t option_; + ::uint32_t worldid_; + ::uint64_t lobbyid_; + ::uint32_t rangefilter_startindex_; + ::uint32_t rangefilter_max_; + ::uint32_t flagfilter_; + ::uint32_t flagattr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<30> SearchRoomRequest_class_data_; +// ------------------------------------------------------------------- + +class RoomMemberDataInternal final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomMemberDataInternal) */ { + public: + inline RoomMemberDataInternal() : RoomMemberDataInternal(nullptr) {} + ~RoomMemberDataInternal() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomMemberDataInternal* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomMemberDataInternal)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomMemberDataInternal(::google::protobuf::internal::ConstantInitialized); + + inline RoomMemberDataInternal(const RoomMemberDataInternal& from) : RoomMemberDataInternal(nullptr, from) {} + inline RoomMemberDataInternal(RoomMemberDataInternal&& from) noexcept + : RoomMemberDataInternal(nullptr, ::std::move(from)) {} + inline RoomMemberDataInternal& operator=(const RoomMemberDataInternal& from) { + CopyFrom(from); + return *this; + } + inline RoomMemberDataInternal& operator=(RoomMemberDataInternal&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomMemberDataInternal& default_instance() { + return *reinterpret_cast( + &_RoomMemberDataInternal_default_instance_); + } + static constexpr int kIndexInFileMessages = 12; + friend void swap(RoomMemberDataInternal& a, RoomMemberDataInternal& b) { a.Swap(&b); } + inline void Swap(RoomMemberDataInternal* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomMemberDataInternal* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomMemberDataInternal* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomMemberDataInternal& from); + void MergeFrom(const RoomMemberDataInternal& from) { RoomMemberDataInternal::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomMemberDataInternal* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomMemberDataInternal"; } + + explicit RoomMemberDataInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomMemberDataInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomMemberDataInternal& from); + RoomMemberDataInternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomMemberDataInternal&& from) noexcept + : RoomMemberDataInternal(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomMemberBinAttrInternalFieldNumber = 8, + kUserInfoFieldNumber = 1, + kTeamIdFieldNumber = 4, + kRoomGroupFieldNumber = 5, + kNatTypeFieldNumber = 6, + kJoinDateFieldNumber = 2, + kMemberIdFieldNumber = 3, + kFlagAttrFieldNumber = 7, + }; + // repeated .np2_structs.RoomMemberBinAttrInternal roomMemberBinAttrInternal = 8; + int roommemberbinattrinternal_size() const; + private: + int _internal_roommemberbinattrinternal_size() const; + + public: + void clear_roommemberbinattrinternal() ; + ::np2_structs::RoomMemberBinAttrInternal* PROTOBUF_NONNULL mutable_roommemberbinattrinternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberBinAttrInternal>* PROTOBUF_NONNULL mutable_roommemberbinattrinternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberBinAttrInternal>& _internal_roommemberbinattrinternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberBinAttrInternal>* PROTOBUF_NONNULL _internal_mutable_roommemberbinattrinternal(); + public: + const ::np2_structs::RoomMemberBinAttrInternal& roommemberbinattrinternal(int index) const; + ::np2_structs::RoomMemberBinAttrInternal* PROTOBUF_NONNULL add_roommemberbinattrinternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberBinAttrInternal>& roommemberbinattrinternal() const; + // .np2_structs.UserInfo userInfo = 1; + bool has_userinfo() const; + void clear_userinfo() ; + const ::np2_structs::UserInfo& userinfo() const; + [[nodiscard]] ::np2_structs::UserInfo* PROTOBUF_NULLABLE release_userinfo(); + ::np2_structs::UserInfo* PROTOBUF_NONNULL mutable_userinfo(); + void set_allocated_userinfo(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_userinfo(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + ::np2_structs::UserInfo* PROTOBUF_NULLABLE unsafe_arena_release_userinfo(); + + private: + const ::np2_structs::UserInfo& _internal_userinfo() const; + ::np2_structs::UserInfo* PROTOBUF_NONNULL _internal_mutable_userinfo(); + + public: + // .np2_structs.uint8 teamId = 4; + bool has_teamid() const; + void clear_teamid() ; + const ::np2_structs::uint8& teamid() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_teamid(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_teamid(); + void set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_teamid(); + + private: + const ::np2_structs::uint8& _internal_teamid() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_teamid(); + + public: + // .np2_structs.RoomGroup roomGroup = 5; + bool has_roomgroup() const; + void clear_roomgroup() ; + const ::np2_structs::RoomGroup& roomgroup() const; + [[nodiscard]] ::np2_structs::RoomGroup* PROTOBUF_NULLABLE release_roomgroup(); + ::np2_structs::RoomGroup* PROTOBUF_NONNULL mutable_roomgroup(); + void set_allocated_roomgroup(::np2_structs::RoomGroup* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_roomgroup(::np2_structs::RoomGroup* PROTOBUF_NULLABLE value); + ::np2_structs::RoomGroup* PROTOBUF_NULLABLE unsafe_arena_release_roomgroup(); + + private: + const ::np2_structs::RoomGroup& _internal_roomgroup() const; + ::np2_structs::RoomGroup* PROTOBUF_NONNULL _internal_mutable_roomgroup(); + + public: + // .np2_structs.uint8 natType = 6; + bool has_nattype() const; + void clear_nattype() ; + const ::np2_structs::uint8& nattype() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_nattype(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_nattype(); + void set_allocated_nattype(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_nattype(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_nattype(); + + private: + const ::np2_structs::uint8& _internal_nattype() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_nattype(); + + public: + // uint64 joinDate = 2; + void clear_joindate() ; + ::uint64_t joindate() const; + void set_joindate(::uint64_t value); + + private: + ::uint64_t _internal_joindate() const; + void _internal_set_joindate(::uint64_t value); + + public: + // uint32 memberId = 3; + void clear_memberid() ; + ::uint32_t memberid() const; + void set_memberid(::uint32_t value); + + private: + ::uint32_t _internal_memberid() const; + void _internal_set_memberid(::uint32_t value); + + public: + // uint32 flagAttr = 7; + void clear_flagattr() ; + ::uint32_t flagattr() const; + void set_flagattr(::uint32_t value); + + private: + ::uint32_t _internal_flagattr() const; + void _internal_set_flagattr(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomMemberDataInternal) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 8, + 5, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomMemberDataInternal& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::RoomMemberBinAttrInternal > roommemberbinattrinternal_; + ::np2_structs::UserInfo* PROTOBUF_NULLABLE userinfo_; + ::np2_structs::uint8* PROTOBUF_NULLABLE teamid_; + ::np2_structs::RoomGroup* PROTOBUF_NULLABLE roomgroup_; + ::np2_structs::uint8* PROTOBUF_NULLABLE nattype_; + ::uint64_t joindate_; + ::uint32_t memberid_; + ::uint32_t flagattr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<35> RoomMemberDataInternal_class_data_; +// ------------------------------------------------------------------- + +class MatchingSearchJoinRoomInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.MatchingSearchJoinRoomInfo) */ { + public: + inline MatchingSearchJoinRoomInfo() : MatchingSearchJoinRoomInfo(nullptr) {} + ~MatchingSearchJoinRoomInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(MatchingSearchJoinRoomInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(MatchingSearchJoinRoomInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR MatchingSearchJoinRoomInfo(::google::protobuf::internal::ConstantInitialized); + + inline MatchingSearchJoinRoomInfo(const MatchingSearchJoinRoomInfo& from) : MatchingSearchJoinRoomInfo(nullptr, from) {} + inline MatchingSearchJoinRoomInfo(MatchingSearchJoinRoomInfo&& from) noexcept + : MatchingSearchJoinRoomInfo(nullptr, ::std::move(from)) {} + inline MatchingSearchJoinRoomInfo& operator=(const MatchingSearchJoinRoomInfo& from) { + CopyFrom(from); + return *this; + } + inline MatchingSearchJoinRoomInfo& operator=(MatchingSearchJoinRoomInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const MatchingSearchJoinRoomInfo& default_instance() { + return *reinterpret_cast( + &_MatchingSearchJoinRoomInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 87; + friend void swap(MatchingSearchJoinRoomInfo& a, MatchingSearchJoinRoomInfo& b) { a.Swap(&b); } + inline void Swap(MatchingSearchJoinRoomInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(MatchingSearchJoinRoomInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + MatchingSearchJoinRoomInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const MatchingSearchJoinRoomInfo& from); + void MergeFrom(const MatchingSearchJoinRoomInfo& from) { MatchingSearchJoinRoomInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(MatchingSearchJoinRoomInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.MatchingSearchJoinRoomInfo"; } + + explicit MatchingSearchJoinRoomInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + MatchingSearchJoinRoomInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const MatchingSearchJoinRoomInfo& from); + MatchingSearchJoinRoomInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, MatchingSearchJoinRoomInfo&& from) noexcept + : MatchingSearchJoinRoomInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kAttrFieldNumber = 2, + kRoomFieldNumber = 1, + }; + // repeated .np2_structs.MatchingAttr attr = 2; + int attr_size() const; + private: + int _internal_attr_size() const; + + public: + void clear_attr() ; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL mutable_attr(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL mutable_attr(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& _internal_attr() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL _internal_mutable_attr(); + public: + const ::np2_structs::MatchingAttr& attr(int index) const; + ::np2_structs::MatchingAttr* PROTOBUF_NONNULL add_attr(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& attr() const; + // .np2_structs.MatchingRoomStatus room = 1; + bool has_room() const; + void clear_room() ; + const ::np2_structs::MatchingRoomStatus& room() const; + [[nodiscard]] ::np2_structs::MatchingRoomStatus* PROTOBUF_NULLABLE release_room(); + ::np2_structs::MatchingRoomStatus* PROTOBUF_NONNULL mutable_room(); + void set_allocated_room(::np2_structs::MatchingRoomStatus* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_room(::np2_structs::MatchingRoomStatus* PROTOBUF_NULLABLE value); + ::np2_structs::MatchingRoomStatus* PROTOBUF_NULLABLE unsafe_arena_release_room(); + + private: + const ::np2_structs::MatchingRoomStatus& _internal_room() const; + ::np2_structs::MatchingRoomStatus* PROTOBUF_NONNULL _internal_mutable_room(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.MatchingSearchJoinRoomInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const MatchingSearchJoinRoomInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::MatchingAttr > attr_; + ::np2_structs::MatchingRoomStatus* PROTOBUF_NULLABLE room_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<39> MatchingSearchJoinRoomInfo_class_data_; +// ------------------------------------------------------------------- + +class GetRoomDataExternalListResponse final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetRoomDataExternalListResponse) */ { + public: + inline GetRoomDataExternalListResponse() : GetRoomDataExternalListResponse(nullptr) {} + ~GetRoomDataExternalListResponse() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetRoomDataExternalListResponse* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetRoomDataExternalListResponse)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetRoomDataExternalListResponse(::google::protobuf::internal::ConstantInitialized); + + inline GetRoomDataExternalListResponse(const GetRoomDataExternalListResponse& from) : GetRoomDataExternalListResponse(nullptr, from) {} + inline GetRoomDataExternalListResponse(GetRoomDataExternalListResponse&& from) noexcept + : GetRoomDataExternalListResponse(nullptr, ::std::move(from)) {} + inline GetRoomDataExternalListResponse& operator=(const GetRoomDataExternalListResponse& from) { + CopyFrom(from); + return *this; + } + inline GetRoomDataExternalListResponse& operator=(GetRoomDataExternalListResponse&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetRoomDataExternalListResponse& default_instance() { + return *reinterpret_cast( + &_GetRoomDataExternalListResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = 27; + friend void swap(GetRoomDataExternalListResponse& a, GetRoomDataExternalListResponse& b) { a.Swap(&b); } + inline void Swap(GetRoomDataExternalListResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetRoomDataExternalListResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetRoomDataExternalListResponse* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetRoomDataExternalListResponse& from); + void MergeFrom(const GetRoomDataExternalListResponse& from) { GetRoomDataExternalListResponse::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetRoomDataExternalListResponse* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetRoomDataExternalListResponse"; } + + explicit GetRoomDataExternalListResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetRoomDataExternalListResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetRoomDataExternalListResponse& from); + GetRoomDataExternalListResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetRoomDataExternalListResponse&& from) noexcept + : GetRoomDataExternalListResponse(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomsFieldNumber = 1, + }; + // repeated .np2_structs.RoomDataExternal rooms = 1; + int rooms_size() const; + private: + int _internal_rooms_size() const; + + public: + void clear_rooms() ; + ::np2_structs::RoomDataExternal* PROTOBUF_NONNULL mutable_rooms(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>* PROTOBUF_NONNULL mutable_rooms(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>& _internal_rooms() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>* PROTOBUF_NONNULL _internal_mutable_rooms(); + public: + const ::np2_structs::RoomDataExternal& rooms(int index) const; + ::np2_structs::RoomDataExternal* PROTOBUF_NONNULL add_rooms(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>& rooms() const; + // @@protoc_insertion_point(class_scope:np2_structs.GetRoomDataExternalListResponse) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<0, 1, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetRoomDataExternalListResponse& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::RoomDataExternal > rooms_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<44> GetRoomDataExternalListResponse_class_data_; +// ------------------------------------------------------------------- + +class RoomMemberUpdateInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomMemberUpdateInfo) */ { + public: + inline RoomMemberUpdateInfo() : RoomMemberUpdateInfo(nullptr) {} + ~RoomMemberUpdateInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomMemberUpdateInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomMemberUpdateInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomMemberUpdateInfo(::google::protobuf::internal::ConstantInitialized); + + inline RoomMemberUpdateInfo(const RoomMemberUpdateInfo& from) : RoomMemberUpdateInfo(nullptr, from) {} + inline RoomMemberUpdateInfo(RoomMemberUpdateInfo&& from) noexcept + : RoomMemberUpdateInfo(nullptr, ::std::move(from)) {} + inline RoomMemberUpdateInfo& operator=(const RoomMemberUpdateInfo& from) { + CopyFrom(from); + return *this; + } + inline RoomMemberUpdateInfo& operator=(RoomMemberUpdateInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomMemberUpdateInfo& default_instance() { + return *reinterpret_cast( + &_RoomMemberUpdateInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 34; + friend void swap(RoomMemberUpdateInfo& a, RoomMemberUpdateInfo& b) { a.Swap(&b); } + inline void Swap(RoomMemberUpdateInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomMemberUpdateInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomMemberUpdateInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomMemberUpdateInfo& from); + void MergeFrom(const RoomMemberUpdateInfo& from) { RoomMemberUpdateInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomMemberUpdateInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomMemberUpdateInfo"; } + + explicit RoomMemberUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomMemberUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomMemberUpdateInfo& from); + RoomMemberUpdateInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomMemberUpdateInfo&& from) noexcept + : RoomMemberUpdateInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kRoomMemberDataInternalFieldNumber = 1, + kEventCauseFieldNumber = 2, + kOptDataFieldNumber = 3, + }; + // .np2_structs.RoomMemberDataInternal roomMemberDataInternal = 1; + bool has_roommemberdatainternal() const; + void clear_roommemberdatainternal() ; + const ::np2_structs::RoomMemberDataInternal& roommemberdatainternal() const; + [[nodiscard]] ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE release_roommemberdatainternal(); + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL mutable_roommemberdatainternal(); + void set_allocated_roommemberdatainternal(::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_roommemberdatainternal(::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE value); + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE unsafe_arena_release_roommemberdatainternal(); + + private: + const ::np2_structs::RoomMemberDataInternal& _internal_roommemberdatainternal() const; + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL _internal_mutable_roommemberdatainternal(); + + public: + // .np2_structs.uint8 eventCause = 2; + bool has_eventcause() const; + void clear_eventcause() ; + const ::np2_structs::uint8& eventcause() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_eventcause(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_eventcause(); + void set_allocated_eventcause(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_eventcause(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_eventcause(); + + private: + const ::np2_structs::uint8& _internal_eventcause() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_eventcause(); + + public: + // .np2_structs.PresenceOptionData optData = 3; + bool has_optdata() const; + void clear_optdata() ; + const ::np2_structs::PresenceOptionData& optdata() const; + [[nodiscard]] ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE release_optdata(); + ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL mutable_optdata(); + void set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value); + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE unsafe_arena_release_optdata(); + + private: + const ::np2_structs::PresenceOptionData& _internal_optdata() const; + ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL _internal_mutable_optdata(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomMemberUpdateInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomMemberUpdateInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE roommemberdatainternal_; + ::np2_structs::uint8* PROTOBUF_NULLABLE eventcause_; + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE optdata_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<33> RoomMemberUpdateInfo_class_data_; +// ------------------------------------------------------------------- + +class RoomMemberDataInternalUpdateInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomMemberDataInternalUpdateInfo) */ { + public: + inline RoomMemberDataInternalUpdateInfo() : RoomMemberDataInternalUpdateInfo(nullptr) {} + ~RoomMemberDataInternalUpdateInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomMemberDataInternalUpdateInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomMemberDataInternalUpdateInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomMemberDataInternalUpdateInfo(::google::protobuf::internal::ConstantInitialized); + + inline RoomMemberDataInternalUpdateInfo(const RoomMemberDataInternalUpdateInfo& from) : RoomMemberDataInternalUpdateInfo(nullptr, from) {} + inline RoomMemberDataInternalUpdateInfo(RoomMemberDataInternalUpdateInfo&& from) noexcept + : RoomMemberDataInternalUpdateInfo(nullptr, ::std::move(from)) {} + inline RoomMemberDataInternalUpdateInfo& operator=(const RoomMemberDataInternalUpdateInfo& from) { + CopyFrom(from); + return *this; + } + inline RoomMemberDataInternalUpdateInfo& operator=(RoomMemberDataInternalUpdateInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomMemberDataInternalUpdateInfo& default_instance() { + return *reinterpret_cast( + &_RoomMemberDataInternalUpdateInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 38; + friend void swap(RoomMemberDataInternalUpdateInfo& a, RoomMemberDataInternalUpdateInfo& b) { a.Swap(&b); } + inline void Swap(RoomMemberDataInternalUpdateInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomMemberDataInternalUpdateInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomMemberDataInternalUpdateInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomMemberDataInternalUpdateInfo& from); + void MergeFrom(const RoomMemberDataInternalUpdateInfo& from) { RoomMemberDataInternalUpdateInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomMemberDataInternalUpdateInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomMemberDataInternalUpdateInfo"; } + + explicit RoomMemberDataInternalUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomMemberDataInternalUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomMemberDataInternalUpdateInfo& from); + RoomMemberDataInternalUpdateInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomMemberDataInternalUpdateInfo&& from) noexcept + : RoomMemberDataInternalUpdateInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNewRoomMemberBinAttrInternalFieldNumber = 4, + kNewRoomMemberDataInternalFieldNumber = 1, + kPrevTeamIdFieldNumber = 3, + kPrevFlagAttrFieldNumber = 2, + }; + // repeated .np2_structs.uint16 newRoomMemberBinAttrInternal = 4; + int newroommemberbinattrinternal_size() const; + private: + int _internal_newroommemberbinattrinternal_size() const; + + public: + void clear_newroommemberbinattrinternal() ; + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_newroommemberbinattrinternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL mutable_newroommemberbinattrinternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& _internal_newroommemberbinattrinternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL _internal_mutable_newroommemberbinattrinternal(); + public: + const ::np2_structs::uint16& newroommemberbinattrinternal(int index) const; + ::np2_structs::uint16* PROTOBUF_NONNULL add_newroommemberbinattrinternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& newroommemberbinattrinternal() const; + // .np2_structs.RoomMemberDataInternal newRoomMemberDataInternal = 1; + bool has_newroommemberdatainternal() const; + void clear_newroommemberdatainternal() ; + const ::np2_structs::RoomMemberDataInternal& newroommemberdatainternal() const; + [[nodiscard]] ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE release_newroommemberdatainternal(); + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL mutable_newroommemberdatainternal(); + void set_allocated_newroommemberdatainternal(::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_newroommemberdatainternal(::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE value); + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE unsafe_arena_release_newroommemberdatainternal(); + + private: + const ::np2_structs::RoomMemberDataInternal& _internal_newroommemberdatainternal() const; + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL _internal_mutable_newroommemberdatainternal(); + + public: + // .np2_structs.uint8 prevTeamId = 3; + bool has_prevteamid() const; + void clear_prevteamid() ; + const ::np2_structs::uint8& prevteamid() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_prevteamid(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_prevteamid(); + void set_allocated_prevteamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_prevteamid(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_prevteamid(); + + private: + const ::np2_structs::uint8& _internal_prevteamid() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_prevteamid(); + + public: + // uint32 prevFlagAttr = 2; + void clear_prevflagattr() ; + ::uint32_t prevflagattr() const; + void set_prevflagattr(::uint32_t value); + + private: + ::uint32_t _internal_prevflagattr() const; + void _internal_set_prevflagattr(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomMemberDataInternalUpdateInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 4, + 3, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomMemberDataInternalUpdateInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::uint16 > newroommemberbinattrinternal_; + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE newroommemberdatainternal_; + ::np2_structs::uint8* PROTOBUF_NULLABLE prevteamid_; + ::uint32_t prevflagattr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<45> RoomMemberDataInternalUpdateInfo_class_data_; +// ------------------------------------------------------------------- + +class RoomDataInternal final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomDataInternal) */ { + public: + inline RoomDataInternal() : RoomDataInternal(nullptr) {} + ~RoomDataInternal() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomDataInternal* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomDataInternal)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomDataInternal(::google::protobuf::internal::ConstantInitialized); + + inline RoomDataInternal(const RoomDataInternal& from) : RoomDataInternal(nullptr, from) {} + inline RoomDataInternal(RoomDataInternal&& from) noexcept + : RoomDataInternal(nullptr, ::std::move(from)) {} + inline RoomDataInternal& operator=(const RoomDataInternal& from) { + CopyFrom(from); + return *this; + } + inline RoomDataInternal& operator=(RoomDataInternal&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomDataInternal& default_instance() { + return *reinterpret_cast( + &_RoomDataInternal_default_instance_); + } + static constexpr int kIndexInFileMessages = 14; + friend void swap(RoomDataInternal& a, RoomDataInternal& b) { a.Swap(&b); } + inline void Swap(RoomDataInternal* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomDataInternal* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomDataInternal* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomDataInternal& from); + void MergeFrom(const RoomDataInternal& from) { RoomDataInternal::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomDataInternal* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomDataInternal"; } + + explicit RoomDataInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomDataInternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomDataInternal& from); + RoomDataInternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomDataInternal&& from) noexcept + : RoomDataInternal(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kMemberListFieldNumber = 7, + kRoomGroupFieldNumber = 9, + kRoomBinAttrInternalFieldNumber = 11, + kServerIdFieldNumber = 1, + kOwnerIdFieldNumber = 8, + kLobbyIdFieldNumber = 3, + kRoomIdFieldNumber = 4, + kWorldIdFieldNumber = 2, + kMaxSlotFieldNumber = 6, + kPasswordSlotMaskFieldNumber = 5, + kFlagAttrFieldNumber = 10, + }; + // repeated .np2_structs.RoomMemberDataInternal memberList = 7; + int memberlist_size() const; + private: + int _internal_memberlist_size() const; + + public: + void clear_memberlist() ; + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL mutable_memberlist(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataInternal>* PROTOBUF_NONNULL mutable_memberlist(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataInternal>& _internal_memberlist() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataInternal>* PROTOBUF_NONNULL _internal_mutable_memberlist(); + public: + const ::np2_structs::RoomMemberDataInternal& memberlist(int index) const; + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL add_memberlist(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataInternal>& memberlist() const; + // repeated .np2_structs.RoomGroup roomGroup = 9; + int roomgroup_size() const; + private: + int _internal_roomgroup_size() const; + + public: + void clear_roomgroup() ; + ::np2_structs::RoomGroup* PROTOBUF_NONNULL mutable_roomgroup(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>* PROTOBUF_NONNULL mutable_roomgroup(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>& _internal_roomgroup() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>* PROTOBUF_NONNULL _internal_mutable_roomgroup(); + public: + const ::np2_structs::RoomGroup& roomgroup(int index) const; + ::np2_structs::RoomGroup* PROTOBUF_NONNULL add_roomgroup(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>& roomgroup() const; + // repeated .np2_structs.BinAttrInternal roomBinAttrInternal = 11; + int roombinattrinternal_size() const; + private: + int _internal_roombinattrinternal_size() const; + + public: + void clear_roombinattrinternal() ; + ::np2_structs::BinAttrInternal* PROTOBUF_NONNULL mutable_roombinattrinternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttrInternal>* PROTOBUF_NONNULL mutable_roombinattrinternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttrInternal>& _internal_roombinattrinternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttrInternal>* PROTOBUF_NONNULL _internal_mutable_roombinattrinternal(); + public: + const ::np2_structs::BinAttrInternal& roombinattrinternal(int index) const; + ::np2_structs::BinAttrInternal* PROTOBUF_NONNULL add_roombinattrinternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttrInternal>& roombinattrinternal() const; + // .np2_structs.uint16 serverId = 1; + bool has_serverid() const; + void clear_serverid() ; + const ::np2_structs::uint16& serverid() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_serverid(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_serverid(); + void set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_serverid(); + + private: + const ::np2_structs::uint16& _internal_serverid() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_serverid(); + + public: + // .np2_structs.uint16 ownerId = 8; + bool has_ownerid() const; + void clear_ownerid() ; + const ::np2_structs::uint16& ownerid() const; + [[nodiscard]] ::np2_structs::uint16* PROTOBUF_NULLABLE release_ownerid(); + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_ownerid(); + void set_allocated_ownerid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_ownerid(::np2_structs::uint16* PROTOBUF_NULLABLE value); + ::np2_structs::uint16* PROTOBUF_NULLABLE unsafe_arena_release_ownerid(); + + private: + const ::np2_structs::uint16& _internal_ownerid() const; + ::np2_structs::uint16* PROTOBUF_NONNULL _internal_mutable_ownerid(); + + public: + // uint64 lobbyId = 3; + void clear_lobbyid() ; + ::uint64_t lobbyid() const; + void set_lobbyid(::uint64_t value); + + private: + ::uint64_t _internal_lobbyid() const; + void _internal_set_lobbyid(::uint64_t value); + + public: + // uint64 roomId = 4; + void clear_roomid() ; + ::uint64_t roomid() const; + void set_roomid(::uint64_t value); + + private: + ::uint64_t _internal_roomid() const; + void _internal_set_roomid(::uint64_t value); + + public: + // uint32 worldId = 2; + void clear_worldid() ; + ::uint32_t worldid() const; + void set_worldid(::uint32_t value); + + private: + ::uint32_t _internal_worldid() const; + void _internal_set_worldid(::uint32_t value); + + public: + // uint32 maxSlot = 6; + void clear_maxslot() ; + ::uint32_t maxslot() const; + void set_maxslot(::uint32_t value); + + private: + ::uint32_t _internal_maxslot() const; + void _internal_set_maxslot(::uint32_t value); + + public: + // uint64 passwordSlotMask = 5; + void clear_passwordslotmask() ; + ::uint64_t passwordslotmask() const; + void set_passwordslotmask(::uint64_t value); + + private: + ::uint64_t _internal_passwordslotmask() const; + void _internal_set_passwordslotmask(::uint64_t value); + + public: + // uint32 flagAttr = 10; + void clear_flagattr() ; + ::uint32_t flagattr() const; + void set_flagattr(::uint32_t value); + + private: + ::uint32_t _internal_flagattr() const; + void _internal_set_flagattr(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomDataInternal) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<4, 11, + 5, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomDataInternal& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::RoomMemberDataInternal > memberlist_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::RoomGroup > roomgroup_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::BinAttrInternal > roombinattrinternal_; + ::np2_structs::uint16* PROTOBUF_NULLABLE serverid_; + ::np2_structs::uint16* PROTOBUF_NULLABLE ownerid_; + ::uint64_t lobbyid_; + ::uint64_t roomid_; + ::uint32_t worldid_; + ::uint32_t maxslot_; + ::uint64_t passwordslotmask_; + ::uint32_t flagattr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<29> RoomDataInternal_class_data_; +// ------------------------------------------------------------------- + +class RoomDataInternalUpdateInfo final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomDataInternalUpdateInfo) */ { + public: + inline RoomDataInternalUpdateInfo() : RoomDataInternalUpdateInfo(nullptr) {} + ~RoomDataInternalUpdateInfo() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomDataInternalUpdateInfo* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomDataInternalUpdateInfo)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomDataInternalUpdateInfo(::google::protobuf::internal::ConstantInitialized); + + inline RoomDataInternalUpdateInfo(const RoomDataInternalUpdateInfo& from) : RoomDataInternalUpdateInfo(nullptr, from) {} + inline RoomDataInternalUpdateInfo(RoomDataInternalUpdateInfo&& from) noexcept + : RoomDataInternalUpdateInfo(nullptr, ::std::move(from)) {} + inline RoomDataInternalUpdateInfo& operator=(const RoomDataInternalUpdateInfo& from) { + CopyFrom(from); + return *this; + } + inline RoomDataInternalUpdateInfo& operator=(RoomDataInternalUpdateInfo&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomDataInternalUpdateInfo& default_instance() { + return *reinterpret_cast( + &_RoomDataInternalUpdateInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = 37; + friend void swap(RoomDataInternalUpdateInfo& a, RoomDataInternalUpdateInfo& b) { a.Swap(&b); } + inline void Swap(RoomDataInternalUpdateInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomDataInternalUpdateInfo* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomDataInternalUpdateInfo* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomDataInternalUpdateInfo& from); + void MergeFrom(const RoomDataInternalUpdateInfo& from) { RoomDataInternalUpdateInfo::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomDataInternalUpdateInfo* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomDataInternalUpdateInfo"; } + + explicit RoomDataInternalUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomDataInternalUpdateInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomDataInternalUpdateInfo& from); + RoomDataInternalUpdateInfo( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomDataInternalUpdateInfo&& from) noexcept + : RoomDataInternalUpdateInfo(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kNewRoomBinAttrInternalFieldNumber = 5, + kNewRoomGroupFieldNumber = 4, + kNewRoomDataInternalFieldNumber = 1, + kPrevRoomPasswordSlotMaskFieldNumber = 3, + kPrevFlagAttrFieldNumber = 2, + }; + // repeated .np2_structs.uint16 newRoomBinAttrInternal = 5; + int newroombinattrinternal_size() const; + private: + int _internal_newroombinattrinternal_size() const; + + public: + void clear_newroombinattrinternal() ; + ::np2_structs::uint16* PROTOBUF_NONNULL mutable_newroombinattrinternal(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL mutable_newroombinattrinternal(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& _internal_newroombinattrinternal() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL _internal_mutable_newroombinattrinternal(); + public: + const ::np2_structs::uint16& newroombinattrinternal(int index) const; + ::np2_structs::uint16* PROTOBUF_NONNULL add_newroombinattrinternal(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& newroombinattrinternal() const; + // bytes newRoomGroup = 4; + void clear_newroomgroup() ; + const ::std::string& newroomgroup() const; + template + void set_newroomgroup(Arg_&& arg, Args_... args); + ::std::string* PROTOBUF_NONNULL mutable_newroomgroup(); + [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_newroomgroup(); + void set_allocated_newroomgroup(::std::string* PROTOBUF_NULLABLE value); + + private: + const ::std::string& _internal_newroomgroup() const; + PROTOBUF_ALWAYS_INLINE void _internal_set_newroomgroup(const ::std::string& value); + ::std::string* PROTOBUF_NONNULL _internal_mutable_newroomgroup(); + + public: + // .np2_structs.RoomDataInternal newRoomDataInternal = 1; + bool has_newroomdatainternal() const; + void clear_newroomdatainternal() ; + const ::np2_structs::RoomDataInternal& newroomdatainternal() const; + [[nodiscard]] ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE release_newroomdatainternal(); + ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL mutable_newroomdatainternal(); + void set_allocated_newroomdatainternal(::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_newroomdatainternal(::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value); + ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE unsafe_arena_release_newroomdatainternal(); + + private: + const ::np2_structs::RoomDataInternal& _internal_newroomdatainternal() const; + ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL _internal_mutable_newroomdatainternal(); + + public: + // uint64 prevRoomPasswordSlotMask = 3; + void clear_prevroompasswordslotmask() ; + ::uint64_t prevroompasswordslotmask() const; + void set_prevroompasswordslotmask(::uint64_t value); + + private: + ::uint64_t _internal_prevroompasswordslotmask() const; + void _internal_set_prevroompasswordslotmask(::uint64_t value); + + public: + // uint32 prevFlagAttr = 2; + void clear_prevflagattr() ; + ::uint32_t prevflagattr() const; + void set_prevflagattr(::uint32_t value); + + private: + ::uint32_t _internal_prevflagattr() const; + void _internal_set_prevflagattr(::uint32_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomDataInternalUpdateInfo) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<3, 5, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomDataInternalUpdateInfo& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::uint16 > newroombinattrinternal_; + ::google::protobuf::internal::ArenaStringPtr newroomgroup_; + ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE newroomdatainternal_; + ::uint64_t prevroompasswordslotmask_; + ::uint32_t prevflagattr_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<39> RoomDataInternalUpdateInfo_class_data_; +// ------------------------------------------------------------------- + +class NotificationUserJoinedRoom final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.NotificationUserJoinedRoom) */ { + public: + inline NotificationUserJoinedRoom() : NotificationUserJoinedRoom(nullptr) {} + ~NotificationUserJoinedRoom() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(NotificationUserJoinedRoom* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(NotificationUserJoinedRoom)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR NotificationUserJoinedRoom(::google::protobuf::internal::ConstantInitialized); + + inline NotificationUserJoinedRoom(const NotificationUserJoinedRoom& from) : NotificationUserJoinedRoom(nullptr, from) {} + inline NotificationUserJoinedRoom(NotificationUserJoinedRoom&& from) noexcept + : NotificationUserJoinedRoom(nullptr, ::std::move(from)) {} + inline NotificationUserJoinedRoom& operator=(const NotificationUserJoinedRoom& from) { + CopyFrom(from); + return *this; + } + inline NotificationUserJoinedRoom& operator=(NotificationUserJoinedRoom&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const NotificationUserJoinedRoom& default_instance() { + return *reinterpret_cast( + &_NotificationUserJoinedRoom_default_instance_); + } + static constexpr int kIndexInFileMessages = 35; + friend void swap(NotificationUserJoinedRoom& a, NotificationUserJoinedRoom& b) { a.Swap(&b); } + inline void Swap(NotificationUserJoinedRoom* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(NotificationUserJoinedRoom* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + NotificationUserJoinedRoom* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const NotificationUserJoinedRoom& from); + void MergeFrom(const NotificationUserJoinedRoom& from) { NotificationUserJoinedRoom::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(NotificationUserJoinedRoom* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.NotificationUserJoinedRoom"; } + + explicit NotificationUserJoinedRoom(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + NotificationUserJoinedRoom(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const NotificationUserJoinedRoom& from); + NotificationUserJoinedRoom( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, NotificationUserJoinedRoom&& from) noexcept + : NotificationUserJoinedRoom(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kUpdateInfoFieldNumber = 2, + kSignalingFieldNumber = 3, + kRoomIdFieldNumber = 1, + }; + // .np2_structs.RoomMemberUpdateInfo update_info = 2; + bool has_update_info() const; + void clear_update_info() ; + const ::np2_structs::RoomMemberUpdateInfo& update_info() const; + [[nodiscard]] ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NULLABLE release_update_info(); + ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NONNULL mutable_update_info(); + void set_allocated_update_info(::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_update_info(::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NULLABLE value); + ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NULLABLE unsafe_arena_release_update_info(); + + private: + const ::np2_structs::RoomMemberUpdateInfo& _internal_update_info() const; + ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NONNULL _internal_mutable_update_info(); + + public: + // .np2_structs.SignalingAddr signaling = 3; + bool has_signaling() const; + void clear_signaling() ; + const ::np2_structs::SignalingAddr& signaling() const; + [[nodiscard]] ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE release_signaling(); + ::np2_structs::SignalingAddr* PROTOBUF_NONNULL mutable_signaling(); + void set_allocated_signaling(::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_signaling(::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value); + ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE unsafe_arena_release_signaling(); + + private: + const ::np2_structs::SignalingAddr& _internal_signaling() const; + ::np2_structs::SignalingAddr* PROTOBUF_NONNULL _internal_mutable_signaling(); + + public: + // uint64 room_id = 1; + void clear_room_id() ; + ::uint64_t room_id() const; + void set_room_id(::uint64_t value); + + private: + ::uint64_t _internal_room_id() const; + void _internal_set_room_id(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.NotificationUserJoinedRoom) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const NotificationUserJoinedRoom& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NULLABLE update_info_; + ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE signaling_; + ::uint64_t room_id_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<39> NotificationUserJoinedRoom_class_data_; +// ------------------------------------------------------------------- + +class JoinRoomResponse final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.JoinRoomResponse) */ { + public: + inline JoinRoomResponse() : JoinRoomResponse(nullptr) {} + ~JoinRoomResponse() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(JoinRoomResponse* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(JoinRoomResponse)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR JoinRoomResponse(::google::protobuf::internal::ConstantInitialized); + + inline JoinRoomResponse(const JoinRoomResponse& from) : JoinRoomResponse(nullptr, from) {} + inline JoinRoomResponse(JoinRoomResponse&& from) noexcept + : JoinRoomResponse(nullptr, ::std::move(from)) {} + inline JoinRoomResponse& operator=(const JoinRoomResponse& from) { + CopyFrom(from); + return *this; + } + inline JoinRoomResponse& operator=(JoinRoomResponse&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const JoinRoomResponse& default_instance() { + return *reinterpret_cast( + &_JoinRoomResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = 24; + friend void swap(JoinRoomResponse& a, JoinRoomResponse& b) { a.Swap(&b); } + inline void Swap(JoinRoomResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(JoinRoomResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + JoinRoomResponse* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const JoinRoomResponse& from); + void MergeFrom(const JoinRoomResponse& from) { JoinRoomResponse::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(JoinRoomResponse* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.JoinRoomResponse"; } + + explicit JoinRoomResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + JoinRoomResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const JoinRoomResponse& from); + JoinRoomResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, JoinRoomResponse&& from) noexcept + : JoinRoomResponse(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kSignalingDataFieldNumber = 2, + kRoomDataFieldNumber = 1, + }; + // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; + int signaling_data_size() const; + private: + int _internal_signaling_data_size() const; + + public: + void clear_signaling_data() ; + ::np2_structs::Matching2SignalingInfo* PROTOBUF_NONNULL mutable_signaling_data(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::Matching2SignalingInfo>* PROTOBUF_NONNULL mutable_signaling_data(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::Matching2SignalingInfo>& _internal_signaling_data() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::Matching2SignalingInfo>* PROTOBUF_NONNULL _internal_mutable_signaling_data(); + public: + const ::np2_structs::Matching2SignalingInfo& signaling_data(int index) const; + ::np2_structs::Matching2SignalingInfo* PROTOBUF_NONNULL add_signaling_data(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::Matching2SignalingInfo>& signaling_data() const; + // .np2_structs.RoomDataInternal room_data = 1; + bool has_room_data() const; + void clear_room_data() ; + const ::np2_structs::RoomDataInternal& room_data() const; + [[nodiscard]] ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE release_room_data(); + ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL mutable_room_data(); + void set_allocated_room_data(::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_room_data(::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value); + ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE unsafe_arena_release_room_data(); + + private: + const ::np2_structs::RoomDataInternal& _internal_room_data() const; + ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL _internal_mutable_room_data(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.JoinRoomResponse) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const JoinRoomResponse& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::Matching2SignalingInfo > signaling_data_; + ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE room_data_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<29> JoinRoomResponse_class_data_; + +// =================================================================== + + + + +// =================================================================== + + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif // __GNUC__ +// ------------------------------------------------------------------- + +// uint8 + +// uint32 value = 1; +inline void uint8::clear_value() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.value_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint32_t uint8::value() const { + // @@protoc_insertion_point(field_get:np2_structs.uint8.value) + return _internal_value(); +} +inline void uint8::set_value(::uint32_t value) { + _internal_set_value(value); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_set:np2_structs.uint8.value) +} +inline ::uint32_t uint8::_internal_value() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.value_; +} +inline void uint8::_internal_set_value(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.value_ = value; +} + +// ------------------------------------------------------------------- + +// uint16 + +// uint32 value = 1; +inline void uint16::clear_value() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.value_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint32_t uint16::value() const { + // @@protoc_insertion_point(field_get:np2_structs.uint16.value) + return _internal_value(); +} +inline void uint16::set_value(::uint32_t value) { + _internal_set_value(value); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_set:np2_structs.uint16.value) +} +inline ::uint32_t uint16::_internal_value() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.value_; +} +inline void uint16::_internal_set_value(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.value_ = value; +} + +// ------------------------------------------------------------------- + +// SignalingAddr + +// bytes ip = 1; +inline void SignalingAddr::clear_ip() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.ip_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& SignalingAddr::ip() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SignalingAddr.ip) + return _internal_ip(); +} +template +PROTOBUF_ALWAYS_INLINE void SignalingAddr::set_ip(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.ip_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.SignalingAddr.ip) +} +inline ::std::string* PROTOBUF_NONNULL SignalingAddr::mutable_ip() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_ip(); + // @@protoc_insertion_point(field_mutable:np2_structs.SignalingAddr.ip) + return _s; +} +inline const ::std::string& SignalingAddr::_internal_ip() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.ip_.Get(); +} +inline void SignalingAddr::_internal_set_ip(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.ip_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL SignalingAddr::_internal_mutable_ip() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.ip_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE SignalingAddr::release_ip() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SignalingAddr.ip) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.ip_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.ip_.Set("", GetArena()); + } + return released; +} +inline void SignalingAddr::set_allocated_ip(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.ip_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.ip_.IsDefault()) { + _impl_.ip_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.SignalingAddr.ip) +} + +// .np2_structs.uint16 port = 2; +inline bool SignalingAddr::has_port() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.port_ != nullptr); + return value; +} +inline void SignalingAddr::clear_port() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.port_ != nullptr) _impl_.port_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::uint16& SignalingAddr::_internal_port() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.port_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& SignalingAddr::port() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SignalingAddr.port) + return _internal_port(); +} +inline void SignalingAddr::unsafe_arena_set_allocated_port( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.port_); + } + _impl_.port_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.SignalingAddr.port) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE SignalingAddr::release_port() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* released = _impl_.port_; + _impl_.port_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE SignalingAddr::unsafe_arena_release_port() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SignalingAddr.port) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* temp = _impl_.port_; + _impl_.port_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SignalingAddr::_internal_mutable_port() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.port_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.port_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.port_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SignalingAddr::mutable_port() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* _msg = _internal_mutable_port(); + // @@protoc_insertion_point(field_mutable:np2_structs.SignalingAddr.port) + return _msg; +} +inline void SignalingAddr::set_allocated_port(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.port_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.port_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.SignalingAddr.port) +} + +// ------------------------------------------------------------------- + +// MatchingSignalingInfo + +// string npid = 1; +inline void MatchingSignalingInfo::clear_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& MatchingSignalingInfo::npid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingSignalingInfo.npid) + return _internal_npid(); +} +template +PROTOBUF_ALWAYS_INLINE void MatchingSignalingInfo::set_npid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.npid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MatchingSignalingInfo.npid) +} +inline ::std::string* PROTOBUF_NONNULL MatchingSignalingInfo::mutable_npid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_npid(); + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingSignalingInfo.npid) + return _s; +} +inline const ::std::string& MatchingSignalingInfo::_internal_npid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.npid_.Get(); +} +inline void MatchingSignalingInfo::_internal_set_npid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MatchingSignalingInfo::_internal_mutable_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.npid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MatchingSignalingInfo::release_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MatchingSignalingInfo.npid) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.npid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.npid_.Set("", GetArena()); + } + return released; +} +inline void MatchingSignalingInfo::set_allocated_npid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.npid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.npid_.IsDefault()) { + _impl_.npid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MatchingSignalingInfo.npid) +} + +// .np2_structs.SignalingAddr addr = 2; +inline bool MatchingSignalingInfo::has_addr() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.addr_ != nullptr); + return value; +} +inline void MatchingSignalingInfo::clear_addr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.addr_ != nullptr) _impl_.addr_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::SignalingAddr& MatchingSignalingInfo::_internal_addr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::SignalingAddr* p = _impl_.addr_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_SignalingAddr_default_instance_); +} +inline const ::np2_structs::SignalingAddr& MatchingSignalingInfo::addr() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingSignalingInfo.addr) + return _internal_addr(); +} +inline void MatchingSignalingInfo::unsafe_arena_set_allocated_addr( + ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.addr_); + } + _impl_.addr_ = reinterpret_cast<::np2_structs::SignalingAddr*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.MatchingSignalingInfo.addr) +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE MatchingSignalingInfo::release_addr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::SignalingAddr* released = _impl_.addr_; + _impl_.addr_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE MatchingSignalingInfo::unsafe_arena_release_addr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MatchingSignalingInfo.addr) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::SignalingAddr* temp = _impl_.addr_; + _impl_.addr_ = nullptr; + return temp; +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NONNULL MatchingSignalingInfo::_internal_mutable_addr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.addr_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::SignalingAddr>(GetArena()); + _impl_.addr_ = reinterpret_cast<::np2_structs::SignalingAddr*>(p); + } + return _impl_.addr_; +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NONNULL MatchingSignalingInfo::mutable_addr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::SignalingAddr* _msg = _internal_mutable_addr(); + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingSignalingInfo.addr) + return _msg; +} +inline void MatchingSignalingInfo::set_allocated_addr(::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.addr_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.addr_ = reinterpret_cast<::np2_structs::SignalingAddr*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.MatchingSignalingInfo.addr) +} + +// ------------------------------------------------------------------- + +// Matching2SignalingInfo + +// .np2_structs.uint16 member_id = 1; +inline bool Matching2SignalingInfo::has_member_id() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.member_id_ != nullptr); + return value; +} +inline void Matching2SignalingInfo::clear_member_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.member_id_ != nullptr) _impl_.member_id_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::uint16& Matching2SignalingInfo::_internal_member_id() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.member_id_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& Matching2SignalingInfo::member_id() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.Matching2SignalingInfo.member_id) + return _internal_member_id(); +} +inline void Matching2SignalingInfo::unsafe_arena_set_allocated_member_id( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.member_id_); + } + _impl_.member_id_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.Matching2SignalingInfo.member_id) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE Matching2SignalingInfo::release_member_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* released = _impl_.member_id_; + _impl_.member_id_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE Matching2SignalingInfo::unsafe_arena_release_member_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.Matching2SignalingInfo.member_id) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* temp = _impl_.member_id_; + _impl_.member_id_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL Matching2SignalingInfo::_internal_mutable_member_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.member_id_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.member_id_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.member_id_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL Matching2SignalingInfo::mutable_member_id() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* _msg = _internal_mutable_member_id(); + // @@protoc_insertion_point(field_mutable:np2_structs.Matching2SignalingInfo.member_id) + return _msg; +} +inline void Matching2SignalingInfo::set_allocated_member_id(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.member_id_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.member_id_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.Matching2SignalingInfo.member_id) +} + +// .np2_structs.SignalingAddr addr = 2; +inline bool Matching2SignalingInfo::has_addr() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.addr_ != nullptr); + return value; +} +inline void Matching2SignalingInfo::clear_addr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.addr_ != nullptr) _impl_.addr_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::SignalingAddr& Matching2SignalingInfo::_internal_addr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::SignalingAddr* p = _impl_.addr_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_SignalingAddr_default_instance_); +} +inline const ::np2_structs::SignalingAddr& Matching2SignalingInfo::addr() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.Matching2SignalingInfo.addr) + return _internal_addr(); +} +inline void Matching2SignalingInfo::unsafe_arena_set_allocated_addr( + ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.addr_); + } + _impl_.addr_ = reinterpret_cast<::np2_structs::SignalingAddr*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.Matching2SignalingInfo.addr) +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE Matching2SignalingInfo::release_addr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::SignalingAddr* released = _impl_.addr_; + _impl_.addr_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE Matching2SignalingInfo::unsafe_arena_release_addr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.Matching2SignalingInfo.addr) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::SignalingAddr* temp = _impl_.addr_; + _impl_.addr_ = nullptr; + return temp; +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NONNULL Matching2SignalingInfo::_internal_mutable_addr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.addr_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::SignalingAddr>(GetArena()); + _impl_.addr_ = reinterpret_cast<::np2_structs::SignalingAddr*>(p); + } + return _impl_.addr_; +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NONNULL Matching2SignalingInfo::mutable_addr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::SignalingAddr* _msg = _internal_mutable_addr(); + // @@protoc_insertion_point(field_mutable:np2_structs.Matching2SignalingInfo.addr) + return _msg; +} +inline void Matching2SignalingInfo::set_allocated_addr(::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.addr_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.addr_ = reinterpret_cast<::np2_structs::SignalingAddr*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.Matching2SignalingInfo.addr) +} + +// ------------------------------------------------------------------- + +// BinAttr + +// .np2_structs.uint16 id = 1; +inline bool BinAttr::has_id() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.id_ != nullptr); + return value; +} +inline void BinAttr::clear_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.id_ != nullptr) _impl_.id_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::uint16& BinAttr::_internal_id() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.id_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& BinAttr::id() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.BinAttr.id) + return _internal_id(); +} +inline void BinAttr::unsafe_arena_set_allocated_id( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.id_); + } + _impl_.id_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.BinAttr.id) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE BinAttr::release_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* released = _impl_.id_; + _impl_.id_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE BinAttr::unsafe_arena_release_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.BinAttr.id) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* temp = _impl_.id_; + _impl_.id_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL BinAttr::_internal_mutable_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.id_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.id_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.id_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL BinAttr::mutable_id() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* _msg = _internal_mutable_id(); + // @@protoc_insertion_point(field_mutable:np2_structs.BinAttr.id) + return _msg; +} +inline void BinAttr::set_allocated_id(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.id_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.id_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.BinAttr.id) +} + +// bytes data = 2; +inline void BinAttr::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& BinAttr::data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.BinAttr.data) + return _internal_data(); +} +template +PROTOBUF_ALWAYS_INLINE void BinAttr::set_data(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.data_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.BinAttr.data) +} +inline ::std::string* PROTOBUF_NONNULL BinAttr::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.BinAttr.data) + return _s; +} +inline const ::std::string& BinAttr::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.data_.Get(); +} +inline void BinAttr::_internal_set_data(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL BinAttr::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.data_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE BinAttr::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.BinAttr.data) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.data_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.data_.Set("", GetArena()); + } + return released; +} +inline void BinAttr::set_allocated_data(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.data_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.data_.IsDefault()) { + _impl_.data_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.BinAttr.data) +} + +// ------------------------------------------------------------------- + +// IntAttr + +// .np2_structs.uint16 id = 1; +inline bool IntAttr::has_id() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.id_ != nullptr); + return value; +} +inline void IntAttr::clear_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.id_ != nullptr) _impl_.id_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::uint16& IntAttr::_internal_id() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.id_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& IntAttr::id() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.IntAttr.id) + return _internal_id(); +} +inline void IntAttr::unsafe_arena_set_allocated_id( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.id_); + } + _impl_.id_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.IntAttr.id) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE IntAttr::release_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* released = _impl_.id_; + _impl_.id_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE IntAttr::unsafe_arena_release_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.IntAttr.id) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* temp = _impl_.id_; + _impl_.id_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL IntAttr::_internal_mutable_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.id_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.id_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.id_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL IntAttr::mutable_id() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* _msg = _internal_mutable_id(); + // @@protoc_insertion_point(field_mutable:np2_structs.IntAttr.id) + return _msg; +} +inline void IntAttr::set_allocated_id(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.id_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.id_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.IntAttr.id) +} + +// uint32 num = 2; +inline void IntAttr::clear_num() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.num_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t IntAttr::num() const { + // @@protoc_insertion_point(field_get:np2_structs.IntAttr.num) + return _internal_num(); +} +inline void IntAttr::set_num(::uint32_t value) { + _internal_set_num(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.IntAttr.num) +} +inline ::uint32_t IntAttr::_internal_num() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.num_; +} +inline void IntAttr::_internal_set_num(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.num_ = value; +} + +// ------------------------------------------------------------------- + +// RoomMemberBinAttrInternal + +// uint64 updateDate = 1; +inline void RoomMemberBinAttrInternal::clear_updatedate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.updatedate_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint64_t RoomMemberBinAttrInternal::updatedate() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberBinAttrInternal.updateDate) + return _internal_updatedate(); +} +inline void RoomMemberBinAttrInternal::set_updatedate(::uint64_t value) { + _internal_set_updatedate(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.RoomMemberBinAttrInternal.updateDate) +} +inline ::uint64_t RoomMemberBinAttrInternal::_internal_updatedate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.updatedate_; +} +inline void RoomMemberBinAttrInternal::_internal_set_updatedate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.updatedate_ = value; +} + +// .np2_structs.BinAttr data = 2; +inline bool RoomMemberBinAttrInternal::has_data() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.data_ != nullptr); + return value; +} +inline void RoomMemberBinAttrInternal::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.data_ != nullptr) _impl_.data_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::BinAttr& RoomMemberBinAttrInternal::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::BinAttr* p = _impl_.data_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_BinAttr_default_instance_); +} +inline const ::np2_structs::BinAttr& RoomMemberBinAttrInternal::data() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberBinAttrInternal.data) + return _internal_data(); +} +inline void RoomMemberBinAttrInternal::unsafe_arena_set_allocated_data( + ::np2_structs::BinAttr* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.data_); + } + _impl_.data_ = reinterpret_cast<::np2_structs::BinAttr*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberBinAttrInternal.data) +} +inline ::np2_structs::BinAttr* PROTOBUF_NULLABLE RoomMemberBinAttrInternal::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::BinAttr* released = _impl_.data_; + _impl_.data_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::BinAttr* PROTOBUF_NULLABLE RoomMemberBinAttrInternal::unsafe_arena_release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberBinAttrInternal.data) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::BinAttr* temp = _impl_.data_; + _impl_.data_ = nullptr; + return temp; +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL RoomMemberBinAttrInternal::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.data_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::BinAttr>(GetArena()); + _impl_.data_ = reinterpret_cast<::np2_structs::BinAttr*>(p); + } + return _impl_.data_; +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL RoomMemberBinAttrInternal::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::BinAttr* _msg = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberBinAttrInternal.data) + return _msg; +} +inline void RoomMemberBinAttrInternal::set_allocated_data(::np2_structs::BinAttr* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.data_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.data_ = reinterpret_cast<::np2_structs::BinAttr*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberBinAttrInternal.data) +} + +// ------------------------------------------------------------------- + +// BinAttrInternal + +// uint64 updateDate = 1; +inline void BinAttrInternal::clear_updatedate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.updatedate_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint64_t BinAttrInternal::updatedate() const { + // @@protoc_insertion_point(field_get:np2_structs.BinAttrInternal.updateDate) + return _internal_updatedate(); +} +inline void BinAttrInternal::set_updatedate(::uint64_t value) { + _internal_set_updatedate(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.BinAttrInternal.updateDate) +} +inline ::uint64_t BinAttrInternal::_internal_updatedate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.updatedate_; +} +inline void BinAttrInternal::_internal_set_updatedate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.updatedate_ = value; +} + +// .np2_structs.uint16 updateMemberId = 2; +inline bool BinAttrInternal::has_updatememberid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.updatememberid_ != nullptr); + return value; +} +inline void BinAttrInternal::clear_updatememberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.updatememberid_ != nullptr) _impl_.updatememberid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::uint16& BinAttrInternal::_internal_updatememberid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.updatememberid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& BinAttrInternal::updatememberid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.BinAttrInternal.updateMemberId) + return _internal_updatememberid(); +} +inline void BinAttrInternal::unsafe_arena_set_allocated_updatememberid( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.updatememberid_); + } + _impl_.updatememberid_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.BinAttrInternal.updateMemberId) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE BinAttrInternal::release_updatememberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* released = _impl_.updatememberid_; + _impl_.updatememberid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE BinAttrInternal::unsafe_arena_release_updatememberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.BinAttrInternal.updateMemberId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* temp = _impl_.updatememberid_; + _impl_.updatememberid_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL BinAttrInternal::_internal_mutable_updatememberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.updatememberid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.updatememberid_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.updatememberid_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL BinAttrInternal::mutable_updatememberid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* _msg = _internal_mutable_updatememberid(); + // @@protoc_insertion_point(field_mutable:np2_structs.BinAttrInternal.updateMemberId) + return _msg; +} +inline void BinAttrInternal::set_allocated_updatememberid(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.updatememberid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.updatememberid_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.BinAttrInternal.updateMemberId) +} + +// .np2_structs.BinAttr data = 3; +inline bool BinAttrInternal::has_data() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.data_ != nullptr); + return value; +} +inline void BinAttrInternal::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.data_ != nullptr) _impl_.data_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::BinAttr& BinAttrInternal::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::BinAttr* p = _impl_.data_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_BinAttr_default_instance_); +} +inline const ::np2_structs::BinAttr& BinAttrInternal::data() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.BinAttrInternal.data) + return _internal_data(); +} +inline void BinAttrInternal::unsafe_arena_set_allocated_data( + ::np2_structs::BinAttr* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.data_); + } + _impl_.data_ = reinterpret_cast<::np2_structs::BinAttr*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.BinAttrInternal.data) +} +inline ::np2_structs::BinAttr* PROTOBUF_NULLABLE BinAttrInternal::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::BinAttr* released = _impl_.data_; + _impl_.data_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::BinAttr* PROTOBUF_NULLABLE BinAttrInternal::unsafe_arena_release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.BinAttrInternal.data) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::BinAttr* temp = _impl_.data_; + _impl_.data_ = nullptr; + return temp; +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL BinAttrInternal::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.data_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::BinAttr>(GetArena()); + _impl_.data_ = reinterpret_cast<::np2_structs::BinAttr*>(p); + } + return _impl_.data_; +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL BinAttrInternal::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::BinAttr* _msg = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.BinAttrInternal.data) + return _msg; +} +inline void BinAttrInternal::set_allocated_data(::np2_structs::BinAttr* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.data_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.data_ = reinterpret_cast<::np2_structs::BinAttr*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.BinAttrInternal.data) +} + +// ------------------------------------------------------------------- + +// OptParam + +// .np2_structs.uint8 type = 1; +inline bool OptParam::has_type() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.type_ != nullptr); + return value; +} +inline void OptParam::clear_type() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.type_ != nullptr) _impl_.type_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::uint8& OptParam::_internal_type() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.type_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& OptParam::type() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.OptParam.type) + return _internal_type(); +} +inline void OptParam::unsafe_arena_set_allocated_type( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.type_); + } + _impl_.type_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.OptParam.type) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE OptParam::release_type() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* released = _impl_.type_; + _impl_.type_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE OptParam::unsafe_arena_release_type() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.OptParam.type) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* temp = _impl_.type_; + _impl_.type_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL OptParam::_internal_mutable_type() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.type_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.type_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.type_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL OptParam::mutable_type() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* _msg = _internal_mutable_type(); + // @@protoc_insertion_point(field_mutable:np2_structs.OptParam.type) + return _msg; +} +inline void OptParam::set_allocated_type(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.type_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.type_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.OptParam.type) +} + +// .np2_structs.uint8 flag = 2; +inline bool OptParam::has_flag() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.flag_ != nullptr); + return value; +} +inline void OptParam::clear_flag() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.flag_ != nullptr) _impl_.flag_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::uint8& OptParam::_internal_flag() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.flag_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& OptParam::flag() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.OptParam.flag) + return _internal_flag(); +} +inline void OptParam::unsafe_arena_set_allocated_flag( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.flag_); + } + _impl_.flag_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.OptParam.flag) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE OptParam::release_flag() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* released = _impl_.flag_; + _impl_.flag_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE OptParam::unsafe_arena_release_flag() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.OptParam.flag) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* temp = _impl_.flag_; + _impl_.flag_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL OptParam::_internal_mutable_flag() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.flag_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.flag_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.flag_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL OptParam::mutable_flag() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* _msg = _internal_mutable_flag(); + // @@protoc_insertion_point(field_mutable:np2_structs.OptParam.flag) + return _msg; +} +inline void OptParam::set_allocated_flag(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.flag_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.flag_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.OptParam.flag) +} + +// .np2_structs.uint16 hubMemberId = 3; +inline bool OptParam::has_hubmemberid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.hubmemberid_ != nullptr); + return value; +} +inline void OptParam::clear_hubmemberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.hubmemberid_ != nullptr) _impl_.hubmemberid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::uint16& OptParam::_internal_hubmemberid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.hubmemberid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& OptParam::hubmemberid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.OptParam.hubMemberId) + return _internal_hubmemberid(); +} +inline void OptParam::unsafe_arena_set_allocated_hubmemberid( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.hubmemberid_); + } + _impl_.hubmemberid_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.OptParam.hubMemberId) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE OptParam::release_hubmemberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint16* released = _impl_.hubmemberid_; + _impl_.hubmemberid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE OptParam::unsafe_arena_release_hubmemberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.OptParam.hubMemberId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint16* temp = _impl_.hubmemberid_; + _impl_.hubmemberid_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL OptParam::_internal_mutable_hubmemberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.hubmemberid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.hubmemberid_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.hubmemberid_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL OptParam::mutable_hubmemberid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint16* _msg = _internal_mutable_hubmemberid(); + // @@protoc_insertion_point(field_mutable:np2_structs.OptParam.hubMemberId) + return _msg; +} +inline void OptParam::set_allocated_hubmemberid(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.hubmemberid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.hubmemberid_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.OptParam.hubMemberId) +} + +// ------------------------------------------------------------------- + +// GroupConfig + +// uint32 slotNum = 1; +inline void GroupConfig::clear_slotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotnum_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t GroupConfig::slotnum() const { + // @@protoc_insertion_point(field_get:np2_structs.GroupConfig.slotNum) + return _internal_slotnum(); +} +inline void GroupConfig::set_slotnum(::uint32_t value) { + _internal_set_slotnum(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.GroupConfig.slotNum) +} +inline ::uint32_t GroupConfig::_internal_slotnum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotnum_; +} +inline void GroupConfig::_internal_set_slotnum(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotnum_ = value; +} + +// bytes label = 2; +inline void GroupConfig::clear_label() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.label_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& GroupConfig::label() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GroupConfig.label) + return _internal_label(); +} +template +PROTOBUF_ALWAYS_INLINE void GroupConfig::set_label(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.label_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.GroupConfig.label) +} +inline ::std::string* PROTOBUF_NONNULL GroupConfig::mutable_label() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_label(); + // @@protoc_insertion_point(field_mutable:np2_structs.GroupConfig.label) + return _s; +} +inline const ::std::string& GroupConfig::_internal_label() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.label_.Get(); +} +inline void GroupConfig::_internal_set_label(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.label_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL GroupConfig::_internal_mutable_label() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.label_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE GroupConfig::release_label() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.GroupConfig.label) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.label_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.label_.Set("", GetArena()); + } + return released; +} +inline void GroupConfig::set_allocated_label(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.label_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.label_.IsDefault()) { + _impl_.label_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.GroupConfig.label) +} + +// bool withPassword = 3; +inline void GroupConfig::clear_withpassword() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withpassword_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline bool GroupConfig::withpassword() const { + // @@protoc_insertion_point(field_get:np2_structs.GroupConfig.withPassword) + return _internal_withpassword(); +} +inline void GroupConfig::set_withpassword(bool value) { + _internal_set_withpassword(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.GroupConfig.withPassword) +} +inline bool GroupConfig::_internal_withpassword() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.withpassword_; +} +inline void GroupConfig::_internal_set_withpassword(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withpassword_ = value; +} + +// ------------------------------------------------------------------- + +// UserInfo + +// string npId = 1; +inline void UserInfo::clear_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& UserInfo::npid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.UserInfo.npId) + return _internal_npid(); +} +template +PROTOBUF_ALWAYS_INLINE void UserInfo::set_npid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.npid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.UserInfo.npId) +} +inline ::std::string* PROTOBUF_NONNULL UserInfo::mutable_npid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_npid(); + // @@protoc_insertion_point(field_mutable:np2_structs.UserInfo.npId) + return _s; +} +inline const ::std::string& UserInfo::_internal_npid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.npid_.Get(); +} +inline void UserInfo::_internal_set_npid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL UserInfo::_internal_mutable_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.npid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE UserInfo::release_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.UserInfo.npId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.npid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.npid_.Set("", GetArena()); + } + return released; +} +inline void UserInfo::set_allocated_npid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.npid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.npid_.IsDefault()) { + _impl_.npid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.UserInfo.npId) +} + +// string onlineName = 2; +inline void UserInfo::clear_onlinename() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.onlinename_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& UserInfo::onlinename() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.UserInfo.onlineName) + return _internal_onlinename(); +} +template +PROTOBUF_ALWAYS_INLINE void UserInfo::set_onlinename(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.onlinename_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.UserInfo.onlineName) +} +inline ::std::string* PROTOBUF_NONNULL UserInfo::mutable_onlinename() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_onlinename(); + // @@protoc_insertion_point(field_mutable:np2_structs.UserInfo.onlineName) + return _s; +} +inline const ::std::string& UserInfo::_internal_onlinename() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.onlinename_.Get(); +} +inline void UserInfo::_internal_set_onlinename(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.onlinename_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL UserInfo::_internal_mutable_onlinename() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.onlinename_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE UserInfo::release_onlinename() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.UserInfo.onlineName) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.onlinename_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.onlinename_.Set("", GetArena()); + } + return released; +} +inline void UserInfo::set_allocated_onlinename(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.onlinename_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.onlinename_.IsDefault()) { + _impl_.onlinename_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.UserInfo.onlineName) +} + +// string avatarUrl = 3; +inline void UserInfo::clear_avatarurl() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.avatarurl_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::std::string& UserInfo::avatarurl() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.UserInfo.avatarUrl) + return _internal_avatarurl(); +} +template +PROTOBUF_ALWAYS_INLINE void UserInfo::set_avatarurl(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + _impl_.avatarurl_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.UserInfo.avatarUrl) +} +inline ::std::string* PROTOBUF_NONNULL UserInfo::mutable_avatarurl() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::std::string* _s = _internal_mutable_avatarurl(); + // @@protoc_insertion_point(field_mutable:np2_structs.UserInfo.avatarUrl) + return _s; +} +inline const ::std::string& UserInfo::_internal_avatarurl() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.avatarurl_.Get(); +} +inline void UserInfo::_internal_set_avatarurl(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.avatarurl_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL UserInfo::_internal_mutable_avatarurl() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.avatarurl_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE UserInfo::release_avatarurl() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.UserInfo.avatarUrl) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000004U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + auto* released = _impl_.avatarurl_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.avatarurl_.Set("", GetArena()); + } + return released; +} +inline void UserInfo::set_allocated_avatarurl(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + _impl_.avatarurl_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.avatarurl_.IsDefault()) { + _impl_.avatarurl_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.UserInfo.avatarUrl) +} + +// ------------------------------------------------------------------- + +// RoomMemberDataInternal + +// .np2_structs.UserInfo userInfo = 1; +inline bool RoomMemberDataInternal::has_userinfo() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.userinfo_ != nullptr); + return value; +} +inline void RoomMemberDataInternal::clear_userinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.userinfo_ != nullptr) _impl_.userinfo_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::UserInfo& RoomMemberDataInternal::_internal_userinfo() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::UserInfo* p = _impl_.userinfo_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_UserInfo_default_instance_); +} +inline const ::np2_structs::UserInfo& RoomMemberDataInternal::userinfo() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternal.userInfo) + return _internal_userinfo(); +} +inline void RoomMemberDataInternal::unsafe_arena_set_allocated_userinfo( + ::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.userinfo_); + } + _impl_.userinfo_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberDataInternal.userInfo) +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE RoomMemberDataInternal::release_userinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::UserInfo* released = _impl_.userinfo_; + _impl_.userinfo_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE RoomMemberDataInternal::unsafe_arena_release_userinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberDataInternal.userInfo) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::UserInfo* temp = _impl_.userinfo_; + _impl_.userinfo_ = nullptr; + return temp; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL RoomMemberDataInternal::_internal_mutable_userinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.userinfo_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::UserInfo>(GetArena()); + _impl_.userinfo_ = reinterpret_cast<::np2_structs::UserInfo*>(p); + } + return _impl_.userinfo_; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL RoomMemberDataInternal::mutable_userinfo() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::UserInfo* _msg = _internal_mutable_userinfo(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataInternal.userInfo) + return _msg; +} +inline void RoomMemberDataInternal::set_allocated_userinfo(::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.userinfo_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.userinfo_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberDataInternal.userInfo) +} + +// uint64 joinDate = 2; +inline void RoomMemberDataInternal::clear_joindate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.joindate_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline ::uint64_t RoomMemberDataInternal::joindate() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternal.joinDate) + return _internal_joindate(); +} +inline void RoomMemberDataInternal::set_joindate(::uint64_t value) { + _internal_set_joindate(value); + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_set:np2_structs.RoomMemberDataInternal.joinDate) +} +inline ::uint64_t RoomMemberDataInternal::_internal_joindate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.joindate_; +} +inline void RoomMemberDataInternal::_internal_set_joindate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.joindate_ = value; +} + +// uint32 memberId = 3; +inline void RoomMemberDataInternal::clear_memberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.memberid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000040U); +} +inline ::uint32_t RoomMemberDataInternal::memberid() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternal.memberId) + return _internal_memberid(); +} +inline void RoomMemberDataInternal::set_memberid(::uint32_t value) { + _internal_set_memberid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_set:np2_structs.RoomMemberDataInternal.memberId) +} +inline ::uint32_t RoomMemberDataInternal::_internal_memberid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.memberid_; +} +inline void RoomMemberDataInternal::_internal_set_memberid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.memberid_ = value; +} + +// .np2_structs.uint8 teamId = 4; +inline bool RoomMemberDataInternal::has_teamid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.teamid_ != nullptr); + return value; +} +inline void RoomMemberDataInternal::clear_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.teamid_ != nullptr) _impl_.teamid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::uint8& RoomMemberDataInternal::_internal_teamid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.teamid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& RoomMemberDataInternal::teamid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternal.teamId) + return _internal_teamid(); +} +inline void RoomMemberDataInternal::unsafe_arena_set_allocated_teamid( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.teamid_); + } + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberDataInternal.teamId) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberDataInternal::release_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* released = _impl_.teamid_; + _impl_.teamid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberDataInternal::unsafe_arena_release_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberDataInternal.teamId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* temp = _impl_.teamid_; + _impl_.teamid_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberDataInternal::_internal_mutable_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.teamid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.teamid_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberDataInternal::mutable_teamid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* _msg = _internal_mutable_teamid(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataInternal.teamId) + return _msg; +} +inline void RoomMemberDataInternal::set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.teamid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberDataInternal.teamId) +} + +// .np2_structs.RoomGroup roomGroup = 5; +inline bool RoomMemberDataInternal::has_roomgroup() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000008U); + PROTOBUF_ASSUME(!value || _impl_.roomgroup_ != nullptr); + return value; +} +inline void RoomMemberDataInternal::clear_roomgroup() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.roomgroup_ != nullptr) _impl_.roomgroup_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::np2_structs::RoomGroup& RoomMemberDataInternal::_internal_roomgroup() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::RoomGroup* p = _impl_.roomgroup_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_RoomGroup_default_instance_); +} +inline const ::np2_structs::RoomGroup& RoomMemberDataInternal::roomgroup() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternal.roomGroup) + return _internal_roomgroup(); +} +inline void RoomMemberDataInternal::unsafe_arena_set_allocated_roomgroup( + ::np2_structs::RoomGroup* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.roomgroup_); + } + _impl_.roomgroup_ = reinterpret_cast<::np2_structs::RoomGroup*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberDataInternal.roomGroup) +} +inline ::np2_structs::RoomGroup* PROTOBUF_NULLABLE RoomMemberDataInternal::release_roomgroup() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::RoomGroup* released = _impl_.roomgroup_; + _impl_.roomgroup_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::RoomGroup* PROTOBUF_NULLABLE RoomMemberDataInternal::unsafe_arena_release_roomgroup() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberDataInternal.roomGroup) + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::RoomGroup* temp = _impl_.roomgroup_; + _impl_.roomgroup_ = nullptr; + return temp; +} +inline ::np2_structs::RoomGroup* PROTOBUF_NONNULL RoomMemberDataInternal::_internal_mutable_roomgroup() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.roomgroup_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::RoomGroup>(GetArena()); + _impl_.roomgroup_ = reinterpret_cast<::np2_structs::RoomGroup*>(p); + } + return _impl_.roomgroup_; +} +inline ::np2_structs::RoomGroup* PROTOBUF_NONNULL RoomMemberDataInternal::mutable_roomgroup() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::RoomGroup* _msg = _internal_mutable_roomgroup(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataInternal.roomGroup) + return _msg; +} +inline void RoomMemberDataInternal::set_allocated_roomgroup(::np2_structs::RoomGroup* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.roomgroup_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + + _impl_.roomgroup_ = reinterpret_cast<::np2_structs::RoomGroup*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberDataInternal.roomGroup) +} + +// .np2_structs.uint8 natType = 6; +inline bool RoomMemberDataInternal::has_nattype() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000010U); + PROTOBUF_ASSUME(!value || _impl_.nattype_ != nullptr); + return value; +} +inline void RoomMemberDataInternal::clear_nattype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.nattype_ != nullptr) _impl_.nattype_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline const ::np2_structs::uint8& RoomMemberDataInternal::_internal_nattype() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.nattype_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& RoomMemberDataInternal::nattype() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternal.natType) + return _internal_nattype(); +} +inline void RoomMemberDataInternal::unsafe_arena_set_allocated_nattype( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.nattype_); + } + _impl_.nattype_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberDataInternal.natType) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberDataInternal::release_nattype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint8* released = _impl_.nattype_; + _impl_.nattype_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberDataInternal::unsafe_arena_release_nattype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberDataInternal.natType) + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint8* temp = _impl_.nattype_; + _impl_.nattype_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberDataInternal::_internal_mutable_nattype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.nattype_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.nattype_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.nattype_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberDataInternal::mutable_nattype() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint8* _msg = _internal_mutable_nattype(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataInternal.natType) + return _msg; +} +inline void RoomMemberDataInternal::set_allocated_nattype(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.nattype_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + + _impl_.nattype_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberDataInternal.natType) +} + +// uint32 flagAttr = 7; +inline void RoomMemberDataInternal::clear_flagattr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000080U); +} +inline ::uint32_t RoomMemberDataInternal::flagattr() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternal.flagAttr) + return _internal_flagattr(); +} +inline void RoomMemberDataInternal::set_flagattr(::uint32_t value) { + _internal_set_flagattr(value); + SetHasBit(_impl_._has_bits_[0], 0x00000080U); + // @@protoc_insertion_point(field_set:np2_structs.RoomMemberDataInternal.flagAttr) +} +inline ::uint32_t RoomMemberDataInternal::_internal_flagattr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.flagattr_; +} +inline void RoomMemberDataInternal::_internal_set_flagattr(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = value; +} + +// repeated .np2_structs.RoomMemberBinAttrInternal roomMemberBinAttrInternal = 8; +inline int RoomMemberDataInternal::_internal_roommemberbinattrinternal_size() const { + return _internal_roommemberbinattrinternal().size(); +} +inline int RoomMemberDataInternal::roommemberbinattrinternal_size() const { + return _internal_roommemberbinattrinternal_size(); +} +inline void RoomMemberDataInternal::clear_roommemberbinattrinternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roommemberbinattrinternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::RoomMemberBinAttrInternal* PROTOBUF_NONNULL RoomMemberDataInternal::mutable_roommemberbinattrinternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataInternal.roomMemberBinAttrInternal) + return _internal_mutable_roommemberbinattrinternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberBinAttrInternal>* PROTOBUF_NONNULL RoomMemberDataInternal::mutable_roommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomMemberDataInternal.roomMemberBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roommemberbinattrinternal(); +} +inline const ::np2_structs::RoomMemberBinAttrInternal& RoomMemberDataInternal::roommemberbinattrinternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternal.roomMemberBinAttrInternal) + return _internal_roommemberbinattrinternal().Get(index); +} +inline ::np2_structs::RoomMemberBinAttrInternal* PROTOBUF_NONNULL RoomMemberDataInternal::add_roommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::RoomMemberBinAttrInternal* _add = + _internal_mutable_roommemberbinattrinternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.RoomMemberDataInternal.roomMemberBinAttrInternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberBinAttrInternal>& RoomMemberDataInternal::roommemberbinattrinternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomMemberDataInternal.roomMemberBinAttrInternal) + return _internal_roommemberbinattrinternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberBinAttrInternal>& +RoomMemberDataInternal::_internal_roommemberbinattrinternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roommemberbinattrinternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberBinAttrInternal>* PROTOBUF_NONNULL +RoomMemberDataInternal::_internal_mutable_roommemberbinattrinternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roommemberbinattrinternal_; +} + +// ------------------------------------------------------------------- + +// RoomGroup + +// .np2_structs.uint8 groupId = 1; +inline bool RoomGroup::has_groupid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.groupid_ != nullptr); + return value; +} +inline void RoomGroup::clear_groupid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.groupid_ != nullptr) _impl_.groupid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::uint8& RoomGroup::_internal_groupid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.groupid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& RoomGroup::groupid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomGroup.groupId) + return _internal_groupid(); +} +inline void RoomGroup::unsafe_arena_set_allocated_groupid( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.groupid_); + } + _impl_.groupid_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomGroup.groupId) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomGroup::release_groupid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* released = _impl_.groupid_; + _impl_.groupid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomGroup::unsafe_arena_release_groupid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomGroup.groupId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* temp = _impl_.groupid_; + _impl_.groupid_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomGroup::_internal_mutable_groupid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.groupid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.groupid_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.groupid_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomGroup::mutable_groupid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* _msg = _internal_mutable_groupid(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomGroup.groupId) + return _msg; +} +inline void RoomGroup::set_allocated_groupid(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.groupid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.groupid_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomGroup.groupId) +} + +// bool withPassword = 2; +inline void RoomGroup::clear_withpassword() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withpassword_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline bool RoomGroup::withpassword() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomGroup.withPassword) + return _internal_withpassword(); +} +inline void RoomGroup::set_withpassword(bool value) { + _internal_set_withpassword(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.RoomGroup.withPassword) +} +inline bool RoomGroup::_internal_withpassword() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.withpassword_; +} +inline void RoomGroup::_internal_set_withpassword(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withpassword_ = value; +} + +// bytes label = 3; +inline void RoomGroup::clear_label() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.label_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& RoomGroup::label() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomGroup.label) + return _internal_label(); +} +template +PROTOBUF_ALWAYS_INLINE void RoomGroup::set_label(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.label_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.RoomGroup.label) +} +inline ::std::string* PROTOBUF_NONNULL RoomGroup::mutable_label() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_label(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomGroup.label) + return _s; +} +inline const ::std::string& RoomGroup::_internal_label() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.label_.Get(); +} +inline void RoomGroup::_internal_set_label(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.label_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL RoomGroup::_internal_mutable_label() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.label_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE RoomGroup::release_label() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomGroup.label) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.label_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.label_.Set("", GetArena()); + } + return released; +} +inline void RoomGroup::set_allocated_label(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.label_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.label_.IsDefault()) { + _impl_.label_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomGroup.label) +} + +// uint32 slotNum = 4; +inline void RoomGroup::clear_slotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotnum_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t RoomGroup::slotnum() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomGroup.slotNum) + return _internal_slotnum(); +} +inline void RoomGroup::set_slotnum(::uint32_t value) { + _internal_set_slotnum(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.RoomGroup.slotNum) +} +inline ::uint32_t RoomGroup::_internal_slotnum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotnum_; +} +inline void RoomGroup::_internal_set_slotnum(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotnum_ = value; +} + +// uint32 curGroupMemberNum = 5; +inline void RoomGroup::clear_curgroupmembernum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.curgroupmembernum_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::uint32_t RoomGroup::curgroupmembernum() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomGroup.curGroupMemberNum) + return _internal_curgroupmembernum(); +} +inline void RoomGroup::set_curgroupmembernum(::uint32_t value) { + _internal_set_curgroupmembernum(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.RoomGroup.curGroupMemberNum) +} +inline ::uint32_t RoomGroup::_internal_curgroupmembernum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.curgroupmembernum_; +} +inline void RoomGroup::_internal_set_curgroupmembernum(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.curgroupmembernum_ = value; +} + +// ------------------------------------------------------------------- + +// RoomDataInternal + +// .np2_structs.uint16 serverId = 1; +inline bool RoomDataInternal::has_serverid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000008U); + PROTOBUF_ASSUME(!value || _impl_.serverid_ != nullptr); + return value; +} +inline void RoomDataInternal::clear_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.serverid_ != nullptr) _impl_.serverid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::np2_structs::uint16& RoomDataInternal::_internal_serverid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.serverid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& RoomDataInternal::serverid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.serverId) + return _internal_serverid(); +} +inline void RoomDataInternal::unsafe_arena_set_allocated_serverid( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.serverid_); + } + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataInternal.serverId) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataInternal::release_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::uint16* released = _impl_.serverid_; + _impl_.serverid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataInternal::unsafe_arena_release_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataInternal.serverId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::uint16* temp = _impl_.serverid_; + _impl_.serverid_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataInternal::_internal_mutable_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.serverid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.serverid_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataInternal::mutable_serverid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::uint16* _msg = _internal_mutable_serverid(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataInternal.serverId) + return _msg; +} +inline void RoomDataInternal::set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.serverid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataInternal.serverId) +} + +// uint32 worldId = 2; +inline void RoomDataInternal::clear_worldid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000080U); +} +inline ::uint32_t RoomDataInternal::worldid() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.worldId) + return _internal_worldid(); +} +inline void RoomDataInternal::set_worldid(::uint32_t value) { + _internal_set_worldid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000080U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataInternal.worldId) +} +inline ::uint32_t RoomDataInternal::_internal_worldid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.worldid_; +} +inline void RoomDataInternal::_internal_set_worldid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = value; +} + +// uint64 lobbyId = 3; +inline void RoomDataInternal::clear_lobbyid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lobbyid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline ::uint64_t RoomDataInternal::lobbyid() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.lobbyId) + return _internal_lobbyid(); +} +inline void RoomDataInternal::set_lobbyid(::uint64_t value) { + _internal_set_lobbyid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataInternal.lobbyId) +} +inline ::uint64_t RoomDataInternal::_internal_lobbyid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.lobbyid_; +} +inline void RoomDataInternal::_internal_set_lobbyid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lobbyid_ = value; +} + +// uint64 roomId = 4; +inline void RoomDataInternal::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000040U); +} +inline ::uint64_t RoomDataInternal::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.roomId) + return _internal_roomid(); +} +inline void RoomDataInternal::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataInternal.roomId) +} +inline ::uint64_t RoomDataInternal::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void RoomDataInternal::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// uint64 passwordSlotMask = 5; +inline void RoomDataInternal::clear_passwordslotmask() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.passwordslotmask_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000200U); +} +inline ::uint64_t RoomDataInternal::passwordslotmask() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.passwordSlotMask) + return _internal_passwordslotmask(); +} +inline void RoomDataInternal::set_passwordslotmask(::uint64_t value) { + _internal_set_passwordslotmask(value); + SetHasBit(_impl_._has_bits_[0], 0x00000200U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataInternal.passwordSlotMask) +} +inline ::uint64_t RoomDataInternal::_internal_passwordslotmask() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.passwordslotmask_; +} +inline void RoomDataInternal::_internal_set_passwordslotmask(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.passwordslotmask_ = value; +} + +// uint32 maxSlot = 6; +inline void RoomDataInternal::clear_maxslot() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.maxslot_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000100U); +} +inline ::uint32_t RoomDataInternal::maxslot() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.maxSlot) + return _internal_maxslot(); +} +inline void RoomDataInternal::set_maxslot(::uint32_t value) { + _internal_set_maxslot(value); + SetHasBit(_impl_._has_bits_[0], 0x00000100U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataInternal.maxSlot) +} +inline ::uint32_t RoomDataInternal::_internal_maxslot() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.maxslot_; +} +inline void RoomDataInternal::_internal_set_maxslot(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.maxslot_ = value; +} + +// repeated .np2_structs.RoomMemberDataInternal memberList = 7; +inline int RoomDataInternal::_internal_memberlist_size() const { + return _internal_memberlist().size(); +} +inline int RoomDataInternal::memberlist_size() const { + return _internal_memberlist_size(); +} +inline void RoomDataInternal::clear_memberlist() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.memberlist_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL RoomDataInternal::mutable_memberlist(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataInternal.memberList) + return _internal_mutable_memberlist()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataInternal>* PROTOBUF_NONNULL RoomDataInternal::mutable_memberlist() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomDataInternal.memberList) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_memberlist(); +} +inline const ::np2_structs::RoomMemberDataInternal& RoomDataInternal::memberlist(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.memberList) + return _internal_memberlist().Get(index); +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL RoomDataInternal::add_memberlist() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::RoomMemberDataInternal* _add = + _internal_mutable_memberlist()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.RoomDataInternal.memberList) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataInternal>& RoomDataInternal::memberlist() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomDataInternal.memberList) + return _internal_memberlist(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataInternal>& +RoomDataInternal::_internal_memberlist() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.memberlist_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataInternal>* PROTOBUF_NONNULL +RoomDataInternal::_internal_mutable_memberlist() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.memberlist_; +} + +// .np2_structs.uint16 ownerId = 8; +inline bool RoomDataInternal::has_ownerid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000010U); + PROTOBUF_ASSUME(!value || _impl_.ownerid_ != nullptr); + return value; +} +inline void RoomDataInternal::clear_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.ownerid_ != nullptr) _impl_.ownerid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline const ::np2_structs::uint16& RoomDataInternal::_internal_ownerid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.ownerid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& RoomDataInternal::ownerid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.ownerId) + return _internal_ownerid(); +} +inline void RoomDataInternal::unsafe_arena_set_allocated_ownerid( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.ownerid_); + } + _impl_.ownerid_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataInternal.ownerId) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataInternal::release_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint16* released = _impl_.ownerid_; + _impl_.ownerid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataInternal::unsafe_arena_release_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataInternal.ownerId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint16* temp = _impl_.ownerid_; + _impl_.ownerid_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataInternal::_internal_mutable_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.ownerid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.ownerid_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.ownerid_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataInternal::mutable_ownerid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint16* _msg = _internal_mutable_ownerid(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataInternal.ownerId) + return _msg; +} +inline void RoomDataInternal::set_allocated_ownerid(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.ownerid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + + _impl_.ownerid_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataInternal.ownerId) +} + +// repeated .np2_structs.RoomGroup roomGroup = 9; +inline int RoomDataInternal::_internal_roomgroup_size() const { + return _internal_roomgroup().size(); +} +inline int RoomDataInternal::roomgroup_size() const { + return _internal_roomgroup_size(); +} +inline void RoomDataInternal::clear_roomgroup() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomgroup_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::np2_structs::RoomGroup* PROTOBUF_NONNULL RoomDataInternal::mutable_roomgroup(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataInternal.roomGroup) + return _internal_mutable_roomgroup()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>* PROTOBUF_NONNULL RoomDataInternal::mutable_roomgroup() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomDataInternal.roomGroup) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roomgroup(); +} +inline const ::np2_structs::RoomGroup& RoomDataInternal::roomgroup(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.roomGroup) + return _internal_roomgroup().Get(index); +} +inline ::np2_structs::RoomGroup* PROTOBUF_NONNULL RoomDataInternal::add_roomgroup() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::RoomGroup* _add = + _internal_mutable_roomgroup()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.RoomDataInternal.roomGroup) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>& RoomDataInternal::roomgroup() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomDataInternal.roomGroup) + return _internal_roomgroup(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>& +RoomDataInternal::_internal_roomgroup() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomgroup_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>* PROTOBUF_NONNULL +RoomDataInternal::_internal_mutable_roomgroup() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roomgroup_; +} + +// uint32 flagAttr = 10; +inline void RoomDataInternal::clear_flagattr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000400U); +} +inline ::uint32_t RoomDataInternal::flagattr() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.flagAttr) + return _internal_flagattr(); +} +inline void RoomDataInternal::set_flagattr(::uint32_t value) { + _internal_set_flagattr(value); + SetHasBit(_impl_._has_bits_[0], 0x00000400U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataInternal.flagAttr) +} +inline ::uint32_t RoomDataInternal::_internal_flagattr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.flagattr_; +} +inline void RoomDataInternal::_internal_set_flagattr(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = value; +} + +// repeated .np2_structs.BinAttrInternal roomBinAttrInternal = 11; +inline int RoomDataInternal::_internal_roombinattrinternal_size() const { + return _internal_roombinattrinternal().size(); +} +inline int RoomDataInternal::roombinattrinternal_size() const { + return _internal_roombinattrinternal_size(); +} +inline void RoomDataInternal::clear_roombinattrinternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roombinattrinternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::np2_structs::BinAttrInternal* PROTOBUF_NONNULL RoomDataInternal::mutable_roombinattrinternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataInternal.roomBinAttrInternal) + return _internal_mutable_roombinattrinternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttrInternal>* PROTOBUF_NONNULL RoomDataInternal::mutable_roombinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomDataInternal.roomBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roombinattrinternal(); +} +inline const ::np2_structs::BinAttrInternal& RoomDataInternal::roombinattrinternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternal.roomBinAttrInternal) + return _internal_roombinattrinternal().Get(index); +} +inline ::np2_structs::BinAttrInternal* PROTOBUF_NONNULL RoomDataInternal::add_roombinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttrInternal* _add = + _internal_mutable_roombinattrinternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_add:np2_structs.RoomDataInternal.roomBinAttrInternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttrInternal>& RoomDataInternal::roombinattrinternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomDataInternal.roomBinAttrInternal) + return _internal_roombinattrinternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttrInternal>& +RoomDataInternal::_internal_roombinattrinternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roombinattrinternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttrInternal>* PROTOBUF_NONNULL +RoomDataInternal::_internal_mutable_roombinattrinternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roombinattrinternal_; +} + +// ------------------------------------------------------------------- + +// RoomDataExternal + +// .np2_structs.uint16 serverId = 1; +inline bool RoomDataExternal::has_serverid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000010U); + PROTOBUF_ASSUME(!value || _impl_.serverid_ != nullptr); + return value; +} +inline void RoomDataExternal::clear_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.serverid_ != nullptr) _impl_.serverid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline const ::np2_structs::uint16& RoomDataExternal::_internal_serverid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.serverid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& RoomDataExternal::serverid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.serverId) + return _internal_serverid(); +} +inline void RoomDataExternal::unsafe_arena_set_allocated_serverid( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.serverid_); + } + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataExternal.serverId) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::release_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint16* released = _impl_.serverid_; + _impl_.serverid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::unsafe_arena_release_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataExternal.serverId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint16* temp = _impl_.serverid_; + _impl_.serverid_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::_internal_mutable_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.serverid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.serverid_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::mutable_serverid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint16* _msg = _internal_mutable_serverid(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.serverId) + return _msg; +} +inline void RoomDataExternal::set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.serverid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataExternal.serverId) +} + +// uint32 worldId = 2; +inline void RoomDataExternal::clear_worldid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00004000U); +} +inline ::uint32_t RoomDataExternal::worldid() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.worldId) + return _internal_worldid(); +} +inline void RoomDataExternal::set_worldid(::uint32_t value) { + _internal_set_worldid(value); + SetHasBit(_impl_._has_bits_[0], 0x00004000U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataExternal.worldId) +} +inline ::uint32_t RoomDataExternal::_internal_worldid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.worldid_; +} +inline void RoomDataExternal::_internal_set_worldid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = value; +} + +// .np2_structs.uint16 publicSlotNum = 3; +inline bool RoomDataExternal::has_publicslotnum() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000020U); + PROTOBUF_ASSUME(!value || _impl_.publicslotnum_ != nullptr); + return value; +} +inline void RoomDataExternal::clear_publicslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.publicslotnum_ != nullptr) _impl_.publicslotnum_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline const ::np2_structs::uint16& RoomDataExternal::_internal_publicslotnum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.publicslotnum_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& RoomDataExternal::publicslotnum() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.publicSlotNum) + return _internal_publicslotnum(); +} +inline void RoomDataExternal::unsafe_arena_set_allocated_publicslotnum( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.publicslotnum_); + } + _impl_.publicslotnum_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000020U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataExternal.publicSlotNum) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::release_publicslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000020U); + ::np2_structs::uint16* released = _impl_.publicslotnum_; + _impl_.publicslotnum_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::unsafe_arena_release_publicslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataExternal.publicSlotNum) + + ClearHasBit(_impl_._has_bits_[0], 0x00000020U); + ::np2_structs::uint16* temp = _impl_.publicslotnum_; + _impl_.publicslotnum_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::_internal_mutable_publicslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.publicslotnum_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.publicslotnum_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.publicslotnum_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::mutable_publicslotnum() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + ::np2_structs::uint16* _msg = _internal_mutable_publicslotnum(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.publicSlotNum) + return _msg; +} +inline void RoomDataExternal::set_allocated_publicslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.publicslotnum_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000020U); + } + + _impl_.publicslotnum_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataExternal.publicSlotNum) +} + +// .np2_structs.uint16 privateSlotNum = 4; +inline bool RoomDataExternal::has_privateslotnum() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000040U); + PROTOBUF_ASSUME(!value || _impl_.privateslotnum_ != nullptr); + return value; +} +inline void RoomDataExternal::clear_privateslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.privateslotnum_ != nullptr) _impl_.privateslotnum_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000040U); +} +inline const ::np2_structs::uint16& RoomDataExternal::_internal_privateslotnum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.privateslotnum_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& RoomDataExternal::privateslotnum() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.privateSlotNum) + return _internal_privateslotnum(); +} +inline void RoomDataExternal::unsafe_arena_set_allocated_privateslotnum( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.privateslotnum_); + } + _impl_.privateslotnum_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000040U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataExternal.privateSlotNum) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::release_privateslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000040U); + ::np2_structs::uint16* released = _impl_.privateslotnum_; + _impl_.privateslotnum_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::unsafe_arena_release_privateslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataExternal.privateSlotNum) + + ClearHasBit(_impl_._has_bits_[0], 0x00000040U); + ::np2_structs::uint16* temp = _impl_.privateslotnum_; + _impl_.privateslotnum_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::_internal_mutable_privateslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.privateslotnum_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.privateslotnum_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.privateslotnum_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::mutable_privateslotnum() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + ::np2_structs::uint16* _msg = _internal_mutable_privateslotnum(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.privateSlotNum) + return _msg; +} +inline void RoomDataExternal::set_allocated_privateslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.privateslotnum_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000040U); + } + + _impl_.privateslotnum_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataExternal.privateSlotNum) +} + +// uint64 lobbyId = 5; +inline void RoomDataExternal::clear_lobbyid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lobbyid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00001000U); +} +inline ::uint64_t RoomDataExternal::lobbyid() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.lobbyId) + return _internal_lobbyid(); +} +inline void RoomDataExternal::set_lobbyid(::uint64_t value) { + _internal_set_lobbyid(value); + SetHasBit(_impl_._has_bits_[0], 0x00001000U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataExternal.lobbyId) +} +inline ::uint64_t RoomDataExternal::_internal_lobbyid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.lobbyid_; +} +inline void RoomDataExternal::_internal_set_lobbyid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lobbyid_ = value; +} + +// uint64 roomId = 6; +inline void RoomDataExternal::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00002000U); +} +inline ::uint64_t RoomDataExternal::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.roomId) + return _internal_roomid(); +} +inline void RoomDataExternal::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00002000U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataExternal.roomId) +} +inline ::uint64_t RoomDataExternal::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void RoomDataExternal::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// .np2_structs.uint16 openPublicSlotNum = 7; +inline bool RoomDataExternal::has_openpublicslotnum() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000080U); + PROTOBUF_ASSUME(!value || _impl_.openpublicslotnum_ != nullptr); + return value; +} +inline void RoomDataExternal::clear_openpublicslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.openpublicslotnum_ != nullptr) _impl_.openpublicslotnum_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000080U); +} +inline const ::np2_structs::uint16& RoomDataExternal::_internal_openpublicslotnum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.openpublicslotnum_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& RoomDataExternal::openpublicslotnum() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.openPublicSlotNum) + return _internal_openpublicslotnum(); +} +inline void RoomDataExternal::unsafe_arena_set_allocated_openpublicslotnum( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.openpublicslotnum_); + } + _impl_.openpublicslotnum_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000080U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000080U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataExternal.openPublicSlotNum) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::release_openpublicslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000080U); + ::np2_structs::uint16* released = _impl_.openpublicslotnum_; + _impl_.openpublicslotnum_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::unsafe_arena_release_openpublicslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataExternal.openPublicSlotNum) + + ClearHasBit(_impl_._has_bits_[0], 0x00000080U); + ::np2_structs::uint16* temp = _impl_.openpublicslotnum_; + _impl_.openpublicslotnum_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::_internal_mutable_openpublicslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.openpublicslotnum_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.openpublicslotnum_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.openpublicslotnum_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::mutable_openpublicslotnum() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000080U); + ::np2_structs::uint16* _msg = _internal_mutable_openpublicslotnum(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.openPublicSlotNum) + return _msg; +} +inline void RoomDataExternal::set_allocated_openpublicslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.openpublicslotnum_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000080U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000080U); + } + + _impl_.openpublicslotnum_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataExternal.openPublicSlotNum) +} + +// .np2_structs.uint16 maxSlot = 8; +inline bool RoomDataExternal::has_maxslot() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000100U); + PROTOBUF_ASSUME(!value || _impl_.maxslot_ != nullptr); + return value; +} +inline void RoomDataExternal::clear_maxslot() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.maxslot_ != nullptr) _impl_.maxslot_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000100U); +} +inline const ::np2_structs::uint16& RoomDataExternal::_internal_maxslot() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.maxslot_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& RoomDataExternal::maxslot() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.maxSlot) + return _internal_maxslot(); +} +inline void RoomDataExternal::unsafe_arena_set_allocated_maxslot( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.maxslot_); + } + _impl_.maxslot_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000100U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000100U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataExternal.maxSlot) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::release_maxslot() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000100U); + ::np2_structs::uint16* released = _impl_.maxslot_; + _impl_.maxslot_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::unsafe_arena_release_maxslot() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataExternal.maxSlot) + + ClearHasBit(_impl_._has_bits_[0], 0x00000100U); + ::np2_structs::uint16* temp = _impl_.maxslot_; + _impl_.maxslot_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::_internal_mutable_maxslot() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.maxslot_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.maxslot_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.maxslot_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::mutable_maxslot() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000100U); + ::np2_structs::uint16* _msg = _internal_mutable_maxslot(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.maxSlot) + return _msg; +} +inline void RoomDataExternal::set_allocated_maxslot(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.maxslot_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000100U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000100U); + } + + _impl_.maxslot_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataExternal.maxSlot) +} + +// .np2_structs.uint16 openPrivateSlotNum = 9; +inline bool RoomDataExternal::has_openprivateslotnum() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000200U); + PROTOBUF_ASSUME(!value || _impl_.openprivateslotnum_ != nullptr); + return value; +} +inline void RoomDataExternal::clear_openprivateslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.openprivateslotnum_ != nullptr) _impl_.openprivateslotnum_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000200U); +} +inline const ::np2_structs::uint16& RoomDataExternal::_internal_openprivateslotnum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.openprivateslotnum_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& RoomDataExternal::openprivateslotnum() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.openPrivateSlotNum) + return _internal_openprivateslotnum(); +} +inline void RoomDataExternal::unsafe_arena_set_allocated_openprivateslotnum( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.openprivateslotnum_); + } + _impl_.openprivateslotnum_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000200U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000200U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataExternal.openPrivateSlotNum) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::release_openprivateslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000200U); + ::np2_structs::uint16* released = _impl_.openprivateslotnum_; + _impl_.openprivateslotnum_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::unsafe_arena_release_openprivateslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataExternal.openPrivateSlotNum) + + ClearHasBit(_impl_._has_bits_[0], 0x00000200U); + ::np2_structs::uint16* temp = _impl_.openprivateslotnum_; + _impl_.openprivateslotnum_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::_internal_mutable_openprivateslotnum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.openprivateslotnum_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.openprivateslotnum_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.openprivateslotnum_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::mutable_openprivateslotnum() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000200U); + ::np2_structs::uint16* _msg = _internal_mutable_openprivateslotnum(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.openPrivateSlotNum) + return _msg; +} +inline void RoomDataExternal::set_allocated_openprivateslotnum(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.openprivateslotnum_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000200U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000200U); + } + + _impl_.openprivateslotnum_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataExternal.openPrivateSlotNum) +} + +// .np2_structs.uint16 curMemberNum = 10; +inline bool RoomDataExternal::has_curmembernum() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000400U); + PROTOBUF_ASSUME(!value || _impl_.curmembernum_ != nullptr); + return value; +} +inline void RoomDataExternal::clear_curmembernum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.curmembernum_ != nullptr) _impl_.curmembernum_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000400U); +} +inline const ::np2_structs::uint16& RoomDataExternal::_internal_curmembernum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.curmembernum_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& RoomDataExternal::curmembernum() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.curMemberNum) + return _internal_curmembernum(); +} +inline void RoomDataExternal::unsafe_arena_set_allocated_curmembernum( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.curmembernum_); + } + _impl_.curmembernum_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000400U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000400U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataExternal.curMemberNum) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::release_curmembernum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000400U); + ::np2_structs::uint16* released = _impl_.curmembernum_; + _impl_.curmembernum_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE RoomDataExternal::unsafe_arena_release_curmembernum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataExternal.curMemberNum) + + ClearHasBit(_impl_._has_bits_[0], 0x00000400U); + ::np2_structs::uint16* temp = _impl_.curmembernum_; + _impl_.curmembernum_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::_internal_mutable_curmembernum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.curmembernum_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.curmembernum_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.curmembernum_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataExternal::mutable_curmembernum() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000400U); + ::np2_structs::uint16* _msg = _internal_mutable_curmembernum(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.curMemberNum) + return _msg; +} +inline void RoomDataExternal::set_allocated_curmembernum(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.curmembernum_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000400U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000400U); + } + + _impl_.curmembernum_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataExternal.curMemberNum) +} + +// uint64 passwordSlotMask = 11; +inline void RoomDataExternal::clear_passwordslotmask() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.passwordslotmask_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00010000U); +} +inline ::uint64_t RoomDataExternal::passwordslotmask() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.passwordSlotMask) + return _internal_passwordslotmask(); +} +inline void RoomDataExternal::set_passwordslotmask(::uint64_t value) { + _internal_set_passwordslotmask(value); + SetHasBit(_impl_._has_bits_[0], 0x00010000U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataExternal.passwordSlotMask) +} +inline ::uint64_t RoomDataExternal::_internal_passwordslotmask() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.passwordslotmask_; +} +inline void RoomDataExternal::_internal_set_passwordslotmask(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.passwordslotmask_ = value; +} + +// .np2_structs.UserInfo owner = 12; +inline bool RoomDataExternal::has_owner() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000800U); + PROTOBUF_ASSUME(!value || _impl_.owner_ != nullptr); + return value; +} +inline void RoomDataExternal::clear_owner() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.owner_ != nullptr) _impl_.owner_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000800U); +} +inline const ::np2_structs::UserInfo& RoomDataExternal::_internal_owner() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::UserInfo* p = _impl_.owner_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_UserInfo_default_instance_); +} +inline const ::np2_structs::UserInfo& RoomDataExternal::owner() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.owner) + return _internal_owner(); +} +inline void RoomDataExternal::unsafe_arena_set_allocated_owner( + ::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.owner_); + } + _impl_.owner_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000800U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000800U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataExternal.owner) +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE RoomDataExternal::release_owner() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000800U); + ::np2_structs::UserInfo* released = _impl_.owner_; + _impl_.owner_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE RoomDataExternal::unsafe_arena_release_owner() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataExternal.owner) + + ClearHasBit(_impl_._has_bits_[0], 0x00000800U); + ::np2_structs::UserInfo* temp = _impl_.owner_; + _impl_.owner_ = nullptr; + return temp; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL RoomDataExternal::_internal_mutable_owner() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.owner_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::UserInfo>(GetArena()); + _impl_.owner_ = reinterpret_cast<::np2_structs::UserInfo*>(p); + } + return _impl_.owner_; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL RoomDataExternal::mutable_owner() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000800U); + ::np2_structs::UserInfo* _msg = _internal_mutable_owner(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.owner) + return _msg; +} +inline void RoomDataExternal::set_allocated_owner(::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.owner_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000800U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000800U); + } + + _impl_.owner_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataExternal.owner) +} + +// repeated .np2_structs.RoomGroup roomGroup = 13; +inline int RoomDataExternal::_internal_roomgroup_size() const { + return _internal_roomgroup().size(); +} +inline int RoomDataExternal::roomgroup_size() const { + return _internal_roomgroup_size(); +} +inline void RoomDataExternal::clear_roomgroup() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomgroup_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::RoomGroup* PROTOBUF_NONNULL RoomDataExternal::mutable_roomgroup(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.roomGroup) + return _internal_mutable_roomgroup()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>* PROTOBUF_NONNULL RoomDataExternal::mutable_roomgroup() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomDataExternal.roomGroup) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roomgroup(); +} +inline const ::np2_structs::RoomGroup& RoomDataExternal::roomgroup(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.roomGroup) + return _internal_roomgroup().Get(index); +} +inline ::np2_structs::RoomGroup* PROTOBUF_NONNULL RoomDataExternal::add_roomgroup() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::RoomGroup* _add = + _internal_mutable_roomgroup()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.RoomDataExternal.roomGroup) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>& RoomDataExternal::roomgroup() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomDataExternal.roomGroup) + return _internal_roomgroup(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>& +RoomDataExternal::_internal_roomgroup() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomgroup_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroup>* PROTOBUF_NONNULL +RoomDataExternal::_internal_mutable_roomgroup() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roomgroup_; +} + +// uint32 flagAttr = 14; +inline void RoomDataExternal::clear_flagattr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00008000U); +} +inline ::uint32_t RoomDataExternal::flagattr() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.flagAttr) + return _internal_flagattr(); +} +inline void RoomDataExternal::set_flagattr(::uint32_t value) { + _internal_set_flagattr(value); + SetHasBit(_impl_._has_bits_[0], 0x00008000U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataExternal.flagAttr) +} +inline ::uint32_t RoomDataExternal::_internal_flagattr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.flagattr_; +} +inline void RoomDataExternal::_internal_set_flagattr(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = value; +} + +// repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 15; +inline int RoomDataExternal::_internal_roomsearchableintattrexternal_size() const { + return _internal_roomsearchableintattrexternal().size(); +} +inline int RoomDataExternal::roomsearchableintattrexternal_size() const { + return _internal_roomsearchableintattrexternal_size(); +} +inline void RoomDataExternal::clear_roomsearchableintattrexternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomsearchableintattrexternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::np2_structs::IntAttr* PROTOBUF_NONNULL RoomDataExternal::mutable_roomsearchableintattrexternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.roomSearchableIntAttrExternal) + return _internal_mutable_roomsearchableintattrexternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL RoomDataExternal::mutable_roomsearchableintattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomDataExternal.roomSearchableIntAttrExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roomsearchableintattrexternal(); +} +inline const ::np2_structs::IntAttr& RoomDataExternal::roomsearchableintattrexternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.roomSearchableIntAttrExternal) + return _internal_roomsearchableintattrexternal().Get(index); +} +inline ::np2_structs::IntAttr* PROTOBUF_NONNULL RoomDataExternal::add_roomsearchableintattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::IntAttr* _add = + _internal_mutable_roomsearchableintattrexternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.RoomDataExternal.roomSearchableIntAttrExternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& RoomDataExternal::roomsearchableintattrexternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomDataExternal.roomSearchableIntAttrExternal) + return _internal_roomsearchableintattrexternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& +RoomDataExternal::_internal_roomsearchableintattrexternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomsearchableintattrexternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL +RoomDataExternal::_internal_mutable_roomsearchableintattrexternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roomsearchableintattrexternal_; +} + +// repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 16; +inline int RoomDataExternal::_internal_roomsearchablebinattrexternal_size() const { + return _internal_roomsearchablebinattrexternal().size(); +} +inline int RoomDataExternal::roomsearchablebinattrexternal_size() const { + return _internal_roomsearchablebinattrexternal_size(); +} +inline void RoomDataExternal::clear_roomsearchablebinattrexternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomsearchablebinattrexternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL RoomDataExternal::mutable_roomsearchablebinattrexternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.roomSearchableBinAttrExternal) + return _internal_mutable_roomsearchablebinattrexternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL RoomDataExternal::mutable_roomsearchablebinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomDataExternal.roomSearchableBinAttrExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roomsearchablebinattrexternal(); +} +inline const ::np2_structs::BinAttr& RoomDataExternal::roomsearchablebinattrexternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.roomSearchableBinAttrExternal) + return _internal_roomsearchablebinattrexternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL RoomDataExternal::add_roomsearchablebinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roomsearchablebinattrexternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_add:np2_structs.RoomDataExternal.roomSearchableBinAttrExternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& RoomDataExternal::roomsearchablebinattrexternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomDataExternal.roomSearchableBinAttrExternal) + return _internal_roomsearchablebinattrexternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +RoomDataExternal::_internal_roomsearchablebinattrexternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomsearchablebinattrexternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +RoomDataExternal::_internal_mutable_roomsearchablebinattrexternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roomsearchablebinattrexternal_; +} + +// repeated .np2_structs.BinAttr roomBinAttrExternal = 17; +inline int RoomDataExternal::_internal_roombinattrexternal_size() const { + return _internal_roombinattrexternal().size(); +} +inline int RoomDataExternal::roombinattrexternal_size() const { + return _internal_roombinattrexternal_size(); +} +inline void RoomDataExternal::clear_roombinattrexternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roombinattrexternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL RoomDataExternal::mutable_roombinattrexternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataExternal.roomBinAttrExternal) + return _internal_mutable_roombinattrexternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL RoomDataExternal::mutable_roombinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomDataExternal.roomBinAttrExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roombinattrexternal(); +} +inline const ::np2_structs::BinAttr& RoomDataExternal::roombinattrexternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataExternal.roomBinAttrExternal) + return _internal_roombinattrexternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL RoomDataExternal::add_roombinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roombinattrexternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_add:np2_structs.RoomDataExternal.roomBinAttrExternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& RoomDataExternal::roombinattrexternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomDataExternal.roomBinAttrExternal) + return _internal_roombinattrexternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +RoomDataExternal::_internal_roombinattrexternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roombinattrexternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +RoomDataExternal::_internal_mutable_roombinattrexternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roombinattrexternal_; +} + +// ------------------------------------------------------------------- + +// IntSearchFilter + +// .np2_structs.uint8 searchOperator = 1; +inline bool IntSearchFilter::has_searchoperator() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.searchoperator_ != nullptr); + return value; +} +inline void IntSearchFilter::clear_searchoperator() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.searchoperator_ != nullptr) _impl_.searchoperator_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::uint8& IntSearchFilter::_internal_searchoperator() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.searchoperator_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& IntSearchFilter::searchoperator() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.IntSearchFilter.searchOperator) + return _internal_searchoperator(); +} +inline void IntSearchFilter::unsafe_arena_set_allocated_searchoperator( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.searchoperator_); + } + _impl_.searchoperator_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.IntSearchFilter.searchOperator) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE IntSearchFilter::release_searchoperator() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* released = _impl_.searchoperator_; + _impl_.searchoperator_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE IntSearchFilter::unsafe_arena_release_searchoperator() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.IntSearchFilter.searchOperator) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* temp = _impl_.searchoperator_; + _impl_.searchoperator_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL IntSearchFilter::_internal_mutable_searchoperator() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.searchoperator_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.searchoperator_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.searchoperator_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL IntSearchFilter::mutable_searchoperator() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* _msg = _internal_mutable_searchoperator(); + // @@protoc_insertion_point(field_mutable:np2_structs.IntSearchFilter.searchOperator) + return _msg; +} +inline void IntSearchFilter::set_allocated_searchoperator(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.searchoperator_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.searchoperator_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.IntSearchFilter.searchOperator) +} + +// .np2_structs.IntAttr attr = 2; +inline bool IntSearchFilter::has_attr() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.attr_ != nullptr); + return value; +} +inline void IntSearchFilter::clear_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.attr_ != nullptr) _impl_.attr_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::IntAttr& IntSearchFilter::_internal_attr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::IntAttr* p = _impl_.attr_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_IntAttr_default_instance_); +} +inline const ::np2_structs::IntAttr& IntSearchFilter::attr() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.IntSearchFilter.attr) + return _internal_attr(); +} +inline void IntSearchFilter::unsafe_arena_set_allocated_attr( + ::np2_structs::IntAttr* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.attr_); + } + _impl_.attr_ = reinterpret_cast<::np2_structs::IntAttr*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.IntSearchFilter.attr) +} +inline ::np2_structs::IntAttr* PROTOBUF_NULLABLE IntSearchFilter::release_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::IntAttr* released = _impl_.attr_; + _impl_.attr_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::IntAttr* PROTOBUF_NULLABLE IntSearchFilter::unsafe_arena_release_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.IntSearchFilter.attr) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::IntAttr* temp = _impl_.attr_; + _impl_.attr_ = nullptr; + return temp; +} +inline ::np2_structs::IntAttr* PROTOBUF_NONNULL IntSearchFilter::_internal_mutable_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.attr_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::IntAttr>(GetArena()); + _impl_.attr_ = reinterpret_cast<::np2_structs::IntAttr*>(p); + } + return _impl_.attr_; +} +inline ::np2_structs::IntAttr* PROTOBUF_NONNULL IntSearchFilter::mutable_attr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::IntAttr* _msg = _internal_mutable_attr(); + // @@protoc_insertion_point(field_mutable:np2_structs.IntSearchFilter.attr) + return _msg; +} +inline void IntSearchFilter::set_allocated_attr(::np2_structs::IntAttr* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.attr_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.attr_ = reinterpret_cast<::np2_structs::IntAttr*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.IntSearchFilter.attr) +} + +// ------------------------------------------------------------------- + +// BinSearchFilter + +// .np2_structs.uint8 searchOperator = 1; +inline bool BinSearchFilter::has_searchoperator() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.searchoperator_ != nullptr); + return value; +} +inline void BinSearchFilter::clear_searchoperator() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.searchoperator_ != nullptr) _impl_.searchoperator_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::uint8& BinSearchFilter::_internal_searchoperator() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.searchoperator_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& BinSearchFilter::searchoperator() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.BinSearchFilter.searchOperator) + return _internal_searchoperator(); +} +inline void BinSearchFilter::unsafe_arena_set_allocated_searchoperator( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.searchoperator_); + } + _impl_.searchoperator_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.BinSearchFilter.searchOperator) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE BinSearchFilter::release_searchoperator() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* released = _impl_.searchoperator_; + _impl_.searchoperator_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE BinSearchFilter::unsafe_arena_release_searchoperator() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.BinSearchFilter.searchOperator) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* temp = _impl_.searchoperator_; + _impl_.searchoperator_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL BinSearchFilter::_internal_mutable_searchoperator() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.searchoperator_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.searchoperator_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.searchoperator_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL BinSearchFilter::mutable_searchoperator() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* _msg = _internal_mutable_searchoperator(); + // @@protoc_insertion_point(field_mutable:np2_structs.BinSearchFilter.searchOperator) + return _msg; +} +inline void BinSearchFilter::set_allocated_searchoperator(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.searchoperator_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.searchoperator_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.BinSearchFilter.searchOperator) +} + +// .np2_structs.BinAttr attr = 2; +inline bool BinSearchFilter::has_attr() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.attr_ != nullptr); + return value; +} +inline void BinSearchFilter::clear_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.attr_ != nullptr) _impl_.attr_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::BinAttr& BinSearchFilter::_internal_attr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::BinAttr* p = _impl_.attr_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_BinAttr_default_instance_); +} +inline const ::np2_structs::BinAttr& BinSearchFilter::attr() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.BinSearchFilter.attr) + return _internal_attr(); +} +inline void BinSearchFilter::unsafe_arena_set_allocated_attr( + ::np2_structs::BinAttr* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.attr_); + } + _impl_.attr_ = reinterpret_cast<::np2_structs::BinAttr*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.BinSearchFilter.attr) +} +inline ::np2_structs::BinAttr* PROTOBUF_NULLABLE BinSearchFilter::release_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::BinAttr* released = _impl_.attr_; + _impl_.attr_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::BinAttr* PROTOBUF_NULLABLE BinSearchFilter::unsafe_arena_release_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.BinSearchFilter.attr) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::BinAttr* temp = _impl_.attr_; + _impl_.attr_ = nullptr; + return temp; +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL BinSearchFilter::_internal_mutable_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.attr_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::BinAttr>(GetArena()); + _impl_.attr_ = reinterpret_cast<::np2_structs::BinAttr*>(p); + } + return _impl_.attr_; +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL BinSearchFilter::mutable_attr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::BinAttr* _msg = _internal_mutable_attr(); + // @@protoc_insertion_point(field_mutable:np2_structs.BinSearchFilter.attr) + return _msg; +} +inline void BinSearchFilter::set_allocated_attr(::np2_structs::BinAttr* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.attr_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.attr_ = reinterpret_cast<::np2_structs::BinAttr*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.BinSearchFilter.attr) +} + +// ------------------------------------------------------------------- + +// PresenceOptionData + +// bytes data = 1; +inline void PresenceOptionData::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& PresenceOptionData::data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.PresenceOptionData.data) + return _internal_data(); +} +template +PROTOBUF_ALWAYS_INLINE void PresenceOptionData::set_data(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.data_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.PresenceOptionData.data) +} +inline ::std::string* PROTOBUF_NONNULL PresenceOptionData::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.PresenceOptionData.data) + return _s; +} +inline const ::std::string& PresenceOptionData::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.data_.Get(); +} +inline void PresenceOptionData::_internal_set_data(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL PresenceOptionData::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.data_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE PresenceOptionData::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.PresenceOptionData.data) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.data_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.data_.Set("", GetArena()); + } + return released; +} +inline void PresenceOptionData::set_allocated_data(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.data_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.data_.IsDefault()) { + _impl_.data_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.PresenceOptionData.data) +} + +// uint32 len = 2; +inline void PresenceOptionData::clear_len() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.len_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t PresenceOptionData::len() const { + // @@protoc_insertion_point(field_get:np2_structs.PresenceOptionData.len) + return _internal_len(); +} +inline void PresenceOptionData::set_len(::uint32_t value) { + _internal_set_len(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.PresenceOptionData.len) +} +inline ::uint32_t PresenceOptionData::_internal_len() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.len_; +} +inline void PresenceOptionData::_internal_set_len(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.len_ = value; +} + +// ------------------------------------------------------------------- + +// RoomGroupPasswordConfig + +// .np2_structs.uint8 groupId = 1; +inline bool RoomGroupPasswordConfig::has_groupid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.groupid_ != nullptr); + return value; +} +inline void RoomGroupPasswordConfig::clear_groupid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.groupid_ != nullptr) _impl_.groupid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::uint8& RoomGroupPasswordConfig::_internal_groupid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.groupid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& RoomGroupPasswordConfig::groupid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomGroupPasswordConfig.groupId) + return _internal_groupid(); +} +inline void RoomGroupPasswordConfig::unsafe_arena_set_allocated_groupid( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.groupid_); + } + _impl_.groupid_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomGroupPasswordConfig.groupId) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomGroupPasswordConfig::release_groupid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* released = _impl_.groupid_; + _impl_.groupid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomGroupPasswordConfig::unsafe_arena_release_groupid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomGroupPasswordConfig.groupId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* temp = _impl_.groupid_; + _impl_.groupid_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomGroupPasswordConfig::_internal_mutable_groupid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.groupid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.groupid_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.groupid_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomGroupPasswordConfig::mutable_groupid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* _msg = _internal_mutable_groupid(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomGroupPasswordConfig.groupId) + return _msg; +} +inline void RoomGroupPasswordConfig::set_allocated_groupid(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.groupid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.groupid_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomGroupPasswordConfig.groupId) +} + +// bool withPassword = 2; +inline void RoomGroupPasswordConfig::clear_withpassword() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withpassword_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline bool RoomGroupPasswordConfig::withpassword() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomGroupPasswordConfig.withPassword) + return _internal_withpassword(); +} +inline void RoomGroupPasswordConfig::set_withpassword(bool value) { + _internal_set_withpassword(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.RoomGroupPasswordConfig.withPassword) +} +inline bool RoomGroupPasswordConfig::_internal_withpassword() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.withpassword_; +} +inline void RoomGroupPasswordConfig::_internal_set_withpassword(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withpassword_ = value; +} + +// ------------------------------------------------------------------- + +// SearchRoomRequest + +// int32 option = 1; +inline void SearchRoomRequest::clear_option() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.option_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::int32_t SearchRoomRequest::option() const { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.option) + return _internal_option(); +} +inline void SearchRoomRequest::set_option(::int32_t value) { + _internal_set_option(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.SearchRoomRequest.option) +} +inline ::int32_t SearchRoomRequest::_internal_option() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.option_; +} +inline void SearchRoomRequest::_internal_set_option(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.option_ = value; +} + +// uint32 worldId = 2; +inline void SearchRoomRequest::clear_worldid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::uint32_t SearchRoomRequest::worldid() const { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.worldId) + return _internal_worldid(); +} +inline void SearchRoomRequest::set_worldid(::uint32_t value) { + _internal_set_worldid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.SearchRoomRequest.worldId) +} +inline ::uint32_t SearchRoomRequest::_internal_worldid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.worldid_; +} +inline void SearchRoomRequest::_internal_set_worldid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = value; +} + +// uint64 lobbyId = 3; +inline void SearchRoomRequest::clear_lobbyid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lobbyid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline ::uint64_t SearchRoomRequest::lobbyid() const { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.lobbyId) + return _internal_lobbyid(); +} +inline void SearchRoomRequest::set_lobbyid(::uint64_t value) { + _internal_set_lobbyid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_set:np2_structs.SearchRoomRequest.lobbyId) +} +inline ::uint64_t SearchRoomRequest::_internal_lobbyid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.lobbyid_; +} +inline void SearchRoomRequest::_internal_set_lobbyid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lobbyid_ = value; +} + +// uint32 rangeFilter_startIndex = 4; +inline void SearchRoomRequest::clear_rangefilter_startindex() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rangefilter_startindex_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000040U); +} +inline ::uint32_t SearchRoomRequest::rangefilter_startindex() const { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.rangeFilter_startIndex) + return _internal_rangefilter_startindex(); +} +inline void SearchRoomRequest::set_rangefilter_startindex(::uint32_t value) { + _internal_set_rangefilter_startindex(value); + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_set:np2_structs.SearchRoomRequest.rangeFilter_startIndex) +} +inline ::uint32_t SearchRoomRequest::_internal_rangefilter_startindex() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.rangefilter_startindex_; +} +inline void SearchRoomRequest::_internal_set_rangefilter_startindex(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rangefilter_startindex_ = value; +} + +// uint32 rangeFilter_max = 5; +inline void SearchRoomRequest::clear_rangefilter_max() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rangefilter_max_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000080U); +} +inline ::uint32_t SearchRoomRequest::rangefilter_max() const { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.rangeFilter_max) + return _internal_rangefilter_max(); +} +inline void SearchRoomRequest::set_rangefilter_max(::uint32_t value) { + _internal_set_rangefilter_max(value); + SetHasBit(_impl_._has_bits_[0], 0x00000080U); + // @@protoc_insertion_point(field_set:np2_structs.SearchRoomRequest.rangeFilter_max) +} +inline ::uint32_t SearchRoomRequest::_internal_rangefilter_max() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.rangefilter_max_; +} +inline void SearchRoomRequest::_internal_set_rangefilter_max(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rangefilter_max_ = value; +} + +// uint32 flagFilter = 6; +inline void SearchRoomRequest::clear_flagfilter() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagfilter_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000100U); +} +inline ::uint32_t SearchRoomRequest::flagfilter() const { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.flagFilter) + return _internal_flagfilter(); +} +inline void SearchRoomRequest::set_flagfilter(::uint32_t value) { + _internal_set_flagfilter(value); + SetHasBit(_impl_._has_bits_[0], 0x00000100U); + // @@protoc_insertion_point(field_set:np2_structs.SearchRoomRequest.flagFilter) +} +inline ::uint32_t SearchRoomRequest::_internal_flagfilter() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.flagfilter_; +} +inline void SearchRoomRequest::_internal_set_flagfilter(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagfilter_ = value; +} + +// uint32 flagAttr = 7; +inline void SearchRoomRequest::clear_flagattr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000200U); +} +inline ::uint32_t SearchRoomRequest::flagattr() const { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.flagAttr) + return _internal_flagattr(); +} +inline void SearchRoomRequest::set_flagattr(::uint32_t value) { + _internal_set_flagattr(value); + SetHasBit(_impl_._has_bits_[0], 0x00000200U); + // @@protoc_insertion_point(field_set:np2_structs.SearchRoomRequest.flagAttr) +} +inline ::uint32_t SearchRoomRequest::_internal_flagattr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.flagattr_; +} +inline void SearchRoomRequest::_internal_set_flagattr(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = value; +} + +// repeated .np2_structs.IntSearchFilter intFilter = 8; +inline int SearchRoomRequest::_internal_intfilter_size() const { + return _internal_intfilter().size(); +} +inline int SearchRoomRequest::intfilter_size() const { + return _internal_intfilter_size(); +} +inline void SearchRoomRequest::clear_intfilter() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.intfilter_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::IntSearchFilter* PROTOBUF_NONNULL SearchRoomRequest::mutable_intfilter(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SearchRoomRequest.intFilter) + return _internal_mutable_intfilter()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::IntSearchFilter>* PROTOBUF_NONNULL SearchRoomRequest::mutable_intfilter() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SearchRoomRequest.intFilter) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_intfilter(); +} +inline const ::np2_structs::IntSearchFilter& SearchRoomRequest::intfilter(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.intFilter) + return _internal_intfilter().Get(index); +} +inline ::np2_structs::IntSearchFilter* PROTOBUF_NONNULL SearchRoomRequest::add_intfilter() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::IntSearchFilter* _add = + _internal_mutable_intfilter()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.SearchRoomRequest.intFilter) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::IntSearchFilter>& SearchRoomRequest::intfilter() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SearchRoomRequest.intFilter) + return _internal_intfilter(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::IntSearchFilter>& +SearchRoomRequest::_internal_intfilter() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.intfilter_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::IntSearchFilter>* PROTOBUF_NONNULL +SearchRoomRequest::_internal_mutable_intfilter() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.intfilter_; +} + +// repeated .np2_structs.BinSearchFilter binFilter = 9; +inline int SearchRoomRequest::_internal_binfilter_size() const { + return _internal_binfilter().size(); +} +inline int SearchRoomRequest::binfilter_size() const { + return _internal_binfilter_size(); +} +inline void SearchRoomRequest::clear_binfilter() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.binfilter_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::np2_structs::BinSearchFilter* PROTOBUF_NONNULL SearchRoomRequest::mutable_binfilter(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SearchRoomRequest.binFilter) + return _internal_mutable_binfilter()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinSearchFilter>* PROTOBUF_NONNULL SearchRoomRequest::mutable_binfilter() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SearchRoomRequest.binFilter) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_binfilter(); +} +inline const ::np2_structs::BinSearchFilter& SearchRoomRequest::binfilter(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.binFilter) + return _internal_binfilter().Get(index); +} +inline ::np2_structs::BinSearchFilter* PROTOBUF_NONNULL SearchRoomRequest::add_binfilter() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinSearchFilter* _add = + _internal_mutable_binfilter()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.SearchRoomRequest.binFilter) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinSearchFilter>& SearchRoomRequest::binfilter() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SearchRoomRequest.binFilter) + return _internal_binfilter(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinSearchFilter>& +SearchRoomRequest::_internal_binfilter() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.binfilter_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinSearchFilter>* PROTOBUF_NONNULL +SearchRoomRequest::_internal_mutable_binfilter() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.binfilter_; +} + +// repeated .np2_structs.uint16 attrId = 10; +inline int SearchRoomRequest::_internal_attrid_size() const { + return _internal_attrid().size(); +} +inline int SearchRoomRequest::attrid_size() const { + return _internal_attrid_size(); +} +inline void SearchRoomRequest::clear_attrid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attrid_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SearchRoomRequest::mutable_attrid(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SearchRoomRequest.attrId) + return _internal_mutable_attrid()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL SearchRoomRequest::mutable_attrid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SearchRoomRequest.attrId) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_attrid(); +} +inline const ::np2_structs::uint16& SearchRoomRequest::attrid(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomRequest.attrId) + return _internal_attrid().Get(index); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SearchRoomRequest::add_attrid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::uint16* _add = + _internal_mutable_attrid()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_add:np2_structs.SearchRoomRequest.attrId) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& SearchRoomRequest::attrid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SearchRoomRequest.attrId) + return _internal_attrid(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& +SearchRoomRequest::_internal_attrid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attrid_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL +SearchRoomRequest::_internal_mutable_attrid() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.attrid_; +} + +// ------------------------------------------------------------------- + +// SearchRoomResponse + +// uint32 startIndex = 1; +inline void SearchRoomResponse::clear_startindex() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.startindex_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t SearchRoomResponse::startindex() const { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomResponse.startIndex) + return _internal_startindex(); +} +inline void SearchRoomResponse::set_startindex(::uint32_t value) { + _internal_set_startindex(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.SearchRoomResponse.startIndex) +} +inline ::uint32_t SearchRoomResponse::_internal_startindex() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.startindex_; +} +inline void SearchRoomResponse::_internal_set_startindex(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.startindex_ = value; +} + +// uint32 total = 2; +inline void SearchRoomResponse::clear_total() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.total_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t SearchRoomResponse::total() const { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomResponse.total) + return _internal_total(); +} +inline void SearchRoomResponse::set_total(::uint32_t value) { + _internal_set_total(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.SearchRoomResponse.total) +} +inline ::uint32_t SearchRoomResponse::_internal_total() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.total_; +} +inline void SearchRoomResponse::_internal_set_total(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.total_ = value; +} + +// repeated .np2_structs.RoomDataExternal rooms = 3; +inline int SearchRoomResponse::_internal_rooms_size() const { + return _internal_rooms().size(); +} +inline int SearchRoomResponse::rooms_size() const { + return _internal_rooms_size(); +} +inline void SearchRoomResponse::clear_rooms() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rooms_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::RoomDataExternal* PROTOBUF_NONNULL SearchRoomResponse::mutable_rooms(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SearchRoomResponse.rooms) + return _internal_mutable_rooms()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>* PROTOBUF_NONNULL SearchRoomResponse::mutable_rooms() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SearchRoomResponse.rooms) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_rooms(); +} +inline const ::np2_structs::RoomDataExternal& SearchRoomResponse::rooms(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SearchRoomResponse.rooms) + return _internal_rooms().Get(index); +} +inline ::np2_structs::RoomDataExternal* PROTOBUF_NONNULL SearchRoomResponse::add_rooms() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::RoomDataExternal* _add = + _internal_mutable_rooms()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.SearchRoomResponse.rooms) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>& SearchRoomResponse::rooms() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SearchRoomResponse.rooms) + return _internal_rooms(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>& +SearchRoomResponse::_internal_rooms() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.rooms_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>* PROTOBUF_NONNULL +SearchRoomResponse::_internal_mutable_rooms() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.rooms_; +} + +// ------------------------------------------------------------------- + +// CreateJoinRoomRequest + +// uint32 worldId = 1; +inline void CreateJoinRoomRequest::clear_worldid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00002000U); +} +inline ::uint32_t CreateJoinRoomRequest::worldid() const { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.worldId) + return _internal_worldid(); +} +inline void CreateJoinRoomRequest::set_worldid(::uint32_t value) { + _internal_set_worldid(value); + SetHasBit(_impl_._has_bits_[0], 0x00002000U); + // @@protoc_insertion_point(field_set:np2_structs.CreateJoinRoomRequest.worldId) +} +inline ::uint32_t CreateJoinRoomRequest::_internal_worldid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.worldid_; +} +inline void CreateJoinRoomRequest::_internal_set_worldid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = value; +} + +// uint64 lobbyId = 2; +inline void CreateJoinRoomRequest::clear_lobbyid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lobbyid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00001000U); +} +inline ::uint64_t CreateJoinRoomRequest::lobbyid() const { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.lobbyId) + return _internal_lobbyid(); +} +inline void CreateJoinRoomRequest::set_lobbyid(::uint64_t value) { + _internal_set_lobbyid(value); + SetHasBit(_impl_._has_bits_[0], 0x00001000U); + // @@protoc_insertion_point(field_set:np2_structs.CreateJoinRoomRequest.lobbyId) +} +inline ::uint64_t CreateJoinRoomRequest::_internal_lobbyid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.lobbyid_; +} +inline void CreateJoinRoomRequest::_internal_set_lobbyid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lobbyid_ = value; +} + +// uint32 maxSlot = 3; +inline void CreateJoinRoomRequest::clear_maxslot() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.maxslot_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00004000U); +} +inline ::uint32_t CreateJoinRoomRequest::maxslot() const { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.maxSlot) + return _internal_maxslot(); +} +inline void CreateJoinRoomRequest::set_maxslot(::uint32_t value) { + _internal_set_maxslot(value); + SetHasBit(_impl_._has_bits_[0], 0x00004000U); + // @@protoc_insertion_point(field_set:np2_structs.CreateJoinRoomRequest.maxSlot) +} +inline ::uint32_t CreateJoinRoomRequest::_internal_maxslot() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.maxslot_; +} +inline void CreateJoinRoomRequest::_internal_set_maxslot(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.maxslot_ = value; +} + +// uint32 flagAttr = 4; +inline void CreateJoinRoomRequest::clear_flagattr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00010000U); +} +inline ::uint32_t CreateJoinRoomRequest::flagattr() const { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.flagAttr) + return _internal_flagattr(); +} +inline void CreateJoinRoomRequest::set_flagattr(::uint32_t value) { + _internal_set_flagattr(value); + SetHasBit(_impl_._has_bits_[0], 0x00010000U); + // @@protoc_insertion_point(field_set:np2_structs.CreateJoinRoomRequest.flagAttr) +} +inline ::uint32_t CreateJoinRoomRequest::_internal_flagattr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.flagattr_; +} +inline void CreateJoinRoomRequest::_internal_set_flagattr(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = value; +} + +// repeated .np2_structs.BinAttr roomBinAttrInternal = 5; +inline int CreateJoinRoomRequest::_internal_roombinattrinternal_size() const { + return _internal_roombinattrinternal().size(); +} +inline int CreateJoinRoomRequest::roombinattrinternal_size() const { + return _internal_roombinattrinternal_size(); +} +inline void CreateJoinRoomRequest::clear_roombinattrinternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roombinattrinternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roombinattrinternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.roomBinAttrInternal) + return _internal_mutable_roombinattrinternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roombinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.CreateJoinRoomRequest.roomBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roombinattrinternal(); +} +inline const ::np2_structs::BinAttr& CreateJoinRoomRequest::roombinattrinternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.roomBinAttrInternal) + return _internal_roombinattrinternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::add_roombinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roombinattrinternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.CreateJoinRoomRequest.roomBinAttrInternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& CreateJoinRoomRequest::roombinattrinternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.CreateJoinRoomRequest.roomBinAttrInternal) + return _internal_roombinattrinternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +CreateJoinRoomRequest::_internal_roombinattrinternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roombinattrinternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +CreateJoinRoomRequest::_internal_mutable_roombinattrinternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roombinattrinternal_; +} + +// repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 6; +inline int CreateJoinRoomRequest::_internal_roomsearchableintattrexternal_size() const { + return _internal_roomsearchableintattrexternal().size(); +} +inline int CreateJoinRoomRequest::roomsearchableintattrexternal_size() const { + return _internal_roomsearchableintattrexternal_size(); +} +inline void CreateJoinRoomRequest::clear_roomsearchableintattrexternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomsearchableintattrexternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::np2_structs::IntAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roomsearchableintattrexternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.roomSearchableIntAttrExternal) + return _internal_mutable_roomsearchableintattrexternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roomsearchableintattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.CreateJoinRoomRequest.roomSearchableIntAttrExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roomsearchableintattrexternal(); +} +inline const ::np2_structs::IntAttr& CreateJoinRoomRequest::roomsearchableintattrexternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.roomSearchableIntAttrExternal) + return _internal_roomsearchableintattrexternal().Get(index); +} +inline ::np2_structs::IntAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::add_roomsearchableintattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::IntAttr* _add = + _internal_mutable_roomsearchableintattrexternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.CreateJoinRoomRequest.roomSearchableIntAttrExternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& CreateJoinRoomRequest::roomsearchableintattrexternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.CreateJoinRoomRequest.roomSearchableIntAttrExternal) + return _internal_roomsearchableintattrexternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& +CreateJoinRoomRequest::_internal_roomsearchableintattrexternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomsearchableintattrexternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL +CreateJoinRoomRequest::_internal_mutable_roomsearchableintattrexternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roomsearchableintattrexternal_; +} + +// repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 7; +inline int CreateJoinRoomRequest::_internal_roomsearchablebinattrexternal_size() const { + return _internal_roomsearchablebinattrexternal().size(); +} +inline int CreateJoinRoomRequest::roomsearchablebinattrexternal_size() const { + return _internal_roomsearchablebinattrexternal_size(); +} +inline void CreateJoinRoomRequest::clear_roomsearchablebinattrexternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomsearchablebinattrexternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roomsearchablebinattrexternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.roomSearchableBinAttrExternal) + return _internal_mutable_roomsearchablebinattrexternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roomsearchablebinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.CreateJoinRoomRequest.roomSearchableBinAttrExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roomsearchablebinattrexternal(); +} +inline const ::np2_structs::BinAttr& CreateJoinRoomRequest::roomsearchablebinattrexternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.roomSearchableBinAttrExternal) + return _internal_roomsearchablebinattrexternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::add_roomsearchablebinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roomsearchablebinattrexternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_add:np2_structs.CreateJoinRoomRequest.roomSearchableBinAttrExternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& CreateJoinRoomRequest::roomsearchablebinattrexternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.CreateJoinRoomRequest.roomSearchableBinAttrExternal) + return _internal_roomsearchablebinattrexternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +CreateJoinRoomRequest::_internal_roomsearchablebinattrexternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomsearchablebinattrexternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +CreateJoinRoomRequest::_internal_mutable_roomsearchablebinattrexternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roomsearchablebinattrexternal_; +} + +// repeated .np2_structs.BinAttr roomBinAttrExternal = 8; +inline int CreateJoinRoomRequest::_internal_roombinattrexternal_size() const { + return _internal_roombinattrexternal().size(); +} +inline int CreateJoinRoomRequest::roombinattrexternal_size() const { + return _internal_roombinattrexternal_size(); +} +inline void CreateJoinRoomRequest::clear_roombinattrexternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roombinattrexternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roombinattrexternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.roomBinAttrExternal) + return _internal_mutable_roombinattrexternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roombinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.CreateJoinRoomRequest.roomBinAttrExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roombinattrexternal(); +} +inline const ::np2_structs::BinAttr& CreateJoinRoomRequest::roombinattrexternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.roomBinAttrExternal) + return _internal_roombinattrexternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::add_roombinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roombinattrexternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_add:np2_structs.CreateJoinRoomRequest.roomBinAttrExternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& CreateJoinRoomRequest::roombinattrexternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.CreateJoinRoomRequest.roomBinAttrExternal) + return _internal_roombinattrexternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +CreateJoinRoomRequest::_internal_roombinattrexternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roombinattrexternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +CreateJoinRoomRequest::_internal_mutable_roombinattrexternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roombinattrexternal_; +} + +// bytes roomPassword = 9; +inline void CreateJoinRoomRequest::clear_roompassword() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roompassword_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000100U); +} +inline const ::std::string& CreateJoinRoomRequest::roompassword() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.roomPassword) + return _internal_roompassword(); +} +template +PROTOBUF_ALWAYS_INLINE void CreateJoinRoomRequest::set_roompassword(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000100U); + _impl_.roompassword_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.CreateJoinRoomRequest.roomPassword) +} +inline ::std::string* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roompassword() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000100U); + ::std::string* _s = _internal_mutable_roompassword(); + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.roomPassword) + return _s; +} +inline const ::std::string& CreateJoinRoomRequest::_internal_roompassword() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roompassword_.Get(); +} +inline void CreateJoinRoomRequest::_internal_set_roompassword(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roompassword_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL CreateJoinRoomRequest::_internal_mutable_roompassword() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.roompassword_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE CreateJoinRoomRequest::release_roompassword() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.CreateJoinRoomRequest.roomPassword) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000100U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000100U); + auto* released = _impl_.roompassword_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.roompassword_.Set("", GetArena()); + } + return released; +} +inline void CreateJoinRoomRequest::set_allocated_roompassword(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000100U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000100U); + } + _impl_.roompassword_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.roompassword_.IsDefault()) { + _impl_.roompassword_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.CreateJoinRoomRequest.roomPassword) +} + +// repeated .np2_structs.GroupConfig groupConfig = 10; +inline int CreateJoinRoomRequest::_internal_groupconfig_size() const { + return _internal_groupconfig().size(); +} +inline int CreateJoinRoomRequest::groupconfig_size() const { + return _internal_groupconfig_size(); +} +inline void CreateJoinRoomRequest::clear_groupconfig() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.groupconfig_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::np2_structs::GroupConfig* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_groupconfig(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.groupConfig) + return _internal_mutable_groupconfig()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::GroupConfig>* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_groupconfig() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.CreateJoinRoomRequest.groupConfig) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_groupconfig(); +} +inline const ::np2_structs::GroupConfig& CreateJoinRoomRequest::groupconfig(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.groupConfig) + return _internal_groupconfig().Get(index); +} +inline ::np2_structs::GroupConfig* PROTOBUF_NONNULL CreateJoinRoomRequest::add_groupconfig() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::GroupConfig* _add = + _internal_mutable_groupconfig()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_add:np2_structs.CreateJoinRoomRequest.groupConfig) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::GroupConfig>& CreateJoinRoomRequest::groupconfig() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.CreateJoinRoomRequest.groupConfig) + return _internal_groupconfig(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::GroupConfig>& +CreateJoinRoomRequest::_internal_groupconfig() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.groupconfig_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::GroupConfig>* PROTOBUF_NONNULL +CreateJoinRoomRequest::_internal_mutable_groupconfig() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.groupconfig_; +} + +// uint64 passwordSlotMask = 11; +inline void CreateJoinRoomRequest::clear_passwordslotmask() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.passwordslotmask_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00008000U); +} +inline ::uint64_t CreateJoinRoomRequest::passwordslotmask() const { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.passwordSlotMask) + return _internal_passwordslotmask(); +} +inline void CreateJoinRoomRequest::set_passwordslotmask(::uint64_t value) { + _internal_set_passwordslotmask(value); + SetHasBit(_impl_._has_bits_[0], 0x00008000U); + // @@protoc_insertion_point(field_set:np2_structs.CreateJoinRoomRequest.passwordSlotMask) +} +inline ::uint64_t CreateJoinRoomRequest::_internal_passwordslotmask() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.passwordslotmask_; +} +inline void CreateJoinRoomRequest::_internal_set_passwordslotmask(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.passwordslotmask_ = value; +} + +// repeated string allowedUser = 12; +inline int CreateJoinRoomRequest::_internal_alloweduser_size() const { + return _internal_alloweduser().size(); +} +inline int CreateJoinRoomRequest::alloweduser_size() const { + return _internal_alloweduser_size(); +} +inline void CreateJoinRoomRequest::clear_alloweduser() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.alloweduser_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000020U); +} +inline ::std::string* PROTOBUF_NONNULL CreateJoinRoomRequest::add_alloweduser() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::std::string* _s = + _internal_mutable_alloweduser()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_add_mutable:np2_structs.CreateJoinRoomRequest.allowedUser) + return _s; +} +inline const ::std::string& CreateJoinRoomRequest::alloweduser(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.allowedUser) + return _internal_alloweduser().Get(index); +} +inline ::std::string* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_alloweduser(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.allowedUser) + return _internal_mutable_alloweduser()->Mutable(index); +} +template +inline void CreateJoinRoomRequest::set_alloweduser(int index, Arg_&& value, Args_... args) { + ::google::protobuf::internal::AssignToString(*_internal_mutable_alloweduser()->Mutable(index), ::std::forward(value), + args... ); + // @@protoc_insertion_point(field_set:np2_structs.CreateJoinRoomRequest.allowedUser) +} +template +inline void CreateJoinRoomRequest::add_alloweduser(Arg_&& value, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::google::protobuf::internal::AddToRepeatedPtrField( + ::google::protobuf::MessageLite::internal_visibility(), GetArena(), + *_internal_mutable_alloweduser(), ::std::forward(value), + args... ); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_add:np2_structs.CreateJoinRoomRequest.allowedUser) +} +inline const ::google::protobuf::RepeatedPtrField<::std::string>& CreateJoinRoomRequest::alloweduser() + const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.CreateJoinRoomRequest.allowedUser) + return _internal_alloweduser(); +} +inline ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL +CreateJoinRoomRequest::mutable_alloweduser() ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.CreateJoinRoomRequest.allowedUser) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_alloweduser(); +} +inline const ::google::protobuf::RepeatedPtrField<::std::string>& +CreateJoinRoomRequest::_internal_alloweduser() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.alloweduser_; +} +inline ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL +CreateJoinRoomRequest::_internal_mutable_alloweduser() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.alloweduser_; +} + +// repeated string blockedUser = 13; +inline int CreateJoinRoomRequest::_internal_blockeduser_size() const { + return _internal_blockeduser().size(); +} +inline int CreateJoinRoomRequest::blockeduser_size() const { + return _internal_blockeduser_size(); +} +inline void CreateJoinRoomRequest::clear_blockeduser() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.blockeduser_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000040U); +} +inline ::std::string* PROTOBUF_NONNULL CreateJoinRoomRequest::add_blockeduser() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::std::string* _s = + _internal_mutable_blockeduser()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_add_mutable:np2_structs.CreateJoinRoomRequest.blockedUser) + return _s; +} +inline const ::std::string& CreateJoinRoomRequest::blockeduser(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.blockedUser) + return _internal_blockeduser().Get(index); +} +inline ::std::string* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_blockeduser(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.blockedUser) + return _internal_mutable_blockeduser()->Mutable(index); +} +template +inline void CreateJoinRoomRequest::set_blockeduser(int index, Arg_&& value, Args_... args) { + ::google::protobuf::internal::AssignToString(*_internal_mutable_blockeduser()->Mutable(index), ::std::forward(value), + args... ); + // @@protoc_insertion_point(field_set:np2_structs.CreateJoinRoomRequest.blockedUser) +} +template +inline void CreateJoinRoomRequest::add_blockeduser(Arg_&& value, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::google::protobuf::internal::AddToRepeatedPtrField( + ::google::protobuf::MessageLite::internal_visibility(), GetArena(), + *_internal_mutable_blockeduser(), ::std::forward(value), + args... ); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_add:np2_structs.CreateJoinRoomRequest.blockedUser) +} +inline const ::google::protobuf::RepeatedPtrField<::std::string>& CreateJoinRoomRequest::blockeduser() + const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.CreateJoinRoomRequest.blockedUser) + return _internal_blockeduser(); +} +inline ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL +CreateJoinRoomRequest::mutable_blockeduser() ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.CreateJoinRoomRequest.blockedUser) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_blockeduser(); +} +inline const ::google::protobuf::RepeatedPtrField<::std::string>& +CreateJoinRoomRequest::_internal_blockeduser() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.blockeduser_; +} +inline ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL +CreateJoinRoomRequest::_internal_mutable_blockeduser() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.blockeduser_; +} + +// bytes joinRoomGroupLabel = 14; +inline void CreateJoinRoomRequest::clear_joinroomgrouplabel() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.joinroomgrouplabel_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000200U); +} +inline const ::std::string& CreateJoinRoomRequest::joinroomgrouplabel() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.joinRoomGroupLabel) + return _internal_joinroomgrouplabel(); +} +template +PROTOBUF_ALWAYS_INLINE void CreateJoinRoomRequest::set_joinroomgrouplabel(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000200U); + _impl_.joinroomgrouplabel_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.CreateJoinRoomRequest.joinRoomGroupLabel) +} +inline ::std::string* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_joinroomgrouplabel() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000200U); + ::std::string* _s = _internal_mutable_joinroomgrouplabel(); + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.joinRoomGroupLabel) + return _s; +} +inline const ::std::string& CreateJoinRoomRequest::_internal_joinroomgrouplabel() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.joinroomgrouplabel_.Get(); +} +inline void CreateJoinRoomRequest::_internal_set_joinroomgrouplabel(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.joinroomgrouplabel_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL CreateJoinRoomRequest::_internal_mutable_joinroomgrouplabel() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.joinroomgrouplabel_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE CreateJoinRoomRequest::release_joinroomgrouplabel() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.CreateJoinRoomRequest.joinRoomGroupLabel) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000200U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000200U); + auto* released = _impl_.joinroomgrouplabel_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.joinroomgrouplabel_.Set("", GetArena()); + } + return released; +} +inline void CreateJoinRoomRequest::set_allocated_joinroomgrouplabel(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000200U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000200U); + } + _impl_.joinroomgrouplabel_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.joinroomgrouplabel_.IsDefault()) { + _impl_.joinroomgrouplabel_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.CreateJoinRoomRequest.joinRoomGroupLabel) +} + +// repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 15; +inline int CreateJoinRoomRequest::_internal_roommemberbinattrinternal_size() const { + return _internal_roommemberbinattrinternal().size(); +} +inline int CreateJoinRoomRequest::roommemberbinattrinternal_size() const { + return _internal_roommemberbinattrinternal_size(); +} +inline void CreateJoinRoomRequest::clear_roommemberbinattrinternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roommemberbinattrinternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000080U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roommemberbinattrinternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.roomMemberBinAttrInternal) + return _internal_mutable_roommemberbinattrinternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_roommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000080U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.CreateJoinRoomRequest.roomMemberBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roommemberbinattrinternal(); +} +inline const ::np2_structs::BinAttr& CreateJoinRoomRequest::roommemberbinattrinternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.roomMemberBinAttrInternal) + return _internal_roommemberbinattrinternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL CreateJoinRoomRequest::add_roommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roommemberbinattrinternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000080U); + // @@protoc_insertion_point(field_add:np2_structs.CreateJoinRoomRequest.roomMemberBinAttrInternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& CreateJoinRoomRequest::roommemberbinattrinternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.CreateJoinRoomRequest.roomMemberBinAttrInternal) + return _internal_roommemberbinattrinternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +CreateJoinRoomRequest::_internal_roommemberbinattrinternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roommemberbinattrinternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +CreateJoinRoomRequest::_internal_mutable_roommemberbinattrinternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roommemberbinattrinternal_; +} + +// .np2_structs.uint8 teamId = 16; +inline bool CreateJoinRoomRequest::has_teamid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000400U); + PROTOBUF_ASSUME(!value || _impl_.teamid_ != nullptr); + return value; +} +inline void CreateJoinRoomRequest::clear_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.teamid_ != nullptr) _impl_.teamid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000400U); +} +inline const ::np2_structs::uint8& CreateJoinRoomRequest::_internal_teamid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.teamid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& CreateJoinRoomRequest::teamid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.teamId) + return _internal_teamid(); +} +inline void CreateJoinRoomRequest::unsafe_arena_set_allocated_teamid( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.teamid_); + } + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000400U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000400U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.CreateJoinRoomRequest.teamId) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE CreateJoinRoomRequest::release_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000400U); + ::np2_structs::uint8* released = _impl_.teamid_; + _impl_.teamid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE CreateJoinRoomRequest::unsafe_arena_release_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.CreateJoinRoomRequest.teamId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000400U); + ::np2_structs::uint8* temp = _impl_.teamid_; + _impl_.teamid_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL CreateJoinRoomRequest::_internal_mutable_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.teamid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.teamid_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_teamid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000400U); + ::np2_structs::uint8* _msg = _internal_mutable_teamid(); + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.teamId) + return _msg; +} +inline void CreateJoinRoomRequest::set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.teamid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000400U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000400U); + } + + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.CreateJoinRoomRequest.teamId) +} + +// .np2_structs.OptParam sigOptParam = 17; +inline bool CreateJoinRoomRequest::has_sigoptparam() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000800U); + PROTOBUF_ASSUME(!value || _impl_.sigoptparam_ != nullptr); + return value; +} +inline void CreateJoinRoomRequest::clear_sigoptparam() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.sigoptparam_ != nullptr) _impl_.sigoptparam_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000800U); +} +inline const ::np2_structs::OptParam& CreateJoinRoomRequest::_internal_sigoptparam() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::OptParam* p = _impl_.sigoptparam_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_OptParam_default_instance_); +} +inline const ::np2_structs::OptParam& CreateJoinRoomRequest::sigoptparam() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateJoinRoomRequest.sigOptParam) + return _internal_sigoptparam(); +} +inline void CreateJoinRoomRequest::unsafe_arena_set_allocated_sigoptparam( + ::np2_structs::OptParam* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.sigoptparam_); + } + _impl_.sigoptparam_ = reinterpret_cast<::np2_structs::OptParam*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000800U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000800U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.CreateJoinRoomRequest.sigOptParam) +} +inline ::np2_structs::OptParam* PROTOBUF_NULLABLE CreateJoinRoomRequest::release_sigoptparam() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000800U); + ::np2_structs::OptParam* released = _impl_.sigoptparam_; + _impl_.sigoptparam_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::OptParam* PROTOBUF_NULLABLE CreateJoinRoomRequest::unsafe_arena_release_sigoptparam() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.CreateJoinRoomRequest.sigOptParam) + + ClearHasBit(_impl_._has_bits_[0], 0x00000800U); + ::np2_structs::OptParam* temp = _impl_.sigoptparam_; + _impl_.sigoptparam_ = nullptr; + return temp; +} +inline ::np2_structs::OptParam* PROTOBUF_NONNULL CreateJoinRoomRequest::_internal_mutable_sigoptparam() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.sigoptparam_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::OptParam>(GetArena()); + _impl_.sigoptparam_ = reinterpret_cast<::np2_structs::OptParam*>(p); + } + return _impl_.sigoptparam_; +} +inline ::np2_structs::OptParam* PROTOBUF_NONNULL CreateJoinRoomRequest::mutable_sigoptparam() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000800U); + ::np2_structs::OptParam* _msg = _internal_mutable_sigoptparam(); + // @@protoc_insertion_point(field_mutable:np2_structs.CreateJoinRoomRequest.sigOptParam) + return _msg; +} +inline void CreateJoinRoomRequest::set_allocated_sigoptparam(::np2_structs::OptParam* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.sigoptparam_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000800U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000800U); + } + + _impl_.sigoptparam_ = reinterpret_cast<::np2_structs::OptParam*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.CreateJoinRoomRequest.sigOptParam) +} + +// ------------------------------------------------------------------- + +// JoinRoomRequest + +// uint64 roomId = 1; +inline void JoinRoomRequest::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline ::uint64_t JoinRoomRequest::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.JoinRoomRequest.roomId) + return _internal_roomid(); +} +inline void JoinRoomRequest::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_set:np2_structs.JoinRoomRequest.roomId) +} +inline ::uint64_t JoinRoomRequest::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void JoinRoomRequest::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// bytes roomPassword = 2; +inline void JoinRoomRequest::clear_roompassword() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roompassword_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& JoinRoomRequest::roompassword() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.JoinRoomRequest.roomPassword) + return _internal_roompassword(); +} +template +PROTOBUF_ALWAYS_INLINE void JoinRoomRequest::set_roompassword(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.roompassword_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.JoinRoomRequest.roomPassword) +} +inline ::std::string* PROTOBUF_NONNULL JoinRoomRequest::mutable_roompassword() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_roompassword(); + // @@protoc_insertion_point(field_mutable:np2_structs.JoinRoomRequest.roomPassword) + return _s; +} +inline const ::std::string& JoinRoomRequest::_internal_roompassword() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roompassword_.Get(); +} +inline void JoinRoomRequest::_internal_set_roompassword(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roompassword_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL JoinRoomRequest::_internal_mutable_roompassword() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.roompassword_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE JoinRoomRequest::release_roompassword() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.JoinRoomRequest.roomPassword) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.roompassword_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.roompassword_.Set("", GetArena()); + } + return released; +} +inline void JoinRoomRequest::set_allocated_roompassword(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.roompassword_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.roompassword_.IsDefault()) { + _impl_.roompassword_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.JoinRoomRequest.roomPassword) +} + +// bytes joinRoomGroupLabel = 3; +inline void JoinRoomRequest::clear_joinroomgrouplabel() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.joinroomgrouplabel_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::std::string& JoinRoomRequest::joinroomgrouplabel() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.JoinRoomRequest.joinRoomGroupLabel) + return _internal_joinroomgrouplabel(); +} +template +PROTOBUF_ALWAYS_INLINE void JoinRoomRequest::set_joinroomgrouplabel(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + _impl_.joinroomgrouplabel_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.JoinRoomRequest.joinRoomGroupLabel) +} +inline ::std::string* PROTOBUF_NONNULL JoinRoomRequest::mutable_joinroomgrouplabel() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::std::string* _s = _internal_mutable_joinroomgrouplabel(); + // @@protoc_insertion_point(field_mutable:np2_structs.JoinRoomRequest.joinRoomGroupLabel) + return _s; +} +inline const ::std::string& JoinRoomRequest::_internal_joinroomgrouplabel() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.joinroomgrouplabel_.Get(); +} +inline void JoinRoomRequest::_internal_set_joinroomgrouplabel(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.joinroomgrouplabel_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL JoinRoomRequest::_internal_mutable_joinroomgrouplabel() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.joinroomgrouplabel_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE JoinRoomRequest::release_joinroomgrouplabel() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.JoinRoomRequest.joinRoomGroupLabel) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000004U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + auto* released = _impl_.joinroomgrouplabel_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.joinroomgrouplabel_.Set("", GetArena()); + } + return released; +} +inline void JoinRoomRequest::set_allocated_joinroomgrouplabel(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + _impl_.joinroomgrouplabel_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.joinroomgrouplabel_.IsDefault()) { + _impl_.joinroomgrouplabel_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.JoinRoomRequest.joinRoomGroupLabel) +} + +// repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; +inline int JoinRoomRequest::_internal_roommemberbinattrinternal_size() const { + return _internal_roommemberbinattrinternal().size(); +} +inline int JoinRoomRequest::roommemberbinattrinternal_size() const { + return _internal_roommemberbinattrinternal_size(); +} +inline void JoinRoomRequest::clear_roommemberbinattrinternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roommemberbinattrinternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL JoinRoomRequest::mutable_roommemberbinattrinternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.JoinRoomRequest.roomMemberBinAttrInternal) + return _internal_mutable_roommemberbinattrinternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL JoinRoomRequest::mutable_roommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.JoinRoomRequest.roomMemberBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roommemberbinattrinternal(); +} +inline const ::np2_structs::BinAttr& JoinRoomRequest::roommemberbinattrinternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.JoinRoomRequest.roomMemberBinAttrInternal) + return _internal_roommemberbinattrinternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL JoinRoomRequest::add_roommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roommemberbinattrinternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.JoinRoomRequest.roomMemberBinAttrInternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& JoinRoomRequest::roommemberbinattrinternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.JoinRoomRequest.roomMemberBinAttrInternal) + return _internal_roommemberbinattrinternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +JoinRoomRequest::_internal_roommemberbinattrinternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roommemberbinattrinternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +JoinRoomRequest::_internal_mutable_roommemberbinattrinternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roommemberbinattrinternal_; +} + +// .np2_structs.PresenceOptionData optData = 5; +inline bool JoinRoomRequest::has_optdata() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000008U); + PROTOBUF_ASSUME(!value || _impl_.optdata_ != nullptr); + return value; +} +inline void JoinRoomRequest::clear_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.optdata_ != nullptr) _impl_.optdata_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::np2_structs::PresenceOptionData& JoinRoomRequest::_internal_optdata() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::PresenceOptionData* p = _impl_.optdata_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_PresenceOptionData_default_instance_); +} +inline const ::np2_structs::PresenceOptionData& JoinRoomRequest::optdata() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.JoinRoomRequest.optData) + return _internal_optdata(); +} +inline void JoinRoomRequest::unsafe_arena_set_allocated_optdata( + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.optdata_); + } + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.JoinRoomRequest.optData) +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE JoinRoomRequest::release_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::PresenceOptionData* released = _impl_.optdata_; + _impl_.optdata_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE JoinRoomRequest::unsafe_arena_release_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.JoinRoomRequest.optData) + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::PresenceOptionData* temp = _impl_.optdata_; + _impl_.optdata_ = nullptr; + return temp; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL JoinRoomRequest::_internal_mutable_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.optdata_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::PresenceOptionData>(GetArena()); + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(p); + } + return _impl_.optdata_; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL JoinRoomRequest::mutable_optdata() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::PresenceOptionData* _msg = _internal_mutable_optdata(); + // @@protoc_insertion_point(field_mutable:np2_structs.JoinRoomRequest.optData) + return _msg; +} +inline void JoinRoomRequest::set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.optdata_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.JoinRoomRequest.optData) +} + +// .np2_structs.uint8 teamId = 6; +inline bool JoinRoomRequest::has_teamid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000010U); + PROTOBUF_ASSUME(!value || _impl_.teamid_ != nullptr); + return value; +} +inline void JoinRoomRequest::clear_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.teamid_ != nullptr) _impl_.teamid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline const ::np2_structs::uint8& JoinRoomRequest::_internal_teamid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.teamid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& JoinRoomRequest::teamid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.JoinRoomRequest.teamId) + return _internal_teamid(); +} +inline void JoinRoomRequest::unsafe_arena_set_allocated_teamid( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.teamid_); + } + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.JoinRoomRequest.teamId) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE JoinRoomRequest::release_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint8* released = _impl_.teamid_; + _impl_.teamid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE JoinRoomRequest::unsafe_arena_release_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.JoinRoomRequest.teamId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint8* temp = _impl_.teamid_; + _impl_.teamid_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL JoinRoomRequest::_internal_mutable_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.teamid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.teamid_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL JoinRoomRequest::mutable_teamid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint8* _msg = _internal_mutable_teamid(); + // @@protoc_insertion_point(field_mutable:np2_structs.JoinRoomRequest.teamId) + return _msg; +} +inline void JoinRoomRequest::set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.teamid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.JoinRoomRequest.teamId) +} + +// ------------------------------------------------------------------- + +// JoinRoomResponse + +// .np2_structs.RoomDataInternal room_data = 1; +inline bool JoinRoomResponse::has_room_data() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.room_data_ != nullptr); + return value; +} +inline void JoinRoomResponse::clear_room_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.room_data_ != nullptr) _impl_.room_data_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::RoomDataInternal& JoinRoomResponse::_internal_room_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::RoomDataInternal* p = _impl_.room_data_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_RoomDataInternal_default_instance_); +} +inline const ::np2_structs::RoomDataInternal& JoinRoomResponse::room_data() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.JoinRoomResponse.room_data) + return _internal_room_data(); +} +inline void JoinRoomResponse::unsafe_arena_set_allocated_room_data( + ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.room_data_); + } + _impl_.room_data_ = reinterpret_cast<::np2_structs::RoomDataInternal*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.JoinRoomResponse.room_data) +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE JoinRoomResponse::release_room_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::RoomDataInternal* released = _impl_.room_data_; + _impl_.room_data_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE JoinRoomResponse::unsafe_arena_release_room_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.JoinRoomResponse.room_data) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::RoomDataInternal* temp = _impl_.room_data_; + _impl_.room_data_ = nullptr; + return temp; +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL JoinRoomResponse::_internal_mutable_room_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.room_data_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::RoomDataInternal>(GetArena()); + _impl_.room_data_ = reinterpret_cast<::np2_structs::RoomDataInternal*>(p); + } + return _impl_.room_data_; +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL JoinRoomResponse::mutable_room_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::RoomDataInternal* _msg = _internal_mutable_room_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.JoinRoomResponse.room_data) + return _msg; +} +inline void JoinRoomResponse::set_allocated_room_data(::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.room_data_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.room_data_ = reinterpret_cast<::np2_structs::RoomDataInternal*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.JoinRoomResponse.room_data) +} + +// repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; +inline int JoinRoomResponse::_internal_signaling_data_size() const { + return _internal_signaling_data().size(); +} +inline int JoinRoomResponse::signaling_data_size() const { + return _internal_signaling_data_size(); +} +inline void JoinRoomResponse::clear_signaling_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.signaling_data_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::Matching2SignalingInfo* PROTOBUF_NONNULL JoinRoomResponse::mutable_signaling_data(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.JoinRoomResponse.signaling_data) + return _internal_mutable_signaling_data()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::Matching2SignalingInfo>* PROTOBUF_NONNULL JoinRoomResponse::mutable_signaling_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.JoinRoomResponse.signaling_data) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_signaling_data(); +} +inline const ::np2_structs::Matching2SignalingInfo& JoinRoomResponse::signaling_data(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.JoinRoomResponse.signaling_data) + return _internal_signaling_data().Get(index); +} +inline ::np2_structs::Matching2SignalingInfo* PROTOBUF_NONNULL JoinRoomResponse::add_signaling_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::Matching2SignalingInfo* _add = + _internal_mutable_signaling_data()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.JoinRoomResponse.signaling_data) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::Matching2SignalingInfo>& JoinRoomResponse::signaling_data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.JoinRoomResponse.signaling_data) + return _internal_signaling_data(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::Matching2SignalingInfo>& +JoinRoomResponse::_internal_signaling_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.signaling_data_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::Matching2SignalingInfo>* PROTOBUF_NONNULL +JoinRoomResponse::_internal_mutable_signaling_data() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.signaling_data_; +} + +// ------------------------------------------------------------------- + +// LeaveRoomRequest + +// uint64 roomId = 1; +inline void LeaveRoomRequest::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint64_t LeaveRoomRequest::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.LeaveRoomRequest.roomId) + return _internal_roomid(); +} +inline void LeaveRoomRequest::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.LeaveRoomRequest.roomId) +} +inline ::uint64_t LeaveRoomRequest::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void LeaveRoomRequest::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// .np2_structs.PresenceOptionData optData = 2; +inline bool LeaveRoomRequest::has_optdata() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.optdata_ != nullptr); + return value; +} +inline void LeaveRoomRequest::clear_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.optdata_ != nullptr) _impl_.optdata_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::PresenceOptionData& LeaveRoomRequest::_internal_optdata() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::PresenceOptionData* p = _impl_.optdata_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_PresenceOptionData_default_instance_); +} +inline const ::np2_structs::PresenceOptionData& LeaveRoomRequest::optdata() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.LeaveRoomRequest.optData) + return _internal_optdata(); +} +inline void LeaveRoomRequest::unsafe_arena_set_allocated_optdata( + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.optdata_); + } + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.LeaveRoomRequest.optData) +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE LeaveRoomRequest::release_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::PresenceOptionData* released = _impl_.optdata_; + _impl_.optdata_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE LeaveRoomRequest::unsafe_arena_release_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.LeaveRoomRequest.optData) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::PresenceOptionData* temp = _impl_.optdata_; + _impl_.optdata_ = nullptr; + return temp; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL LeaveRoomRequest::_internal_mutable_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.optdata_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::PresenceOptionData>(GetArena()); + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(p); + } + return _impl_.optdata_; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL LeaveRoomRequest::mutable_optdata() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::PresenceOptionData* _msg = _internal_mutable_optdata(); + // @@protoc_insertion_point(field_mutable:np2_structs.LeaveRoomRequest.optData) + return _msg; +} +inline void LeaveRoomRequest::set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.optdata_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.LeaveRoomRequest.optData) +} + +// ------------------------------------------------------------------- + +// GetRoomDataExternalListRequest + +// repeated uint64 roomIds = 1; +inline int GetRoomDataExternalListRequest::_internal_roomids_size() const { + return _internal_roomids().size(); +} +inline int GetRoomDataExternalListRequest::roomids_size() const { + return _internal_roomids_size(); +} +inline void GetRoomDataExternalListRequest::clear_roomids() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomids_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint64_t GetRoomDataExternalListRequest::roomids(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomDataExternalListRequest.roomIds) + return _internal_roomids().Get(index); +} +inline void GetRoomDataExternalListRequest::set_roomids(int index, ::uint64_t value) { + _internal_mutable_roomids()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.GetRoomDataExternalListRequest.roomIds) +} +inline void GetRoomDataExternalListRequest::add_roomids(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_roomids()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.GetRoomDataExternalListRequest.roomIds) +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& GetRoomDataExternalListRequest::roomids() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetRoomDataExternalListRequest.roomIds) + return _internal_roomids(); +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL GetRoomDataExternalListRequest::mutable_roomids() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetRoomDataExternalListRequest.roomIds) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roomids(); +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& +GetRoomDataExternalListRequest::_internal_roomids() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomids_; +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL +GetRoomDataExternalListRequest::_internal_mutable_roomids() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roomids_; +} + +// repeated .np2_structs.uint16 attrIds = 2; +inline int GetRoomDataExternalListRequest::_internal_attrids_size() const { + return _internal_attrids().size(); +} +inline int GetRoomDataExternalListRequest::attrids_size() const { + return _internal_attrids_size(); +} +inline void GetRoomDataExternalListRequest::clear_attrids() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attrids_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetRoomDataExternalListRequest::mutable_attrids(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetRoomDataExternalListRequest.attrIds) + return _internal_mutable_attrids()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL GetRoomDataExternalListRequest::mutable_attrids() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetRoomDataExternalListRequest.attrIds) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_attrids(); +} +inline const ::np2_structs::uint16& GetRoomDataExternalListRequest::attrids(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomDataExternalListRequest.attrIds) + return _internal_attrids().Get(index); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetRoomDataExternalListRequest::add_attrids() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::uint16* _add = + _internal_mutable_attrids()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.GetRoomDataExternalListRequest.attrIds) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& GetRoomDataExternalListRequest::attrids() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetRoomDataExternalListRequest.attrIds) + return _internal_attrids(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& +GetRoomDataExternalListRequest::_internal_attrids() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attrids_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL +GetRoomDataExternalListRequest::_internal_mutable_attrids() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.attrids_; +} + +// ------------------------------------------------------------------- + +// GetRoomDataExternalListResponse + +// repeated .np2_structs.RoomDataExternal rooms = 1; +inline int GetRoomDataExternalListResponse::_internal_rooms_size() const { + return _internal_rooms().size(); +} +inline int GetRoomDataExternalListResponse::rooms_size() const { + return _internal_rooms_size(); +} +inline void GetRoomDataExternalListResponse::clear_rooms() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rooms_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::RoomDataExternal* PROTOBUF_NONNULL GetRoomDataExternalListResponse::mutable_rooms(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetRoomDataExternalListResponse.rooms) + return _internal_mutable_rooms()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>* PROTOBUF_NONNULL GetRoomDataExternalListResponse::mutable_rooms() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetRoomDataExternalListResponse.rooms) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_rooms(); +} +inline const ::np2_structs::RoomDataExternal& GetRoomDataExternalListResponse::rooms(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomDataExternalListResponse.rooms) + return _internal_rooms().Get(index); +} +inline ::np2_structs::RoomDataExternal* PROTOBUF_NONNULL GetRoomDataExternalListResponse::add_rooms() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::RoomDataExternal* _add = + _internal_mutable_rooms()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.GetRoomDataExternalListResponse.rooms) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>& GetRoomDataExternalListResponse::rooms() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetRoomDataExternalListResponse.rooms) + return _internal_rooms(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>& +GetRoomDataExternalListResponse::_internal_rooms() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.rooms_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomDataExternal>* PROTOBUF_NONNULL +GetRoomDataExternalListResponse::_internal_mutable_rooms() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.rooms_; +} + +// ------------------------------------------------------------------- + +// SetRoomDataExternalRequest + +// uint64 roomId = 1; +inline void SetRoomDataExternalRequest::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint64_t SetRoomDataExternalRequest::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataExternalRequest.roomId) + return _internal_roomid(); +} +inline void SetRoomDataExternalRequest::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.SetRoomDataExternalRequest.roomId) +} +inline ::uint64_t SetRoomDataExternalRequest::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void SetRoomDataExternalRequest::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// repeated .np2_structs.IntAttr roomSearchableIntAttrExternal = 2; +inline int SetRoomDataExternalRequest::_internal_roomsearchableintattrexternal_size() const { + return _internal_roomsearchableintattrexternal().size(); +} +inline int SetRoomDataExternalRequest::roomsearchableintattrexternal_size() const { + return _internal_roomsearchableintattrexternal_size(); +} +inline void SetRoomDataExternalRequest::clear_roomsearchableintattrexternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomsearchableintattrexternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::IntAttr* PROTOBUF_NONNULL SetRoomDataExternalRequest::mutable_roomsearchableintattrexternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomDataExternalRequest.roomSearchableIntAttrExternal) + return _internal_mutable_roomsearchableintattrexternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL SetRoomDataExternalRequest::mutable_roomsearchableintattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SetRoomDataExternalRequest.roomSearchableIntAttrExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roomsearchableintattrexternal(); +} +inline const ::np2_structs::IntAttr& SetRoomDataExternalRequest::roomsearchableintattrexternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataExternalRequest.roomSearchableIntAttrExternal) + return _internal_roomsearchableintattrexternal().Get(index); +} +inline ::np2_structs::IntAttr* PROTOBUF_NONNULL SetRoomDataExternalRequest::add_roomsearchableintattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::IntAttr* _add = + _internal_mutable_roomsearchableintattrexternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.SetRoomDataExternalRequest.roomSearchableIntAttrExternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& SetRoomDataExternalRequest::roomsearchableintattrexternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SetRoomDataExternalRequest.roomSearchableIntAttrExternal) + return _internal_roomsearchableintattrexternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>& +SetRoomDataExternalRequest::_internal_roomsearchableintattrexternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomsearchableintattrexternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::IntAttr>* PROTOBUF_NONNULL +SetRoomDataExternalRequest::_internal_mutable_roomsearchableintattrexternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roomsearchableintattrexternal_; +} + +// repeated .np2_structs.BinAttr roomSearchableBinAttrExternal = 3; +inline int SetRoomDataExternalRequest::_internal_roomsearchablebinattrexternal_size() const { + return _internal_roomsearchablebinattrexternal().size(); +} +inline int SetRoomDataExternalRequest::roomsearchablebinattrexternal_size() const { + return _internal_roomsearchablebinattrexternal_size(); +} +inline void SetRoomDataExternalRequest::clear_roomsearchablebinattrexternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomsearchablebinattrexternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetRoomDataExternalRequest::mutable_roomsearchablebinattrexternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomDataExternalRequest.roomSearchableBinAttrExternal) + return _internal_mutable_roomsearchablebinattrexternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL SetRoomDataExternalRequest::mutable_roomsearchablebinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SetRoomDataExternalRequest.roomSearchableBinAttrExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roomsearchablebinattrexternal(); +} +inline const ::np2_structs::BinAttr& SetRoomDataExternalRequest::roomsearchablebinattrexternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataExternalRequest.roomSearchableBinAttrExternal) + return _internal_roomsearchablebinattrexternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetRoomDataExternalRequest::add_roomsearchablebinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roomsearchablebinattrexternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.SetRoomDataExternalRequest.roomSearchableBinAttrExternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& SetRoomDataExternalRequest::roomsearchablebinattrexternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SetRoomDataExternalRequest.roomSearchableBinAttrExternal) + return _internal_roomsearchablebinattrexternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +SetRoomDataExternalRequest::_internal_roomsearchablebinattrexternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomsearchablebinattrexternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +SetRoomDataExternalRequest::_internal_mutable_roomsearchablebinattrexternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roomsearchablebinattrexternal_; +} + +// repeated .np2_structs.BinAttr roomBinAttrExternal = 4; +inline int SetRoomDataExternalRequest::_internal_roombinattrexternal_size() const { + return _internal_roombinattrexternal().size(); +} +inline int SetRoomDataExternalRequest::roombinattrexternal_size() const { + return _internal_roombinattrexternal_size(); +} +inline void SetRoomDataExternalRequest::clear_roombinattrexternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roombinattrexternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetRoomDataExternalRequest::mutable_roombinattrexternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomDataExternalRequest.roomBinAttrExternal) + return _internal_mutable_roombinattrexternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL SetRoomDataExternalRequest::mutable_roombinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SetRoomDataExternalRequest.roomBinAttrExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roombinattrexternal(); +} +inline const ::np2_structs::BinAttr& SetRoomDataExternalRequest::roombinattrexternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataExternalRequest.roomBinAttrExternal) + return _internal_roombinattrexternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetRoomDataExternalRequest::add_roombinattrexternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roombinattrexternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_add:np2_structs.SetRoomDataExternalRequest.roomBinAttrExternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& SetRoomDataExternalRequest::roombinattrexternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SetRoomDataExternalRequest.roomBinAttrExternal) + return _internal_roombinattrexternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +SetRoomDataExternalRequest::_internal_roombinattrexternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roombinattrexternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +SetRoomDataExternalRequest::_internal_mutable_roombinattrexternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roombinattrexternal_; +} + +// ------------------------------------------------------------------- + +// SetRoomDataInternalRequest + +// uint64 roomId = 1; +inline void SetRoomDataInternalRequest::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::uint64_t SetRoomDataInternalRequest::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataInternalRequest.roomId) + return _internal_roomid(); +} +inline void SetRoomDataInternalRequest::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.SetRoomDataInternalRequest.roomId) +} +inline ::uint64_t SetRoomDataInternalRequest::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void SetRoomDataInternalRequest::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// uint32 flagFilter = 2; +inline void SetRoomDataInternalRequest::clear_flagfilter() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagfilter_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline ::uint32_t SetRoomDataInternalRequest::flagfilter() const { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataInternalRequest.flagFilter) + return _internal_flagfilter(); +} +inline void SetRoomDataInternalRequest::set_flagfilter(::uint32_t value) { + _internal_set_flagfilter(value); + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_set:np2_structs.SetRoomDataInternalRequest.flagFilter) +} +inline ::uint32_t SetRoomDataInternalRequest::_internal_flagfilter() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.flagfilter_; +} +inline void SetRoomDataInternalRequest::_internal_set_flagfilter(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagfilter_ = value; +} + +// uint32 flagAttr = 3; +inline void SetRoomDataInternalRequest::clear_flagattr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000040U); +} +inline ::uint32_t SetRoomDataInternalRequest::flagattr() const { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataInternalRequest.flagAttr) + return _internal_flagattr(); +} +inline void SetRoomDataInternalRequest::set_flagattr(::uint32_t value) { + _internal_set_flagattr(value); + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_set:np2_structs.SetRoomDataInternalRequest.flagAttr) +} +inline ::uint32_t SetRoomDataInternalRequest::_internal_flagattr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.flagattr_; +} +inline void SetRoomDataInternalRequest::_internal_set_flagattr(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.flagattr_ = value; +} + +// repeated .np2_structs.BinAttr roomBinAttrInternal = 4; +inline int SetRoomDataInternalRequest::_internal_roombinattrinternal_size() const { + return _internal_roombinattrinternal().size(); +} +inline int SetRoomDataInternalRequest::roombinattrinternal_size() const { + return _internal_roombinattrinternal_size(); +} +inline void SetRoomDataInternalRequest::clear_roombinattrinternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roombinattrinternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetRoomDataInternalRequest::mutable_roombinattrinternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomDataInternalRequest.roomBinAttrInternal) + return _internal_mutable_roombinattrinternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL SetRoomDataInternalRequest::mutable_roombinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SetRoomDataInternalRequest.roomBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roombinattrinternal(); +} +inline const ::np2_structs::BinAttr& SetRoomDataInternalRequest::roombinattrinternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataInternalRequest.roomBinAttrInternal) + return _internal_roombinattrinternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetRoomDataInternalRequest::add_roombinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roombinattrinternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.SetRoomDataInternalRequest.roomBinAttrInternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& SetRoomDataInternalRequest::roombinattrinternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SetRoomDataInternalRequest.roomBinAttrInternal) + return _internal_roombinattrinternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +SetRoomDataInternalRequest::_internal_roombinattrinternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roombinattrinternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +SetRoomDataInternalRequest::_internal_mutable_roombinattrinternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roombinattrinternal_; +} + +// repeated .np2_structs.RoomGroupPasswordConfig passwordConfig = 5; +inline int SetRoomDataInternalRequest::_internal_passwordconfig_size() const { + return _internal_passwordconfig().size(); +} +inline int SetRoomDataInternalRequest::passwordconfig_size() const { + return _internal_passwordconfig_size(); +} +inline void SetRoomDataInternalRequest::clear_passwordconfig() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.passwordconfig_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::np2_structs::RoomGroupPasswordConfig* PROTOBUF_NONNULL SetRoomDataInternalRequest::mutable_passwordconfig(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomDataInternalRequest.passwordConfig) + return _internal_mutable_passwordconfig()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroupPasswordConfig>* PROTOBUF_NONNULL SetRoomDataInternalRequest::mutable_passwordconfig() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SetRoomDataInternalRequest.passwordConfig) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_passwordconfig(); +} +inline const ::np2_structs::RoomGroupPasswordConfig& SetRoomDataInternalRequest::passwordconfig(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataInternalRequest.passwordConfig) + return _internal_passwordconfig().Get(index); +} +inline ::np2_structs::RoomGroupPasswordConfig* PROTOBUF_NONNULL SetRoomDataInternalRequest::add_passwordconfig() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::RoomGroupPasswordConfig* _add = + _internal_mutable_passwordconfig()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.SetRoomDataInternalRequest.passwordConfig) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroupPasswordConfig>& SetRoomDataInternalRequest::passwordconfig() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SetRoomDataInternalRequest.passwordConfig) + return _internal_passwordconfig(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroupPasswordConfig>& +SetRoomDataInternalRequest::_internal_passwordconfig() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.passwordconfig_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomGroupPasswordConfig>* PROTOBUF_NONNULL +SetRoomDataInternalRequest::_internal_mutable_passwordconfig() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.passwordconfig_; +} + +// repeated uint64 passwordSlotMask = 6; +inline int SetRoomDataInternalRequest::_internal_passwordslotmask_size() const { + return _internal_passwordslotmask().size(); +} +inline int SetRoomDataInternalRequest::passwordslotmask_size() const { + return _internal_passwordslotmask_size(); +} +inline void SetRoomDataInternalRequest::clear_passwordslotmask() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.passwordslotmask_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint64_t SetRoomDataInternalRequest::passwordslotmask(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataInternalRequest.passwordSlotMask) + return _internal_passwordslotmask().Get(index); +} +inline void SetRoomDataInternalRequest::set_passwordslotmask(int index, ::uint64_t value) { + _internal_mutable_passwordslotmask()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.SetRoomDataInternalRequest.passwordSlotMask) +} +inline void SetRoomDataInternalRequest::add_passwordslotmask(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_passwordslotmask()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_add:np2_structs.SetRoomDataInternalRequest.passwordSlotMask) +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& SetRoomDataInternalRequest::passwordslotmask() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SetRoomDataInternalRequest.passwordSlotMask) + return _internal_passwordslotmask(); +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL SetRoomDataInternalRequest::mutable_passwordslotmask() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SetRoomDataInternalRequest.passwordSlotMask) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_passwordslotmask(); +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& +SetRoomDataInternalRequest::_internal_passwordslotmask() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.passwordslotmask_; +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL +SetRoomDataInternalRequest::_internal_mutable_passwordslotmask() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.passwordslotmask_; +} + +// repeated .np2_structs.uint16 ownerPrivilegeRank = 7; +inline int SetRoomDataInternalRequest::_internal_ownerprivilegerank_size() const { + return _internal_ownerprivilegerank().size(); +} +inline int SetRoomDataInternalRequest::ownerprivilegerank_size() const { + return _internal_ownerprivilegerank_size(); +} +inline void SetRoomDataInternalRequest::clear_ownerprivilegerank() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.ownerprivilegerank_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SetRoomDataInternalRequest::mutable_ownerprivilegerank(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomDataInternalRequest.ownerPrivilegeRank) + return _internal_mutable_ownerprivilegerank()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL SetRoomDataInternalRequest::mutable_ownerprivilegerank() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SetRoomDataInternalRequest.ownerPrivilegeRank) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_ownerprivilegerank(); +} +inline const ::np2_structs::uint16& SetRoomDataInternalRequest::ownerprivilegerank(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomDataInternalRequest.ownerPrivilegeRank) + return _internal_ownerprivilegerank().Get(index); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SetRoomDataInternalRequest::add_ownerprivilegerank() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::uint16* _add = + _internal_mutable_ownerprivilegerank()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_add:np2_structs.SetRoomDataInternalRequest.ownerPrivilegeRank) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& SetRoomDataInternalRequest::ownerprivilegerank() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SetRoomDataInternalRequest.ownerPrivilegeRank) + return _internal_ownerprivilegerank(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& +SetRoomDataInternalRequest::_internal_ownerprivilegerank() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.ownerprivilegerank_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL +SetRoomDataInternalRequest::_internal_mutable_ownerprivilegerank() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.ownerprivilegerank_; +} + +// ------------------------------------------------------------------- + +// GetRoomMemberDataInternalRequest + +// uint64 roomId = 1; +inline void GetRoomMemberDataInternalRequest::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint64_t GetRoomMemberDataInternalRequest::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomMemberDataInternalRequest.roomId) + return _internal_roomid(); +} +inline void GetRoomMemberDataInternalRequest::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.GetRoomMemberDataInternalRequest.roomId) +} +inline ::uint64_t GetRoomMemberDataInternalRequest::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void GetRoomMemberDataInternalRequest::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// .np2_structs.uint16 memberId = 2; +inline bool GetRoomMemberDataInternalRequest::has_memberid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.memberid_ != nullptr); + return value; +} +inline void GetRoomMemberDataInternalRequest::clear_memberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.memberid_ != nullptr) _impl_.memberid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::uint16& GetRoomMemberDataInternalRequest::_internal_memberid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.memberid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& GetRoomMemberDataInternalRequest::memberid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomMemberDataInternalRequest.memberId) + return _internal_memberid(); +} +inline void GetRoomMemberDataInternalRequest::unsafe_arena_set_allocated_memberid( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.memberid_); + } + _impl_.memberid_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.GetRoomMemberDataInternalRequest.memberId) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE GetRoomMemberDataInternalRequest::release_memberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* released = _impl_.memberid_; + _impl_.memberid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE GetRoomMemberDataInternalRequest::unsafe_arena_release_memberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.GetRoomMemberDataInternalRequest.memberId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* temp = _impl_.memberid_; + _impl_.memberid_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetRoomMemberDataInternalRequest::_internal_mutable_memberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.memberid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.memberid_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.memberid_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetRoomMemberDataInternalRequest::mutable_memberid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* _msg = _internal_mutable_memberid(); + // @@protoc_insertion_point(field_mutable:np2_structs.GetRoomMemberDataInternalRequest.memberId) + return _msg; +} +inline void GetRoomMemberDataInternalRequest::set_allocated_memberid(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.memberid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.memberid_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.GetRoomMemberDataInternalRequest.memberId) +} + +// repeated .np2_structs.uint16 attrId = 3; +inline int GetRoomMemberDataInternalRequest::_internal_attrid_size() const { + return _internal_attrid().size(); +} +inline int GetRoomMemberDataInternalRequest::attrid_size() const { + return _internal_attrid_size(); +} +inline void GetRoomMemberDataInternalRequest::clear_attrid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attrid_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetRoomMemberDataInternalRequest::mutable_attrid(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetRoomMemberDataInternalRequest.attrId) + return _internal_mutable_attrid()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL GetRoomMemberDataInternalRequest::mutable_attrid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetRoomMemberDataInternalRequest.attrId) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_attrid(); +} +inline const ::np2_structs::uint16& GetRoomMemberDataInternalRequest::attrid(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomMemberDataInternalRequest.attrId) + return _internal_attrid().Get(index); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetRoomMemberDataInternalRequest::add_attrid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::uint16* _add = + _internal_mutable_attrid()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.GetRoomMemberDataInternalRequest.attrId) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& GetRoomMemberDataInternalRequest::attrid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetRoomMemberDataInternalRequest.attrId) + return _internal_attrid(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& +GetRoomMemberDataInternalRequest::_internal_attrid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attrid_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL +GetRoomMemberDataInternalRequest::_internal_mutable_attrid() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.attrid_; +} + +// ------------------------------------------------------------------- + +// SetRoomMemberDataInternalRequest + +// uint64 roomId = 1; +inline void SetRoomMemberDataInternalRequest::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint64_t SetRoomMemberDataInternalRequest::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomMemberDataInternalRequest.roomId) + return _internal_roomid(); +} +inline void SetRoomMemberDataInternalRequest::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.SetRoomMemberDataInternalRequest.roomId) +} +inline ::uint64_t SetRoomMemberDataInternalRequest::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void SetRoomMemberDataInternalRequest::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// .np2_structs.uint16 memberId = 2; +inline bool SetRoomMemberDataInternalRequest::has_memberid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.memberid_ != nullptr); + return value; +} +inline void SetRoomMemberDataInternalRequest::clear_memberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.memberid_ != nullptr) _impl_.memberid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::uint16& SetRoomMemberDataInternalRequest::_internal_memberid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.memberid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& SetRoomMemberDataInternalRequest::memberid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomMemberDataInternalRequest.memberId) + return _internal_memberid(); +} +inline void SetRoomMemberDataInternalRequest::unsafe_arena_set_allocated_memberid( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.memberid_); + } + _impl_.memberid_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.SetRoomMemberDataInternalRequest.memberId) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE SetRoomMemberDataInternalRequest::release_memberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* released = _impl_.memberid_; + _impl_.memberid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE SetRoomMemberDataInternalRequest::unsafe_arena_release_memberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SetRoomMemberDataInternalRequest.memberId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* temp = _impl_.memberid_; + _impl_.memberid_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::_internal_mutable_memberid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.memberid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.memberid_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.memberid_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::mutable_memberid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* _msg = _internal_mutable_memberid(); + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomMemberDataInternalRequest.memberId) + return _msg; +} +inline void SetRoomMemberDataInternalRequest::set_allocated_memberid(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.memberid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.memberid_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.SetRoomMemberDataInternalRequest.memberId) +} + +// .np2_structs.uint8 teamId = 3; +inline bool SetRoomMemberDataInternalRequest::has_teamid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.teamid_ != nullptr); + return value; +} +inline void SetRoomMemberDataInternalRequest::clear_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.teamid_ != nullptr) _impl_.teamid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::uint8& SetRoomMemberDataInternalRequest::_internal_teamid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.teamid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& SetRoomMemberDataInternalRequest::teamid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomMemberDataInternalRequest.teamId) + return _internal_teamid(); +} +inline void SetRoomMemberDataInternalRequest::unsafe_arena_set_allocated_teamid( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.teamid_); + } + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.SetRoomMemberDataInternalRequest.teamId) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE SetRoomMemberDataInternalRequest::release_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* released = _impl_.teamid_; + _impl_.teamid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE SetRoomMemberDataInternalRequest::unsafe_arena_release_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SetRoomMemberDataInternalRequest.teamId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* temp = _impl_.teamid_; + _impl_.teamid_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::_internal_mutable_teamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.teamid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.teamid_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::mutable_teamid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* _msg = _internal_mutable_teamid(); + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomMemberDataInternalRequest.teamId) + return _msg; +} +inline void SetRoomMemberDataInternalRequest::set_allocated_teamid(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.teamid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.teamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.SetRoomMemberDataInternalRequest.teamId) +} + +// repeated .np2_structs.BinAttr roomMemberBinAttrInternal = 4; +inline int SetRoomMemberDataInternalRequest::_internal_roommemberbinattrinternal_size() const { + return _internal_roommemberbinattrinternal().size(); +} +inline int SetRoomMemberDataInternalRequest::roommemberbinattrinternal_size() const { + return _internal_roommemberbinattrinternal_size(); +} +inline void SetRoomMemberDataInternalRequest::clear_roommemberbinattrinternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roommemberbinattrinternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::mutable_roommemberbinattrinternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomMemberDataInternalRequest.roomMemberBinAttrInternal) + return _internal_mutable_roommemberbinattrinternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::mutable_roommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SetRoomMemberDataInternalRequest.roomMemberBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_roommemberbinattrinternal(); +} +inline const ::np2_structs::BinAttr& SetRoomMemberDataInternalRequest::roommemberbinattrinternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomMemberDataInternalRequest.roomMemberBinAttrInternal) + return _internal_roommemberbinattrinternal().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetRoomMemberDataInternalRequest::add_roommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_roommemberbinattrinternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.SetRoomMemberDataInternalRequest.roomMemberBinAttrInternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& SetRoomMemberDataInternalRequest::roommemberbinattrinternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SetRoomMemberDataInternalRequest.roomMemberBinAttrInternal) + return _internal_roommemberbinattrinternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +SetRoomMemberDataInternalRequest::_internal_roommemberbinattrinternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roommemberbinattrinternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +SetRoomMemberDataInternalRequest::_internal_mutable_roommemberbinattrinternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.roommemberbinattrinternal_; +} + +// ------------------------------------------------------------------- + +// SetUserInfo + +// .np2_structs.uint16 serverId = 1; +inline bool SetUserInfo::has_serverid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.serverid_ != nullptr); + return value; +} +inline void SetUserInfo::clear_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.serverid_ != nullptr) _impl_.serverid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::uint16& SetUserInfo::_internal_serverid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.serverid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& SetUserInfo::serverid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetUserInfo.serverId) + return _internal_serverid(); +} +inline void SetUserInfo::unsafe_arena_set_allocated_serverid( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.serverid_); + } + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.SetUserInfo.serverId) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE SetUserInfo::release_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* released = _impl_.serverid_; + _impl_.serverid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE SetUserInfo::unsafe_arena_release_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SetUserInfo.serverId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* temp = _impl_.serverid_; + _impl_.serverid_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SetUserInfo::_internal_mutable_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.serverid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.serverid_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SetUserInfo::mutable_serverid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint16* _msg = _internal_mutable_serverid(); + // @@protoc_insertion_point(field_mutable:np2_structs.SetUserInfo.serverId) + return _msg; +} +inline void SetUserInfo::set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.serverid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.SetUserInfo.serverId) +} + +// repeated .np2_structs.BinAttr userBinAttr = 2; +inline int SetUserInfo::_internal_userbinattr_size() const { + return _internal_userbinattr().size(); +} +inline int SetUserInfo::userbinattr_size() const { + return _internal_userbinattr_size(); +} +inline void SetUserInfo::clear_userbinattr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.userbinattr_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetUserInfo::mutable_userbinattr(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SetUserInfo.userBinAttr) + return _internal_mutable_userbinattr()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL SetUserInfo::mutable_userbinattr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SetUserInfo.userBinAttr) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_userbinattr(); +} +inline const ::np2_structs::BinAttr& SetUserInfo::userbinattr(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetUserInfo.userBinAttr) + return _internal_userbinattr().Get(index); +} +inline ::np2_structs::BinAttr* PROTOBUF_NONNULL SetUserInfo::add_userbinattr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::BinAttr* _add = + _internal_mutable_userbinattr()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.SetUserInfo.userBinAttr) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& SetUserInfo::userbinattr() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SetUserInfo.userBinAttr) + return _internal_userbinattr(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>& +SetUserInfo::_internal_userbinattr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.userbinattr_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::BinAttr>* PROTOBUF_NONNULL +SetUserInfo::_internal_mutable_userbinattr() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.userbinattr_; +} + +// ------------------------------------------------------------------- + +// GetRoomDataInternalRequest + +// uint64 roomId = 1; +inline void GetRoomDataInternalRequest::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint64_t GetRoomDataInternalRequest::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomDataInternalRequest.roomId) + return _internal_roomid(); +} +inline void GetRoomDataInternalRequest::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.GetRoomDataInternalRequest.roomId) +} +inline ::uint64_t GetRoomDataInternalRequest::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void GetRoomDataInternalRequest::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// repeated .np2_structs.uint16 attrId = 2; +inline int GetRoomDataInternalRequest::_internal_attrid_size() const { + return _internal_attrid().size(); +} +inline int GetRoomDataInternalRequest::attrid_size() const { + return _internal_attrid_size(); +} +inline void GetRoomDataInternalRequest::clear_attrid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attrid_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetRoomDataInternalRequest::mutable_attrid(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetRoomDataInternalRequest.attrId) + return _internal_mutable_attrid()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL GetRoomDataInternalRequest::mutable_attrid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetRoomDataInternalRequest.attrId) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_attrid(); +} +inline const ::np2_structs::uint16& GetRoomDataInternalRequest::attrid(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomDataInternalRequest.attrId) + return _internal_attrid().Get(index); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetRoomDataInternalRequest::add_attrid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::uint16* _add = + _internal_mutable_attrid()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.GetRoomDataInternalRequest.attrId) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& GetRoomDataInternalRequest::attrid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetRoomDataInternalRequest.attrId) + return _internal_attrid(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& +GetRoomDataInternalRequest::_internal_attrid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attrid_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL +GetRoomDataInternalRequest::_internal_mutable_attrid() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.attrid_; +} + +// ------------------------------------------------------------------- + +// RoomMemberUpdateInfo + +// .np2_structs.RoomMemberDataInternal roomMemberDataInternal = 1; +inline bool RoomMemberUpdateInfo::has_roommemberdatainternal() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.roommemberdatainternal_ != nullptr); + return value; +} +inline void RoomMemberUpdateInfo::clear_roommemberdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.roommemberdatainternal_ != nullptr) _impl_.roommemberdatainternal_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::RoomMemberDataInternal& RoomMemberUpdateInfo::_internal_roommemberdatainternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::RoomMemberDataInternal* p = _impl_.roommemberdatainternal_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_RoomMemberDataInternal_default_instance_); +} +inline const ::np2_structs::RoomMemberDataInternal& RoomMemberUpdateInfo::roommemberdatainternal() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberUpdateInfo.roomMemberDataInternal) + return _internal_roommemberdatainternal(); +} +inline void RoomMemberUpdateInfo::unsafe_arena_set_allocated_roommemberdatainternal( + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.roommemberdatainternal_); + } + _impl_.roommemberdatainternal_ = reinterpret_cast<::np2_structs::RoomMemberDataInternal*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberUpdateInfo.roomMemberDataInternal) +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE RoomMemberUpdateInfo::release_roommemberdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::RoomMemberDataInternal* released = _impl_.roommemberdatainternal_; + _impl_.roommemberdatainternal_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE RoomMemberUpdateInfo::unsafe_arena_release_roommemberdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberUpdateInfo.roomMemberDataInternal) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::RoomMemberDataInternal* temp = _impl_.roommemberdatainternal_; + _impl_.roommemberdatainternal_ = nullptr; + return temp; +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL RoomMemberUpdateInfo::_internal_mutable_roommemberdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.roommemberdatainternal_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::RoomMemberDataInternal>(GetArena()); + _impl_.roommemberdatainternal_ = reinterpret_cast<::np2_structs::RoomMemberDataInternal*>(p); + } + return _impl_.roommemberdatainternal_; +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL RoomMemberUpdateInfo::mutable_roommemberdatainternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::RoomMemberDataInternal* _msg = _internal_mutable_roommemberdatainternal(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberUpdateInfo.roomMemberDataInternal) + return _msg; +} +inline void RoomMemberUpdateInfo::set_allocated_roommemberdatainternal(::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.roommemberdatainternal_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.roommemberdatainternal_ = reinterpret_cast<::np2_structs::RoomMemberDataInternal*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberUpdateInfo.roomMemberDataInternal) +} + +// .np2_structs.uint8 eventCause = 2; +inline bool RoomMemberUpdateInfo::has_eventcause() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.eventcause_ != nullptr); + return value; +} +inline void RoomMemberUpdateInfo::clear_eventcause() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.eventcause_ != nullptr) _impl_.eventcause_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::uint8& RoomMemberUpdateInfo::_internal_eventcause() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.eventcause_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& RoomMemberUpdateInfo::eventcause() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberUpdateInfo.eventCause) + return _internal_eventcause(); +} +inline void RoomMemberUpdateInfo::unsafe_arena_set_allocated_eventcause( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.eventcause_); + } + _impl_.eventcause_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberUpdateInfo.eventCause) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberUpdateInfo::release_eventcause() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* released = _impl_.eventcause_; + _impl_.eventcause_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberUpdateInfo::unsafe_arena_release_eventcause() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberUpdateInfo.eventCause) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* temp = _impl_.eventcause_; + _impl_.eventcause_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberUpdateInfo::_internal_mutable_eventcause() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.eventcause_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.eventcause_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.eventcause_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberUpdateInfo::mutable_eventcause() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* _msg = _internal_mutable_eventcause(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberUpdateInfo.eventCause) + return _msg; +} +inline void RoomMemberUpdateInfo::set_allocated_eventcause(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.eventcause_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.eventcause_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberUpdateInfo.eventCause) +} + +// .np2_structs.PresenceOptionData optData = 3; +inline bool RoomMemberUpdateInfo::has_optdata() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.optdata_ != nullptr); + return value; +} +inline void RoomMemberUpdateInfo::clear_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.optdata_ != nullptr) _impl_.optdata_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::PresenceOptionData& RoomMemberUpdateInfo::_internal_optdata() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::PresenceOptionData* p = _impl_.optdata_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_PresenceOptionData_default_instance_); +} +inline const ::np2_structs::PresenceOptionData& RoomMemberUpdateInfo::optdata() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberUpdateInfo.optData) + return _internal_optdata(); +} +inline void RoomMemberUpdateInfo::unsafe_arena_set_allocated_optdata( + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.optdata_); + } + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberUpdateInfo.optData) +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE RoomMemberUpdateInfo::release_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::PresenceOptionData* released = _impl_.optdata_; + _impl_.optdata_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE RoomMemberUpdateInfo::unsafe_arena_release_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberUpdateInfo.optData) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::PresenceOptionData* temp = _impl_.optdata_; + _impl_.optdata_ = nullptr; + return temp; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL RoomMemberUpdateInfo::_internal_mutable_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.optdata_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::PresenceOptionData>(GetArena()); + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(p); + } + return _impl_.optdata_; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL RoomMemberUpdateInfo::mutable_optdata() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::PresenceOptionData* _msg = _internal_mutable_optdata(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberUpdateInfo.optData) + return _msg; +} +inline void RoomMemberUpdateInfo::set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.optdata_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberUpdateInfo.optData) +} + +// ------------------------------------------------------------------- + +// NotificationUserJoinedRoom + +// uint64 room_id = 1; +inline void NotificationUserJoinedRoom::clear_room_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.room_id_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint64_t NotificationUserJoinedRoom::room_id() const { + // @@protoc_insertion_point(field_get:np2_structs.NotificationUserJoinedRoom.room_id) + return _internal_room_id(); +} +inline void NotificationUserJoinedRoom::set_room_id(::uint64_t value) { + _internal_set_room_id(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.NotificationUserJoinedRoom.room_id) +} +inline ::uint64_t NotificationUserJoinedRoom::_internal_room_id() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.room_id_; +} +inline void NotificationUserJoinedRoom::_internal_set_room_id(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.room_id_ = value; +} + +// .np2_structs.RoomMemberUpdateInfo update_info = 2; +inline bool NotificationUserJoinedRoom::has_update_info() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.update_info_ != nullptr); + return value; +} +inline void NotificationUserJoinedRoom::clear_update_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.update_info_ != nullptr) _impl_.update_info_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::RoomMemberUpdateInfo& NotificationUserJoinedRoom::_internal_update_info() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::RoomMemberUpdateInfo* p = _impl_.update_info_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_RoomMemberUpdateInfo_default_instance_); +} +inline const ::np2_structs::RoomMemberUpdateInfo& NotificationUserJoinedRoom::update_info() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.NotificationUserJoinedRoom.update_info) + return _internal_update_info(); +} +inline void NotificationUserJoinedRoom::unsafe_arena_set_allocated_update_info( + ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.update_info_); + } + _impl_.update_info_ = reinterpret_cast<::np2_structs::RoomMemberUpdateInfo*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.NotificationUserJoinedRoom.update_info) +} +inline ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NULLABLE NotificationUserJoinedRoom::release_update_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::RoomMemberUpdateInfo* released = _impl_.update_info_; + _impl_.update_info_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NULLABLE NotificationUserJoinedRoom::unsafe_arena_release_update_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.NotificationUserJoinedRoom.update_info) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::RoomMemberUpdateInfo* temp = _impl_.update_info_; + _impl_.update_info_ = nullptr; + return temp; +} +inline ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NONNULL NotificationUserJoinedRoom::_internal_mutable_update_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.update_info_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::RoomMemberUpdateInfo>(GetArena()); + _impl_.update_info_ = reinterpret_cast<::np2_structs::RoomMemberUpdateInfo*>(p); + } + return _impl_.update_info_; +} +inline ::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NONNULL NotificationUserJoinedRoom::mutable_update_info() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::RoomMemberUpdateInfo* _msg = _internal_mutable_update_info(); + // @@protoc_insertion_point(field_mutable:np2_structs.NotificationUserJoinedRoom.update_info) + return _msg; +} +inline void NotificationUserJoinedRoom::set_allocated_update_info(::np2_structs::RoomMemberUpdateInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.update_info_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.update_info_ = reinterpret_cast<::np2_structs::RoomMemberUpdateInfo*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.NotificationUserJoinedRoom.update_info) +} + +// .np2_structs.SignalingAddr signaling = 3; +inline bool NotificationUserJoinedRoom::has_signaling() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.signaling_ != nullptr); + return value; +} +inline void NotificationUserJoinedRoom::clear_signaling() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.signaling_ != nullptr) _impl_.signaling_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::SignalingAddr& NotificationUserJoinedRoom::_internal_signaling() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::SignalingAddr* p = _impl_.signaling_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_SignalingAddr_default_instance_); +} +inline const ::np2_structs::SignalingAddr& NotificationUserJoinedRoom::signaling() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.NotificationUserJoinedRoom.signaling) + return _internal_signaling(); +} +inline void NotificationUserJoinedRoom::unsafe_arena_set_allocated_signaling( + ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.signaling_); + } + _impl_.signaling_ = reinterpret_cast<::np2_structs::SignalingAddr*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.NotificationUserJoinedRoom.signaling) +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE NotificationUserJoinedRoom::release_signaling() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::SignalingAddr* released = _impl_.signaling_; + _impl_.signaling_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NULLABLE NotificationUserJoinedRoom::unsafe_arena_release_signaling() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.NotificationUserJoinedRoom.signaling) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::SignalingAddr* temp = _impl_.signaling_; + _impl_.signaling_ = nullptr; + return temp; +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NONNULL NotificationUserJoinedRoom::_internal_mutable_signaling() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.signaling_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::SignalingAddr>(GetArena()); + _impl_.signaling_ = reinterpret_cast<::np2_structs::SignalingAddr*>(p); + } + return _impl_.signaling_; +} +inline ::np2_structs::SignalingAddr* PROTOBUF_NONNULL NotificationUserJoinedRoom::mutable_signaling() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::SignalingAddr* _msg = _internal_mutable_signaling(); + // @@protoc_insertion_point(field_mutable:np2_structs.NotificationUserJoinedRoom.signaling) + return _msg; +} +inline void NotificationUserJoinedRoom::set_allocated_signaling(::np2_structs::SignalingAddr* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.signaling_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.signaling_ = reinterpret_cast<::np2_structs::SignalingAddr*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.NotificationUserJoinedRoom.signaling) +} + +// ------------------------------------------------------------------- + +// RoomUpdateInfo + +// .np2_structs.uint8 eventCause = 1; +inline bool RoomUpdateInfo::has_eventcause() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.eventcause_ != nullptr); + return value; +} +inline void RoomUpdateInfo::clear_eventcause() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.eventcause_ != nullptr) _impl_.eventcause_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::uint8& RoomUpdateInfo::_internal_eventcause() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.eventcause_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& RoomUpdateInfo::eventcause() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomUpdateInfo.eventCause) + return _internal_eventcause(); +} +inline void RoomUpdateInfo::unsafe_arena_set_allocated_eventcause( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.eventcause_); + } + _impl_.eventcause_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomUpdateInfo.eventCause) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomUpdateInfo::release_eventcause() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* released = _impl_.eventcause_; + _impl_.eventcause_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomUpdateInfo::unsafe_arena_release_eventcause() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomUpdateInfo.eventCause) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* temp = _impl_.eventcause_; + _impl_.eventcause_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomUpdateInfo::_internal_mutable_eventcause() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.eventcause_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.eventcause_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.eventcause_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomUpdateInfo::mutable_eventcause() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint8* _msg = _internal_mutable_eventcause(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomUpdateInfo.eventCause) + return _msg; +} +inline void RoomUpdateInfo::set_allocated_eventcause(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.eventcause_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.eventcause_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomUpdateInfo.eventCause) +} + +// int32 errorCode = 2; +inline void RoomUpdateInfo::clear_errorcode() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.errorcode_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::int32_t RoomUpdateInfo::errorcode() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomUpdateInfo.errorCode) + return _internal_errorcode(); +} +inline void RoomUpdateInfo::set_errorcode(::int32_t value) { + _internal_set_errorcode(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.RoomUpdateInfo.errorCode) +} +inline ::int32_t RoomUpdateInfo::_internal_errorcode() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.errorcode_; +} +inline void RoomUpdateInfo::_internal_set_errorcode(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.errorcode_ = value; +} + +// .np2_structs.PresenceOptionData optData = 3; +inline bool RoomUpdateInfo::has_optdata() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.optdata_ != nullptr); + return value; +} +inline void RoomUpdateInfo::clear_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.optdata_ != nullptr) _impl_.optdata_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::PresenceOptionData& RoomUpdateInfo::_internal_optdata() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::PresenceOptionData* p = _impl_.optdata_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_PresenceOptionData_default_instance_); +} +inline const ::np2_structs::PresenceOptionData& RoomUpdateInfo::optdata() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomUpdateInfo.optData) + return _internal_optdata(); +} +inline void RoomUpdateInfo::unsafe_arena_set_allocated_optdata( + ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.optdata_); + } + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomUpdateInfo.optData) +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE RoomUpdateInfo::release_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::PresenceOptionData* released = _impl_.optdata_; + _impl_.optdata_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE RoomUpdateInfo::unsafe_arena_release_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomUpdateInfo.optData) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::PresenceOptionData* temp = _impl_.optdata_; + _impl_.optdata_ = nullptr; + return temp; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL RoomUpdateInfo::_internal_mutable_optdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.optdata_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::PresenceOptionData>(GetArena()); + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(p); + } + return _impl_.optdata_; +} +inline ::np2_structs::PresenceOptionData* PROTOBUF_NONNULL RoomUpdateInfo::mutable_optdata() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::PresenceOptionData* _msg = _internal_mutable_optdata(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomUpdateInfo.optData) + return _msg; +} +inline void RoomUpdateInfo::set_allocated_optdata(::np2_structs::PresenceOptionData* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.optdata_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.optdata_ = reinterpret_cast<::np2_structs::PresenceOptionData*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomUpdateInfo.optData) +} + +// ------------------------------------------------------------------- + +// RoomDataInternalUpdateInfo + +// .np2_structs.RoomDataInternal newRoomDataInternal = 1; +inline bool RoomDataInternalUpdateInfo::has_newroomdatainternal() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.newroomdatainternal_ != nullptr); + return value; +} +inline void RoomDataInternalUpdateInfo::clear_newroomdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.newroomdatainternal_ != nullptr) _impl_.newroomdatainternal_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::RoomDataInternal& RoomDataInternalUpdateInfo::_internal_newroomdatainternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::RoomDataInternal* p = _impl_.newroomdatainternal_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_RoomDataInternal_default_instance_); +} +inline const ::np2_structs::RoomDataInternal& RoomDataInternalUpdateInfo::newroomdatainternal() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternalUpdateInfo.newRoomDataInternal) + return _internal_newroomdatainternal(); +} +inline void RoomDataInternalUpdateInfo::unsafe_arena_set_allocated_newroomdatainternal( + ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.newroomdatainternal_); + } + _impl_.newroomdatainternal_ = reinterpret_cast<::np2_structs::RoomDataInternal*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomDataInternalUpdateInfo.newRoomDataInternal) +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE RoomDataInternalUpdateInfo::release_newroomdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::RoomDataInternal* released = _impl_.newroomdatainternal_; + _impl_.newroomdatainternal_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE RoomDataInternalUpdateInfo::unsafe_arena_release_newroomdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataInternalUpdateInfo.newRoomDataInternal) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::RoomDataInternal* temp = _impl_.newroomdatainternal_; + _impl_.newroomdatainternal_ = nullptr; + return temp; +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::_internal_mutable_newroomdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.newroomdatainternal_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::RoomDataInternal>(GetArena()); + _impl_.newroomdatainternal_ = reinterpret_cast<::np2_structs::RoomDataInternal*>(p); + } + return _impl_.newroomdatainternal_; +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::mutable_newroomdatainternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::RoomDataInternal* _msg = _internal_mutable_newroomdatainternal(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataInternalUpdateInfo.newRoomDataInternal) + return _msg; +} +inline void RoomDataInternalUpdateInfo::set_allocated_newroomdatainternal(::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.newroomdatainternal_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.newroomdatainternal_ = reinterpret_cast<::np2_structs::RoomDataInternal*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataInternalUpdateInfo.newRoomDataInternal) +} + +// uint32 prevFlagAttr = 2; +inline void RoomDataInternalUpdateInfo::clear_prevflagattr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.prevflagattr_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::uint32_t RoomDataInternalUpdateInfo::prevflagattr() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternalUpdateInfo.prevFlagAttr) + return _internal_prevflagattr(); +} +inline void RoomDataInternalUpdateInfo::set_prevflagattr(::uint32_t value) { + _internal_set_prevflagattr(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataInternalUpdateInfo.prevFlagAttr) +} +inline ::uint32_t RoomDataInternalUpdateInfo::_internal_prevflagattr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.prevflagattr_; +} +inline void RoomDataInternalUpdateInfo::_internal_set_prevflagattr(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.prevflagattr_ = value; +} + +// uint64 prevRoomPasswordSlotMask = 3; +inline void RoomDataInternalUpdateInfo::clear_prevroompasswordslotmask() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.prevroompasswordslotmask_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint64_t RoomDataInternalUpdateInfo::prevroompasswordslotmask() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternalUpdateInfo.prevRoomPasswordSlotMask) + return _internal_prevroompasswordslotmask(); +} +inline void RoomDataInternalUpdateInfo::set_prevroompasswordslotmask(::uint64_t value) { + _internal_set_prevroompasswordslotmask(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataInternalUpdateInfo.prevRoomPasswordSlotMask) +} +inline ::uint64_t RoomDataInternalUpdateInfo::_internal_prevroompasswordslotmask() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.prevroompasswordslotmask_; +} +inline void RoomDataInternalUpdateInfo::_internal_set_prevroompasswordslotmask(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.prevroompasswordslotmask_ = value; +} + +// bytes newRoomGroup = 4; +inline void RoomDataInternalUpdateInfo::clear_newroomgroup() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.newroomgroup_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& RoomDataInternalUpdateInfo::newroomgroup() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternalUpdateInfo.newRoomGroup) + return _internal_newroomgroup(); +} +template +PROTOBUF_ALWAYS_INLINE void RoomDataInternalUpdateInfo::set_newroomgroup(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.newroomgroup_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.RoomDataInternalUpdateInfo.newRoomGroup) +} +inline ::std::string* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::mutable_newroomgroup() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_newroomgroup(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataInternalUpdateInfo.newRoomGroup) + return _s; +} +inline const ::std::string& RoomDataInternalUpdateInfo::_internal_newroomgroup() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.newroomgroup_.Get(); +} +inline void RoomDataInternalUpdateInfo::_internal_set_newroomgroup(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.newroomgroup_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::_internal_mutable_newroomgroup() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.newroomgroup_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE RoomDataInternalUpdateInfo::release_newroomgroup() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomDataInternalUpdateInfo.newRoomGroup) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.newroomgroup_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.newroomgroup_.Set("", GetArena()); + } + return released; +} +inline void RoomDataInternalUpdateInfo::set_allocated_newroomgroup(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.newroomgroup_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.newroomgroup_.IsDefault()) { + _impl_.newroomgroup_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomDataInternalUpdateInfo.newRoomGroup) +} + +// repeated .np2_structs.uint16 newRoomBinAttrInternal = 5; +inline int RoomDataInternalUpdateInfo::_internal_newroombinattrinternal_size() const { + return _internal_newroombinattrinternal().size(); +} +inline int RoomDataInternalUpdateInfo::newroombinattrinternal_size() const { + return _internal_newroombinattrinternal_size(); +} +inline void RoomDataInternalUpdateInfo::clear_newroombinattrinternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.newroombinattrinternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::mutable_newroombinattrinternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomDataInternalUpdateInfo.newRoomBinAttrInternal) + return _internal_mutable_newroombinattrinternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::mutable_newroombinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomDataInternalUpdateInfo.newRoomBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_newroombinattrinternal(); +} +inline const ::np2_structs::uint16& RoomDataInternalUpdateInfo::newroombinattrinternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomDataInternalUpdateInfo.newRoomBinAttrInternal) + return _internal_newroombinattrinternal().Get(index); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomDataInternalUpdateInfo::add_newroombinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::uint16* _add = + _internal_mutable_newroombinattrinternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.RoomDataInternalUpdateInfo.newRoomBinAttrInternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& RoomDataInternalUpdateInfo::newroombinattrinternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomDataInternalUpdateInfo.newRoomBinAttrInternal) + return _internal_newroombinattrinternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& +RoomDataInternalUpdateInfo::_internal_newroombinattrinternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.newroombinattrinternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL +RoomDataInternalUpdateInfo::_internal_mutable_newroombinattrinternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.newroombinattrinternal_; +} + +// ------------------------------------------------------------------- + +// RoomMemberDataInternalUpdateInfo + +// .np2_structs.RoomMemberDataInternal newRoomMemberDataInternal = 1; +inline bool RoomMemberDataInternalUpdateInfo::has_newroommemberdatainternal() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.newroommemberdatainternal_ != nullptr); + return value; +} +inline void RoomMemberDataInternalUpdateInfo::clear_newroommemberdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.newroommemberdatainternal_ != nullptr) _impl_.newroommemberdatainternal_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::RoomMemberDataInternal& RoomMemberDataInternalUpdateInfo::_internal_newroommemberdatainternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::RoomMemberDataInternal* p = _impl_.newroommemberdatainternal_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_RoomMemberDataInternal_default_instance_); +} +inline const ::np2_structs::RoomMemberDataInternal& RoomMemberDataInternalUpdateInfo::newroommemberdatainternal() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberDataInternal) + return _internal_newroommemberdatainternal(); +} +inline void RoomMemberDataInternalUpdateInfo::unsafe_arena_set_allocated_newroommemberdatainternal( + ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.newroommemberdatainternal_); + } + _impl_.newroommemberdatainternal_ = reinterpret_cast<::np2_structs::RoomMemberDataInternal*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberDataInternal) +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE RoomMemberDataInternalUpdateInfo::release_newroommemberdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::RoomMemberDataInternal* released = _impl_.newroommemberdatainternal_; + _impl_.newroommemberdatainternal_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE RoomMemberDataInternalUpdateInfo::unsafe_arena_release_newroommemberdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberDataInternal) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::RoomMemberDataInternal* temp = _impl_.newroommemberdatainternal_; + _impl_.newroommemberdatainternal_ = nullptr; + return temp; +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::_internal_mutable_newroommemberdatainternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.newroommemberdatainternal_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::RoomMemberDataInternal>(GetArena()); + _impl_.newroommemberdatainternal_ = reinterpret_cast<::np2_structs::RoomMemberDataInternal*>(p); + } + return _impl_.newroommemberdatainternal_; +} +inline ::np2_structs::RoomMemberDataInternal* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::mutable_newroommemberdatainternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::RoomMemberDataInternal* _msg = _internal_mutable_newroommemberdatainternal(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberDataInternal) + return _msg; +} +inline void RoomMemberDataInternalUpdateInfo::set_allocated_newroommemberdatainternal(::np2_structs::RoomMemberDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.newroommemberdatainternal_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.newroommemberdatainternal_ = reinterpret_cast<::np2_structs::RoomMemberDataInternal*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberDataInternal) +} + +// uint32 prevFlagAttr = 2; +inline void RoomMemberDataInternalUpdateInfo::clear_prevflagattr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.prevflagattr_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t RoomMemberDataInternalUpdateInfo::prevflagattr() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternalUpdateInfo.prevFlagAttr) + return _internal_prevflagattr(); +} +inline void RoomMemberDataInternalUpdateInfo::set_prevflagattr(::uint32_t value) { + _internal_set_prevflagattr(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.RoomMemberDataInternalUpdateInfo.prevFlagAttr) +} +inline ::uint32_t RoomMemberDataInternalUpdateInfo::_internal_prevflagattr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.prevflagattr_; +} +inline void RoomMemberDataInternalUpdateInfo::_internal_set_prevflagattr(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.prevflagattr_ = value; +} + +// .np2_structs.uint8 prevTeamId = 3; +inline bool RoomMemberDataInternalUpdateInfo::has_prevteamid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.prevteamid_ != nullptr); + return value; +} +inline void RoomMemberDataInternalUpdateInfo::clear_prevteamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.prevteamid_ != nullptr) _impl_.prevteamid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::uint8& RoomMemberDataInternalUpdateInfo::_internal_prevteamid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.prevteamid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& RoomMemberDataInternalUpdateInfo::prevteamid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternalUpdateInfo.prevTeamId) + return _internal_prevteamid(); +} +inline void RoomMemberDataInternalUpdateInfo::unsafe_arena_set_allocated_prevteamid( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.prevteamid_); + } + _impl_.prevteamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberDataInternalUpdateInfo.prevTeamId) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberDataInternalUpdateInfo::release_prevteamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* released = _impl_.prevteamid_; + _impl_.prevteamid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberDataInternalUpdateInfo::unsafe_arena_release_prevteamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberDataInternalUpdateInfo.prevTeamId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* temp = _impl_.prevteamid_; + _impl_.prevteamid_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::_internal_mutable_prevteamid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.prevteamid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.prevteamid_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.prevteamid_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::mutable_prevteamid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* _msg = _internal_mutable_prevteamid(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataInternalUpdateInfo.prevTeamId) + return _msg; +} +inline void RoomMemberDataInternalUpdateInfo::set_allocated_prevteamid(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.prevteamid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.prevteamid_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberDataInternalUpdateInfo.prevTeamId) +} + +// repeated .np2_structs.uint16 newRoomMemberBinAttrInternal = 4; +inline int RoomMemberDataInternalUpdateInfo::_internal_newroommemberbinattrinternal_size() const { + return _internal_newroommemberbinattrinternal().size(); +} +inline int RoomMemberDataInternalUpdateInfo::newroommemberbinattrinternal_size() const { + return _internal_newroommemberbinattrinternal_size(); +} +inline void RoomMemberDataInternalUpdateInfo::clear_newroommemberbinattrinternal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.newroommemberbinattrinternal_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::mutable_newroommemberbinattrinternal(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberBinAttrInternal) + return _internal_mutable_newroommemberbinattrinternal()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::mutable_newroommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberBinAttrInternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_newroommemberbinattrinternal(); +} +inline const ::np2_structs::uint16& RoomMemberDataInternalUpdateInfo::newroommemberbinattrinternal(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberBinAttrInternal) + return _internal_newroommemberbinattrinternal().Get(index); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomMemberDataInternalUpdateInfo::add_newroommemberbinattrinternal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::uint16* _add = + _internal_mutable_newroommemberbinattrinternal()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberBinAttrInternal) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& RoomMemberDataInternalUpdateInfo::newroommemberbinattrinternal() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomMemberDataInternalUpdateInfo.newRoomMemberBinAttrInternal) + return _internal_newroommemberbinattrinternal(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& +RoomMemberDataInternalUpdateInfo::_internal_newroommemberbinattrinternal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.newroommemberbinattrinternal_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL +RoomMemberDataInternalUpdateInfo::_internal_mutable_newroommemberbinattrinternal() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.newroommemberbinattrinternal_; +} + +// ------------------------------------------------------------------- + +// GetPingInfoResponse + +// .np2_structs.uint16 serverId = 1; +inline bool GetPingInfoResponse::has_serverid() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.serverid_ != nullptr); + return value; +} +inline void GetPingInfoResponse::clear_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.serverid_ != nullptr) _impl_.serverid_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::uint16& GetPingInfoResponse::_internal_serverid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.serverid_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& GetPingInfoResponse::serverid() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetPingInfoResponse.serverId) + return _internal_serverid(); +} +inline void GetPingInfoResponse::unsafe_arena_set_allocated_serverid( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.serverid_); + } + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.GetPingInfoResponse.serverId) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE GetPingInfoResponse::release_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* released = _impl_.serverid_; + _impl_.serverid_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE GetPingInfoResponse::unsafe_arena_release_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.GetPingInfoResponse.serverId) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* temp = _impl_.serverid_; + _impl_.serverid_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetPingInfoResponse::_internal_mutable_serverid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.serverid_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.serverid_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL GetPingInfoResponse::mutable_serverid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::uint16* _msg = _internal_mutable_serverid(); + // @@protoc_insertion_point(field_mutable:np2_structs.GetPingInfoResponse.serverId) + return _msg; +} +inline void GetPingInfoResponse::set_allocated_serverid(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.serverid_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.serverid_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.GetPingInfoResponse.serverId) +} + +// uint32 worldId = 2; +inline void GetPingInfoResponse::clear_worldid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t GetPingInfoResponse::worldid() const { + // @@protoc_insertion_point(field_get:np2_structs.GetPingInfoResponse.worldId) + return _internal_worldid(); +} +inline void GetPingInfoResponse::set_worldid(::uint32_t value) { + _internal_set_worldid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.GetPingInfoResponse.worldId) +} +inline ::uint32_t GetPingInfoResponse::_internal_worldid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.worldid_; +} +inline void GetPingInfoResponse::_internal_set_worldid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.worldid_ = value; +} + +// uint64 roomId = 3; +inline void GetPingInfoResponse::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint64_t GetPingInfoResponse::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.GetPingInfoResponse.roomId) + return _internal_roomid(); +} +inline void GetPingInfoResponse::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.GetPingInfoResponse.roomId) +} +inline ::uint64_t GetPingInfoResponse::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void GetPingInfoResponse::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// uint32 rtt = 4; +inline void GetPingInfoResponse::clear_rtt() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rtt_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t GetPingInfoResponse::rtt() const { + // @@protoc_insertion_point(field_get:np2_structs.GetPingInfoResponse.rtt) + return _internal_rtt(); +} +inline void GetPingInfoResponse::set_rtt(::uint32_t value) { + _internal_set_rtt(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.GetPingInfoResponse.rtt) +} +inline ::uint32_t GetPingInfoResponse::_internal_rtt() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.rtt_; +} +inline void GetPingInfoResponse::_internal_set_rtt(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rtt_ = value; +} + +// ------------------------------------------------------------------- + +// SendRoomMessageRequest + +// uint64 roomId = 1; +inline void SendRoomMessageRequest::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::uint64_t SendRoomMessageRequest::roomid() const { + // @@protoc_insertion_point(field_get:np2_structs.SendRoomMessageRequest.roomId) + return _internal_roomid(); +} +inline void SendRoomMessageRequest::set_roomid(::uint64_t value) { + _internal_set_roomid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.SendRoomMessageRequest.roomId) +} +inline ::uint64_t SendRoomMessageRequest::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_; +} +inline void SendRoomMessageRequest::_internal_set_roomid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_ = value; +} + +// .np2_structs.uint8 castType = 2; +inline bool SendRoomMessageRequest::has_casttype() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.casttype_ != nullptr); + return value; +} +inline void SendRoomMessageRequest::clear_casttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.casttype_ != nullptr) _impl_.casttype_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::uint8& SendRoomMessageRequest::_internal_casttype() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.casttype_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& SendRoomMessageRequest::casttype() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SendRoomMessageRequest.castType) + return _internal_casttype(); +} +inline void SendRoomMessageRequest::unsafe_arena_set_allocated_casttype( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.casttype_); + } + _impl_.casttype_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.SendRoomMessageRequest.castType) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE SendRoomMessageRequest::release_casttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* released = _impl_.casttype_; + _impl_.casttype_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE SendRoomMessageRequest::unsafe_arena_release_casttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SendRoomMessageRequest.castType) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* temp = _impl_.casttype_; + _impl_.casttype_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL SendRoomMessageRequest::_internal_mutable_casttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.casttype_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.casttype_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.casttype_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL SendRoomMessageRequest::mutable_casttype() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* _msg = _internal_mutable_casttype(); + // @@protoc_insertion_point(field_mutable:np2_structs.SendRoomMessageRequest.castType) + return _msg; +} +inline void SendRoomMessageRequest::set_allocated_casttype(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.casttype_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.casttype_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.SendRoomMessageRequest.castType) +} + +// repeated .np2_structs.uint16 dst = 3; +inline int SendRoomMessageRequest::_internal_dst_size() const { + return _internal_dst().size(); +} +inline int SendRoomMessageRequest::dst_size() const { + return _internal_dst_size(); +} +inline void SendRoomMessageRequest::clear_dst() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.dst_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SendRoomMessageRequest::mutable_dst(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SendRoomMessageRequest.dst) + return _internal_mutable_dst()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL SendRoomMessageRequest::mutable_dst() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SendRoomMessageRequest.dst) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_dst(); +} +inline const ::np2_structs::uint16& SendRoomMessageRequest::dst(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SendRoomMessageRequest.dst) + return _internal_dst().Get(index); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL SendRoomMessageRequest::add_dst() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::uint16* _add = + _internal_mutable_dst()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.SendRoomMessageRequest.dst) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& SendRoomMessageRequest::dst() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SendRoomMessageRequest.dst) + return _internal_dst(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& +SendRoomMessageRequest::_internal_dst() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.dst_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL +SendRoomMessageRequest::_internal_mutable_dst() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.dst_; +} + +// bytes msg = 4; +inline void SendRoomMessageRequest::clear_msg() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.msg_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& SendRoomMessageRequest::msg() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SendRoomMessageRequest.msg) + return _internal_msg(); +} +template +PROTOBUF_ALWAYS_INLINE void SendRoomMessageRequest::set_msg(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.msg_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.SendRoomMessageRequest.msg) +} +inline ::std::string* PROTOBUF_NONNULL SendRoomMessageRequest::mutable_msg() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_msg(); + // @@protoc_insertion_point(field_mutable:np2_structs.SendRoomMessageRequest.msg) + return _s; +} +inline const ::std::string& SendRoomMessageRequest::_internal_msg() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.msg_.Get(); +} +inline void SendRoomMessageRequest::_internal_set_msg(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.msg_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL SendRoomMessageRequest::_internal_mutable_msg() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.msg_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE SendRoomMessageRequest::release_msg() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SendRoomMessageRequest.msg) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.msg_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.msg_.Set("", GetArena()); + } + return released; +} +inline void SendRoomMessageRequest::set_allocated_msg(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.msg_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.msg_.IsDefault()) { + _impl_.msg_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.SendRoomMessageRequest.msg) +} + +// .np2_structs.uint8 option = 5; +inline bool SendRoomMessageRequest::has_option() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000008U); + PROTOBUF_ASSUME(!value || _impl_.option_ != nullptr); + return value; +} +inline void SendRoomMessageRequest::clear_option() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.option_ != nullptr) _impl_.option_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::np2_structs::uint8& SendRoomMessageRequest::_internal_option() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.option_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& SendRoomMessageRequest::option() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SendRoomMessageRequest.option) + return _internal_option(); +} +inline void SendRoomMessageRequest::unsafe_arena_set_allocated_option( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.option_); + } + _impl_.option_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.SendRoomMessageRequest.option) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE SendRoomMessageRequest::release_option() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::uint8* released = _impl_.option_; + _impl_.option_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE SendRoomMessageRequest::unsafe_arena_release_option() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SendRoomMessageRequest.option) + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::uint8* temp = _impl_.option_; + _impl_.option_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL SendRoomMessageRequest::_internal_mutable_option() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.option_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.option_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.option_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL SendRoomMessageRequest::mutable_option() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::uint8* _msg = _internal_mutable_option(); + // @@protoc_insertion_point(field_mutable:np2_structs.SendRoomMessageRequest.option) + return _msg; +} +inline void SendRoomMessageRequest::set_allocated_option(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.option_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + + _impl_.option_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.SendRoomMessageRequest.option) +} + +// ------------------------------------------------------------------- + +// RoomMessageInfo + +// bool filtered = 1; +inline void RoomMessageInfo::clear_filtered() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.filtered_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline bool RoomMessageInfo::filtered() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomMessageInfo.filtered) + return _internal_filtered(); +} +inline void RoomMessageInfo::set_filtered(bool value) { + _internal_set_filtered(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.RoomMessageInfo.filtered) +} +inline bool RoomMessageInfo::_internal_filtered() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.filtered_; +} +inline void RoomMessageInfo::_internal_set_filtered(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.filtered_ = value; +} + +// .np2_structs.uint8 castType = 2; +inline bool RoomMessageInfo::has_casttype() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.casttype_ != nullptr); + return value; +} +inline void RoomMessageInfo::clear_casttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.casttype_ != nullptr) _impl_.casttype_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::uint8& RoomMessageInfo::_internal_casttype() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.casttype_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& RoomMessageInfo::casttype() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMessageInfo.castType) + return _internal_casttype(); +} +inline void RoomMessageInfo::unsafe_arena_set_allocated_casttype( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.casttype_); + } + _impl_.casttype_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMessageInfo.castType) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMessageInfo::release_casttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* released = _impl_.casttype_; + _impl_.casttype_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMessageInfo::unsafe_arena_release_casttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMessageInfo.castType) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* temp = _impl_.casttype_; + _impl_.casttype_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMessageInfo::_internal_mutable_casttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.casttype_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.casttype_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.casttype_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMessageInfo::mutable_casttype() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::uint8* _msg = _internal_mutable_casttype(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMessageInfo.castType) + return _msg; +} +inline void RoomMessageInfo::set_allocated_casttype(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.casttype_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.casttype_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMessageInfo.castType) +} + +// repeated .np2_structs.uint16 dst = 3; +inline int RoomMessageInfo::_internal_dst_size() const { + return _internal_dst().size(); +} +inline int RoomMessageInfo::dst_size() const { + return _internal_dst_size(); +} +inline void RoomMessageInfo::clear_dst() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.dst_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomMessageInfo::mutable_dst(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMessageInfo.dst) + return _internal_mutable_dst()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL RoomMessageInfo::mutable_dst() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.RoomMessageInfo.dst) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_dst(); +} +inline const ::np2_structs::uint16& RoomMessageInfo::dst(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMessageInfo.dst) + return _internal_dst().Get(index); +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL RoomMessageInfo::add_dst() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::uint16* _add = + _internal_mutable_dst()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.RoomMessageInfo.dst) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& RoomMessageInfo::dst() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.RoomMessageInfo.dst) + return _internal_dst(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>& +RoomMessageInfo::_internal_dst() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.dst_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::uint16>* PROTOBUF_NONNULL +RoomMessageInfo::_internal_mutable_dst() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.dst_; +} + +// .np2_structs.UserInfo srcMember = 4; +inline bool RoomMessageInfo::has_srcmember() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000008U); + PROTOBUF_ASSUME(!value || _impl_.srcmember_ != nullptr); + return value; +} +inline void RoomMessageInfo::clear_srcmember() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.srcmember_ != nullptr) _impl_.srcmember_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::np2_structs::UserInfo& RoomMessageInfo::_internal_srcmember() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::UserInfo* p = _impl_.srcmember_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_UserInfo_default_instance_); +} +inline const ::np2_structs::UserInfo& RoomMessageInfo::srcmember() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMessageInfo.srcMember) + return _internal_srcmember(); +} +inline void RoomMessageInfo::unsafe_arena_set_allocated_srcmember( + ::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.srcmember_); + } + _impl_.srcmember_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMessageInfo.srcMember) +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE RoomMessageInfo::release_srcmember() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::UserInfo* released = _impl_.srcmember_; + _impl_.srcmember_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE RoomMessageInfo::unsafe_arena_release_srcmember() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMessageInfo.srcMember) + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::UserInfo* temp = _impl_.srcmember_; + _impl_.srcmember_ = nullptr; + return temp; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL RoomMessageInfo::_internal_mutable_srcmember() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.srcmember_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::UserInfo>(GetArena()); + _impl_.srcmember_ = reinterpret_cast<::np2_structs::UserInfo*>(p); + } + return _impl_.srcmember_; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL RoomMessageInfo::mutable_srcmember() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::UserInfo* _msg = _internal_mutable_srcmember(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMessageInfo.srcMember) + return _msg; +} +inline void RoomMessageInfo::set_allocated_srcmember(::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.srcmember_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + + _impl_.srcmember_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMessageInfo.srcMember) +} + +// bytes msg = 5; +inline void RoomMessageInfo::clear_msg() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.msg_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& RoomMessageInfo::msg() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMessageInfo.msg) + return _internal_msg(); +} +template +PROTOBUF_ALWAYS_INLINE void RoomMessageInfo::set_msg(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.msg_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.RoomMessageInfo.msg) +} +inline ::std::string* PROTOBUF_NONNULL RoomMessageInfo::mutable_msg() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_msg(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMessageInfo.msg) + return _s; +} +inline const ::std::string& RoomMessageInfo::_internal_msg() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.msg_.Get(); +} +inline void RoomMessageInfo::_internal_set_msg(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.msg_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL RoomMessageInfo::_internal_mutable_msg() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.msg_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE RoomMessageInfo::release_msg() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMessageInfo.msg) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.msg_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.msg_.Set("", GetArena()); + } + return released; +} +inline void RoomMessageInfo::set_allocated_msg(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.msg_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.msg_.IsDefault()) { + _impl_.msg_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMessageInfo.msg) +} + +// ------------------------------------------------------------------- + +// MessageDetails + +// string communicationId = 1; +inline void MessageDetails::clear_communicationid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.communicationid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& MessageDetails::communicationid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MessageDetails.communicationId) + return _internal_communicationid(); +} +template +PROTOBUF_ALWAYS_INLINE void MessageDetails::set_communicationid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.communicationid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MessageDetails.communicationId) +} +inline ::std::string* PROTOBUF_NONNULL MessageDetails::mutable_communicationid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_communicationid(); + // @@protoc_insertion_point(field_mutable:np2_structs.MessageDetails.communicationId) + return _s; +} +inline const ::std::string& MessageDetails::_internal_communicationid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.communicationid_.Get(); +} +inline void MessageDetails::_internal_set_communicationid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.communicationid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MessageDetails::_internal_mutable_communicationid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.communicationid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MessageDetails::release_communicationid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MessageDetails.communicationId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.communicationid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.communicationid_.Set("", GetArena()); + } + return released; +} +inline void MessageDetails::set_allocated_communicationid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.communicationid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.communicationid_.IsDefault()) { + _impl_.communicationid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MessageDetails.communicationId) +} + +// uint64 msgId = 2; +inline void MessageDetails::clear_msgid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.msgid_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000040U); +} +inline ::uint64_t MessageDetails::msgid() const { + // @@protoc_insertion_point(field_get:np2_structs.MessageDetails.msgId) + return _internal_msgid(); +} +inline void MessageDetails::set_msgid(::uint64_t value) { + _internal_set_msgid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_set:np2_structs.MessageDetails.msgId) +} +inline ::uint64_t MessageDetails::_internal_msgid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.msgid_; +} +inline void MessageDetails::_internal_set_msgid(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.msgid_ = value; +} + +// .np2_structs.uint16 mainType = 3; +inline bool MessageDetails::has_maintype() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000010U); + PROTOBUF_ASSUME(!value || _impl_.maintype_ != nullptr); + return value; +} +inline void MessageDetails::clear_maintype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.maintype_ != nullptr) _impl_.maintype_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline const ::np2_structs::uint16& MessageDetails::_internal_maintype() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.maintype_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& MessageDetails::maintype() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MessageDetails.mainType) + return _internal_maintype(); +} +inline void MessageDetails::unsafe_arena_set_allocated_maintype( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.maintype_); + } + _impl_.maintype_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.MessageDetails.mainType) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE MessageDetails::release_maintype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint16* released = _impl_.maintype_; + _impl_.maintype_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE MessageDetails::unsafe_arena_release_maintype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MessageDetails.mainType) + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint16* temp = _impl_.maintype_; + _impl_.maintype_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL MessageDetails::_internal_mutable_maintype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.maintype_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.maintype_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.maintype_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL MessageDetails::mutable_maintype() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::uint16* _msg = _internal_mutable_maintype(); + // @@protoc_insertion_point(field_mutable:np2_structs.MessageDetails.mainType) + return _msg; +} +inline void MessageDetails::set_allocated_maintype(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.maintype_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + + _impl_.maintype_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.MessageDetails.mainType) +} + +// .np2_structs.uint16 subType = 4; +inline bool MessageDetails::has_subtype() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000020U); + PROTOBUF_ASSUME(!value || _impl_.subtype_ != nullptr); + return value; +} +inline void MessageDetails::clear_subtype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.subtype_ != nullptr) _impl_.subtype_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline const ::np2_structs::uint16& MessageDetails::_internal_subtype() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint16* p = _impl_.subtype_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint16_default_instance_); +} +inline const ::np2_structs::uint16& MessageDetails::subtype() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MessageDetails.subType) + return _internal_subtype(); +} +inline void MessageDetails::unsafe_arena_set_allocated_subtype( + ::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.subtype_); + } + _impl_.subtype_ = reinterpret_cast<::np2_structs::uint16*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000020U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.MessageDetails.subType) +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE MessageDetails::release_subtype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000020U); + ::np2_structs::uint16* released = _impl_.subtype_; + _impl_.subtype_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint16* PROTOBUF_NULLABLE MessageDetails::unsafe_arena_release_subtype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MessageDetails.subType) + + ClearHasBit(_impl_._has_bits_[0], 0x00000020U); + ::np2_structs::uint16* temp = _impl_.subtype_; + _impl_.subtype_ = nullptr; + return temp; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL MessageDetails::_internal_mutable_subtype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.subtype_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint16>(GetArena()); + _impl_.subtype_ = reinterpret_cast<::np2_structs::uint16*>(p); + } + return _impl_.subtype_; +} +inline ::np2_structs::uint16* PROTOBUF_NONNULL MessageDetails::mutable_subtype() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + ::np2_structs::uint16* _msg = _internal_mutable_subtype(); + // @@protoc_insertion_point(field_mutable:np2_structs.MessageDetails.subType) + return _msg; +} +inline void MessageDetails::set_allocated_subtype(::np2_structs::uint16* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.subtype_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000020U); + } + + _impl_.subtype_ = reinterpret_cast<::np2_structs::uint16*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.MessageDetails.subType) +} + +// uint32 msgFeatures = 5; +inline void MessageDetails::clear_msgfeatures() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.msgfeatures_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000080U); +} +inline ::uint32_t MessageDetails::msgfeatures() const { + // @@protoc_insertion_point(field_get:np2_structs.MessageDetails.msgFeatures) + return _internal_msgfeatures(); +} +inline void MessageDetails::set_msgfeatures(::uint32_t value) { + _internal_set_msgfeatures(value); + SetHasBit(_impl_._has_bits_[0], 0x00000080U); + // @@protoc_insertion_point(field_set:np2_structs.MessageDetails.msgFeatures) +} +inline ::uint32_t MessageDetails::_internal_msgfeatures() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.msgfeatures_; +} +inline void MessageDetails::_internal_set_msgfeatures(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.msgfeatures_ = value; +} + +// string subject = 6; +inline void MessageDetails::clear_subject() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.subject_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& MessageDetails::subject() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MessageDetails.subject) + return _internal_subject(); +} +template +PROTOBUF_ALWAYS_INLINE void MessageDetails::set_subject(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.subject_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MessageDetails.subject) +} +inline ::std::string* PROTOBUF_NONNULL MessageDetails::mutable_subject() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_subject(); + // @@protoc_insertion_point(field_mutable:np2_structs.MessageDetails.subject) + return _s; +} +inline const ::std::string& MessageDetails::_internal_subject() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.subject_.Get(); +} +inline void MessageDetails::_internal_set_subject(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.subject_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MessageDetails::_internal_mutable_subject() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.subject_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MessageDetails::release_subject() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MessageDetails.subject) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.subject_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.subject_.Set("", GetArena()); + } + return released; +} +inline void MessageDetails::set_allocated_subject(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.subject_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.subject_.IsDefault()) { + _impl_.subject_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MessageDetails.subject) +} + +// string body = 7; +inline void MessageDetails::clear_body() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.body_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::std::string& MessageDetails::body() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MessageDetails.body) + return _internal_body(); +} +template +PROTOBUF_ALWAYS_INLINE void MessageDetails::set_body(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + _impl_.body_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MessageDetails.body) +} +inline ::std::string* PROTOBUF_NONNULL MessageDetails::mutable_body() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::std::string* _s = _internal_mutable_body(); + // @@protoc_insertion_point(field_mutable:np2_structs.MessageDetails.body) + return _s; +} +inline const ::std::string& MessageDetails::_internal_body() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.body_.Get(); +} +inline void MessageDetails::_internal_set_body(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.body_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MessageDetails::_internal_mutable_body() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.body_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MessageDetails::release_body() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MessageDetails.body) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000004U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + auto* released = _impl_.body_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.body_.Set("", GetArena()); + } + return released; +} +inline void MessageDetails::set_allocated_body(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + _impl_.body_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.body_.IsDefault()) { + _impl_.body_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MessageDetails.body) +} + +// bytes data = 8; +inline void MessageDetails::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::std::string& MessageDetails::data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MessageDetails.data) + return _internal_data(); +} +template +PROTOBUF_ALWAYS_INLINE void MessageDetails::set_data(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + _impl_.data_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MessageDetails.data) +} +inline ::std::string* PROTOBUF_NONNULL MessageDetails::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::std::string* _s = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.MessageDetails.data) + return _s; +} +inline const ::std::string& MessageDetails::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.data_.Get(); +} +inline void MessageDetails::_internal_set_data(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MessageDetails::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.data_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MessageDetails::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MessageDetails.data) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000008U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + auto* released = _impl_.data_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.data_.Set("", GetArena()); + } + return released; +} +inline void MessageDetails::set_allocated_data(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + _impl_.data_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.data_.IsDefault()) { + _impl_.data_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MessageDetails.data) +} + +// ------------------------------------------------------------------- + +// SendMessageRequest + +// bytes message = 1; +inline void SendMessageRequest::clear_message() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.message_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& SendMessageRequest::message() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SendMessageRequest.message) + return _internal_message(); +} +template +PROTOBUF_ALWAYS_INLINE void SendMessageRequest::set_message(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.message_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.SendMessageRequest.message) +} +inline ::std::string* PROTOBUF_NONNULL SendMessageRequest::mutable_message() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_message(); + // @@protoc_insertion_point(field_mutable:np2_structs.SendMessageRequest.message) + return _s; +} +inline const ::std::string& SendMessageRequest::_internal_message() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.message_.Get(); +} +inline void SendMessageRequest::_internal_set_message(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.message_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL SendMessageRequest::_internal_mutable_message() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.message_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE SendMessageRequest::release_message() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SendMessageRequest.message) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.message_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.message_.Set("", GetArena()); + } + return released; +} +inline void SendMessageRequest::set_allocated_message(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.message_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.message_.IsDefault()) { + _impl_.message_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.SendMessageRequest.message) +} + +// repeated string npids = 2; +inline int SendMessageRequest::_internal_npids_size() const { + return _internal_npids().size(); +} +inline int SendMessageRequest::npids_size() const { + return _internal_npids_size(); +} +inline void SendMessageRequest::clear_npids() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npids_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::std::string* PROTOBUF_NONNULL SendMessageRequest::add_npids() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::std::string* _s = + _internal_mutable_npids()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add_mutable:np2_structs.SendMessageRequest.npids) + return _s; +} +inline const ::std::string& SendMessageRequest::npids(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SendMessageRequest.npids) + return _internal_npids().Get(index); +} +inline ::std::string* PROTOBUF_NONNULL SendMessageRequest::mutable_npids(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SendMessageRequest.npids) + return _internal_mutable_npids()->Mutable(index); +} +template +inline void SendMessageRequest::set_npids(int index, Arg_&& value, Args_... args) { + ::google::protobuf::internal::AssignToString(*_internal_mutable_npids()->Mutable(index), ::std::forward(value), + args... ); + // @@protoc_insertion_point(field_set:np2_structs.SendMessageRequest.npids) +} +template +inline void SendMessageRequest::add_npids(Arg_&& value, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::google::protobuf::internal::AddToRepeatedPtrField( + ::google::protobuf::MessageLite::internal_visibility(), GetArena(), + *_internal_mutable_npids(), ::std::forward(value), + args... ); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.SendMessageRequest.npids) +} +inline const ::google::protobuf::RepeatedPtrField<::std::string>& SendMessageRequest::npids() + const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SendMessageRequest.npids) + return _internal_npids(); +} +inline ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL +SendMessageRequest::mutable_npids() ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SendMessageRequest.npids) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_npids(); +} +inline const ::google::protobuf::RepeatedPtrField<::std::string>& +SendMessageRequest::_internal_npids() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.npids_; +} +inline ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL +SendMessageRequest::_internal_mutable_npids() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.npids_; +} + +// ------------------------------------------------------------------- + +// BoardInfo + +// uint32 rankLimit = 1; +inline void BoardInfo::clear_ranklimit() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.ranklimit_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint32_t BoardInfo::ranklimit() const { + // @@protoc_insertion_point(field_get:np2_structs.BoardInfo.rankLimit) + return _internal_ranklimit(); +} +inline void BoardInfo::set_ranklimit(::uint32_t value) { + _internal_set_ranklimit(value); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_set:np2_structs.BoardInfo.rankLimit) +} +inline ::uint32_t BoardInfo::_internal_ranklimit() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.ranklimit_; +} +inline void BoardInfo::_internal_set_ranklimit(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.ranklimit_ = value; +} + +// uint32 updateMode = 2; +inline void BoardInfo::clear_updatemode() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.updatemode_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t BoardInfo::updatemode() const { + // @@protoc_insertion_point(field_get:np2_structs.BoardInfo.updateMode) + return _internal_updatemode(); +} +inline void BoardInfo::set_updatemode(::uint32_t value) { + _internal_set_updatemode(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.BoardInfo.updateMode) +} +inline ::uint32_t BoardInfo::_internal_updatemode() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.updatemode_; +} +inline void BoardInfo::_internal_set_updatemode(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.updatemode_ = value; +} + +// uint32 sortMode = 3; +inline void BoardInfo::clear_sortmode() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.sortmode_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t BoardInfo::sortmode() const { + // @@protoc_insertion_point(field_get:np2_structs.BoardInfo.sortMode) + return _internal_sortmode(); +} +inline void BoardInfo::set_sortmode(::uint32_t value) { + _internal_set_sortmode(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.BoardInfo.sortMode) +} +inline ::uint32_t BoardInfo::_internal_sortmode() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.sortmode_; +} +inline void BoardInfo::_internal_set_sortmode(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.sortmode_ = value; +} + +// uint32 uploadNumLimit = 4; +inline void BoardInfo::clear_uploadnumlimit() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.uploadnumlimit_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t BoardInfo::uploadnumlimit() const { + // @@protoc_insertion_point(field_get:np2_structs.BoardInfo.uploadNumLimit) + return _internal_uploadnumlimit(); +} +inline void BoardInfo::set_uploadnumlimit(::uint32_t value) { + _internal_set_uploadnumlimit(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.BoardInfo.uploadNumLimit) +} +inline ::uint32_t BoardInfo::_internal_uploadnumlimit() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.uploadnumlimit_; +} +inline void BoardInfo::_internal_set_uploadnumlimit(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.uploadnumlimit_ = value; +} + +// uint32 uploadSizeLimit = 5; +inline void BoardInfo::clear_uploadsizelimit() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.uploadsizelimit_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::uint32_t BoardInfo::uploadsizelimit() const { + // @@protoc_insertion_point(field_get:np2_structs.BoardInfo.uploadSizeLimit) + return _internal_uploadsizelimit(); +} +inline void BoardInfo::set_uploadsizelimit(::uint32_t value) { + _internal_set_uploadsizelimit(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.BoardInfo.uploadSizeLimit) +} +inline ::uint32_t BoardInfo::_internal_uploadsizelimit() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.uploadsizelimit_; +} +inline void BoardInfo::_internal_set_uploadsizelimit(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.uploadsizelimit_ = value; +} + +// ------------------------------------------------------------------- + +// RecordScoreRequest + +// uint32 boardId = 1; +inline void RecordScoreRequest::clear_boardid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t RecordScoreRequest::boardid() const { + // @@protoc_insertion_point(field_get:np2_structs.RecordScoreRequest.boardId) + return _internal_boardid(); +} +inline void RecordScoreRequest::set_boardid(::uint32_t value) { + _internal_set_boardid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.RecordScoreRequest.boardId) +} +inline ::uint32_t RecordScoreRequest::_internal_boardid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.boardid_; +} +inline void RecordScoreRequest::_internal_set_boardid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = value; +} + +// int32 pcId = 2; +inline void RecordScoreRequest::clear_pcid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::int32_t RecordScoreRequest::pcid() const { + // @@protoc_insertion_point(field_get:np2_structs.RecordScoreRequest.pcId) + return _internal_pcid(); +} +inline void RecordScoreRequest::set_pcid(::int32_t value) { + _internal_set_pcid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.RecordScoreRequest.pcId) +} +inline ::int32_t RecordScoreRequest::_internal_pcid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.pcid_; +} +inline void RecordScoreRequest::_internal_set_pcid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = value; +} + +// int64 score = 3; +inline void RecordScoreRequest::clear_score() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.score_ = ::int64_t{0}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::int64_t RecordScoreRequest::score() const { + // @@protoc_insertion_point(field_get:np2_structs.RecordScoreRequest.score) + return _internal_score(); +} +inline void RecordScoreRequest::set_score(::int64_t value) { + _internal_set_score(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.RecordScoreRequest.score) +} +inline ::int64_t RecordScoreRequest::_internal_score() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.score_; +} +inline void RecordScoreRequest::_internal_set_score(::int64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.score_ = value; +} + +// string comment = 4; +inline void RecordScoreRequest::clear_comment() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.comment_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& RecordScoreRequest::comment() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RecordScoreRequest.comment) + return _internal_comment(); +} +template +PROTOBUF_ALWAYS_INLINE void RecordScoreRequest::set_comment(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.comment_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.RecordScoreRequest.comment) +} +inline ::std::string* PROTOBUF_NONNULL RecordScoreRequest::mutable_comment() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_comment(); + // @@protoc_insertion_point(field_mutable:np2_structs.RecordScoreRequest.comment) + return _s; +} +inline const ::std::string& RecordScoreRequest::_internal_comment() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.comment_.Get(); +} +inline void RecordScoreRequest::_internal_set_comment(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.comment_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL RecordScoreRequest::_internal_mutable_comment() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.comment_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE RecordScoreRequest::release_comment() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RecordScoreRequest.comment) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.comment_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.comment_.Set("", GetArena()); + } + return released; +} +inline void RecordScoreRequest::set_allocated_comment(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.comment_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.comment_.IsDefault()) { + _impl_.comment_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.RecordScoreRequest.comment) +} + +// bytes data = 5; +inline void RecordScoreRequest::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& RecordScoreRequest::data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RecordScoreRequest.data) + return _internal_data(); +} +template +PROTOBUF_ALWAYS_INLINE void RecordScoreRequest::set_data(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.data_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.RecordScoreRequest.data) +} +inline ::std::string* PROTOBUF_NONNULL RecordScoreRequest::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.RecordScoreRequest.data) + return _s; +} +inline const ::std::string& RecordScoreRequest::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.data_.Get(); +} +inline void RecordScoreRequest::_internal_set_data(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL RecordScoreRequest::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.data_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE RecordScoreRequest::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RecordScoreRequest.data) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.data_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.data_.Set("", GetArena()); + } + return released; +} +inline void RecordScoreRequest::set_allocated_data(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.data_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.data_.IsDefault()) { + _impl_.data_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.RecordScoreRequest.data) +} + +// ------------------------------------------------------------------- + +// GetScoreRangeRequest + +// uint32 boardId = 1; +inline void GetScoreRangeRequest::clear_boardid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint32_t GetScoreRangeRequest::boardid() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreRangeRequest.boardId) + return _internal_boardid(); +} +inline void GetScoreRangeRequest::set_boardid(::uint32_t value) { + _internal_set_boardid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreRangeRequest.boardId) +} +inline ::uint32_t GetScoreRangeRequest::_internal_boardid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.boardid_; +} +inline void GetScoreRangeRequest::_internal_set_boardid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = value; +} + +// uint32 startRank = 2; +inline void GetScoreRangeRequest::clear_startrank() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.startrank_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t GetScoreRangeRequest::startrank() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreRangeRequest.startRank) + return _internal_startrank(); +} +inline void GetScoreRangeRequest::set_startrank(::uint32_t value) { + _internal_set_startrank(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreRangeRequest.startRank) +} +inline ::uint32_t GetScoreRangeRequest::_internal_startrank() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.startrank_; +} +inline void GetScoreRangeRequest::_internal_set_startrank(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.startrank_ = value; +} + +// uint32 numRanks = 3; +inline void GetScoreRangeRequest::clear_numranks() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.numranks_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t GetScoreRangeRequest::numranks() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreRangeRequest.numRanks) + return _internal_numranks(); +} +inline void GetScoreRangeRequest::set_numranks(::uint32_t value) { + _internal_set_numranks(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreRangeRequest.numRanks) +} +inline ::uint32_t GetScoreRangeRequest::_internal_numranks() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.numranks_; +} +inline void GetScoreRangeRequest::_internal_set_numranks(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.numranks_ = value; +} + +// bool withComment = 4; +inline void GetScoreRangeRequest::clear_withcomment() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withcomment_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline bool GetScoreRangeRequest::withcomment() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreRangeRequest.withComment) + return _internal_withcomment(); +} +inline void GetScoreRangeRequest::set_withcomment(bool value) { + _internal_set_withcomment(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreRangeRequest.withComment) +} +inline bool GetScoreRangeRequest::_internal_withcomment() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.withcomment_; +} +inline void GetScoreRangeRequest::_internal_set_withcomment(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withcomment_ = value; +} + +// bool withGameInfo = 5; +inline void GetScoreRangeRequest::clear_withgameinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withgameinfo_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline bool GetScoreRangeRequest::withgameinfo() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreRangeRequest.withGameInfo) + return _internal_withgameinfo(); +} +inline void GetScoreRangeRequest::set_withgameinfo(bool value) { + _internal_set_withgameinfo(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreRangeRequest.withGameInfo) +} +inline bool GetScoreRangeRequest::_internal_withgameinfo() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.withgameinfo_; +} +inline void GetScoreRangeRequest::_internal_set_withgameinfo(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withgameinfo_ = value; +} + +// ------------------------------------------------------------------- + +// ScoreNpIdPcId + +// string npid = 1; +inline void ScoreNpIdPcId::clear_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& ScoreNpIdPcId::npid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.ScoreNpIdPcId.npid) + return _internal_npid(); +} +template +PROTOBUF_ALWAYS_INLINE void ScoreNpIdPcId::set_npid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.npid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.ScoreNpIdPcId.npid) +} +inline ::std::string* PROTOBUF_NONNULL ScoreNpIdPcId::mutable_npid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_npid(); + // @@protoc_insertion_point(field_mutable:np2_structs.ScoreNpIdPcId.npid) + return _s; +} +inline const ::std::string& ScoreNpIdPcId::_internal_npid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.npid_.Get(); +} +inline void ScoreNpIdPcId::_internal_set_npid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL ScoreNpIdPcId::_internal_mutable_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.npid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE ScoreNpIdPcId::release_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.ScoreNpIdPcId.npid) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.npid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.npid_.Set("", GetArena()); + } + return released; +} +inline void ScoreNpIdPcId::set_allocated_npid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.npid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.npid_.IsDefault()) { + _impl_.npid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.ScoreNpIdPcId.npid) +} + +// int32 pcId = 2; +inline void ScoreNpIdPcId::clear_pcid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::int32_t ScoreNpIdPcId::pcid() const { + // @@protoc_insertion_point(field_get:np2_structs.ScoreNpIdPcId.pcId) + return _internal_pcid(); +} +inline void ScoreNpIdPcId::set_pcid(::int32_t value) { + _internal_set_pcid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.ScoreNpIdPcId.pcId) +} +inline ::int32_t ScoreNpIdPcId::_internal_pcid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.pcid_; +} +inline void ScoreNpIdPcId::_internal_set_pcid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = value; +} + +// ------------------------------------------------------------------- + +// GetScoreNpIdRequest + +// uint32 boardId = 1; +inline void GetScoreNpIdRequest::clear_boardid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t GetScoreNpIdRequest::boardid() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreNpIdRequest.boardId) + return _internal_boardid(); +} +inline void GetScoreNpIdRequest::set_boardid(::uint32_t value) { + _internal_set_boardid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreNpIdRequest.boardId) +} +inline ::uint32_t GetScoreNpIdRequest::_internal_boardid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.boardid_; +} +inline void GetScoreNpIdRequest::_internal_set_boardid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = value; +} + +// repeated .np2_structs.ScoreNpIdPcId npids = 2; +inline int GetScoreNpIdRequest::_internal_npids_size() const { + return _internal_npids().size(); +} +inline int GetScoreNpIdRequest::npids_size() const { + return _internal_npids_size(); +} +inline void GetScoreNpIdRequest::clear_npids() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npids_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::ScoreNpIdPcId* PROTOBUF_NONNULL GetScoreNpIdRequest::mutable_npids(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetScoreNpIdRequest.npids) + return _internal_mutable_npids()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreNpIdPcId>* PROTOBUF_NONNULL GetScoreNpIdRequest::mutable_npids() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetScoreNpIdRequest.npids) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_npids(); +} +inline const ::np2_structs::ScoreNpIdPcId& GetScoreNpIdRequest::npids(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreNpIdRequest.npids) + return _internal_npids().Get(index); +} +inline ::np2_structs::ScoreNpIdPcId* PROTOBUF_NONNULL GetScoreNpIdRequest::add_npids() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::ScoreNpIdPcId* _add = + _internal_mutable_npids()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.GetScoreNpIdRequest.npids) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreNpIdPcId>& GetScoreNpIdRequest::npids() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetScoreNpIdRequest.npids) + return _internal_npids(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreNpIdPcId>& +GetScoreNpIdRequest::_internal_npids() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.npids_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreNpIdPcId>* PROTOBUF_NONNULL +GetScoreNpIdRequest::_internal_mutable_npids() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.npids_; +} + +// bool withComment = 3; +inline void GetScoreNpIdRequest::clear_withcomment() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withcomment_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline bool GetScoreNpIdRequest::withcomment() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreNpIdRequest.withComment) + return _internal_withcomment(); +} +inline void GetScoreNpIdRequest::set_withcomment(bool value) { + _internal_set_withcomment(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreNpIdRequest.withComment) +} +inline bool GetScoreNpIdRequest::_internal_withcomment() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.withcomment_; +} +inline void GetScoreNpIdRequest::_internal_set_withcomment(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withcomment_ = value; +} + +// bool withGameInfo = 4; +inline void GetScoreNpIdRequest::clear_withgameinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withgameinfo_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline bool GetScoreNpIdRequest::withgameinfo() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreNpIdRequest.withGameInfo) + return _internal_withgameinfo(); +} +inline void GetScoreNpIdRequest::set_withgameinfo(bool value) { + _internal_set_withgameinfo(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreNpIdRequest.withGameInfo) +} +inline bool GetScoreNpIdRequest::_internal_withgameinfo() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.withgameinfo_; +} +inline void GetScoreNpIdRequest::_internal_set_withgameinfo(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withgameinfo_ = value; +} + +// ------------------------------------------------------------------- + +// GetScoreFriendsRequest + +// uint32 boardId = 1; +inline void GetScoreFriendsRequest::clear_boardid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint32_t GetScoreFriendsRequest::boardid() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreFriendsRequest.boardId) + return _internal_boardid(); +} +inline void GetScoreFriendsRequest::set_boardid(::uint32_t value) { + _internal_set_boardid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreFriendsRequest.boardId) +} +inline ::uint32_t GetScoreFriendsRequest::_internal_boardid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.boardid_; +} +inline void GetScoreFriendsRequest::_internal_set_boardid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = value; +} + +// bool include_self = 2; +inline void GetScoreFriendsRequest::clear_include_self() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.include_self_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline bool GetScoreFriendsRequest::include_self() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreFriendsRequest.include_self) + return _internal_include_self(); +} +inline void GetScoreFriendsRequest::set_include_self(bool value) { + _internal_set_include_self(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreFriendsRequest.include_self) +} +inline bool GetScoreFriendsRequest::_internal_include_self() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.include_self_; +} +inline void GetScoreFriendsRequest::_internal_set_include_self(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.include_self_ = value; +} + +// uint32 max = 3; +inline void GetScoreFriendsRequest::clear_max() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.max_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t GetScoreFriendsRequest::max() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreFriendsRequest.max) + return _internal_max(); +} +inline void GetScoreFriendsRequest::set_max(::uint32_t value) { + _internal_set_max(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreFriendsRequest.max) +} +inline ::uint32_t GetScoreFriendsRequest::_internal_max() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.max_; +} +inline void GetScoreFriendsRequest::_internal_set_max(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.max_ = value; +} + +// bool withComment = 4; +inline void GetScoreFriendsRequest::clear_withcomment() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withcomment_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline bool GetScoreFriendsRequest::withcomment() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreFriendsRequest.withComment) + return _internal_withcomment(); +} +inline void GetScoreFriendsRequest::set_withcomment(bool value) { + _internal_set_withcomment(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreFriendsRequest.withComment) +} +inline bool GetScoreFriendsRequest::_internal_withcomment() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.withcomment_; +} +inline void GetScoreFriendsRequest::_internal_set_withcomment(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withcomment_ = value; +} + +// bool withGameInfo = 5; +inline void GetScoreFriendsRequest::clear_withgameinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withgameinfo_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline bool GetScoreFriendsRequest::withgameinfo() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreFriendsRequest.withGameInfo) + return _internal_withgameinfo(); +} +inline void GetScoreFriendsRequest::set_withgameinfo(bool value) { + _internal_set_withgameinfo(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreFriendsRequest.withGameInfo) +} +inline bool GetScoreFriendsRequest::_internal_withgameinfo() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.withgameinfo_; +} +inline void GetScoreFriendsRequest::_internal_set_withgameinfo(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.withgameinfo_ = value; +} + +// ------------------------------------------------------------------- + +// ScoreRankData + +// string npId = 1; +inline void ScoreRankData::clear_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& ScoreRankData::npid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.ScoreRankData.npId) + return _internal_npid(); +} +template +PROTOBUF_ALWAYS_INLINE void ScoreRankData::set_npid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.npid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.ScoreRankData.npId) +} +inline ::std::string* PROTOBUF_NONNULL ScoreRankData::mutable_npid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_npid(); + // @@protoc_insertion_point(field_mutable:np2_structs.ScoreRankData.npId) + return _s; +} +inline const ::std::string& ScoreRankData::_internal_npid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.npid_.Get(); +} +inline void ScoreRankData::_internal_set_npid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL ScoreRankData::_internal_mutable_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.npid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE ScoreRankData::release_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.ScoreRankData.npId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.npid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.npid_.Set("", GetArena()); + } + return released; +} +inline void ScoreRankData::set_allocated_npid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.npid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.npid_.IsDefault()) { + _impl_.npid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.ScoreRankData.npId) +} + +// string onlineName = 2; +inline void ScoreRankData::clear_onlinename() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.onlinename_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& ScoreRankData::onlinename() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.ScoreRankData.onlineName) + return _internal_onlinename(); +} +template +PROTOBUF_ALWAYS_INLINE void ScoreRankData::set_onlinename(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.onlinename_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.ScoreRankData.onlineName) +} +inline ::std::string* PROTOBUF_NONNULL ScoreRankData::mutable_onlinename() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_onlinename(); + // @@protoc_insertion_point(field_mutable:np2_structs.ScoreRankData.onlineName) + return _s; +} +inline const ::std::string& ScoreRankData::_internal_onlinename() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.onlinename_.Get(); +} +inline void ScoreRankData::_internal_set_onlinename(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.onlinename_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL ScoreRankData::_internal_mutable_onlinename() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.onlinename_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE ScoreRankData::release_onlinename() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.ScoreRankData.onlineName) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.onlinename_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.onlinename_.Set("", GetArena()); + } + return released; +} +inline void ScoreRankData::set_allocated_onlinename(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.onlinename_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.onlinename_.IsDefault()) { + _impl_.onlinename_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.ScoreRankData.onlineName) +} + +// int32 pcId = 3; +inline void ScoreRankData::clear_pcid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::int32_t ScoreRankData::pcid() const { + // @@protoc_insertion_point(field_get:np2_structs.ScoreRankData.pcId) + return _internal_pcid(); +} +inline void ScoreRankData::set_pcid(::int32_t value) { + _internal_set_pcid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.ScoreRankData.pcId) +} +inline ::int32_t ScoreRankData::_internal_pcid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.pcid_; +} +inline void ScoreRankData::_internal_set_pcid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = value; +} + +// uint32 rank = 4; +inline void ScoreRankData::clear_rank() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rank_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t ScoreRankData::rank() const { + // @@protoc_insertion_point(field_get:np2_structs.ScoreRankData.rank) + return _internal_rank(); +} +inline void ScoreRankData::set_rank(::uint32_t value) { + _internal_set_rank(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.ScoreRankData.rank) +} +inline ::uint32_t ScoreRankData::_internal_rank() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.rank_; +} +inline void ScoreRankData::_internal_set_rank(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rank_ = value; +} + +// int64 score = 5; +inline void ScoreRankData::clear_score() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.score_ = ::int64_t{0}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::int64_t ScoreRankData::score() const { + // @@protoc_insertion_point(field_get:np2_structs.ScoreRankData.score) + return _internal_score(); +} +inline void ScoreRankData::set_score(::int64_t value) { + _internal_set_score(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.ScoreRankData.score) +} +inline ::int64_t ScoreRankData::_internal_score() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.score_; +} +inline void ScoreRankData::_internal_set_score(::int64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.score_ = value; +} + +// bool hasGameData = 6; +inline void ScoreRankData::clear_hasgamedata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.hasgamedata_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000040U); +} +inline bool ScoreRankData::hasgamedata() const { + // @@protoc_insertion_point(field_get:np2_structs.ScoreRankData.hasGameData) + return _internal_hasgamedata(); +} +inline void ScoreRankData::set_hasgamedata(bool value) { + _internal_set_hasgamedata(value); + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_set:np2_structs.ScoreRankData.hasGameData) +} +inline bool ScoreRankData::_internal_hasgamedata() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.hasgamedata_; +} +inline void ScoreRankData::_internal_set_hasgamedata(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.hasgamedata_ = value; +} + +// uint64 recordDate = 7; +inline void ScoreRankData::clear_recorddate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.recorddate_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline ::uint64_t ScoreRankData::recorddate() const { + // @@protoc_insertion_point(field_get:np2_structs.ScoreRankData.recordDate) + return _internal_recorddate(); +} +inline void ScoreRankData::set_recorddate(::uint64_t value) { + _internal_set_recorddate(value); + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_set:np2_structs.ScoreRankData.recordDate) +} +inline ::uint64_t ScoreRankData::_internal_recorddate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.recorddate_; +} +inline void ScoreRankData::_internal_set_recorddate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.recorddate_ = value; +} + +// ------------------------------------------------------------------- + +// ScoreInfo + +// bytes data = 1; +inline void ScoreInfo::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& ScoreInfo::data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.ScoreInfo.data) + return _internal_data(); +} +template +PROTOBUF_ALWAYS_INLINE void ScoreInfo::set_data(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.data_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.ScoreInfo.data) +} +inline ::std::string* PROTOBUF_NONNULL ScoreInfo::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.ScoreInfo.data) + return _s; +} +inline const ::std::string& ScoreInfo::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.data_.Get(); +} +inline void ScoreInfo::_internal_set_data(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL ScoreInfo::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.data_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE ScoreInfo::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.ScoreInfo.data) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.data_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.data_.Set("", GetArena()); + } + return released; +} +inline void ScoreInfo::set_allocated_data(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.data_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.data_.IsDefault()) { + _impl_.data_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.ScoreInfo.data) +} + +// ------------------------------------------------------------------- + +// GetScoreResponse + +// repeated .np2_structs.ScoreRankData rankArray = 1; +inline int GetScoreResponse::_internal_rankarray_size() const { + return _internal_rankarray().size(); +} +inline int GetScoreResponse::rankarray_size() const { + return _internal_rankarray_size(); +} +inline void GetScoreResponse::clear_rankarray() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rankarray_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::ScoreRankData* PROTOBUF_NONNULL GetScoreResponse::mutable_rankarray(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetScoreResponse.rankArray) + return _internal_mutable_rankarray()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreRankData>* PROTOBUF_NONNULL GetScoreResponse::mutable_rankarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetScoreResponse.rankArray) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_rankarray(); +} +inline const ::np2_structs::ScoreRankData& GetScoreResponse::rankarray(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreResponse.rankArray) + return _internal_rankarray().Get(index); +} +inline ::np2_structs::ScoreRankData* PROTOBUF_NONNULL GetScoreResponse::add_rankarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::ScoreRankData* _add = + _internal_mutable_rankarray()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.GetScoreResponse.rankArray) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreRankData>& GetScoreResponse::rankarray() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetScoreResponse.rankArray) + return _internal_rankarray(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreRankData>& +GetScoreResponse::_internal_rankarray() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.rankarray_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreRankData>* PROTOBUF_NONNULL +GetScoreResponse::_internal_mutable_rankarray() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.rankarray_; +} + +// repeated string commentArray = 2; +inline int GetScoreResponse::_internal_commentarray_size() const { + return _internal_commentarray().size(); +} +inline int GetScoreResponse::commentarray_size() const { + return _internal_commentarray_size(); +} +inline void GetScoreResponse::clear_commentarray() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.commentarray_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::std::string* PROTOBUF_NONNULL GetScoreResponse::add_commentarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::std::string* _s = + _internal_mutable_commentarray()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add_mutable:np2_structs.GetScoreResponse.commentArray) + return _s; +} +inline const ::std::string& GetScoreResponse::commentarray(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreResponse.commentArray) + return _internal_commentarray().Get(index); +} +inline ::std::string* PROTOBUF_NONNULL GetScoreResponse::mutable_commentarray(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetScoreResponse.commentArray) + return _internal_mutable_commentarray()->Mutable(index); +} +template +inline void GetScoreResponse::set_commentarray(int index, Arg_&& value, Args_... args) { + ::google::protobuf::internal::AssignToString(*_internal_mutable_commentarray()->Mutable(index), ::std::forward(value), + args... ); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreResponse.commentArray) +} +template +inline void GetScoreResponse::add_commentarray(Arg_&& value, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::google::protobuf::internal::AddToRepeatedPtrField( + ::google::protobuf::MessageLite::internal_visibility(), GetArena(), + *_internal_mutable_commentarray(), ::std::forward(value), + args... ); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.GetScoreResponse.commentArray) +} +inline const ::google::protobuf::RepeatedPtrField<::std::string>& GetScoreResponse::commentarray() + const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetScoreResponse.commentArray) + return _internal_commentarray(); +} +inline ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL +GetScoreResponse::mutable_commentarray() ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetScoreResponse.commentArray) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_commentarray(); +} +inline const ::google::protobuf::RepeatedPtrField<::std::string>& +GetScoreResponse::_internal_commentarray() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.commentarray_; +} +inline ::google::protobuf::RepeatedPtrField<::std::string>* PROTOBUF_NONNULL +GetScoreResponse::_internal_mutable_commentarray() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.commentarray_; +} + +// repeated .np2_structs.ScoreInfo infoArray = 3; +inline int GetScoreResponse::_internal_infoarray_size() const { + return _internal_infoarray().size(); +} +inline int GetScoreResponse::infoarray_size() const { + return _internal_infoarray_size(); +} +inline void GetScoreResponse::clear_infoarray() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.infoarray_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::np2_structs::ScoreInfo* PROTOBUF_NONNULL GetScoreResponse::mutable_infoarray(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetScoreResponse.infoArray) + return _internal_mutable_infoarray()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreInfo>* PROTOBUF_NONNULL GetScoreResponse::mutable_infoarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetScoreResponse.infoArray) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_infoarray(); +} +inline const ::np2_structs::ScoreInfo& GetScoreResponse::infoarray(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreResponse.infoArray) + return _internal_infoarray().Get(index); +} +inline ::np2_structs::ScoreInfo* PROTOBUF_NONNULL GetScoreResponse::add_infoarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::ScoreInfo* _add = + _internal_mutable_infoarray()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_add:np2_structs.GetScoreResponse.infoArray) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreInfo>& GetScoreResponse::infoarray() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetScoreResponse.infoArray) + return _internal_infoarray(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreInfo>& +GetScoreResponse::_internal_infoarray() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.infoarray_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::ScoreInfo>* PROTOBUF_NONNULL +GetScoreResponse::_internal_mutable_infoarray() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.infoarray_; +} + +// uint64 lastSortDate = 4; +inline void GetScoreResponse::clear_lastsortdate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastsortdate_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint64_t GetScoreResponse::lastsortdate() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreResponse.lastSortDate) + return _internal_lastsortdate(); +} +inline void GetScoreResponse::set_lastsortdate(::uint64_t value) { + _internal_set_lastsortdate(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreResponse.lastSortDate) +} +inline ::uint64_t GetScoreResponse::_internal_lastsortdate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.lastsortdate_; +} +inline void GetScoreResponse::_internal_set_lastsortdate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastsortdate_ = value; +} + +// uint32 totalRecord = 5; +inline void GetScoreResponse::clear_totalrecord() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.totalrecord_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::uint32_t GetScoreResponse::totalrecord() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreResponse.totalRecord) + return _internal_totalrecord(); +} +inline void GetScoreResponse::set_totalrecord(::uint32_t value) { + _internal_set_totalrecord(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreResponse.totalRecord) +} +inline ::uint32_t GetScoreResponse::_internal_totalrecord() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.totalrecord_; +} +inline void GetScoreResponse::_internal_set_totalrecord(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.totalrecord_ = value; +} + +// ------------------------------------------------------------------- + +// RecordScoreGameDataRequest + +// uint32 boardId = 1; +inline void RecordScoreGameDataRequest::clear_boardid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint32_t RecordScoreGameDataRequest::boardid() const { + // @@protoc_insertion_point(field_get:np2_structs.RecordScoreGameDataRequest.boardId) + return _internal_boardid(); +} +inline void RecordScoreGameDataRequest::set_boardid(::uint32_t value) { + _internal_set_boardid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_set:np2_structs.RecordScoreGameDataRequest.boardId) +} +inline ::uint32_t RecordScoreGameDataRequest::_internal_boardid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.boardid_; +} +inline void RecordScoreGameDataRequest::_internal_set_boardid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = value; +} + +// int32 pcId = 2; +inline void RecordScoreGameDataRequest::clear_pcid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::int32_t RecordScoreGameDataRequest::pcid() const { + // @@protoc_insertion_point(field_get:np2_structs.RecordScoreGameDataRequest.pcId) + return _internal_pcid(); +} +inline void RecordScoreGameDataRequest::set_pcid(::int32_t value) { + _internal_set_pcid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.RecordScoreGameDataRequest.pcId) +} +inline ::int32_t RecordScoreGameDataRequest::_internal_pcid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.pcid_; +} +inline void RecordScoreGameDataRequest::_internal_set_pcid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = value; +} + +// int64 score = 3; +inline void RecordScoreGameDataRequest::clear_score() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.score_ = ::int64_t{0}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::int64_t RecordScoreGameDataRequest::score() const { + // @@protoc_insertion_point(field_get:np2_structs.RecordScoreGameDataRequest.score) + return _internal_score(); +} +inline void RecordScoreGameDataRequest::set_score(::int64_t value) { + _internal_set_score(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.RecordScoreGameDataRequest.score) +} +inline ::int64_t RecordScoreGameDataRequest::_internal_score() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.score_; +} +inline void RecordScoreGameDataRequest::_internal_set_score(::int64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.score_ = value; +} + +// ------------------------------------------------------------------- + +// GetScoreGameDataRequest + +// uint32 boardId = 1; +inline void GetScoreGameDataRequest::clear_boardid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t GetScoreGameDataRequest::boardid() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreGameDataRequest.boardId) + return _internal_boardid(); +} +inline void GetScoreGameDataRequest::set_boardid(::uint32_t value) { + _internal_set_boardid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreGameDataRequest.boardId) +} +inline ::uint32_t GetScoreGameDataRequest::_internal_boardid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.boardid_; +} +inline void GetScoreGameDataRequest::_internal_set_boardid(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.boardid_ = value; +} + +// string npId = 2; +inline void GetScoreGameDataRequest::clear_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& GetScoreGameDataRequest::npid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreGameDataRequest.npId) + return _internal_npid(); +} +template +PROTOBUF_ALWAYS_INLINE void GetScoreGameDataRequest::set_npid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.npid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreGameDataRequest.npId) +} +inline ::std::string* PROTOBUF_NONNULL GetScoreGameDataRequest::mutable_npid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_npid(); + // @@protoc_insertion_point(field_mutable:np2_structs.GetScoreGameDataRequest.npId) + return _s; +} +inline const ::std::string& GetScoreGameDataRequest::_internal_npid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.npid_.Get(); +} +inline void GetScoreGameDataRequest::_internal_set_npid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL GetScoreGameDataRequest::_internal_mutable_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.npid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE GetScoreGameDataRequest::release_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.GetScoreGameDataRequest.npId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.npid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.npid_.Set("", GetArena()); + } + return released; +} +inline void GetScoreGameDataRequest::set_allocated_npid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.npid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.npid_.IsDefault()) { + _impl_.npid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.GetScoreGameDataRequest.npId) +} + +// int32 pcId = 3; +inline void GetScoreGameDataRequest::clear_pcid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::int32_t GetScoreGameDataRequest::pcid() const { + // @@protoc_insertion_point(field_get:np2_structs.GetScoreGameDataRequest.pcId) + return _internal_pcid(); +} +inline void GetScoreGameDataRequest::set_pcid(::int32_t value) { + _internal_set_pcid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.GetScoreGameDataRequest.pcId) +} +inline ::int32_t GetScoreGameDataRequest::_internal_pcid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.pcid_; +} +inline void GetScoreGameDataRequest::_internal_set_pcid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.pcid_ = value; +} + +// ------------------------------------------------------------------- + +// TusUser + +// bool vuser = 1; +inline void TusUser::clear_vuser() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.vuser_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline bool TusUser::vuser() const { + // @@protoc_insertion_point(field_get:np2_structs.TusUser.vuser) + return _internal_vuser(); +} +inline void TusUser::set_vuser(bool value) { + _internal_set_vuser(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.TusUser.vuser) +} +inline bool TusUser::_internal_vuser() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.vuser_; +} +inline void TusUser::_internal_set_vuser(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.vuser_ = value; +} + +// string npid = 2; +inline void TusUser::clear_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& TusUser::npid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusUser.npid) + return _internal_npid(); +} +template +PROTOBUF_ALWAYS_INLINE void TusUser::set_npid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.npid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusUser.npid) +} +inline ::std::string* PROTOBUF_NONNULL TusUser::mutable_npid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_npid(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusUser.npid) + return _s; +} +inline const ::std::string& TusUser::_internal_npid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.npid_.Get(); +} +inline void TusUser::_internal_set_npid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.npid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusUser::_internal_mutable_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.npid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusUser::release_npid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusUser.npid) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.npid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.npid_.Set("", GetArena()); + } + return released; +} +inline void TusUser::set_allocated_npid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.npid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.npid_.IsDefault()) { + _impl_.npid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusUser.npid) +} + +// ------------------------------------------------------------------- + +// TusVariable + +// string ownerId = 1; +inline void TusVariable::clear_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.ownerid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& TusVariable::ownerid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusVariable.ownerId) + return _internal_ownerid(); +} +template +PROTOBUF_ALWAYS_INLINE void TusVariable::set_ownerid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.ownerid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusVariable.ownerId) +} +inline ::std::string* PROTOBUF_NONNULL TusVariable::mutable_ownerid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_ownerid(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusVariable.ownerId) + return _s; +} +inline const ::std::string& TusVariable::_internal_ownerid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.ownerid_.Get(); +} +inline void TusVariable::_internal_set_ownerid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.ownerid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusVariable::_internal_mutable_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.ownerid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusVariable::release_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusVariable.ownerId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.ownerid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.ownerid_.Set("", GetArena()); + } + return released; +} +inline void TusVariable::set_allocated_ownerid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.ownerid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.ownerid_.IsDefault()) { + _impl_.ownerid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusVariable.ownerId) +} + +// bool hasData = 2; +inline void TusVariable::clear_hasdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.hasdata_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline bool TusVariable::hasdata() const { + // @@protoc_insertion_point(field_get:np2_structs.TusVariable.hasData) + return _internal_hasdata(); +} +inline void TusVariable::set_hasdata(bool value) { + _internal_set_hasdata(value); + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_set:np2_structs.TusVariable.hasData) +} +inline bool TusVariable::_internal_hasdata() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.hasdata_; +} +inline void TusVariable::_internal_set_hasdata(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.hasdata_ = value; +} + +// uint64 lastChangedDate = 3; +inline void TusVariable::clear_lastchangeddate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastchangeddate_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint64_t TusVariable::lastchangeddate() const { + // @@protoc_insertion_point(field_get:np2_structs.TusVariable.lastChangedDate) + return _internal_lastchangeddate(); +} +inline void TusVariable::set_lastchangeddate(::uint64_t value) { + _internal_set_lastchangeddate(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.TusVariable.lastChangedDate) +} +inline ::uint64_t TusVariable::_internal_lastchangeddate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.lastchangeddate_; +} +inline void TusVariable::_internal_set_lastchangeddate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastchangeddate_ = value; +} + +// string lastChangedAuthorId = 4; +inline void TusVariable::clear_lastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastchangedauthorid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& TusVariable::lastchangedauthorid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusVariable.lastChangedAuthorId) + return _internal_lastchangedauthorid(); +} +template +PROTOBUF_ALWAYS_INLINE void TusVariable::set_lastchangedauthorid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.lastchangedauthorid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusVariable.lastChangedAuthorId) +} +inline ::std::string* PROTOBUF_NONNULL TusVariable::mutable_lastchangedauthorid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_lastchangedauthorid(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusVariable.lastChangedAuthorId) + return _s; +} +inline const ::std::string& TusVariable::_internal_lastchangedauthorid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.lastchangedauthorid_.Get(); +} +inline void TusVariable::_internal_set_lastchangedauthorid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastchangedauthorid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusVariable::_internal_mutable_lastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.lastchangedauthorid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusVariable::release_lastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusVariable.lastChangedAuthorId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.lastchangedauthorid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.lastchangedauthorid_.Set("", GetArena()); + } + return released; +} +inline void TusVariable::set_allocated_lastchangedauthorid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.lastchangedauthorid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.lastchangedauthorid_.IsDefault()) { + _impl_.lastchangedauthorid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusVariable.lastChangedAuthorId) +} + +// int64 variable = 5; +inline void TusVariable::clear_variable() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.variable_ = ::int64_t{0}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::int64_t TusVariable::variable() const { + // @@protoc_insertion_point(field_get:np2_structs.TusVariable.variable) + return _internal_variable(); +} +inline void TusVariable::set_variable(::int64_t value) { + _internal_set_variable(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.TusVariable.variable) +} +inline ::int64_t TusVariable::_internal_variable() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.variable_; +} +inline void TusVariable::_internal_set_variable(::int64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.variable_ = value; +} + +// int64 oldVariable = 6; +inline void TusVariable::clear_oldvariable() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.oldvariable_ = ::int64_t{0}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::int64_t TusVariable::oldvariable() const { + // @@protoc_insertion_point(field_get:np2_structs.TusVariable.oldVariable) + return _internal_oldvariable(); +} +inline void TusVariable::set_oldvariable(::int64_t value) { + _internal_set_oldvariable(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.TusVariable.oldVariable) +} +inline ::int64_t TusVariable::_internal_oldvariable() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.oldvariable_; +} +inline void TusVariable::_internal_set_oldvariable(::int64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.oldvariable_ = value; +} + +// ------------------------------------------------------------------- + +// TusVarResponse + +// repeated .np2_structs.TusVariable vars = 1; +inline int TusVarResponse::_internal_vars_size() const { + return _internal_vars().size(); +} +inline int TusVarResponse::vars_size() const { + return _internal_vars_size(); +} +inline void TusVarResponse::clear_vars() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.vars_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::TusVariable* PROTOBUF_NONNULL TusVarResponse::mutable_vars(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.TusVarResponse.vars) + return _internal_mutable_vars()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::TusVariable>* PROTOBUF_NONNULL TusVarResponse::mutable_vars() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusVarResponse.vars) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_vars(); +} +inline const ::np2_structs::TusVariable& TusVarResponse::vars(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusVarResponse.vars) + return _internal_vars().Get(index); +} +inline ::np2_structs::TusVariable* PROTOBUF_NONNULL TusVarResponse::add_vars() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::TusVariable* _add = + _internal_mutable_vars()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusVarResponse.vars) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::TusVariable>& TusVarResponse::vars() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusVarResponse.vars) + return _internal_vars(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::TusVariable>& +TusVarResponse::_internal_vars() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.vars_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::TusVariable>* PROTOBUF_NONNULL +TusVarResponse::_internal_mutable_vars() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.vars_; +} + +// ------------------------------------------------------------------- + +// TusSetMultiSlotVariableRequest + +// .np2_structs.TusUser user = 1; +inline bool TusSetMultiSlotVariableRequest::has_user() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.user_ != nullptr); + return value; +} +inline void TusSetMultiSlotVariableRequest::clear_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ != nullptr) _impl_.user_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::TusUser& TusSetMultiSlotVariableRequest::_internal_user() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusUser* p = _impl_.user_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusUser_default_instance_); +} +inline const ::np2_structs::TusUser& TusSetMultiSlotVariableRequest::user() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusSetMultiSlotVariableRequest.user) + return _internal_user(); +} +inline void TusSetMultiSlotVariableRequest::unsafe_arena_set_allocated_user( + ::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusSetMultiSlotVariableRequest.user) +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusSetMultiSlotVariableRequest::release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::TusUser* released = _impl_.user_; + _impl_.user_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusSetMultiSlotVariableRequest::unsafe_arena_release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusSetMultiSlotVariableRequest.user) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::TusUser* temp = _impl_.user_; + _impl_.user_ = nullptr; + return temp; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusSetMultiSlotVariableRequest::_internal_mutable_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusUser>(GetArena()); + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(p); + } + return _impl_.user_; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusSetMultiSlotVariableRequest::mutable_user() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::TusUser* _msg = _internal_mutable_user(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusSetMultiSlotVariableRequest.user) + return _msg; +} +inline void TusSetMultiSlotVariableRequest::set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusSetMultiSlotVariableRequest.user) +} + +// repeated int32 slotIdArray = 2; +inline int TusSetMultiSlotVariableRequest::_internal_slotidarray_size() const { + return _internal_slotidarray().size(); +} +inline int TusSetMultiSlotVariableRequest::slotidarray_size() const { + return _internal_slotidarray_size(); +} +inline void TusSetMultiSlotVariableRequest::clear_slotidarray() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotidarray_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::int32_t TusSetMultiSlotVariableRequest::slotidarray(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusSetMultiSlotVariableRequest.slotIdArray) + return _internal_slotidarray().Get(index); +} +inline void TusSetMultiSlotVariableRequest::set_slotidarray(int index, ::int32_t value) { + _internal_mutable_slotidarray()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusSetMultiSlotVariableRequest.slotIdArray) +} +inline void TusSetMultiSlotVariableRequest::add_slotidarray(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_slotidarray()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusSetMultiSlotVariableRequest.slotIdArray) +} +inline const ::google::protobuf::RepeatedField<::int32_t>& TusSetMultiSlotVariableRequest::slotidarray() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusSetMultiSlotVariableRequest.slotIdArray) + return _internal_slotidarray(); +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL TusSetMultiSlotVariableRequest::mutable_slotidarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusSetMultiSlotVariableRequest.slotIdArray) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_slotidarray(); +} +inline const ::google::protobuf::RepeatedField<::int32_t>& +TusSetMultiSlotVariableRequest::_internal_slotidarray() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotidarray_; +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL +TusSetMultiSlotVariableRequest::_internal_mutable_slotidarray() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.slotidarray_; +} + +// repeated int64 variableArray = 3; +inline int TusSetMultiSlotVariableRequest::_internal_variablearray_size() const { + return _internal_variablearray().size(); +} +inline int TusSetMultiSlotVariableRequest::variablearray_size() const { + return _internal_variablearray_size(); +} +inline void TusSetMultiSlotVariableRequest::clear_variablearray() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.variablearray_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::int64_t TusSetMultiSlotVariableRequest::variablearray(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusSetMultiSlotVariableRequest.variableArray) + return _internal_variablearray().Get(index); +} +inline void TusSetMultiSlotVariableRequest::set_variablearray(int index, ::int64_t value) { + _internal_mutable_variablearray()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusSetMultiSlotVariableRequest.variableArray) +} +inline void TusSetMultiSlotVariableRequest::add_variablearray(::int64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_variablearray()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.TusSetMultiSlotVariableRequest.variableArray) +} +inline const ::google::protobuf::RepeatedField<::int64_t>& TusSetMultiSlotVariableRequest::variablearray() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusSetMultiSlotVariableRequest.variableArray) + return _internal_variablearray(); +} +inline ::google::protobuf::RepeatedField<::int64_t>* PROTOBUF_NONNULL TusSetMultiSlotVariableRequest::mutable_variablearray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusSetMultiSlotVariableRequest.variableArray) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_variablearray(); +} +inline const ::google::protobuf::RepeatedField<::int64_t>& +TusSetMultiSlotVariableRequest::_internal_variablearray() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.variablearray_; +} +inline ::google::protobuf::RepeatedField<::int64_t>* PROTOBUF_NONNULL +TusSetMultiSlotVariableRequest::_internal_mutable_variablearray() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.variablearray_; +} + +// ------------------------------------------------------------------- + +// TusGetMultiSlotVariableRequest + +// .np2_structs.TusUser user = 1; +inline bool TusGetMultiSlotVariableRequest::has_user() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.user_ != nullptr); + return value; +} +inline void TusGetMultiSlotVariableRequest::clear_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ != nullptr) _impl_.user_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::TusUser& TusGetMultiSlotVariableRequest::_internal_user() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusUser* p = _impl_.user_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusUser_default_instance_); +} +inline const ::np2_structs::TusUser& TusGetMultiSlotVariableRequest::user() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusGetMultiSlotVariableRequest.user) + return _internal_user(); +} +inline void TusGetMultiSlotVariableRequest::unsafe_arena_set_allocated_user( + ::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusGetMultiSlotVariableRequest.user) +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusGetMultiSlotVariableRequest::release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* released = _impl_.user_; + _impl_.user_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusGetMultiSlotVariableRequest::unsafe_arena_release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusGetMultiSlotVariableRequest.user) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* temp = _impl_.user_; + _impl_.user_ = nullptr; + return temp; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetMultiSlotVariableRequest::_internal_mutable_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusUser>(GetArena()); + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(p); + } + return _impl_.user_; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetMultiSlotVariableRequest::mutable_user() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* _msg = _internal_mutable_user(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusGetMultiSlotVariableRequest.user) + return _msg; +} +inline void TusGetMultiSlotVariableRequest::set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusGetMultiSlotVariableRequest.user) +} + +// repeated int32 slotIdArray = 2; +inline int TusGetMultiSlotVariableRequest::_internal_slotidarray_size() const { + return _internal_slotidarray().size(); +} +inline int TusGetMultiSlotVariableRequest::slotidarray_size() const { + return _internal_slotidarray_size(); +} +inline void TusGetMultiSlotVariableRequest::clear_slotidarray() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotidarray_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::int32_t TusGetMultiSlotVariableRequest::slotidarray(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetMultiSlotVariableRequest.slotIdArray) + return _internal_slotidarray().Get(index); +} +inline void TusGetMultiSlotVariableRequest::set_slotidarray(int index, ::int32_t value) { + _internal_mutable_slotidarray()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusGetMultiSlotVariableRequest.slotIdArray) +} +inline void TusGetMultiSlotVariableRequest::add_slotidarray(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_slotidarray()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusGetMultiSlotVariableRequest.slotIdArray) +} +inline const ::google::protobuf::RepeatedField<::int32_t>& TusGetMultiSlotVariableRequest::slotidarray() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusGetMultiSlotVariableRequest.slotIdArray) + return _internal_slotidarray(); +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL TusGetMultiSlotVariableRequest::mutable_slotidarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusGetMultiSlotVariableRequest.slotIdArray) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_slotidarray(); +} +inline const ::google::protobuf::RepeatedField<::int32_t>& +TusGetMultiSlotVariableRequest::_internal_slotidarray() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotidarray_; +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL +TusGetMultiSlotVariableRequest::_internal_mutable_slotidarray() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.slotidarray_; +} + +// ------------------------------------------------------------------- + +// TusGetMultiUserVariableRequest + +// repeated .np2_structs.TusUser users = 1; +inline int TusGetMultiUserVariableRequest::_internal_users_size() const { + return _internal_users().size(); +} +inline int TusGetMultiUserVariableRequest::users_size() const { + return _internal_users_size(); +} +inline void TusGetMultiUserVariableRequest::clear_users() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.users_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetMultiUserVariableRequest::mutable_users(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.TusGetMultiUserVariableRequest.users) + return _internal_mutable_users()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>* PROTOBUF_NONNULL TusGetMultiUserVariableRequest::mutable_users() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusGetMultiUserVariableRequest.users) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_users(); +} +inline const ::np2_structs::TusUser& TusGetMultiUserVariableRequest::users(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusGetMultiUserVariableRequest.users) + return _internal_users().Get(index); +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetMultiUserVariableRequest::add_users() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::TusUser* _add = + _internal_mutable_users()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusGetMultiUserVariableRequest.users) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>& TusGetMultiUserVariableRequest::users() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusGetMultiUserVariableRequest.users) + return _internal_users(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>& +TusGetMultiUserVariableRequest::_internal_users() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.users_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>* PROTOBUF_NONNULL +TusGetMultiUserVariableRequest::_internal_mutable_users() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.users_; +} + +// int32 slotId = 2; +inline void TusGetMultiUserVariableRequest::clear_slotid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::int32_t TusGetMultiUserVariableRequest::slotid() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetMultiUserVariableRequest.slotId) + return _internal_slotid(); +} +inline void TusGetMultiUserVariableRequest::set_slotid(::int32_t value) { + _internal_set_slotid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetMultiUserVariableRequest.slotId) +} +inline ::int32_t TusGetMultiUserVariableRequest::_internal_slotid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotid_; +} +inline void TusGetMultiUserVariableRequest::_internal_set_slotid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = value; +} + +// ------------------------------------------------------------------- + +// TusGetFriendsVariableRequest + +// int32 slotId = 1; +inline void TusGetFriendsVariableRequest::clear_slotid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::int32_t TusGetFriendsVariableRequest::slotid() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetFriendsVariableRequest.slotId) + return _internal_slotid(); +} +inline void TusGetFriendsVariableRequest::set_slotid(::int32_t value) { + _internal_set_slotid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetFriendsVariableRequest.slotId) +} +inline ::int32_t TusGetFriendsVariableRequest::_internal_slotid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotid_; +} +inline void TusGetFriendsVariableRequest::_internal_set_slotid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = value; +} + +// bool includeSelf = 2; +inline void TusGetFriendsVariableRequest::clear_includeself() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.includeself_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline bool TusGetFriendsVariableRequest::includeself() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetFriendsVariableRequest.includeSelf) + return _internal_includeself(); +} +inline void TusGetFriendsVariableRequest::set_includeself(bool value) { + _internal_set_includeself(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetFriendsVariableRequest.includeSelf) +} +inline bool TusGetFriendsVariableRequest::_internal_includeself() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.includeself_; +} +inline void TusGetFriendsVariableRequest::_internal_set_includeself(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.includeself_ = value; +} + +// int32 sortType = 3; +inline void TusGetFriendsVariableRequest::clear_sorttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.sorttype_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::int32_t TusGetFriendsVariableRequest::sorttype() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetFriendsVariableRequest.sortType) + return _internal_sorttype(); +} +inline void TusGetFriendsVariableRequest::set_sorttype(::int32_t value) { + _internal_set_sorttype(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetFriendsVariableRequest.sortType) +} +inline ::int32_t TusGetFriendsVariableRequest::_internal_sorttype() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.sorttype_; +} +inline void TusGetFriendsVariableRequest::_internal_set_sorttype(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.sorttype_ = value; +} + +// uint32 arrayNum = 4; +inline void TusGetFriendsVariableRequest::clear_arraynum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.arraynum_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t TusGetFriendsVariableRequest::arraynum() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetFriendsVariableRequest.arrayNum) + return _internal_arraynum(); +} +inline void TusGetFriendsVariableRequest::set_arraynum(::uint32_t value) { + _internal_set_arraynum(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetFriendsVariableRequest.arrayNum) +} +inline ::uint32_t TusGetFriendsVariableRequest::_internal_arraynum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.arraynum_; +} +inline void TusGetFriendsVariableRequest::_internal_set_arraynum(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.arraynum_ = value; +} + +// ------------------------------------------------------------------- + +// TusAddAndGetVariableRequest + +// .np2_structs.TusUser user = 1; +inline bool TusAddAndGetVariableRequest::has_user() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.user_ != nullptr); + return value; +} +inline void TusAddAndGetVariableRequest::clear_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ != nullptr) _impl_.user_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::TusUser& TusAddAndGetVariableRequest::_internal_user() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusUser* p = _impl_.user_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusUser_default_instance_); +} +inline const ::np2_structs::TusUser& TusAddAndGetVariableRequest::user() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusAddAndGetVariableRequest.user) + return _internal_user(); +} +inline void TusAddAndGetVariableRequest::unsafe_arena_set_allocated_user( + ::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusAddAndGetVariableRequest.user) +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusAddAndGetVariableRequest::release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::TusUser* released = _impl_.user_; + _impl_.user_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusAddAndGetVariableRequest::unsafe_arena_release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusAddAndGetVariableRequest.user) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::TusUser* temp = _impl_.user_; + _impl_.user_ = nullptr; + return temp; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusAddAndGetVariableRequest::_internal_mutable_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusUser>(GetArena()); + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(p); + } + return _impl_.user_; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusAddAndGetVariableRequest::mutable_user() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::TusUser* _msg = _internal_mutable_user(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusAddAndGetVariableRequest.user) + return _msg; +} +inline void TusAddAndGetVariableRequest::set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusAddAndGetVariableRequest.user) +} + +// int32 slotId = 2; +inline void TusAddAndGetVariableRequest::clear_slotid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::int32_t TusAddAndGetVariableRequest::slotid() const { + // @@protoc_insertion_point(field_get:np2_structs.TusAddAndGetVariableRequest.slotId) + return _internal_slotid(); +} +inline void TusAddAndGetVariableRequest::set_slotid(::int32_t value) { + _internal_set_slotid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.TusAddAndGetVariableRequest.slotId) +} +inline ::int32_t TusAddAndGetVariableRequest::_internal_slotid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotid_; +} +inline void TusAddAndGetVariableRequest::_internal_set_slotid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = value; +} + +// int64 inVariable = 3; +inline void TusAddAndGetVariableRequest::clear_invariable() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.invariable_ = ::int64_t{0}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::int64_t TusAddAndGetVariableRequest::invariable() const { + // @@protoc_insertion_point(field_get:np2_structs.TusAddAndGetVariableRequest.inVariable) + return _internal_invariable(); +} +inline void TusAddAndGetVariableRequest::set_invariable(::int64_t value) { + _internal_set_invariable(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.TusAddAndGetVariableRequest.inVariable) +} +inline ::int64_t TusAddAndGetVariableRequest::_internal_invariable() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.invariable_; +} +inline void TusAddAndGetVariableRequest::_internal_set_invariable(::int64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.invariable_ = value; +} + +// repeated uint64 isLastChangedDate = 4; +inline int TusAddAndGetVariableRequest::_internal_islastchangeddate_size() const { + return _internal_islastchangeddate().size(); +} +inline int TusAddAndGetVariableRequest::islastchangeddate_size() const { + return _internal_islastchangeddate_size(); +} +inline void TusAddAndGetVariableRequest::clear_islastchangeddate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.islastchangeddate_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint64_t TusAddAndGetVariableRequest::islastchangeddate(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusAddAndGetVariableRequest.isLastChangedDate) + return _internal_islastchangeddate().Get(index); +} +inline void TusAddAndGetVariableRequest::set_islastchangeddate(int index, ::uint64_t value) { + _internal_mutable_islastchangeddate()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusAddAndGetVariableRequest.isLastChangedDate) +} +inline void TusAddAndGetVariableRequest::add_islastchangeddate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_islastchangeddate()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusAddAndGetVariableRequest.isLastChangedDate) +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& TusAddAndGetVariableRequest::islastchangeddate() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusAddAndGetVariableRequest.isLastChangedDate) + return _internal_islastchangeddate(); +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL TusAddAndGetVariableRequest::mutable_islastchangeddate() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusAddAndGetVariableRequest.isLastChangedDate) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_islastchangeddate(); +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& +TusAddAndGetVariableRequest::_internal_islastchangeddate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.islastchangeddate_; +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL +TusAddAndGetVariableRequest::_internal_mutable_islastchangeddate() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.islastchangeddate_; +} + +// string isLastChangedAuthorId = 5; +inline void TusAddAndGetVariableRequest::clear_islastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.islastchangedauthorid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& TusAddAndGetVariableRequest::islastchangedauthorid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusAddAndGetVariableRequest.isLastChangedAuthorId) + return _internal_islastchangedauthorid(); +} +template +PROTOBUF_ALWAYS_INLINE void TusAddAndGetVariableRequest::set_islastchangedauthorid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.islastchangedauthorid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusAddAndGetVariableRequest.isLastChangedAuthorId) +} +inline ::std::string* PROTOBUF_NONNULL TusAddAndGetVariableRequest::mutable_islastchangedauthorid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_islastchangedauthorid(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusAddAndGetVariableRequest.isLastChangedAuthorId) + return _s; +} +inline const ::std::string& TusAddAndGetVariableRequest::_internal_islastchangedauthorid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.islastchangedauthorid_.Get(); +} +inline void TusAddAndGetVariableRequest::_internal_set_islastchangedauthorid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.islastchangedauthorid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusAddAndGetVariableRequest::_internal_mutable_islastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.islastchangedauthorid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusAddAndGetVariableRequest::release_islastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusAddAndGetVariableRequest.isLastChangedAuthorId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.islastchangedauthorid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.islastchangedauthorid_.Set("", GetArena()); + } + return released; +} +inline void TusAddAndGetVariableRequest::set_allocated_islastchangedauthorid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.islastchangedauthorid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.islastchangedauthorid_.IsDefault()) { + _impl_.islastchangedauthorid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusAddAndGetVariableRequest.isLastChangedAuthorId) +} + +// ------------------------------------------------------------------- + +// TusTryAndSetVariableRequest + +// .np2_structs.TusUser user = 1; +inline bool TusTryAndSetVariableRequest::has_user() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000008U); + PROTOBUF_ASSUME(!value || _impl_.user_ != nullptr); + return value; +} +inline void TusTryAndSetVariableRequest::clear_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ != nullptr) _impl_.user_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::np2_structs::TusUser& TusTryAndSetVariableRequest::_internal_user() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusUser* p = _impl_.user_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusUser_default_instance_); +} +inline const ::np2_structs::TusUser& TusTryAndSetVariableRequest::user() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusTryAndSetVariableRequest.user) + return _internal_user(); +} +inline void TusTryAndSetVariableRequest::unsafe_arena_set_allocated_user( + ::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusTryAndSetVariableRequest.user) +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusTryAndSetVariableRequest::release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::TusUser* released = _impl_.user_; + _impl_.user_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusTryAndSetVariableRequest::unsafe_arena_release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusTryAndSetVariableRequest.user) + + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::TusUser* temp = _impl_.user_; + _impl_.user_ = nullptr; + return temp; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusTryAndSetVariableRequest::_internal_mutable_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusUser>(GetArena()); + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(p); + } + return _impl_.user_; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusTryAndSetVariableRequest::mutable_user() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::np2_structs::TusUser* _msg = _internal_mutable_user(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusTryAndSetVariableRequest.user) + return _msg; +} +inline void TusTryAndSetVariableRequest::set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusTryAndSetVariableRequest.user) +} + +// int32 slotId = 2; +inline void TusTryAndSetVariableRequest::clear_slotid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline ::int32_t TusTryAndSetVariableRequest::slotid() const { + // @@protoc_insertion_point(field_get:np2_structs.TusTryAndSetVariableRequest.slotId) + return _internal_slotid(); +} +inline void TusTryAndSetVariableRequest::set_slotid(::int32_t value) { + _internal_set_slotid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.TusTryAndSetVariableRequest.slotId) +} +inline ::int32_t TusTryAndSetVariableRequest::_internal_slotid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotid_; +} +inline void TusTryAndSetVariableRequest::_internal_set_slotid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = value; +} + +// int32 opeType = 3; +inline void TusTryAndSetVariableRequest::clear_opetype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.opetype_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline ::int32_t TusTryAndSetVariableRequest::opetype() const { + // @@protoc_insertion_point(field_get:np2_structs.TusTryAndSetVariableRequest.opeType) + return _internal_opetype(); +} +inline void TusTryAndSetVariableRequest::set_opetype(::int32_t value) { + _internal_set_opetype(value); + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_set:np2_structs.TusTryAndSetVariableRequest.opeType) +} +inline ::int32_t TusTryAndSetVariableRequest::_internal_opetype() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.opetype_; +} +inline void TusTryAndSetVariableRequest::_internal_set_opetype(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.opetype_ = value; +} + +// int64 variable = 4; +inline void TusTryAndSetVariableRequest::clear_variable() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.variable_ = ::int64_t{0}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000040U); +} +inline ::int64_t TusTryAndSetVariableRequest::variable() const { + // @@protoc_insertion_point(field_get:np2_structs.TusTryAndSetVariableRequest.variable) + return _internal_variable(); +} +inline void TusTryAndSetVariableRequest::set_variable(::int64_t value) { + _internal_set_variable(value); + SetHasBit(_impl_._has_bits_[0], 0x00000040U); + // @@protoc_insertion_point(field_set:np2_structs.TusTryAndSetVariableRequest.variable) +} +inline ::int64_t TusTryAndSetVariableRequest::_internal_variable() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.variable_; +} +inline void TusTryAndSetVariableRequest::_internal_set_variable(::int64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.variable_ = value; +} + +// repeated uint64 isLastChangedDate = 5; +inline int TusTryAndSetVariableRequest::_internal_islastchangeddate_size() const { + return _internal_islastchangeddate().size(); +} +inline int TusTryAndSetVariableRequest::islastchangeddate_size() const { + return _internal_islastchangeddate_size(); +} +inline void TusTryAndSetVariableRequest::clear_islastchangeddate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.islastchangeddate_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint64_t TusTryAndSetVariableRequest::islastchangeddate(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusTryAndSetVariableRequest.isLastChangedDate) + return _internal_islastchangeddate().Get(index); +} +inline void TusTryAndSetVariableRequest::set_islastchangeddate(int index, ::uint64_t value) { + _internal_mutable_islastchangeddate()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusTryAndSetVariableRequest.isLastChangedDate) +} +inline void TusTryAndSetVariableRequest::add_islastchangeddate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_islastchangeddate()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusTryAndSetVariableRequest.isLastChangedDate) +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& TusTryAndSetVariableRequest::islastchangeddate() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusTryAndSetVariableRequest.isLastChangedDate) + return _internal_islastchangeddate(); +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL TusTryAndSetVariableRequest::mutable_islastchangeddate() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusTryAndSetVariableRequest.isLastChangedDate) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_islastchangeddate(); +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& +TusTryAndSetVariableRequest::_internal_islastchangeddate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.islastchangeddate_; +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL +TusTryAndSetVariableRequest::_internal_mutable_islastchangeddate() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.islastchangeddate_; +} + +// string isLastChangedAuthorId = 6; +inline void TusTryAndSetVariableRequest::clear_islastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.islastchangedauthorid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::std::string& TusTryAndSetVariableRequest::islastchangedauthorid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusTryAndSetVariableRequest.isLastChangedAuthorId) + return _internal_islastchangedauthorid(); +} +template +PROTOBUF_ALWAYS_INLINE void TusTryAndSetVariableRequest::set_islastchangedauthorid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + _impl_.islastchangedauthorid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusTryAndSetVariableRequest.isLastChangedAuthorId) +} +inline ::std::string* PROTOBUF_NONNULL TusTryAndSetVariableRequest::mutable_islastchangedauthorid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::std::string* _s = _internal_mutable_islastchangedauthorid(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusTryAndSetVariableRequest.isLastChangedAuthorId) + return _s; +} +inline const ::std::string& TusTryAndSetVariableRequest::_internal_islastchangedauthorid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.islastchangedauthorid_.Get(); +} +inline void TusTryAndSetVariableRequest::_internal_set_islastchangedauthorid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.islastchangedauthorid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusTryAndSetVariableRequest::_internal_mutable_islastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.islastchangedauthorid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusTryAndSetVariableRequest::release_islastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusTryAndSetVariableRequest.isLastChangedAuthorId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000004U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + auto* released = _impl_.islastchangedauthorid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.islastchangedauthorid_.Set("", GetArena()); + } + return released; +} +inline void TusTryAndSetVariableRequest::set_allocated_islastchangedauthorid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + _impl_.islastchangedauthorid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.islastchangedauthorid_.IsDefault()) { + _impl_.islastchangedauthorid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusTryAndSetVariableRequest.isLastChangedAuthorId) +} + +// repeated int64 compareValue = 7; +inline int TusTryAndSetVariableRequest::_internal_comparevalue_size() const { + return _internal_comparevalue().size(); +} +inline int TusTryAndSetVariableRequest::comparevalue_size() const { + return _internal_comparevalue_size(); +} +inline void TusTryAndSetVariableRequest::clear_comparevalue() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.comparevalue_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::int64_t TusTryAndSetVariableRequest::comparevalue(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusTryAndSetVariableRequest.compareValue) + return _internal_comparevalue().Get(index); +} +inline void TusTryAndSetVariableRequest::set_comparevalue(int index, ::int64_t value) { + _internal_mutable_comparevalue()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusTryAndSetVariableRequest.compareValue) +} +inline void TusTryAndSetVariableRequest::add_comparevalue(::int64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_comparevalue()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.TusTryAndSetVariableRequest.compareValue) +} +inline const ::google::protobuf::RepeatedField<::int64_t>& TusTryAndSetVariableRequest::comparevalue() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusTryAndSetVariableRequest.compareValue) + return _internal_comparevalue(); +} +inline ::google::protobuf::RepeatedField<::int64_t>* PROTOBUF_NONNULL TusTryAndSetVariableRequest::mutable_comparevalue() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusTryAndSetVariableRequest.compareValue) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_comparevalue(); +} +inline const ::google::protobuf::RepeatedField<::int64_t>& +TusTryAndSetVariableRequest::_internal_comparevalue() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.comparevalue_; +} +inline ::google::protobuf::RepeatedField<::int64_t>* PROTOBUF_NONNULL +TusTryAndSetVariableRequest::_internal_mutable_comparevalue() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.comparevalue_; +} + +// ------------------------------------------------------------------- + +// TusDeleteMultiSlotVariableRequest + +// .np2_structs.TusUser user = 1; +inline bool TusDeleteMultiSlotVariableRequest::has_user() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.user_ != nullptr); + return value; +} +inline void TusDeleteMultiSlotVariableRequest::clear_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ != nullptr) _impl_.user_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::TusUser& TusDeleteMultiSlotVariableRequest::_internal_user() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusUser* p = _impl_.user_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusUser_default_instance_); +} +inline const ::np2_structs::TusUser& TusDeleteMultiSlotVariableRequest::user() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusDeleteMultiSlotVariableRequest.user) + return _internal_user(); +} +inline void TusDeleteMultiSlotVariableRequest::unsafe_arena_set_allocated_user( + ::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusDeleteMultiSlotVariableRequest.user) +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusDeleteMultiSlotVariableRequest::release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* released = _impl_.user_; + _impl_.user_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusDeleteMultiSlotVariableRequest::unsafe_arena_release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusDeleteMultiSlotVariableRequest.user) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* temp = _impl_.user_; + _impl_.user_ = nullptr; + return temp; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusDeleteMultiSlotVariableRequest::_internal_mutable_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusUser>(GetArena()); + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(p); + } + return _impl_.user_; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusDeleteMultiSlotVariableRequest::mutable_user() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* _msg = _internal_mutable_user(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusDeleteMultiSlotVariableRequest.user) + return _msg; +} +inline void TusDeleteMultiSlotVariableRequest::set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusDeleteMultiSlotVariableRequest.user) +} + +// repeated int32 slotIdArray = 2; +inline int TusDeleteMultiSlotVariableRequest::_internal_slotidarray_size() const { + return _internal_slotidarray().size(); +} +inline int TusDeleteMultiSlotVariableRequest::slotidarray_size() const { + return _internal_slotidarray_size(); +} +inline void TusDeleteMultiSlotVariableRequest::clear_slotidarray() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotidarray_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::int32_t TusDeleteMultiSlotVariableRequest::slotidarray(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusDeleteMultiSlotVariableRequest.slotIdArray) + return _internal_slotidarray().Get(index); +} +inline void TusDeleteMultiSlotVariableRequest::set_slotidarray(int index, ::int32_t value) { + _internal_mutable_slotidarray()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusDeleteMultiSlotVariableRequest.slotIdArray) +} +inline void TusDeleteMultiSlotVariableRequest::add_slotidarray(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_slotidarray()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusDeleteMultiSlotVariableRequest.slotIdArray) +} +inline const ::google::protobuf::RepeatedField<::int32_t>& TusDeleteMultiSlotVariableRequest::slotidarray() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusDeleteMultiSlotVariableRequest.slotIdArray) + return _internal_slotidarray(); +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL TusDeleteMultiSlotVariableRequest::mutable_slotidarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusDeleteMultiSlotVariableRequest.slotIdArray) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_slotidarray(); +} +inline const ::google::protobuf::RepeatedField<::int32_t>& +TusDeleteMultiSlotVariableRequest::_internal_slotidarray() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotidarray_; +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL +TusDeleteMultiSlotVariableRequest::_internal_mutable_slotidarray() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.slotidarray_; +} + +// ------------------------------------------------------------------- + +// TusSetDataRequest + +// .np2_structs.TusUser user = 1; +inline bool TusSetDataRequest::has_user() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000010U); + PROTOBUF_ASSUME(!value || _impl_.user_ != nullptr); + return value; +} +inline void TusSetDataRequest::clear_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ != nullptr) _impl_.user_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline const ::np2_structs::TusUser& TusSetDataRequest::_internal_user() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusUser* p = _impl_.user_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusUser_default_instance_); +} +inline const ::np2_structs::TusUser& TusSetDataRequest::user() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusSetDataRequest.user) + return _internal_user(); +} +inline void TusSetDataRequest::unsafe_arena_set_allocated_user( + ::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusSetDataRequest.user) +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusSetDataRequest::release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::TusUser* released = _impl_.user_; + _impl_.user_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusSetDataRequest::unsafe_arena_release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusSetDataRequest.user) + + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::TusUser* temp = _impl_.user_; + _impl_.user_ = nullptr; + return temp; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusSetDataRequest::_internal_mutable_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusUser>(GetArena()); + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(p); + } + return _impl_.user_; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusSetDataRequest::mutable_user() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + ::np2_structs::TusUser* _msg = _internal_mutable_user(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusSetDataRequest.user) + return _msg; +} +inline void TusSetDataRequest::set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000010U); + } + + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusSetDataRequest.user) +} + +// int32 slotId = 2; +inline void TusSetDataRequest::clear_slotid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000020U); +} +inline ::int32_t TusSetDataRequest::slotid() const { + // @@protoc_insertion_point(field_get:np2_structs.TusSetDataRequest.slotId) + return _internal_slotid(); +} +inline void TusSetDataRequest::set_slotid(::int32_t value) { + _internal_set_slotid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000020U); + // @@protoc_insertion_point(field_set:np2_structs.TusSetDataRequest.slotId) +} +inline ::int32_t TusSetDataRequest::_internal_slotid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotid_; +} +inline void TusSetDataRequest::_internal_set_slotid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = value; +} + +// bytes data = 3; +inline void TusSetDataRequest::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& TusSetDataRequest::data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusSetDataRequest.data) + return _internal_data(); +} +template +PROTOBUF_ALWAYS_INLINE void TusSetDataRequest::set_data(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.data_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusSetDataRequest.data) +} +inline ::std::string* PROTOBUF_NONNULL TusSetDataRequest::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusSetDataRequest.data) + return _s; +} +inline const ::std::string& TusSetDataRequest::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.data_.Get(); +} +inline void TusSetDataRequest::_internal_set_data(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusSetDataRequest::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.data_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusSetDataRequest::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusSetDataRequest.data) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.data_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.data_.Set("", GetArena()); + } + return released; +} +inline void TusSetDataRequest::set_allocated_data(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.data_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.data_.IsDefault()) { + _impl_.data_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusSetDataRequest.data) +} + +// bytes info = 4; +inline void TusSetDataRequest::clear_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.info_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::std::string& TusSetDataRequest::info() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusSetDataRequest.info) + return _internal_info(); +} +template +PROTOBUF_ALWAYS_INLINE void TusSetDataRequest::set_info(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + _impl_.info_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusSetDataRequest.info) +} +inline ::std::string* PROTOBUF_NONNULL TusSetDataRequest::mutable_info() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::std::string* _s = _internal_mutable_info(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusSetDataRequest.info) + return _s; +} +inline const ::std::string& TusSetDataRequest::_internal_info() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.info_.Get(); +} +inline void TusSetDataRequest::_internal_set_info(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.info_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusSetDataRequest::_internal_mutable_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.info_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusSetDataRequest::release_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusSetDataRequest.info) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000004U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + auto* released = _impl_.info_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.info_.Set("", GetArena()); + } + return released; +} +inline void TusSetDataRequest::set_allocated_info(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + _impl_.info_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.info_.IsDefault()) { + _impl_.info_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusSetDataRequest.info) +} + +// repeated uint64 isLastChangedDate = 5; +inline int TusSetDataRequest::_internal_islastchangeddate_size() const { + return _internal_islastchangeddate().size(); +} +inline int TusSetDataRequest::islastchangeddate_size() const { + return _internal_islastchangeddate_size(); +} +inline void TusSetDataRequest::clear_islastchangeddate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.islastchangeddate_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint64_t TusSetDataRequest::islastchangeddate(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusSetDataRequest.isLastChangedDate) + return _internal_islastchangeddate().Get(index); +} +inline void TusSetDataRequest::set_islastchangeddate(int index, ::uint64_t value) { + _internal_mutable_islastchangeddate()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusSetDataRequest.isLastChangedDate) +} +inline void TusSetDataRequest::add_islastchangeddate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_islastchangeddate()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusSetDataRequest.isLastChangedDate) +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& TusSetDataRequest::islastchangeddate() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusSetDataRequest.isLastChangedDate) + return _internal_islastchangeddate(); +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL TusSetDataRequest::mutable_islastchangeddate() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusSetDataRequest.isLastChangedDate) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_islastchangeddate(); +} +inline const ::google::protobuf::RepeatedField<::uint64_t>& +TusSetDataRequest::_internal_islastchangeddate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.islastchangeddate_; +} +inline ::google::protobuf::RepeatedField<::uint64_t>* PROTOBUF_NONNULL +TusSetDataRequest::_internal_mutable_islastchangeddate() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.islastchangeddate_; +} + +// string isLastChangedAuthorId = 6; +inline void TusSetDataRequest::clear_islastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.islastchangedauthorid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::std::string& TusSetDataRequest::islastchangedauthorid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusSetDataRequest.isLastChangedAuthorId) + return _internal_islastchangedauthorid(); +} +template +PROTOBUF_ALWAYS_INLINE void TusSetDataRequest::set_islastchangedauthorid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + _impl_.islastchangedauthorid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusSetDataRequest.isLastChangedAuthorId) +} +inline ::std::string* PROTOBUF_NONNULL TusSetDataRequest::mutable_islastchangedauthorid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::std::string* _s = _internal_mutable_islastchangedauthorid(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusSetDataRequest.isLastChangedAuthorId) + return _s; +} +inline const ::std::string& TusSetDataRequest::_internal_islastchangedauthorid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.islastchangedauthorid_.Get(); +} +inline void TusSetDataRequest::_internal_set_islastchangedauthorid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.islastchangedauthorid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusSetDataRequest::_internal_mutable_islastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.islastchangedauthorid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusSetDataRequest::release_islastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusSetDataRequest.isLastChangedAuthorId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000008U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + auto* released = _impl_.islastchangedauthorid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.islastchangedauthorid_.Set("", GetArena()); + } + return released; +} +inline void TusSetDataRequest::set_allocated_islastchangedauthorid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + _impl_.islastchangedauthorid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.islastchangedauthorid_.IsDefault()) { + _impl_.islastchangedauthorid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusSetDataRequest.isLastChangedAuthorId) +} + +// ------------------------------------------------------------------- + +// TusDataStatus + +// string ownerId = 1; +inline void TusDataStatus::clear_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.ownerid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& TusDataStatus::ownerid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusDataStatus.ownerId) + return _internal_ownerid(); +} +template +PROTOBUF_ALWAYS_INLINE void TusDataStatus::set_ownerid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.ownerid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusDataStatus.ownerId) +} +inline ::std::string* PROTOBUF_NONNULL TusDataStatus::mutable_ownerid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_ownerid(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusDataStatus.ownerId) + return _s; +} +inline const ::std::string& TusDataStatus::_internal_ownerid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.ownerid_.Get(); +} +inline void TusDataStatus::_internal_set_ownerid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.ownerid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusDataStatus::_internal_mutable_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.ownerid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusDataStatus::release_ownerid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusDataStatus.ownerId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.ownerid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.ownerid_.Set("", GetArena()); + } + return released; +} +inline void TusDataStatus::set_allocated_ownerid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.ownerid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.ownerid_.IsDefault()) { + _impl_.ownerid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusDataStatus.ownerId) +} + +// bool hasData = 2; +inline void TusDataStatus::clear_hasdata() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.hasdata_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline bool TusDataStatus::hasdata() const { + // @@protoc_insertion_point(field_get:np2_structs.TusDataStatus.hasData) + return _internal_hasdata(); +} +inline void TusDataStatus::set_hasdata(bool value) { + _internal_set_hasdata(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.TusDataStatus.hasData) +} +inline bool TusDataStatus::_internal_hasdata() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.hasdata_; +} +inline void TusDataStatus::_internal_set_hasdata(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.hasdata_ = value; +} + +// uint64 lastChangedDate = 3; +inline void TusDataStatus::clear_lastchangeddate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastchangeddate_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint64_t TusDataStatus::lastchangeddate() const { + // @@protoc_insertion_point(field_get:np2_structs.TusDataStatus.lastChangedDate) + return _internal_lastchangeddate(); +} +inline void TusDataStatus::set_lastchangeddate(::uint64_t value) { + _internal_set_lastchangeddate(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.TusDataStatus.lastChangedDate) +} +inline ::uint64_t TusDataStatus::_internal_lastchangeddate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.lastchangeddate_; +} +inline void TusDataStatus::_internal_set_lastchangeddate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastchangeddate_ = value; +} + +// string lastChangedAuthorId = 4; +inline void TusDataStatus::clear_lastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastchangedauthorid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& TusDataStatus::lastchangedauthorid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusDataStatus.lastChangedAuthorId) + return _internal_lastchangedauthorid(); +} +template +PROTOBUF_ALWAYS_INLINE void TusDataStatus::set_lastchangedauthorid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.lastchangedauthorid_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusDataStatus.lastChangedAuthorId) +} +inline ::std::string* PROTOBUF_NONNULL TusDataStatus::mutable_lastchangedauthorid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_lastchangedauthorid(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusDataStatus.lastChangedAuthorId) + return _s; +} +inline const ::std::string& TusDataStatus::_internal_lastchangedauthorid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.lastchangedauthorid_.Get(); +} +inline void TusDataStatus::_internal_set_lastchangedauthorid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.lastchangedauthorid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusDataStatus::_internal_mutable_lastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.lastchangedauthorid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusDataStatus::release_lastchangedauthorid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusDataStatus.lastChangedAuthorId) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.lastchangedauthorid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.lastchangedauthorid_.Set("", GetArena()); + } + return released; +} +inline void TusDataStatus::set_allocated_lastchangedauthorid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.lastchangedauthorid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.lastchangedauthorid_.IsDefault()) { + _impl_.lastchangedauthorid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusDataStatus.lastChangedAuthorId) +} + +// bytes info = 5; +inline void TusDataStatus::clear_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.info_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::std::string& TusDataStatus::info() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusDataStatus.info) + return _internal_info(); +} +template +PROTOBUF_ALWAYS_INLINE void TusDataStatus::set_info(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + _impl_.info_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusDataStatus.info) +} +inline ::std::string* PROTOBUF_NONNULL TusDataStatus::mutable_info() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::std::string* _s = _internal_mutable_info(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusDataStatus.info) + return _s; +} +inline const ::std::string& TusDataStatus::_internal_info() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.info_.Get(); +} +inline void TusDataStatus::_internal_set_info(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.info_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusDataStatus::_internal_mutable_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.info_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusDataStatus::release_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusDataStatus.info) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000004U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + auto* released = _impl_.info_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.info_.Set("", GetArena()); + } + return released; +} +inline void TusDataStatus::set_allocated_info(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + _impl_.info_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.info_.IsDefault()) { + _impl_.info_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusDataStatus.info) +} + +// ------------------------------------------------------------------- + +// TusData + +// .np2_structs.TusDataStatus status = 1; +inline bool TusData::has_status() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.status_ != nullptr); + return value; +} +inline void TusData::clear_status() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.status_ != nullptr) _impl_.status_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::TusDataStatus& TusData::_internal_status() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusDataStatus* p = _impl_.status_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusDataStatus_default_instance_); +} +inline const ::np2_structs::TusDataStatus& TusData::status() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusData.status) + return _internal_status(); +} +inline void TusData::unsafe_arena_set_allocated_status( + ::np2_structs::TusDataStatus* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.status_); + } + _impl_.status_ = reinterpret_cast<::np2_structs::TusDataStatus*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusData.status) +} +inline ::np2_structs::TusDataStatus* PROTOBUF_NULLABLE TusData::release_status() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusDataStatus* released = _impl_.status_; + _impl_.status_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusDataStatus* PROTOBUF_NULLABLE TusData::unsafe_arena_release_status() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusData.status) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusDataStatus* temp = _impl_.status_; + _impl_.status_ = nullptr; + return temp; +} +inline ::np2_structs::TusDataStatus* PROTOBUF_NONNULL TusData::_internal_mutable_status() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.status_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusDataStatus>(GetArena()); + _impl_.status_ = reinterpret_cast<::np2_structs::TusDataStatus*>(p); + } + return _impl_.status_; +} +inline ::np2_structs::TusDataStatus* PROTOBUF_NONNULL TusData::mutable_status() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusDataStatus* _msg = _internal_mutable_status(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusData.status) + return _msg; +} +inline void TusData::set_allocated_status(::np2_structs::TusDataStatus* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.status_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.status_ = reinterpret_cast<::np2_structs::TusDataStatus*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusData.status) +} + +// bytes data = 2; +inline void TusData::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& TusData::data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusData.data) + return _internal_data(); +} +template +PROTOBUF_ALWAYS_INLINE void TusData::set_data(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.data_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.TusData.data) +} +inline ::std::string* PROTOBUF_NONNULL TusData::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusData.data) + return _s; +} +inline const ::std::string& TusData::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.data_.Get(); +} +inline void TusData::_internal_set_data(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL TusData::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.data_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE TusData::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusData.data) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.data_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.data_.Set("", GetArena()); + } + return released; +} +inline void TusData::set_allocated_data(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.data_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.data_.IsDefault()) { + _impl_.data_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusData.data) +} + +// ------------------------------------------------------------------- + +// TusDataStatusResponse + +// repeated .np2_structs.TusDataStatus status = 1; +inline int TusDataStatusResponse::_internal_status_size() const { + return _internal_status().size(); +} +inline int TusDataStatusResponse::status_size() const { + return _internal_status_size(); +} +inline void TusDataStatusResponse::clear_status() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.status_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::TusDataStatus* PROTOBUF_NONNULL TusDataStatusResponse::mutable_status(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.TusDataStatusResponse.status) + return _internal_mutable_status()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::TusDataStatus>* PROTOBUF_NONNULL TusDataStatusResponse::mutable_status() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusDataStatusResponse.status) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_status(); +} +inline const ::np2_structs::TusDataStatus& TusDataStatusResponse::status(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusDataStatusResponse.status) + return _internal_status().Get(index); +} +inline ::np2_structs::TusDataStatus* PROTOBUF_NONNULL TusDataStatusResponse::add_status() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::TusDataStatus* _add = + _internal_mutable_status()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusDataStatusResponse.status) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::TusDataStatus>& TusDataStatusResponse::status() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusDataStatusResponse.status) + return _internal_status(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::TusDataStatus>& +TusDataStatusResponse::_internal_status() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.status_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::TusDataStatus>* PROTOBUF_NONNULL +TusDataStatusResponse::_internal_mutable_status() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.status_; +} + +// ------------------------------------------------------------------- + +// TusGetDataRequest + +// .np2_structs.TusUser user = 1; +inline bool TusGetDataRequest::has_user() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.user_ != nullptr); + return value; +} +inline void TusGetDataRequest::clear_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ != nullptr) _impl_.user_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::TusUser& TusGetDataRequest::_internal_user() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusUser* p = _impl_.user_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusUser_default_instance_); +} +inline const ::np2_structs::TusUser& TusGetDataRequest::user() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusGetDataRequest.user) + return _internal_user(); +} +inline void TusGetDataRequest::unsafe_arena_set_allocated_user( + ::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusGetDataRequest.user) +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusGetDataRequest::release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::TusUser* released = _impl_.user_; + _impl_.user_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusGetDataRequest::unsafe_arena_release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusGetDataRequest.user) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::TusUser* temp = _impl_.user_; + _impl_.user_ = nullptr; + return temp; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetDataRequest::_internal_mutable_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusUser>(GetArena()); + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(p); + } + return _impl_.user_; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetDataRequest::mutable_user() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::TusUser* _msg = _internal_mutable_user(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusGetDataRequest.user) + return _msg; +} +inline void TusGetDataRequest::set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusGetDataRequest.user) +} + +// int32 slotId = 2; +inline void TusGetDataRequest::clear_slotid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::int32_t TusGetDataRequest::slotid() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetDataRequest.slotId) + return _internal_slotid(); +} +inline void TusGetDataRequest::set_slotid(::int32_t value) { + _internal_set_slotid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetDataRequest.slotId) +} +inline ::int32_t TusGetDataRequest::_internal_slotid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotid_; +} +inline void TusGetDataRequest::_internal_set_slotid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = value; +} + +// ------------------------------------------------------------------- + +// TusGetMultiSlotDataStatusRequest + +// .np2_structs.TusUser user = 1; +inline bool TusGetMultiSlotDataStatusRequest::has_user() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.user_ != nullptr); + return value; +} +inline void TusGetMultiSlotDataStatusRequest::clear_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ != nullptr) _impl_.user_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::TusUser& TusGetMultiSlotDataStatusRequest::_internal_user() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusUser* p = _impl_.user_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusUser_default_instance_); +} +inline const ::np2_structs::TusUser& TusGetMultiSlotDataStatusRequest::user() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusGetMultiSlotDataStatusRequest.user) + return _internal_user(); +} +inline void TusGetMultiSlotDataStatusRequest::unsafe_arena_set_allocated_user( + ::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusGetMultiSlotDataStatusRequest.user) +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusGetMultiSlotDataStatusRequest::release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* released = _impl_.user_; + _impl_.user_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusGetMultiSlotDataStatusRequest::unsafe_arena_release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusGetMultiSlotDataStatusRequest.user) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* temp = _impl_.user_; + _impl_.user_ = nullptr; + return temp; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetMultiSlotDataStatusRequest::_internal_mutable_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusUser>(GetArena()); + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(p); + } + return _impl_.user_; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetMultiSlotDataStatusRequest::mutable_user() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* _msg = _internal_mutable_user(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusGetMultiSlotDataStatusRequest.user) + return _msg; +} +inline void TusGetMultiSlotDataStatusRequest::set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusGetMultiSlotDataStatusRequest.user) +} + +// repeated int32 slotIdArray = 2; +inline int TusGetMultiSlotDataStatusRequest::_internal_slotidarray_size() const { + return _internal_slotidarray().size(); +} +inline int TusGetMultiSlotDataStatusRequest::slotidarray_size() const { + return _internal_slotidarray_size(); +} +inline void TusGetMultiSlotDataStatusRequest::clear_slotidarray() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotidarray_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::int32_t TusGetMultiSlotDataStatusRequest::slotidarray(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetMultiSlotDataStatusRequest.slotIdArray) + return _internal_slotidarray().Get(index); +} +inline void TusGetMultiSlotDataStatusRequest::set_slotidarray(int index, ::int32_t value) { + _internal_mutable_slotidarray()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusGetMultiSlotDataStatusRequest.slotIdArray) +} +inline void TusGetMultiSlotDataStatusRequest::add_slotidarray(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_slotidarray()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusGetMultiSlotDataStatusRequest.slotIdArray) +} +inline const ::google::protobuf::RepeatedField<::int32_t>& TusGetMultiSlotDataStatusRequest::slotidarray() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusGetMultiSlotDataStatusRequest.slotIdArray) + return _internal_slotidarray(); +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL TusGetMultiSlotDataStatusRequest::mutable_slotidarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusGetMultiSlotDataStatusRequest.slotIdArray) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_slotidarray(); +} +inline const ::google::protobuf::RepeatedField<::int32_t>& +TusGetMultiSlotDataStatusRequest::_internal_slotidarray() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotidarray_; +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL +TusGetMultiSlotDataStatusRequest::_internal_mutable_slotidarray() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.slotidarray_; +} + +// ------------------------------------------------------------------- + +// TusGetMultiUserDataStatusRequest + +// repeated .np2_structs.TusUser users = 1; +inline int TusGetMultiUserDataStatusRequest::_internal_users_size() const { + return _internal_users().size(); +} +inline int TusGetMultiUserDataStatusRequest::users_size() const { + return _internal_users_size(); +} +inline void TusGetMultiUserDataStatusRequest::clear_users() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.users_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetMultiUserDataStatusRequest::mutable_users(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.TusGetMultiUserDataStatusRequest.users) + return _internal_mutable_users()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>* PROTOBUF_NONNULL TusGetMultiUserDataStatusRequest::mutable_users() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusGetMultiUserDataStatusRequest.users) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_users(); +} +inline const ::np2_structs::TusUser& TusGetMultiUserDataStatusRequest::users(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusGetMultiUserDataStatusRequest.users) + return _internal_users().Get(index); +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusGetMultiUserDataStatusRequest::add_users() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::TusUser* _add = + _internal_mutable_users()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusGetMultiUserDataStatusRequest.users) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>& TusGetMultiUserDataStatusRequest::users() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusGetMultiUserDataStatusRequest.users) + return _internal_users(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>& +TusGetMultiUserDataStatusRequest::_internal_users() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.users_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::TusUser>* PROTOBUF_NONNULL +TusGetMultiUserDataStatusRequest::_internal_mutable_users() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.users_; +} + +// int32 slotId = 2; +inline void TusGetMultiUserDataStatusRequest::clear_slotid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::int32_t TusGetMultiUserDataStatusRequest::slotid() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetMultiUserDataStatusRequest.slotId) + return _internal_slotid(); +} +inline void TusGetMultiUserDataStatusRequest::set_slotid(::int32_t value) { + _internal_set_slotid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetMultiUserDataStatusRequest.slotId) +} +inline ::int32_t TusGetMultiUserDataStatusRequest::_internal_slotid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotid_; +} +inline void TusGetMultiUserDataStatusRequest::_internal_set_slotid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = value; +} + +// ------------------------------------------------------------------- + +// TusGetFriendsDataStatusRequest + +// int32 slotId = 1; +inline void TusGetFriendsDataStatusRequest::clear_slotid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::int32_t TusGetFriendsDataStatusRequest::slotid() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetFriendsDataStatusRequest.slotId) + return _internal_slotid(); +} +inline void TusGetFriendsDataStatusRequest::set_slotid(::int32_t value) { + _internal_set_slotid(value); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetFriendsDataStatusRequest.slotId) +} +inline ::int32_t TusGetFriendsDataStatusRequest::_internal_slotid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotid_; +} +inline void TusGetFriendsDataStatusRequest::_internal_set_slotid(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotid_ = value; +} + +// bool includeSelf = 2; +inline void TusGetFriendsDataStatusRequest::clear_includeself() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.includeself_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline bool TusGetFriendsDataStatusRequest::includeself() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetFriendsDataStatusRequest.includeSelf) + return _internal_includeself(); +} +inline void TusGetFriendsDataStatusRequest::set_includeself(bool value) { + _internal_set_includeself(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetFriendsDataStatusRequest.includeSelf) +} +inline bool TusGetFriendsDataStatusRequest::_internal_includeself() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.includeself_; +} +inline void TusGetFriendsDataStatusRequest::_internal_set_includeself(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.includeself_ = value; +} + +// int32 sortType = 3; +inline void TusGetFriendsDataStatusRequest::clear_sorttype() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.sorttype_ = 0; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::int32_t TusGetFriendsDataStatusRequest::sorttype() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetFriendsDataStatusRequest.sortType) + return _internal_sorttype(); +} +inline void TusGetFriendsDataStatusRequest::set_sorttype(::int32_t value) { + _internal_set_sorttype(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetFriendsDataStatusRequest.sortType) +} +inline ::int32_t TusGetFriendsDataStatusRequest::_internal_sorttype() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.sorttype_; +} +inline void TusGetFriendsDataStatusRequest::_internal_set_sorttype(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.sorttype_ = value; +} + +// uint32 arrayNum = 4; +inline void TusGetFriendsDataStatusRequest::clear_arraynum() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.arraynum_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t TusGetFriendsDataStatusRequest::arraynum() const { + // @@protoc_insertion_point(field_get:np2_structs.TusGetFriendsDataStatusRequest.arrayNum) + return _internal_arraynum(); +} +inline void TusGetFriendsDataStatusRequest::set_arraynum(::uint32_t value) { + _internal_set_arraynum(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.TusGetFriendsDataStatusRequest.arrayNum) +} +inline ::uint32_t TusGetFriendsDataStatusRequest::_internal_arraynum() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.arraynum_; +} +inline void TusGetFriendsDataStatusRequest::_internal_set_arraynum(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.arraynum_ = value; +} + +// ------------------------------------------------------------------- + +// TusDeleteMultiSlotDataRequest + +// .np2_structs.TusUser user = 1; +inline bool TusDeleteMultiSlotDataRequest::has_user() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.user_ != nullptr); + return value; +} +inline void TusDeleteMultiSlotDataRequest::clear_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ != nullptr) _impl_.user_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::TusUser& TusDeleteMultiSlotDataRequest::_internal_user() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::TusUser* p = _impl_.user_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_TusUser_default_instance_); +} +inline const ::np2_structs::TusUser& TusDeleteMultiSlotDataRequest::user() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.TusDeleteMultiSlotDataRequest.user) + return _internal_user(); +} +inline void TusDeleteMultiSlotDataRequest::unsafe_arena_set_allocated_user( + ::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.TusDeleteMultiSlotDataRequest.user) +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusDeleteMultiSlotDataRequest::release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* released = _impl_.user_; + _impl_.user_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::TusUser* PROTOBUF_NULLABLE TusDeleteMultiSlotDataRequest::unsafe_arena_release_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.TusDeleteMultiSlotDataRequest.user) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* temp = _impl_.user_; + _impl_.user_ = nullptr; + return temp; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusDeleteMultiSlotDataRequest::_internal_mutable_user() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.user_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::TusUser>(GetArena()); + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(p); + } + return _impl_.user_; +} +inline ::np2_structs::TusUser* PROTOBUF_NONNULL TusDeleteMultiSlotDataRequest::mutable_user() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::TusUser* _msg = _internal_mutable_user(); + // @@protoc_insertion_point(field_mutable:np2_structs.TusDeleteMultiSlotDataRequest.user) + return _msg; +} +inline void TusDeleteMultiSlotDataRequest::set_allocated_user(::np2_structs::TusUser* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.user_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.user_ = reinterpret_cast<::np2_structs::TusUser*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.TusDeleteMultiSlotDataRequest.user) +} + +// repeated int32 slotIdArray = 2; +inline int TusDeleteMultiSlotDataRequest::_internal_slotidarray_size() const { + return _internal_slotidarray().size(); +} +inline int TusDeleteMultiSlotDataRequest::slotidarray_size() const { + return _internal_slotidarray_size(); +} +inline void TusDeleteMultiSlotDataRequest::clear_slotidarray() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.slotidarray_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::int32_t TusDeleteMultiSlotDataRequest::slotidarray(int index) const { + // @@protoc_insertion_point(field_get:np2_structs.TusDeleteMultiSlotDataRequest.slotIdArray) + return _internal_slotidarray().Get(index); +} +inline void TusDeleteMultiSlotDataRequest::set_slotidarray(int index, ::int32_t value) { + _internal_mutable_slotidarray()->Set(index, value); + // @@protoc_insertion_point(field_set:np2_structs.TusDeleteMultiSlotDataRequest.slotIdArray) +} +inline void TusDeleteMultiSlotDataRequest::add_slotidarray(::int32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _internal_mutable_slotidarray()->Add(value); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.TusDeleteMultiSlotDataRequest.slotIdArray) +} +inline const ::google::protobuf::RepeatedField<::int32_t>& TusDeleteMultiSlotDataRequest::slotidarray() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.TusDeleteMultiSlotDataRequest.slotIdArray) + return _internal_slotidarray(); +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL TusDeleteMultiSlotDataRequest::mutable_slotidarray() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.TusDeleteMultiSlotDataRequest.slotIdArray) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_slotidarray(); +} +inline const ::google::protobuf::RepeatedField<::int32_t>& +TusDeleteMultiSlotDataRequest::_internal_slotidarray() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.slotidarray_; +} +inline ::google::protobuf::RepeatedField<::int32_t>* PROTOBUF_NONNULL +TusDeleteMultiSlotDataRequest::_internal_mutable_slotidarray() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.slotidarray_; +} + +// ------------------------------------------------------------------- + +// SetPresenceRequest + +// string title = 1; +inline void SetPresenceRequest::clear_title() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.title_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& SetPresenceRequest::title() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetPresenceRequest.title) + return _internal_title(); +} +template +PROTOBUF_ALWAYS_INLINE void SetPresenceRequest::set_title(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.title_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.SetPresenceRequest.title) +} +inline ::std::string* PROTOBUF_NONNULL SetPresenceRequest::mutable_title() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_title(); + // @@protoc_insertion_point(field_mutable:np2_structs.SetPresenceRequest.title) + return _s; +} +inline const ::std::string& SetPresenceRequest::_internal_title() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.title_.Get(); +} +inline void SetPresenceRequest::_internal_set_title(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.title_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL SetPresenceRequest::_internal_mutable_title() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.title_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE SetPresenceRequest::release_title() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SetPresenceRequest.title) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.title_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.title_.Set("", GetArena()); + } + return released; +} +inline void SetPresenceRequest::set_allocated_title(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.title_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.title_.IsDefault()) { + _impl_.title_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.SetPresenceRequest.title) +} + +// string status = 2; +inline void SetPresenceRequest::clear_status() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.status_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& SetPresenceRequest::status() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetPresenceRequest.status) + return _internal_status(); +} +template +PROTOBUF_ALWAYS_INLINE void SetPresenceRequest::set_status(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.status_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.SetPresenceRequest.status) +} +inline ::std::string* PROTOBUF_NONNULL SetPresenceRequest::mutable_status() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_status(); + // @@protoc_insertion_point(field_mutable:np2_structs.SetPresenceRequest.status) + return _s; +} +inline const ::std::string& SetPresenceRequest::_internal_status() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.status_.Get(); +} +inline void SetPresenceRequest::_internal_set_status(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.status_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL SetPresenceRequest::_internal_mutable_status() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.status_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE SetPresenceRequest::release_status() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SetPresenceRequest.status) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.status_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.status_.Set("", GetArena()); + } + return released; +} +inline void SetPresenceRequest::set_allocated_status(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.status_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.status_.IsDefault()) { + _impl_.status_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.SetPresenceRequest.status) +} + +// string comment = 3; +inline void SetPresenceRequest::clear_comment() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.comment_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::std::string& SetPresenceRequest::comment() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetPresenceRequest.comment) + return _internal_comment(); +} +template +PROTOBUF_ALWAYS_INLINE void SetPresenceRequest::set_comment(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + _impl_.comment_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.SetPresenceRequest.comment) +} +inline ::std::string* PROTOBUF_NONNULL SetPresenceRequest::mutable_comment() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::std::string* _s = _internal_mutable_comment(); + // @@protoc_insertion_point(field_mutable:np2_structs.SetPresenceRequest.comment) + return _s; +} +inline const ::std::string& SetPresenceRequest::_internal_comment() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.comment_.Get(); +} +inline void SetPresenceRequest::_internal_set_comment(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.comment_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL SetPresenceRequest::_internal_mutable_comment() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.comment_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE SetPresenceRequest::release_comment() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SetPresenceRequest.comment) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000004U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + auto* released = _impl_.comment_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.comment_.Set("", GetArena()); + } + return released; +} +inline void SetPresenceRequest::set_allocated_comment(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + _impl_.comment_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.comment_.IsDefault()) { + _impl_.comment_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.SetPresenceRequest.comment) +} + +// bytes data = 4; +inline void SetPresenceRequest::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::std::string& SetPresenceRequest::data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetPresenceRequest.data) + return _internal_data(); +} +template +PROTOBUF_ALWAYS_INLINE void SetPresenceRequest::set_data(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + _impl_.data_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.SetPresenceRequest.data) +} +inline ::std::string* PROTOBUF_NONNULL SetPresenceRequest::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::std::string* _s = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.SetPresenceRequest.data) + return _s; +} +inline const ::std::string& SetPresenceRequest::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.data_.Get(); +} +inline void SetPresenceRequest::_internal_set_data(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL SetPresenceRequest::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.data_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE SetPresenceRequest::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SetPresenceRequest.data) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000008U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + auto* released = _impl_.data_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.data_.Set("", GetArena()); + } + return released; +} +inline void SetPresenceRequest::set_allocated_data(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + _impl_.data_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.data_.IsDefault()) { + _impl_.data_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.SetPresenceRequest.data) +} + +// ------------------------------------------------------------------- + +// MatchingSearchCondition + +// uint32 attr_type = 1; +inline void MatchingSearchCondition::clear_attr_type() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_type_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::uint32_t MatchingSearchCondition::attr_type() const { + // @@protoc_insertion_point(field_get:np2_structs.MatchingSearchCondition.attr_type) + return _internal_attr_type(); +} +inline void MatchingSearchCondition::set_attr_type(::uint32_t value) { + _internal_set_attr_type(value); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_set:np2_structs.MatchingSearchCondition.attr_type) +} +inline ::uint32_t MatchingSearchCondition::_internal_attr_type() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attr_type_; +} +inline void MatchingSearchCondition::_internal_set_attr_type(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_type_ = value; +} + +// uint32 attr_id = 2; +inline void MatchingSearchCondition::clear_attr_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_id_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t MatchingSearchCondition::attr_id() const { + // @@protoc_insertion_point(field_get:np2_structs.MatchingSearchCondition.attr_id) + return _internal_attr_id(); +} +inline void MatchingSearchCondition::set_attr_id(::uint32_t value) { + _internal_set_attr_id(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.MatchingSearchCondition.attr_id) +} +inline ::uint32_t MatchingSearchCondition::_internal_attr_id() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attr_id_; +} +inline void MatchingSearchCondition::_internal_set_attr_id(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_id_ = value; +} + +// uint32 comp_op = 3; +inline void MatchingSearchCondition::clear_comp_op() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.comp_op_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t MatchingSearchCondition::comp_op() const { + // @@protoc_insertion_point(field_get:np2_structs.MatchingSearchCondition.comp_op) + return _internal_comp_op(); +} +inline void MatchingSearchCondition::set_comp_op(::uint32_t value) { + _internal_set_comp_op(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.MatchingSearchCondition.comp_op) +} +inline ::uint32_t MatchingSearchCondition::_internal_comp_op() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.comp_op_; +} +inline void MatchingSearchCondition::_internal_set_comp_op(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.comp_op_ = value; +} + +// uint32 comp_value = 4; +inline void MatchingSearchCondition::clear_comp_value() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.comp_value_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t MatchingSearchCondition::comp_value() const { + // @@protoc_insertion_point(field_get:np2_structs.MatchingSearchCondition.comp_value) + return _internal_comp_value(); +} +inline void MatchingSearchCondition::set_comp_value(::uint32_t value) { + _internal_set_comp_value(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.MatchingSearchCondition.comp_value) +} +inline ::uint32_t MatchingSearchCondition::_internal_comp_value() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.comp_value_; +} +inline void MatchingSearchCondition::_internal_set_comp_value(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.comp_value_ = value; +} + +// ------------------------------------------------------------------- + +// MatchingAttr + +// uint32 attr_type = 1; +inline void MatchingAttr::clear_attr_type() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_type_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t MatchingAttr::attr_type() const { + // @@protoc_insertion_point(field_get:np2_structs.MatchingAttr.attr_type) + return _internal_attr_type(); +} +inline void MatchingAttr::set_attr_type(::uint32_t value) { + _internal_set_attr_type(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.MatchingAttr.attr_type) +} +inline ::uint32_t MatchingAttr::_internal_attr_type() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attr_type_; +} +inline void MatchingAttr::_internal_set_attr_type(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_type_ = value; +} + +// uint32 attr_id = 2; +inline void MatchingAttr::clear_attr_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_id_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t MatchingAttr::attr_id() const { + // @@protoc_insertion_point(field_get:np2_structs.MatchingAttr.attr_id) + return _internal_attr_id(); +} +inline void MatchingAttr::set_attr_id(::uint32_t value) { + _internal_set_attr_id(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.MatchingAttr.attr_id) +} +inline ::uint32_t MatchingAttr::_internal_attr_id() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attr_id_; +} +inline void MatchingAttr::_internal_set_attr_id(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_id_ = value; +} + +// uint32 num = 3; +inline void MatchingAttr::clear_num() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.num_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t MatchingAttr::num() const { + // @@protoc_insertion_point(field_get:np2_structs.MatchingAttr.num) + return _internal_num(); +} +inline void MatchingAttr::set_num(::uint32_t value) { + _internal_set_num(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.MatchingAttr.num) +} +inline ::uint32_t MatchingAttr::_internal_num() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.num_; +} +inline void MatchingAttr::_internal_set_num(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.num_ = value; +} + +// bytes data = 4; +inline void MatchingAttr::clear_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& MatchingAttr::data() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingAttr.data) + return _internal_data(); +} +template +PROTOBUF_ALWAYS_INLINE void MatchingAttr::set_data(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.data_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MatchingAttr.data) +} +inline ::std::string* PROTOBUF_NONNULL MatchingAttr::mutable_data() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingAttr.data) + return _s; +} +inline const ::std::string& MatchingAttr::_internal_data() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.data_.Get(); +} +inline void MatchingAttr::_internal_set_data(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.data_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MatchingAttr::_internal_mutable_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.data_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MatchingAttr::release_data() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MatchingAttr.data) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.data_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.data_.Set("", GetArena()); + } + return released; +} +inline void MatchingAttr::set_allocated_data(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.data_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.data_.IsDefault()) { + _impl_.data_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MatchingAttr.data) +} + +// ------------------------------------------------------------------- + +// CreateRoomGUIRequest + +// uint32 total_slots = 1; +inline void CreateRoomGUIRequest::clear_total_slots() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.total_slots_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t CreateRoomGUIRequest::total_slots() const { + // @@protoc_insertion_point(field_get:np2_structs.CreateRoomGUIRequest.total_slots) + return _internal_total_slots(); +} +inline void CreateRoomGUIRequest::set_total_slots(::uint32_t value) { + _internal_set_total_slots(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.CreateRoomGUIRequest.total_slots) +} +inline ::uint32_t CreateRoomGUIRequest::_internal_total_slots() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.total_slots_; +} +inline void CreateRoomGUIRequest::_internal_set_total_slots(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.total_slots_ = value; +} + +// uint32 private_slots = 2; +inline void CreateRoomGUIRequest::clear_private_slots() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.private_slots_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t CreateRoomGUIRequest::private_slots() const { + // @@protoc_insertion_point(field_get:np2_structs.CreateRoomGUIRequest.private_slots) + return _internal_private_slots(); +} +inline void CreateRoomGUIRequest::set_private_slots(::uint32_t value) { + _internal_set_private_slots(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.CreateRoomGUIRequest.private_slots) +} +inline ::uint32_t CreateRoomGUIRequest::_internal_private_slots() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.private_slots_; +} +inline void CreateRoomGUIRequest::_internal_set_private_slots(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.private_slots_ = value; +} + +// bool privilege_grant = 3; +inline void CreateRoomGUIRequest::clear_privilege_grant() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.privilege_grant_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline bool CreateRoomGUIRequest::privilege_grant() const { + // @@protoc_insertion_point(field_get:np2_structs.CreateRoomGUIRequest.privilege_grant) + return _internal_privilege_grant(); +} +inline void CreateRoomGUIRequest::set_privilege_grant(bool value) { + _internal_set_privilege_grant(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.CreateRoomGUIRequest.privilege_grant) +} +inline bool CreateRoomGUIRequest::_internal_privilege_grant() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.privilege_grant_; +} +inline void CreateRoomGUIRequest::_internal_set_privilege_grant(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.privilege_grant_ = value; +} + +// bool stealth = 4; +inline void CreateRoomGUIRequest::clear_stealth() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.stealth_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000010U); +} +inline bool CreateRoomGUIRequest::stealth() const { + // @@protoc_insertion_point(field_get:np2_structs.CreateRoomGUIRequest.stealth) + return _internal_stealth(); +} +inline void CreateRoomGUIRequest::set_stealth(bool value) { + _internal_set_stealth(value); + SetHasBit(_impl_._has_bits_[0], 0x00000010U); + // @@protoc_insertion_point(field_set:np2_structs.CreateRoomGUIRequest.stealth) +} +inline bool CreateRoomGUIRequest::_internal_stealth() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.stealth_; +} +inline void CreateRoomGUIRequest::_internal_set_stealth(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.stealth_ = value; +} + +// repeated .np2_structs.MatchingAttr game_attrs = 5; +inline int CreateRoomGUIRequest::_internal_game_attrs_size() const { + return _internal_game_attrs().size(); +} +inline int CreateRoomGUIRequest::game_attrs_size() const { + return _internal_game_attrs_size(); +} +inline void CreateRoomGUIRequest::clear_game_attrs() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.game_attrs_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL CreateRoomGUIRequest::mutable_game_attrs(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.CreateRoomGUIRequest.game_attrs) + return _internal_mutable_game_attrs()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL CreateRoomGUIRequest::mutable_game_attrs() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.CreateRoomGUIRequest.game_attrs) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_game_attrs(); +} +inline const ::np2_structs::MatchingAttr& CreateRoomGUIRequest::game_attrs(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateRoomGUIRequest.game_attrs) + return _internal_game_attrs().Get(index); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL CreateRoomGUIRequest::add_game_attrs() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::MatchingAttr* _add = + _internal_mutable_game_attrs()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.CreateRoomGUIRequest.game_attrs) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& CreateRoomGUIRequest::game_attrs() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.CreateRoomGUIRequest.game_attrs) + return _internal_game_attrs(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& +CreateRoomGUIRequest::_internal_game_attrs() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.game_attrs_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL +CreateRoomGUIRequest::_internal_mutable_game_attrs() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.game_attrs_; +} + +// ------------------------------------------------------------------- + +// GUIUserInfo + +// .np2_structs.UserInfo info = 1; +inline bool GUIUserInfo::has_info() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.info_ != nullptr); + return value; +} +inline void GUIUserInfo::clear_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.info_ != nullptr) _impl_.info_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::UserInfo& GUIUserInfo::_internal_info() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::UserInfo* p = _impl_.info_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_UserInfo_default_instance_); +} +inline const ::np2_structs::UserInfo& GUIUserInfo::info() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GUIUserInfo.info) + return _internal_info(); +} +inline void GUIUserInfo::unsafe_arena_set_allocated_info( + ::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.info_); + } + _impl_.info_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.GUIUserInfo.info) +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE GUIUserInfo::release_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::UserInfo* released = _impl_.info_; + _impl_.info_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE GUIUserInfo::unsafe_arena_release_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.GUIUserInfo.info) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::UserInfo* temp = _impl_.info_; + _impl_.info_ = nullptr; + return temp; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL GUIUserInfo::_internal_mutable_info() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.info_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::UserInfo>(GetArena()); + _impl_.info_ = reinterpret_cast<::np2_structs::UserInfo*>(p); + } + return _impl_.info_; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL GUIUserInfo::mutable_info() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::UserInfo* _msg = _internal_mutable_info(); + // @@protoc_insertion_point(field_mutable:np2_structs.GUIUserInfo.info) + return _msg; +} +inline void GUIUserInfo::set_allocated_info(::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.info_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.info_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.GUIUserInfo.info) +} + +// bool owner = 2; +inline void GUIUserInfo::clear_owner() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.owner_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline bool GUIUserInfo::owner() const { + // @@protoc_insertion_point(field_get:np2_structs.GUIUserInfo.owner) + return _internal_owner(); +} +inline void GUIUserInfo::set_owner(bool value) { + _internal_set_owner(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.GUIUserInfo.owner) +} +inline bool GUIUserInfo::_internal_owner() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.owner_; +} +inline void GUIUserInfo::_internal_set_owner(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.owner_ = value; +} + +// ------------------------------------------------------------------- + +// MatchingRoomStatus + +// bytes id = 1; +inline void MatchingRoomStatus::clear_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.id_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& MatchingRoomStatus::id() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingRoomStatus.id) + return _internal_id(); +} +template +PROTOBUF_ALWAYS_INLINE void MatchingRoomStatus::set_id(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.id_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MatchingRoomStatus.id) +} +inline ::std::string* PROTOBUF_NONNULL MatchingRoomStatus::mutable_id() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_id(); + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingRoomStatus.id) + return _s; +} +inline const ::std::string& MatchingRoomStatus::_internal_id() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.id_.Get(); +} +inline void MatchingRoomStatus::_internal_set_id(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.id_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MatchingRoomStatus::_internal_mutable_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.id_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MatchingRoomStatus::release_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MatchingRoomStatus.id) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.id_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.id_.Set("", GetArena()); + } + return released; +} +inline void MatchingRoomStatus::set_allocated_id(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.id_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.id_.IsDefault()) { + _impl_.id_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MatchingRoomStatus.id) +} + +// repeated .np2_structs.GUIUserInfo members = 2; +inline int MatchingRoomStatus::_internal_members_size() const { + return _internal_members().size(); +} +inline int MatchingRoomStatus::members_size() const { + return _internal_members_size(); +} +inline void MatchingRoomStatus::clear_members() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.members_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::GUIUserInfo* PROTOBUF_NONNULL MatchingRoomStatus::mutable_members(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingRoomStatus.members) + return _internal_mutable_members()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::GUIUserInfo>* PROTOBUF_NONNULL MatchingRoomStatus::mutable_members() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.MatchingRoomStatus.members) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_members(); +} +inline const ::np2_structs::GUIUserInfo& MatchingRoomStatus::members(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingRoomStatus.members) + return _internal_members().Get(index); +} +inline ::np2_structs::GUIUserInfo* PROTOBUF_NONNULL MatchingRoomStatus::add_members() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::GUIUserInfo* _add = + _internal_mutable_members()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.MatchingRoomStatus.members) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::GUIUserInfo>& MatchingRoomStatus::members() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.MatchingRoomStatus.members) + return _internal_members(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::GUIUserInfo>& +MatchingRoomStatus::_internal_members() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.members_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::GUIUserInfo>* PROTOBUF_NONNULL +MatchingRoomStatus::_internal_mutable_members() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.members_; +} + +// string kick_actor = 3; +inline void MatchingRoomStatus::clear_kick_actor() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.kick_actor_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::std::string& MatchingRoomStatus::kick_actor() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingRoomStatus.kick_actor) + return _internal_kick_actor(); +} +template +PROTOBUF_ALWAYS_INLINE void MatchingRoomStatus::set_kick_actor(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + _impl_.kick_actor_.Set(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MatchingRoomStatus.kick_actor) +} +inline ::std::string* PROTOBUF_NONNULL MatchingRoomStatus::mutable_kick_actor() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::std::string* _s = _internal_mutable_kick_actor(); + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingRoomStatus.kick_actor) + return _s; +} +inline const ::std::string& MatchingRoomStatus::_internal_kick_actor() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.kick_actor_.Get(); +} +inline void MatchingRoomStatus::_internal_set_kick_actor(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.kick_actor_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MatchingRoomStatus::_internal_mutable_kick_actor() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.kick_actor_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MatchingRoomStatus::release_kick_actor() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MatchingRoomStatus.kick_actor) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000004U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + auto* released = _impl_.kick_actor_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.kick_actor_.Set("", GetArena()); + } + return released; +} +inline void MatchingRoomStatus::set_allocated_kick_actor(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + _impl_.kick_actor_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.kick_actor_.IsDefault()) { + _impl_.kick_actor_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MatchingRoomStatus.kick_actor) +} + +// bytes opt = 4; +inline void MatchingRoomStatus::clear_opt() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.opt_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline const ::std::string& MatchingRoomStatus::opt() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingRoomStatus.opt) + return _internal_opt(); +} +template +PROTOBUF_ALWAYS_INLINE void MatchingRoomStatus::set_opt(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + _impl_.opt_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MatchingRoomStatus.opt) +} +inline ::std::string* PROTOBUF_NONNULL MatchingRoomStatus::mutable_opt() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + ::std::string* _s = _internal_mutable_opt(); + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingRoomStatus.opt) + return _s; +} +inline const ::std::string& MatchingRoomStatus::_internal_opt() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.opt_.Get(); +} +inline void MatchingRoomStatus::_internal_set_opt(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.opt_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MatchingRoomStatus::_internal_mutable_opt() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.opt_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MatchingRoomStatus::release_opt() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MatchingRoomStatus.opt) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000008U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + auto* released = _impl_.opt_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.opt_.Set("", GetArena()); + } + return released; +} +inline void MatchingRoomStatus::set_allocated_opt(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000008U); + } + _impl_.opt_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.opt_.IsDefault()) { + _impl_.opt_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MatchingRoomStatus.opt) +} + +// ------------------------------------------------------------------- + +// GetRoomListGUIRequest + +// uint32 range_start = 1; +inline void GetRoomListGUIRequest::clear_range_start() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.range_start_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t GetRoomListGUIRequest::range_start() const { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomListGUIRequest.range_start) + return _internal_range_start(); +} +inline void GetRoomListGUIRequest::set_range_start(::uint32_t value) { + _internal_set_range_start(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.GetRoomListGUIRequest.range_start) +} +inline ::uint32_t GetRoomListGUIRequest::_internal_range_start() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.range_start_; +} +inline void GetRoomListGUIRequest::_internal_set_range_start(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.range_start_ = value; +} + +// uint32 range_max = 2; +inline void GetRoomListGUIRequest::clear_range_max() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.range_max_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000008U); +} +inline ::uint32_t GetRoomListGUIRequest::range_max() const { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomListGUIRequest.range_max) + return _internal_range_max(); +} +inline void GetRoomListGUIRequest::set_range_max(::uint32_t value) { + _internal_set_range_max(value); + SetHasBit(_impl_._has_bits_[0], 0x00000008U); + // @@protoc_insertion_point(field_set:np2_structs.GetRoomListGUIRequest.range_max) +} +inline ::uint32_t GetRoomListGUIRequest::_internal_range_max() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.range_max_; +} +inline void GetRoomListGUIRequest::_internal_set_range_max(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.range_max_ = value; +} + +// repeated .np2_structs.MatchingSearchCondition conds = 3; +inline int GetRoomListGUIRequest::_internal_conds_size() const { + return _internal_conds().size(); +} +inline int GetRoomListGUIRequest::conds_size() const { + return _internal_conds_size(); +} +inline void GetRoomListGUIRequest::clear_conds() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.conds_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL GetRoomListGUIRequest::mutable_conds(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetRoomListGUIRequest.conds) + return _internal_mutable_conds()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL GetRoomListGUIRequest::mutable_conds() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetRoomListGUIRequest.conds) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_conds(); +} +inline const ::np2_structs::MatchingSearchCondition& GetRoomListGUIRequest::conds(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomListGUIRequest.conds) + return _internal_conds().Get(index); +} +inline ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL GetRoomListGUIRequest::add_conds() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::MatchingSearchCondition* _add = + _internal_mutable_conds()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.GetRoomListGUIRequest.conds) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& GetRoomListGUIRequest::conds() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetRoomListGUIRequest.conds) + return _internal_conds(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& +GetRoomListGUIRequest::_internal_conds() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.conds_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL +GetRoomListGUIRequest::_internal_mutable_conds() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.conds_; +} + +// repeated .np2_structs.MatchingAttr attrs = 4; +inline int GetRoomListGUIRequest::_internal_attrs_size() const { + return _internal_attrs().size(); +} +inline int GetRoomListGUIRequest::attrs_size() const { + return _internal_attrs_size(); +} +inline void GetRoomListGUIRequest::clear_attrs() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attrs_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL GetRoomListGUIRequest::mutable_attrs(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetRoomListGUIRequest.attrs) + return _internal_mutable_attrs()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL GetRoomListGUIRequest::mutable_attrs() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetRoomListGUIRequest.attrs) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_attrs(); +} +inline const ::np2_structs::MatchingAttr& GetRoomListGUIRequest::attrs(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomListGUIRequest.attrs) + return _internal_attrs().Get(index); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL GetRoomListGUIRequest::add_attrs() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::MatchingAttr* _add = + _internal_mutable_attrs()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.GetRoomListGUIRequest.attrs) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& GetRoomListGUIRequest::attrs() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetRoomListGUIRequest.attrs) + return _internal_attrs(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& +GetRoomListGUIRequest::_internal_attrs() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attrs_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL +GetRoomListGUIRequest::_internal_mutable_attrs() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.attrs_; +} + +// ------------------------------------------------------------------- + +// MatchingRoom + +// bytes id = 1; +inline void MatchingRoom::clear_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.id_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::std::string& MatchingRoom::id() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingRoom.id) + return _internal_id(); +} +template +PROTOBUF_ALWAYS_INLINE void MatchingRoom::set_id(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + _impl_.id_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MatchingRoom.id) +} +inline ::std::string* PROTOBUF_NONNULL MatchingRoom::mutable_id() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::std::string* _s = _internal_mutable_id(); + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingRoom.id) + return _s; +} +inline const ::std::string& MatchingRoom::_internal_id() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.id_.Get(); +} +inline void MatchingRoom::_internal_set_id(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.id_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MatchingRoom::_internal_mutable_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.id_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MatchingRoom::release_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MatchingRoom.id) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000002U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + auto* released = _impl_.id_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.id_.Set("", GetArena()); + } + return released; +} +inline void MatchingRoom::set_allocated_id(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + _impl_.id_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.id_.IsDefault()) { + _impl_.id_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MatchingRoom.id) +} + +// repeated .np2_structs.MatchingAttr attr = 2; +inline int MatchingRoom::_internal_attr_size() const { + return _internal_attr().size(); +} +inline int MatchingRoom::attr_size() const { + return _internal_attr_size(); +} +inline void MatchingRoom::clear_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL MatchingRoom::mutable_attr(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingRoom.attr) + return _internal_mutable_attr()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL MatchingRoom::mutable_attr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.MatchingRoom.attr) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_attr(); +} +inline const ::np2_structs::MatchingAttr& MatchingRoom::attr(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingRoom.attr) + return _internal_attr().Get(index); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL MatchingRoom::add_attr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::MatchingAttr* _add = + _internal_mutable_attr()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.MatchingRoom.attr) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& MatchingRoom::attr() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.MatchingRoom.attr) + return _internal_attr(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& +MatchingRoom::_internal_attr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attr_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL +MatchingRoom::_internal_mutable_attr() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.attr_; +} + +// ------------------------------------------------------------------- + +// MatchingRoomList + +// uint32 start = 1; +inline void MatchingRoomList::clear_start() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.start_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t MatchingRoomList::start() const { + // @@protoc_insertion_point(field_get:np2_structs.MatchingRoomList.start) + return _internal_start(); +} +inline void MatchingRoomList::set_start(::uint32_t value) { + _internal_set_start(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.MatchingRoomList.start) +} +inline ::uint32_t MatchingRoomList::_internal_start() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.start_; +} +inline void MatchingRoomList::_internal_set_start(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.start_ = value; +} + +// uint32 total = 2; +inline void MatchingRoomList::clear_total() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.total_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint32_t MatchingRoomList::total() const { + // @@protoc_insertion_point(field_get:np2_structs.MatchingRoomList.total) + return _internal_total(); +} +inline void MatchingRoomList::set_total(::uint32_t value) { + _internal_set_total(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.MatchingRoomList.total) +} +inline ::uint32_t MatchingRoomList::_internal_total() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.total_; +} +inline void MatchingRoomList::_internal_set_total(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.total_ = value; +} + +// repeated .np2_structs.MatchingRoom rooms = 3; +inline int MatchingRoomList::_internal_rooms_size() const { + return _internal_rooms().size(); +} +inline int MatchingRoomList::rooms_size() const { + return _internal_rooms_size(); +} +inline void MatchingRoomList::clear_rooms() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.rooms_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::MatchingRoom* PROTOBUF_NONNULL MatchingRoomList::mutable_rooms(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingRoomList.rooms) + return _internal_mutable_rooms()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingRoom>* PROTOBUF_NONNULL MatchingRoomList::mutable_rooms() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.MatchingRoomList.rooms) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_rooms(); +} +inline const ::np2_structs::MatchingRoom& MatchingRoomList::rooms(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingRoomList.rooms) + return _internal_rooms().Get(index); +} +inline ::np2_structs::MatchingRoom* PROTOBUF_NONNULL MatchingRoomList::add_rooms() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::MatchingRoom* _add = + _internal_mutable_rooms()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.MatchingRoomList.rooms) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingRoom>& MatchingRoomList::rooms() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.MatchingRoomList.rooms) + return _internal_rooms(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingRoom>& +MatchingRoomList::_internal_rooms() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.rooms_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingRoom>* PROTOBUF_NONNULL +MatchingRoomList::_internal_mutable_rooms() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.rooms_; +} + +// ------------------------------------------------------------------- + +// MatchingGuiRoomId + +// bytes id = 1; +inline void MatchingGuiRoomId::clear_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.id_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& MatchingGuiRoomId::id() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingGuiRoomId.id) + return _internal_id(); +} +template +PROTOBUF_ALWAYS_INLINE void MatchingGuiRoomId::set_id(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.id_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.MatchingGuiRoomId.id) +} +inline ::std::string* PROTOBUF_NONNULL MatchingGuiRoomId::mutable_id() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_id(); + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingGuiRoomId.id) + return _s; +} +inline const ::std::string& MatchingGuiRoomId::_internal_id() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.id_.Get(); +} +inline void MatchingGuiRoomId::_internal_set_id(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.id_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL MatchingGuiRoomId::_internal_mutable_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.id_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE MatchingGuiRoomId::release_id() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MatchingGuiRoomId.id) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.id_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.id_.Set("", GetArena()); + } + return released; +} +inline void MatchingGuiRoomId::set_allocated_id(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.id_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.id_.IsDefault()) { + _impl_.id_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.MatchingGuiRoomId.id) +} + +// ------------------------------------------------------------------- + +// SetRoomSearchFlagGUI + +// bytes roomid = 1; +inline void SetRoomSearchFlagGUI::clear_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_.ClearToEmpty(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::std::string& SetRoomSearchFlagGUI::roomid() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomSearchFlagGUI.roomid) + return _internal_roomid(); +} +template +PROTOBUF_ALWAYS_INLINE void SetRoomSearchFlagGUI::set_roomid(Arg_&& arg, Args_... args) { + ::google::protobuf::internal::TSanWrite(&_impl_); + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + _impl_.roomid_.SetBytes(static_cast(arg), args..., GetArena()); + // @@protoc_insertion_point(field_set:np2_structs.SetRoomSearchFlagGUI.roomid) +} +inline ::std::string* PROTOBUF_NONNULL SetRoomSearchFlagGUI::mutable_roomid() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::std::string* _s = _internal_mutable_roomid(); + // @@protoc_insertion_point(field_mutable:np2_structs.SetRoomSearchFlagGUI.roomid) + return _s; +} +inline const ::std::string& SetRoomSearchFlagGUI::_internal_roomid() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.roomid_.Get(); +} +inline void SetRoomSearchFlagGUI::_internal_set_roomid(const ::std::string& value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.roomid_.Set(value, GetArena()); +} +inline ::std::string* PROTOBUF_NONNULL SetRoomSearchFlagGUI::_internal_mutable_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + return _impl_.roomid_.Mutable( GetArena()); +} +inline ::std::string* PROTOBUF_NULLABLE SetRoomSearchFlagGUI::release_roomid() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.SetRoomSearchFlagGUI.roomid) + if (!CheckHasBit(_impl_._has_bits_[0], 0x00000001U)) { + return nullptr; + } + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + auto* released = _impl_.roomid_.Release(); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { + _impl_.roomid_.Set("", GetArena()); + } + return released; +} +inline void SetRoomSearchFlagGUI::set_allocated_roomid(::std::string* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + _impl_.roomid_.SetAllocated(value, GetArena()); + if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.roomid_.IsDefault()) { + _impl_.roomid_.Set("", GetArena()); + } + // @@protoc_insertion_point(field_set_allocated:np2_structs.SetRoomSearchFlagGUI.roomid) +} + +// bool stealth = 2; +inline void SetRoomSearchFlagGUI::clear_stealth() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.stealth_ = false; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline bool SetRoomSearchFlagGUI::stealth() const { + // @@protoc_insertion_point(field_get:np2_structs.SetRoomSearchFlagGUI.stealth) + return _internal_stealth(); +} +inline void SetRoomSearchFlagGUI::set_stealth(bool value) { + _internal_set_stealth(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.SetRoomSearchFlagGUI.stealth) +} +inline bool SetRoomSearchFlagGUI::_internal_stealth() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.stealth_; +} +inline void SetRoomSearchFlagGUI::_internal_set_stealth(bool value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.stealth_ = value; +} + +// ------------------------------------------------------------------- + +// QuickMatchGUIRequest + +// repeated .np2_structs.MatchingSearchCondition conds = 1; +inline int QuickMatchGUIRequest::_internal_conds_size() const { + return _internal_conds().size(); +} +inline int QuickMatchGUIRequest::conds_size() const { + return _internal_conds_size(); +} +inline void QuickMatchGUIRequest::clear_conds() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.conds_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL QuickMatchGUIRequest::mutable_conds(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.QuickMatchGUIRequest.conds) + return _internal_mutable_conds()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL QuickMatchGUIRequest::mutable_conds() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.QuickMatchGUIRequest.conds) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_conds(); +} +inline const ::np2_structs::MatchingSearchCondition& QuickMatchGUIRequest::conds(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.QuickMatchGUIRequest.conds) + return _internal_conds().Get(index); +} +inline ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL QuickMatchGUIRequest::add_conds() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::MatchingSearchCondition* _add = + _internal_mutable_conds()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.QuickMatchGUIRequest.conds) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& QuickMatchGUIRequest::conds() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.QuickMatchGUIRequest.conds) + return _internal_conds(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& +QuickMatchGUIRequest::_internal_conds() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.conds_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL +QuickMatchGUIRequest::_internal_mutable_conds() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.conds_; +} + +// uint32 available_num = 2; +inline void QuickMatchGUIRequest::clear_available_num() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.available_num_ = 0u; + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::uint32_t QuickMatchGUIRequest::available_num() const { + // @@protoc_insertion_point(field_get:np2_structs.QuickMatchGUIRequest.available_num) + return _internal_available_num(); +} +inline void QuickMatchGUIRequest::set_available_num(::uint32_t value) { + _internal_set_available_num(value); + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_set:np2_structs.QuickMatchGUIRequest.available_num) +} +inline ::uint32_t QuickMatchGUIRequest::_internal_available_num() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.available_num_; +} +inline void QuickMatchGUIRequest::_internal_set_available_num(::uint32_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.available_num_ = value; +} + +// ------------------------------------------------------------------- + +// SearchJoinRoomGUIRequest + +// repeated .np2_structs.MatchingSearchCondition conds = 1; +inline int SearchJoinRoomGUIRequest::_internal_conds_size() const { + return _internal_conds().size(); +} +inline int SearchJoinRoomGUIRequest::conds_size() const { + return _internal_conds_size(); +} +inline void SearchJoinRoomGUIRequest::clear_conds() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.conds_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL SearchJoinRoomGUIRequest::mutable_conds(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SearchJoinRoomGUIRequest.conds) + return _internal_mutable_conds()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL SearchJoinRoomGUIRequest::mutable_conds() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SearchJoinRoomGUIRequest.conds) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_conds(); +} +inline const ::np2_structs::MatchingSearchCondition& SearchJoinRoomGUIRequest::conds(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SearchJoinRoomGUIRequest.conds) + return _internal_conds().Get(index); +} +inline ::np2_structs::MatchingSearchCondition* PROTOBUF_NONNULL SearchJoinRoomGUIRequest::add_conds() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::MatchingSearchCondition* _add = + _internal_mutable_conds()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.SearchJoinRoomGUIRequest.conds) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& SearchJoinRoomGUIRequest::conds() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SearchJoinRoomGUIRequest.conds) + return _internal_conds(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>& +SearchJoinRoomGUIRequest::_internal_conds() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.conds_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingSearchCondition>* PROTOBUF_NONNULL +SearchJoinRoomGUIRequest::_internal_mutable_conds() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.conds_; +} + +// repeated .np2_structs.MatchingAttr attrs = 2; +inline int SearchJoinRoomGUIRequest::_internal_attrs_size() const { + return _internal_attrs().size(); +} +inline int SearchJoinRoomGUIRequest::attrs_size() const { + return _internal_attrs_size(); +} +inline void SearchJoinRoomGUIRequest::clear_attrs() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attrs_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000002U); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL SearchJoinRoomGUIRequest::mutable_attrs(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.SearchJoinRoomGUIRequest.attrs) + return _internal_mutable_attrs()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL SearchJoinRoomGUIRequest::mutable_attrs() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.SearchJoinRoomGUIRequest.attrs) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_attrs(); +} +inline const ::np2_structs::MatchingAttr& SearchJoinRoomGUIRequest::attrs(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.SearchJoinRoomGUIRequest.attrs) + return _internal_attrs().Get(index); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL SearchJoinRoomGUIRequest::add_attrs() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::MatchingAttr* _add = + _internal_mutable_attrs()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000002U); + // @@protoc_insertion_point(field_add:np2_structs.SearchJoinRoomGUIRequest.attrs) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& SearchJoinRoomGUIRequest::attrs() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.SearchJoinRoomGUIRequest.attrs) + return _internal_attrs(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& +SearchJoinRoomGUIRequest::_internal_attrs() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attrs_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL +SearchJoinRoomGUIRequest::_internal_mutable_attrs() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.attrs_; +} + +// ------------------------------------------------------------------- + +// MatchingSearchJoinRoomInfo + +// .np2_structs.MatchingRoomStatus room = 1; +inline bool MatchingSearchJoinRoomInfo::has_room() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.room_ != nullptr); + return value; +} +inline void MatchingSearchJoinRoomInfo::clear_room() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.room_ != nullptr) _impl_.room_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::MatchingRoomStatus& MatchingSearchJoinRoomInfo::_internal_room() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::MatchingRoomStatus* p = _impl_.room_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_MatchingRoomStatus_default_instance_); +} +inline const ::np2_structs::MatchingRoomStatus& MatchingSearchJoinRoomInfo::room() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingSearchJoinRoomInfo.room) + return _internal_room(); +} +inline void MatchingSearchJoinRoomInfo::unsafe_arena_set_allocated_room( + ::np2_structs::MatchingRoomStatus* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.room_); + } + _impl_.room_ = reinterpret_cast<::np2_structs::MatchingRoomStatus*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.MatchingSearchJoinRoomInfo.room) +} +inline ::np2_structs::MatchingRoomStatus* PROTOBUF_NULLABLE MatchingSearchJoinRoomInfo::release_room() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::MatchingRoomStatus* released = _impl_.room_; + _impl_.room_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::MatchingRoomStatus* PROTOBUF_NULLABLE MatchingSearchJoinRoomInfo::unsafe_arena_release_room() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.MatchingSearchJoinRoomInfo.room) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::MatchingRoomStatus* temp = _impl_.room_; + _impl_.room_ = nullptr; + return temp; +} +inline ::np2_structs::MatchingRoomStatus* PROTOBUF_NONNULL MatchingSearchJoinRoomInfo::_internal_mutable_room() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.room_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::MatchingRoomStatus>(GetArena()); + _impl_.room_ = reinterpret_cast<::np2_structs::MatchingRoomStatus*>(p); + } + return _impl_.room_; +} +inline ::np2_structs::MatchingRoomStatus* PROTOBUF_NONNULL MatchingSearchJoinRoomInfo::mutable_room() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::MatchingRoomStatus* _msg = _internal_mutable_room(); + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingSearchJoinRoomInfo.room) + return _msg; +} +inline void MatchingSearchJoinRoomInfo::set_allocated_room(::np2_structs::MatchingRoomStatus* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.room_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.room_ = reinterpret_cast<::np2_structs::MatchingRoomStatus*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.MatchingSearchJoinRoomInfo.room) +} + +// repeated .np2_structs.MatchingAttr attr = 2; +inline int MatchingSearchJoinRoomInfo::_internal_attr_size() const { + return _internal_attr().size(); +} +inline int MatchingSearchJoinRoomInfo::attr_size() const { + return _internal_attr_size(); +} +inline void MatchingSearchJoinRoomInfo::clear_attr() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.attr_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL MatchingSearchJoinRoomInfo::mutable_attr(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.MatchingSearchJoinRoomInfo.attr) + return _internal_mutable_attr()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL MatchingSearchJoinRoomInfo::mutable_attr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.MatchingSearchJoinRoomInfo.attr) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_attr(); +} +inline const ::np2_structs::MatchingAttr& MatchingSearchJoinRoomInfo::attr(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.MatchingSearchJoinRoomInfo.attr) + return _internal_attr().Get(index); +} +inline ::np2_structs::MatchingAttr* PROTOBUF_NONNULL MatchingSearchJoinRoomInfo::add_attr() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::MatchingAttr* _add = + _internal_mutable_attr()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.MatchingSearchJoinRoomInfo.attr) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& MatchingSearchJoinRoomInfo::attr() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.MatchingSearchJoinRoomInfo.attr) + return _internal_attr(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>& +MatchingSearchJoinRoomInfo::_internal_attr() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.attr_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::MatchingAttr>* PROTOBUF_NONNULL +MatchingSearchJoinRoomInfo::_internal_mutable_attr() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.attr_; +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif // __GNUC__ + +// @@protoc_insertion_point(namespace_scope) +} // namespace np2_structs + + +// @@protoc_insertion_point(global_scope) + +#include "google/protobuf/port_undef.inc" + +#endif // np2_5fstructs_2eproto_2epb_2eh diff --git a/rpcs3/Emu/NP/generated/np2_structs.proto b/rpcs3/Emu/NP/generated/np2_structs.proto new file mode 100644 index 0000000000..34413476e6 --- /dev/null +++ b/rpcs3/Emu/NP/generated/np2_structs.proto @@ -0,0 +1,687 @@ + +// Protocol Buffers definition for np2_structs + +syntax = "proto3"; + +option optimize_for = LITE_RUNTIME; + +package np2_structs; + +// These types exist to ease the transition from flatbuffers +message uint8 { + uint32 value = 1; +} + +message uint16 { + uint32 value = 1; +} + +// SignalingAddr +message SignalingAddr { + bytes ip = 1; + uint16 port = 2; +} + +// MatchingSignalingInfo +message MatchingSignalingInfo { + string npid = 1; + SignalingAddr addr = 2; +} + +// Matching2SignalingInfo +message Matching2SignalingInfo { + uint16 member_id = 1; + SignalingAddr addr = 2; +} + +// BinAttr +message BinAttr { + uint16 id = 1; + bytes data = 2; +} + +// IntAttr +message IntAttr { + uint16 id = 1; + uint32 num = 2; +} + +// RoomMemberBinAttrInternal +message RoomMemberBinAttrInternal { + uint64 updateDate = 1; + BinAttr data = 2; +} + +// BinAttrInternal +message BinAttrInternal { + uint64 updateDate = 1; + uint16 updateMemberId = 2; + BinAttr data = 3; +} + +// OptParam +message OptParam { + uint8 type = 1; + uint8 flag = 2; + uint16 hubMemberId = 3; +} + +// GroupConfig +message GroupConfig { + uint32 slotNum = 1; + bytes label = 2; + bool withPassword = 3; +} + +// UserInfo +message UserInfo { + string npId = 1; + string onlineName = 2; + string avatarUrl = 3; +} + +// RoomMemberDataInternal +message RoomMemberDataInternal { + UserInfo userInfo = 1; + uint64 joinDate = 2; + uint32 memberId = 3; + uint8 teamId = 4; + RoomGroup roomGroup = 5; + uint8 natType = 6; + uint32 flagAttr = 7; + repeated RoomMemberBinAttrInternal roomMemberBinAttrInternal = 8; +} + +// RoomGroup +message RoomGroup { + uint8 groupId = 1; + bool withPassword = 2; + bytes label = 3; + uint32 slotNum = 4; + uint32 curGroupMemberNum = 5; +} + +// RoomDataInternal +message RoomDataInternal { + uint16 serverId = 1; + uint32 worldId = 2; + uint64 lobbyId = 3; + uint64 roomId = 4; + uint64 passwordSlotMask = 5; + uint32 maxSlot = 6; + repeated RoomMemberDataInternal memberList = 7; + uint16 ownerId = 8; + repeated RoomGroup roomGroup = 9; + uint32 flagAttr = 10; + repeated BinAttrInternal roomBinAttrInternal = 11; +} + +// RoomDataExternal +message RoomDataExternal { + uint16 serverId = 1; + uint32 worldId = 2; + uint16 publicSlotNum = 3; + uint16 privateSlotNum = 4; + uint64 lobbyId = 5; + uint64 roomId = 6; + uint16 openPublicSlotNum = 7; + uint16 maxSlot = 8; + uint16 openPrivateSlotNum = 9; + uint16 curMemberNum = 10; + uint64 passwordSlotMask = 11; + UserInfo owner = 12; + repeated RoomGroup roomGroup = 13; + uint32 flagAttr = 14; + repeated IntAttr roomSearchableIntAttrExternal = 15; + repeated BinAttr roomSearchableBinAttrExternal = 16; + repeated BinAttr roomBinAttrExternal = 17; +} + +// IntSearchFilter +message IntSearchFilter { + uint8 searchOperator = 1; + IntAttr attr = 2; +} + +// BinSearchFilter +message BinSearchFilter { + uint8 searchOperator = 1; + BinAttr attr = 2; +} + +// PresenceOptionData +message PresenceOptionData { + bytes data = 1; + uint32 len = 2; +} + +// RoomGroupPasswordConfig +message RoomGroupPasswordConfig { + uint8 groupId = 1; + bool withPassword = 2; +} + +// SearchRoomRequest +message SearchRoomRequest { + int32 option = 1; + uint32 worldId = 2; + uint64 lobbyId = 3; + uint32 rangeFilter_startIndex = 4; + uint32 rangeFilter_max = 5; + uint32 flagFilter = 6; + uint32 flagAttr = 7; + repeated IntSearchFilter intFilter = 8; + repeated BinSearchFilter binFilter = 9; + repeated uint16 attrId = 10; +} + +// SearchRoomResponse +message SearchRoomResponse { + uint32 startIndex = 1; + uint32 total = 2; + repeated RoomDataExternal rooms = 3; +} + +// CreateJoinRoomRequest +message CreateJoinRoomRequest { + uint32 worldId = 1; + uint64 lobbyId = 2; + uint32 maxSlot = 3; + uint32 flagAttr = 4; + repeated BinAttr roomBinAttrInternal = 5; + repeated IntAttr roomSearchableIntAttrExternal = 6; + repeated BinAttr roomSearchableBinAttrExternal = 7; + repeated BinAttr roomBinAttrExternal = 8; + bytes roomPassword = 9; + repeated GroupConfig groupConfig = 10; + uint64 passwordSlotMask = 11; + repeated string allowedUser = 12; + repeated string blockedUser = 13; + bytes joinRoomGroupLabel = 14; + repeated BinAttr roomMemberBinAttrInternal = 15; + uint8 teamId = 16; + OptParam sigOptParam = 17; +} + +// JoinRoomRequest +message JoinRoomRequest { + uint64 roomId = 1; + bytes roomPassword = 2; + bytes joinRoomGroupLabel = 3; + repeated BinAttr roomMemberBinAttrInternal = 4; + PresenceOptionData optData = 5; + uint8 teamId = 6; +} + +// JoinRoomResponse +message JoinRoomResponse { + RoomDataInternal room_data = 1; + repeated Matching2SignalingInfo signaling_data = 2; +} + +// LeaveRoomRequest +message LeaveRoomRequest { + uint64 roomId = 1; + PresenceOptionData optData = 2; +} + +// GetRoomDataExternalListRequest +message GetRoomDataExternalListRequest { + repeated uint64 roomIds = 1; + repeated uint16 attrIds = 2; +} + +// GetRoomDataExternalListResponse +message GetRoomDataExternalListResponse { + repeated RoomDataExternal rooms = 1; +} + +// SetRoomDataExternalRequest +message SetRoomDataExternalRequest { + uint64 roomId = 1; + repeated IntAttr roomSearchableIntAttrExternal = 2; + repeated BinAttr roomSearchableBinAttrExternal = 3; + repeated BinAttr roomBinAttrExternal = 4; +} + +// SetRoomDataInternalRequest +message SetRoomDataInternalRequest { + uint64 roomId = 1; + uint32 flagFilter = 2; + uint32 flagAttr = 3; + repeated BinAttr roomBinAttrInternal = 4; + repeated RoomGroupPasswordConfig passwordConfig = 5; + repeated uint64 passwordSlotMask = 6; + repeated uint16 ownerPrivilegeRank = 7; +} + +// GetRoomMemberDataInternalRequest +message GetRoomMemberDataInternalRequest { + uint64 roomId = 1; + uint16 memberId = 2; + repeated uint16 attrId = 3; +} + +// SetRoomMemberDataInternalRequest +message SetRoomMemberDataInternalRequest { + uint64 roomId = 1; + uint16 memberId = 2; + uint8 teamId = 3; + repeated BinAttr roomMemberBinAttrInternal = 4; +} + +// SetUserInfo +message SetUserInfo { + uint16 serverId = 1; + repeated BinAttr userBinAttr = 2; +} + +// GetRoomDataInternalRequest +message GetRoomDataInternalRequest { + uint64 roomId = 1; + repeated uint16 attrId = 2; +} + +// RoomMemberUpdateInfo +message RoomMemberUpdateInfo { + RoomMemberDataInternal roomMemberDataInternal = 1; + uint8 eventCause = 2; + PresenceOptionData optData = 3; +} + +// NotificationUserJoinedRoom +message NotificationUserJoinedRoom { + uint64 room_id = 1; + RoomMemberUpdateInfo update_info = 2; + SignalingAddr signaling = 3; +} + +// RoomUpdateInfo +message RoomUpdateInfo { + uint8 eventCause = 1; + int32 errorCode = 2; + PresenceOptionData optData = 3; +} + +// RoomDataInternalUpdateInfo +message RoomDataInternalUpdateInfo { + RoomDataInternal newRoomDataInternal = 1; + uint32 prevFlagAttr = 2; + uint64 prevRoomPasswordSlotMask = 3; + bytes newRoomGroup = 4; + repeated uint16 newRoomBinAttrInternal = 5; +} + +// RoomMemberDataInternalUpdateInfo +message RoomMemberDataInternalUpdateInfo { + RoomMemberDataInternal newRoomMemberDataInternal = 1; + uint32 prevFlagAttr = 2; + uint8 prevTeamId = 3; + repeated uint16 newRoomMemberBinAttrInternal = 4; +} + +// GetPingInfoResponse +message GetPingInfoResponse { + uint16 serverId = 1; + uint32 worldId = 2; + uint64 roomId = 3; + uint32 rtt = 4; +} + +// SendRoomMessageRequest +message SendRoomMessageRequest { + uint64 roomId = 1; + uint8 castType = 2; + repeated uint16 dst = 3; + bytes msg = 4; + uint8 option = 5; +} + +// RoomMessageInfo +message RoomMessageInfo { + bool filtered = 1; + uint8 castType = 2; + repeated uint16 dst = 3; + UserInfo srcMember = 4; + bytes msg = 5; +} + +// MessageDetails +message MessageDetails { + string communicationId = 1; + uint64 msgId = 2; + uint16 mainType = 3; + uint16 subType = 4; + uint32 msgFeatures = 5; + string subject = 6; + string body = 7; + bytes data = 8; +} + +// SendMessageRequest +message SendMessageRequest { + bytes message = 1; + repeated string npids = 2; +} + +// BoardInfo +message BoardInfo { + uint32 rankLimit = 1; + uint32 updateMode = 2; + uint32 sortMode = 3; + uint32 uploadNumLimit = 4; + uint32 uploadSizeLimit = 5; +} + +// RecordScoreRequest +message RecordScoreRequest { + uint32 boardId = 1; + int32 pcId = 2; + int64 score = 3; + string comment = 4; + bytes data = 5; +} + +// GetScoreRangeRequest +message GetScoreRangeRequest { + uint32 boardId = 1; + uint32 startRank = 2; + uint32 numRanks = 3; + bool withComment = 4; + bool withGameInfo = 5; +} + +// ScoreNpIdPcId +message ScoreNpIdPcId { + string npid = 1; + int32 pcId = 2; +} + +// GetScoreNpIdRequest +message GetScoreNpIdRequest { + uint32 boardId = 1; + repeated ScoreNpIdPcId npids = 2; + bool withComment = 3; + bool withGameInfo = 4; +} + +// GetScoreFriendsRequest +message GetScoreFriendsRequest { + uint32 boardId = 1; + bool include_self = 2; + uint32 max = 3; + bool withComment = 4; + bool withGameInfo = 5; +} + +// ScoreRankData +message ScoreRankData { + string npId = 1; + string onlineName = 2; + int32 pcId = 3; + uint32 rank = 4; + int64 score = 5; + bool hasGameData = 6; + uint64 recordDate = 7; +} + +// ScoreInfo +message ScoreInfo { + bytes data = 1; +} + +// GetScoreResponse +message GetScoreResponse { + repeated ScoreRankData rankArray = 1; + repeated string commentArray = 2; + repeated ScoreInfo infoArray = 3; + uint64 lastSortDate = 4; + uint32 totalRecord = 5; +} + +// RecordScoreGameDataRequest +message RecordScoreGameDataRequest { + uint32 boardId = 1; + int32 pcId = 2; + int64 score = 3; +} + +// GetScoreGameDataRequest +message GetScoreGameDataRequest { + uint32 boardId = 1; + string npId = 2; + int32 pcId = 3; +} + +// TusUser +message TusUser { + bool vuser = 1; + string npid = 2; +} + +// TusVariable +message TusVariable { + string ownerId = 1; + bool hasData = 2; + uint64 lastChangedDate = 3; + string lastChangedAuthorId = 4; + int64 variable = 5; + int64 oldVariable = 6; +} + +// TusVarResponse +message TusVarResponse { + repeated TusVariable vars = 1; +} + +// TusSetMultiSlotVariableRequest +message TusSetMultiSlotVariableRequest { + TusUser user = 1; + repeated int32 slotIdArray = 2; + repeated int64 variableArray = 3; +} + +// TusGetMultiSlotVariableRequest +message TusGetMultiSlotVariableRequest { + TusUser user = 1; + repeated int32 slotIdArray = 2; +} + +// TusGetMultiUserVariableRequest +message TusGetMultiUserVariableRequest { + repeated TusUser users = 1; + int32 slotId = 2; +} + +// TusGetFriendsVariableRequest +message TusGetFriendsVariableRequest { + int32 slotId = 1; + bool includeSelf = 2; + int32 sortType = 3; + uint32 arrayNum = 4; +} + +// TusAddAndGetVariableRequest +message TusAddAndGetVariableRequest { + TusUser user = 1; + int32 slotId = 2; + int64 inVariable = 3; + repeated uint64 isLastChangedDate = 4; + string isLastChangedAuthorId = 5; +} + +// TusTryAndSetVariableRequest +message TusTryAndSetVariableRequest { + TusUser user = 1; + int32 slotId = 2; + int32 opeType = 3; + int64 variable = 4; + repeated uint64 isLastChangedDate = 5; + string isLastChangedAuthorId = 6; + repeated int64 compareValue = 7; +} + +// TusDeleteMultiSlotVariableRequest +message TusDeleteMultiSlotVariableRequest { + TusUser user = 1; + repeated int32 slotIdArray = 2; +} + +// TusSetDataRequest +message TusSetDataRequest { + TusUser user = 1; + int32 slotId = 2; + bytes data = 3; + bytes info = 4; + repeated uint64 isLastChangedDate = 5; + string isLastChangedAuthorId = 6; +} + +// TusDataStatus +message TusDataStatus { + string ownerId = 1; + bool hasData = 2; + uint64 lastChangedDate = 3; + string lastChangedAuthorId = 4; + bytes info = 5; +} + +// TusData +message TusData { + TusDataStatus status = 1; + bytes data = 2; +} + +// TusDataStatusResponse +message TusDataStatusResponse { + repeated TusDataStatus status = 1; +} + +// TusGetDataRequest +message TusGetDataRequest { + TusUser user = 1; + int32 slotId = 2; +} + +// TusGetMultiSlotDataStatusRequest +message TusGetMultiSlotDataStatusRequest { + TusUser user = 1; + repeated int32 slotIdArray = 2; +} + +// TusGetMultiUserDataStatusRequest +message TusGetMultiUserDataStatusRequest { + repeated TusUser users = 1; + int32 slotId = 2; +} + +// TusGetFriendsDataStatusRequest +message TusGetFriendsDataStatusRequest { + int32 slotId = 1; + bool includeSelf = 2; + int32 sortType = 3; + uint32 arrayNum = 4; +} + +// TusDeleteMultiSlotDataRequest +message TusDeleteMultiSlotDataRequest { + TusUser user = 1; + repeated int32 slotIdArray = 2; +} + +// SetPresenceRequest +message SetPresenceRequest { + string title = 1; + string status = 2; + string comment = 3; + bytes data = 4; +} + +// MatchingSearchCondition +message MatchingSearchCondition { + uint32 attr_type = 1; + uint32 attr_id = 2; + uint32 comp_op = 3; + uint32 comp_value = 4; +} + +// MatchingAttr +message MatchingAttr { + uint32 attr_type = 1; + uint32 attr_id = 2; + uint32 num = 3; + bytes data = 4; +} + +// CreateRoomGUIRequest +message CreateRoomGUIRequest { + uint32 total_slots = 1; + uint32 private_slots = 2; + bool privilege_grant = 3; + bool stealth = 4; + repeated MatchingAttr game_attrs = 5; +} + +// GUIUserInfo +message GUIUserInfo { + UserInfo info = 1; + bool owner = 2; +} + +// MatchingRoomStatus +message MatchingRoomStatus { + bytes id = 1; + repeated GUIUserInfo members = 2; + string kick_actor = 3; + bytes opt = 4; +} + +// GetRoomListGUIRequest +message GetRoomListGUIRequest { + uint32 range_start = 1; + uint32 range_max = 2; + repeated MatchingSearchCondition conds = 3; + repeated MatchingAttr attrs = 4; +} + +// MatchingRoom +message MatchingRoom { + bytes id = 1; + repeated MatchingAttr attr = 2; +} + +// MatchingRoomList +message MatchingRoomList { + uint32 start = 1; + uint32 total = 2; + repeated MatchingRoom rooms = 3; +} + +// MatchingGuiRoomId +message MatchingGuiRoomId { + bytes id = 1; +} + +// SetRoomSearchFlagGUI +message SetRoomSearchFlagGUI { + bytes roomid = 1; + bool stealth = 2; +} + +// QuickMatchGUIRequest +message QuickMatchGUIRequest { + repeated MatchingSearchCondition conds = 1; + uint32 available_num = 2; +} + +// SearchJoinRoomGUIRequest +message SearchJoinRoomGUIRequest { + repeated MatchingSearchCondition conds = 1; + repeated MatchingAttr attrs = 2; +} + +// MatchingSearchJoinRoomInfo +message MatchingSearchJoinRoomInfo { + MatchingRoomStatus room = 1; + repeated MatchingAttr attr = 2; +} diff --git a/rpcs3/Emu/NP/generated/np2_structs_generated.h b/rpcs3/Emu/NP/generated/np2_structs_generated.h deleted file mode 100644 index 5dabacbbc9..0000000000 --- a/rpcs3/Emu/NP/generated/np2_structs_generated.h +++ /dev/null @@ -1,7429 +0,0 @@ -// automatically generated by the FlatBuffers compiler, do not modify - - -#ifndef FLATBUFFERS_GENERATED_NP2STRUCTS_H_ -#define FLATBUFFERS_GENERATED_NP2STRUCTS_H_ - -#include "flatbuffers/flatbuffers.h" - -// Ensure the included flatbuffers.h is the same version as when this file was -// generated, otherwise it may not be compatible. -static_assert(FLATBUFFERS_VERSION_MAJOR == 25 && - FLATBUFFERS_VERSION_MINOR == 9 && - FLATBUFFERS_VERSION_REVISION == 23, - "Non-compatible flatbuffers version included"); - -struct SignalingAddr; -struct SignalingAddrBuilder; - -struct MatchingSignalingInfo; -struct MatchingSignalingInfoBuilder; - -struct Matching2SignalingInfo; -struct Matching2SignalingInfoBuilder; - -struct BinAttr; -struct BinAttrBuilder; - -struct IntAttr; -struct IntAttrBuilder; - -struct RoomMemberBinAttrInternal; -struct RoomMemberBinAttrInternalBuilder; - -struct BinAttrInternal; -struct BinAttrInternalBuilder; - -struct OptParam; -struct OptParamBuilder; - -struct GroupConfig; -struct GroupConfigBuilder; - -struct UserInfo; -struct UserInfoBuilder; - -struct RoomMemberDataInternal; -struct RoomMemberDataInternalBuilder; - -struct RoomGroup; -struct RoomGroupBuilder; - -struct RoomDataInternal; -struct RoomDataInternalBuilder; - -struct RoomDataExternal; -struct RoomDataExternalBuilder; - -struct IntSearchFilter; -struct IntSearchFilterBuilder; - -struct BinSearchFilter; -struct BinSearchFilterBuilder; - -struct PresenceOptionData; -struct PresenceOptionDataBuilder; - -struct RoomGroupPasswordConfig; -struct RoomGroupPasswordConfigBuilder; - -struct SearchRoomRequest; -struct SearchRoomRequestBuilder; - -struct SearchRoomResponse; -struct SearchRoomResponseBuilder; - -struct CreateJoinRoomRequest; -struct CreateJoinRoomRequestBuilder; - -struct JoinRoomRequest; -struct JoinRoomRequestBuilder; - -struct JoinRoomResponse; -struct JoinRoomResponseBuilder; - -struct LeaveRoomRequest; -struct LeaveRoomRequestBuilder; - -struct GetRoomDataExternalListRequest; -struct GetRoomDataExternalListRequestBuilder; - -struct GetRoomDataExternalListResponse; -struct GetRoomDataExternalListResponseBuilder; - -struct SetRoomDataExternalRequest; -struct SetRoomDataExternalRequestBuilder; - -struct SetRoomDataInternalRequest; -struct SetRoomDataInternalRequestBuilder; - -struct GetRoomMemberDataInternalRequest; -struct GetRoomMemberDataInternalRequestBuilder; - -struct SetRoomMemberDataInternalRequest; -struct SetRoomMemberDataInternalRequestBuilder; - -struct SetUserInfo; -struct SetUserInfoBuilder; - -struct GetRoomDataInternalRequest; -struct GetRoomDataInternalRequestBuilder; - -struct RoomMemberUpdateInfo; -struct RoomMemberUpdateInfoBuilder; - -struct NotificationUserJoinedRoom; -struct NotificationUserJoinedRoomBuilder; - -struct RoomUpdateInfo; -struct RoomUpdateInfoBuilder; - -struct RoomDataInternalUpdateInfo; -struct RoomDataInternalUpdateInfoBuilder; - -struct RoomMemberDataInternalUpdateInfo; -struct RoomMemberDataInternalUpdateInfoBuilder; - -struct GetPingInfoResponse; -struct GetPingInfoResponseBuilder; - -struct SendRoomMessageRequest; -struct SendRoomMessageRequestBuilder; - -struct RoomMessageInfo; -struct RoomMessageInfoBuilder; - -struct MessageDetails; -struct MessageDetailsBuilder; - -struct SendMessageRequest; -struct SendMessageRequestBuilder; - -struct BoardInfo; -struct BoardInfoBuilder; - -struct RecordScoreRequest; -struct RecordScoreRequestBuilder; - -struct GetScoreRangeRequest; -struct GetScoreRangeRequestBuilder; - -struct ScoreNpIdPcId; -struct ScoreNpIdPcIdBuilder; - -struct GetScoreNpIdRequest; -struct GetScoreNpIdRequestBuilder; - -struct GetScoreFriendsRequest; -struct GetScoreFriendsRequestBuilder; - -struct ScoreRankData; -struct ScoreRankDataBuilder; - -struct ScoreInfo; -struct ScoreInfoBuilder; - -struct GetScoreResponse; -struct GetScoreResponseBuilder; - -struct RecordScoreGameDataRequest; -struct RecordScoreGameDataRequestBuilder; - -struct GetScoreGameDataRequest; -struct GetScoreGameDataRequestBuilder; - -struct TusUser; -struct TusUserBuilder; - -struct TusVariable; -struct TusVariableBuilder; - -struct TusVarResponse; -struct TusVarResponseBuilder; - -struct TusSetMultiSlotVariableRequest; -struct TusSetMultiSlotVariableRequestBuilder; - -struct TusGetMultiSlotVariableRequest; -struct TusGetMultiSlotVariableRequestBuilder; - -struct TusGetMultiUserVariableRequest; -struct TusGetMultiUserVariableRequestBuilder; - -struct TusGetFriendsVariableRequest; -struct TusGetFriendsVariableRequestBuilder; - -struct TusAddAndGetVariableRequest; -struct TusAddAndGetVariableRequestBuilder; - -struct TusTryAndSetVariableRequest; -struct TusTryAndSetVariableRequestBuilder; - -struct TusDeleteMultiSlotVariableRequest; -struct TusDeleteMultiSlotVariableRequestBuilder; - -struct TusSetDataRequest; -struct TusSetDataRequestBuilder; - -struct TusDataStatus; -struct TusDataStatusBuilder; - -struct TusData; -struct TusDataBuilder; - -struct TusDataStatusResponse; -struct TusDataStatusResponseBuilder; - -struct TusGetDataRequest; -struct TusGetDataRequestBuilder; - -struct TusGetMultiSlotDataStatusRequest; -struct TusGetMultiSlotDataStatusRequestBuilder; - -struct TusGetMultiUserDataStatusRequest; -struct TusGetMultiUserDataStatusRequestBuilder; - -struct TusGetFriendsDataStatusRequest; -struct TusGetFriendsDataStatusRequestBuilder; - -struct TusDeleteMultiSlotDataRequest; -struct TusDeleteMultiSlotDataRequestBuilder; - -struct SetPresenceRequest; -struct SetPresenceRequestBuilder; - -struct MatchingSearchCondition; -struct MatchingSearchConditionBuilder; - -struct MatchingAttr; -struct MatchingAttrBuilder; - -struct CreateRoomGUIRequest; -struct CreateRoomGUIRequestBuilder; - -struct GUIUserInfo; -struct GUIUserInfoBuilder; - -struct MatchingRoomStatus; -struct MatchingRoomStatusBuilder; - -struct GetRoomListGUIRequest; -struct GetRoomListGUIRequestBuilder; - -struct MatchingRoom; -struct MatchingRoomBuilder; - -struct MatchingRoomList; -struct MatchingRoomListBuilder; - -struct MatchingGuiRoomId; -struct MatchingGuiRoomIdBuilder; - -struct SetRoomSearchFlagGUI; -struct SetRoomSearchFlagGUIBuilder; - -struct QuickMatchGUIRequest; -struct QuickMatchGUIRequestBuilder; - -struct SearchJoinRoomGUIRequest; -struct SearchJoinRoomGUIRequestBuilder; - -struct MatchingSearchJoinRoomInfo; -struct MatchingSearchJoinRoomInfoBuilder; - -struct SignalingAddr FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SignalingAddrBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_IP = 4, - VT_PORT = 6 - }; - const ::flatbuffers::Vector *ip() const { - return GetPointer *>(VT_IP); - } - uint16_t port() const { - return GetField(VT_PORT, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_IP) && - verifier.VerifyVector(ip()) && - VerifyField(verifier, VT_PORT, 2) && - verifier.EndTable(); - } -}; - -struct SignalingAddrBuilder { - typedef SignalingAddr Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_ip(::flatbuffers::Offset<::flatbuffers::Vector> ip) { - fbb_.AddOffset(SignalingAddr::VT_IP, ip); - } - void add_port(uint16_t port) { - fbb_.AddElement(SignalingAddr::VT_PORT, port, 0); - } - explicit SignalingAddrBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSignalingAddr( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> ip = 0, - uint16_t port = 0) { - SignalingAddrBuilder builder_(_fbb); - builder_.add_ip(ip); - builder_.add_port(port); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSignalingAddrDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *ip = nullptr, - uint16_t port = 0) { - auto ip__ = ip ? _fbb.CreateVector(*ip) : 0; - return CreateSignalingAddr( - _fbb, - ip__, - port); -} - -struct MatchingSignalingInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef MatchingSignalingInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NPID = 4, - VT_ADDR = 6 - }; - const ::flatbuffers::String *npid() const { - return GetPointer(VT_NPID); - } - const SignalingAddr *addr() const { - return GetPointer(VT_ADDR); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_NPID) && - verifier.VerifyString(npid()) && - VerifyOffset(verifier, VT_ADDR) && - verifier.VerifyTable(addr()) && - verifier.EndTable(); - } -}; - -struct MatchingSignalingInfoBuilder { - typedef MatchingSignalingInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_npid(::flatbuffers::Offset<::flatbuffers::String> npid) { - fbb_.AddOffset(MatchingSignalingInfo::VT_NPID, npid); - } - void add_addr(::flatbuffers::Offset addr) { - fbb_.AddOffset(MatchingSignalingInfo::VT_ADDR, addr); - } - explicit MatchingSignalingInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMatchingSignalingInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::String> npid = 0, - ::flatbuffers::Offset addr = 0) { - MatchingSignalingInfoBuilder builder_(_fbb); - builder_.add_addr(addr); - builder_.add_npid(npid); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateMatchingSignalingInfoDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const char *npid = nullptr, - ::flatbuffers::Offset addr = 0) { - auto npid__ = npid ? _fbb.CreateString(npid) : 0; - return CreateMatchingSignalingInfo( - _fbb, - npid__, - addr); -} - -struct Matching2SignalingInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef Matching2SignalingInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_MEMBER_ID = 4, - VT_ADDR = 6 - }; - uint16_t member_id() const { - return GetField(VT_MEMBER_ID, 0); - } - const SignalingAddr *addr() const { - return GetPointer(VT_ADDR); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_MEMBER_ID, 2) && - VerifyOffset(verifier, VT_ADDR) && - verifier.VerifyTable(addr()) && - verifier.EndTable(); - } -}; - -struct Matching2SignalingInfoBuilder { - typedef Matching2SignalingInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_member_id(uint16_t member_id) { - fbb_.AddElement(Matching2SignalingInfo::VT_MEMBER_ID, member_id, 0); - } - void add_addr(::flatbuffers::Offset addr) { - fbb_.AddOffset(Matching2SignalingInfo::VT_ADDR, addr); - } - explicit Matching2SignalingInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMatching2SignalingInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t member_id = 0, - ::flatbuffers::Offset addr = 0) { - Matching2SignalingInfoBuilder builder_(_fbb); - builder_.add_addr(addr); - builder_.add_member_id(member_id); - return builder_.Finish(); -} - -struct BinAttr FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef BinAttrBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ID = 4, - VT_DATA = 6 - }; - uint16_t id() const { - return GetField(VT_ID, 0); - } - const ::flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ID, 2) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - verifier.EndTable(); - } -}; - -struct BinAttrBuilder { - typedef BinAttr Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_id(uint16_t id) { - fbb_.AddElement(BinAttr::VT_ID, id, 0); - } - void add_data(::flatbuffers::Offset<::flatbuffers::Vector> data) { - fbb_.AddOffset(BinAttr::VT_DATA, data); - } - explicit BinAttrBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateBinAttr( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t id = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> data = 0) { - BinAttrBuilder builder_(_fbb); - builder_.add_data(data); - builder_.add_id(id); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateBinAttrDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t id = 0, - const std::vector *data = nullptr) { - auto data__ = data ? _fbb.CreateVector(*data) : 0; - return CreateBinAttr( - _fbb, - id, - data__); -} - -struct IntAttr FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef IntAttrBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ID = 4, - VT_NUM = 6 - }; - uint16_t id() const { - return GetField(VT_ID, 0); - } - uint32_t num() const { - return GetField(VT_NUM, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ID, 2) && - VerifyField(verifier, VT_NUM, 4) && - verifier.EndTable(); - } -}; - -struct IntAttrBuilder { - typedef IntAttr Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_id(uint16_t id) { - fbb_.AddElement(IntAttr::VT_ID, id, 0); - } - void add_num(uint32_t num) { - fbb_.AddElement(IntAttr::VT_NUM, num, 0); - } - explicit IntAttrBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateIntAttr( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t id = 0, - uint32_t num = 0) { - IntAttrBuilder builder_(_fbb); - builder_.add_num(num); - builder_.add_id(id); - return builder_.Finish(); -} - -struct RoomMemberBinAttrInternal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomMemberBinAttrInternalBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_UPDATEDATE = 4, - VT_DATA = 6 - }; - uint64_t updateDate() const { - return GetField(VT_UPDATEDATE, 0); - } - const BinAttr *data() const { - return GetPointer(VT_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_UPDATEDATE, 8) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyTable(data()) && - verifier.EndTable(); - } -}; - -struct RoomMemberBinAttrInternalBuilder { - typedef RoomMemberBinAttrInternal Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_updateDate(uint64_t updateDate) { - fbb_.AddElement(RoomMemberBinAttrInternal::VT_UPDATEDATE, updateDate, 0); - } - void add_data(::flatbuffers::Offset data) { - fbb_.AddOffset(RoomMemberBinAttrInternal::VT_DATA, data); - } - explicit RoomMemberBinAttrInternalBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomMemberBinAttrInternal( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t updateDate = 0, - ::flatbuffers::Offset data = 0) { - RoomMemberBinAttrInternalBuilder builder_(_fbb); - builder_.add_updateDate(updateDate); - builder_.add_data(data); - return builder_.Finish(); -} - -struct BinAttrInternal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef BinAttrInternalBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_UPDATEDATE = 4, - VT_UPDATEMEMBERID = 6, - VT_DATA = 8 - }; - uint64_t updateDate() const { - return GetField(VT_UPDATEDATE, 0); - } - uint16_t updateMemberId() const { - return GetField(VT_UPDATEMEMBERID, 0); - } - const BinAttr *data() const { - return GetPointer(VT_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_UPDATEDATE, 8) && - VerifyField(verifier, VT_UPDATEMEMBERID, 2) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyTable(data()) && - verifier.EndTable(); - } -}; - -struct BinAttrInternalBuilder { - typedef BinAttrInternal Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_updateDate(uint64_t updateDate) { - fbb_.AddElement(BinAttrInternal::VT_UPDATEDATE, updateDate, 0); - } - void add_updateMemberId(uint16_t updateMemberId) { - fbb_.AddElement(BinAttrInternal::VT_UPDATEMEMBERID, updateMemberId, 0); - } - void add_data(::flatbuffers::Offset data) { - fbb_.AddOffset(BinAttrInternal::VT_DATA, data); - } - explicit BinAttrInternalBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateBinAttrInternal( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t updateDate = 0, - uint16_t updateMemberId = 0, - ::flatbuffers::Offset data = 0) { - BinAttrInternalBuilder builder_(_fbb); - builder_.add_updateDate(updateDate); - builder_.add_data(data); - builder_.add_updateMemberId(updateMemberId); - return builder_.Finish(); -} - -struct OptParam FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef OptParamBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_TYPE = 4, - VT_FLAG = 6, - VT_HUBMEMBERID = 8 - }; - uint8_t type() const { - return GetField(VT_TYPE, 0); - } - uint8_t flag() const { - return GetField(VT_FLAG, 0); - } - uint16_t hubMemberId() const { - return GetField(VT_HUBMEMBERID, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_TYPE, 1) && - VerifyField(verifier, VT_FLAG, 1) && - VerifyField(verifier, VT_HUBMEMBERID, 2) && - verifier.EndTable(); - } -}; - -struct OptParamBuilder { - typedef OptParam Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_type(uint8_t type) { - fbb_.AddElement(OptParam::VT_TYPE, type, 0); - } - void add_flag(uint8_t flag) { - fbb_.AddElement(OptParam::VT_FLAG, flag, 0); - } - void add_hubMemberId(uint16_t hubMemberId) { - fbb_.AddElement(OptParam::VT_HUBMEMBERID, hubMemberId, 0); - } - explicit OptParamBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateOptParam( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint8_t type = 0, - uint8_t flag = 0, - uint16_t hubMemberId = 0) { - OptParamBuilder builder_(_fbb); - builder_.add_hubMemberId(hubMemberId); - builder_.add_flag(flag); - builder_.add_type(type); - return builder_.Finish(); -} - -struct GroupConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GroupConfigBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SLOTNUM = 4, - VT_LABEL = 6, - VT_WITHPASSWORD = 8 - }; - uint32_t slotNum() const { - return GetField(VT_SLOTNUM, 0); - } - const ::flatbuffers::Vector *label() const { - return GetPointer *>(VT_LABEL); - } - bool withPassword() const { - return GetField(VT_WITHPASSWORD, 0) != 0; - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SLOTNUM, 4) && - VerifyOffset(verifier, VT_LABEL) && - verifier.VerifyVector(label()) && - VerifyField(verifier, VT_WITHPASSWORD, 1) && - verifier.EndTable(); - } -}; - -struct GroupConfigBuilder { - typedef GroupConfig Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_slotNum(uint32_t slotNum) { - fbb_.AddElement(GroupConfig::VT_SLOTNUM, slotNum, 0); - } - void add_label(::flatbuffers::Offset<::flatbuffers::Vector> label) { - fbb_.AddOffset(GroupConfig::VT_LABEL, label); - } - void add_withPassword(bool withPassword) { - fbb_.AddElement(GroupConfig::VT_WITHPASSWORD, static_cast(withPassword), 0); - } - explicit GroupConfigBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGroupConfig( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t slotNum = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> label = 0, - bool withPassword = false) { - GroupConfigBuilder builder_(_fbb); - builder_.add_label(label); - builder_.add_slotNum(slotNum); - builder_.add_withPassword(withPassword); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateGroupConfigDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t slotNum = 0, - const std::vector *label = nullptr, - bool withPassword = false) { - auto label__ = label ? _fbb.CreateVector(*label) : 0; - return CreateGroupConfig( - _fbb, - slotNum, - label__, - withPassword); -} - -struct UserInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef UserInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NPID = 4, - VT_ONLINENAME = 6, - VT_AVATARURL = 8 - }; - const ::flatbuffers::String *npId() const { - return GetPointer(VT_NPID); - } - const ::flatbuffers::String *onlineName() const { - return GetPointer(VT_ONLINENAME); - } - const ::flatbuffers::String *avatarUrl() const { - return GetPointer(VT_AVATARURL); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_NPID) && - verifier.VerifyString(npId()) && - VerifyOffset(verifier, VT_ONLINENAME) && - verifier.VerifyString(onlineName()) && - VerifyOffset(verifier, VT_AVATARURL) && - verifier.VerifyString(avatarUrl()) && - verifier.EndTable(); - } -}; - -struct UserInfoBuilder { - typedef UserInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_npId(::flatbuffers::Offset<::flatbuffers::String> npId) { - fbb_.AddOffset(UserInfo::VT_NPID, npId); - } - void add_onlineName(::flatbuffers::Offset<::flatbuffers::String> onlineName) { - fbb_.AddOffset(UserInfo::VT_ONLINENAME, onlineName); - } - void add_avatarUrl(::flatbuffers::Offset<::flatbuffers::String> avatarUrl) { - fbb_.AddOffset(UserInfo::VT_AVATARURL, avatarUrl); - } - explicit UserInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateUserInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::String> npId = 0, - ::flatbuffers::Offset<::flatbuffers::String> onlineName = 0, - ::flatbuffers::Offset<::flatbuffers::String> avatarUrl = 0) { - UserInfoBuilder builder_(_fbb); - builder_.add_avatarUrl(avatarUrl); - builder_.add_onlineName(onlineName); - builder_.add_npId(npId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateUserInfoDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const char *npId = nullptr, - const char *onlineName = nullptr, - const char *avatarUrl = nullptr) { - auto npId__ = npId ? _fbb.CreateString(npId) : 0; - auto onlineName__ = onlineName ? _fbb.CreateString(onlineName) : 0; - auto avatarUrl__ = avatarUrl ? _fbb.CreateString(avatarUrl) : 0; - return CreateUserInfo( - _fbb, - npId__, - onlineName__, - avatarUrl__); -} - -struct RoomMemberDataInternal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomMemberDataInternalBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USERINFO = 4, - VT_JOINDATE = 6, - VT_MEMBERID = 8, - VT_TEAMID = 10, - VT_ROOMGROUP = 12, - VT_NATTYPE = 14, - VT_FLAGATTR = 16, - VT_ROOMMEMBERBINATTRINTERNAL = 18 - }; - const UserInfo *userInfo() const { - return GetPointer(VT_USERINFO); - } - uint64_t joinDate() const { - return GetField(VT_JOINDATE, 0); - } - uint16_t memberId() const { - return GetField(VT_MEMBERID, 0); - } - uint8_t teamId() const { - return GetField(VT_TEAMID, 0); - } - const RoomGroup *roomGroup() const { - return GetPointer(VT_ROOMGROUP); - } - uint8_t natType() const { - return GetField(VT_NATTYPE, 0); - } - uint32_t flagAttr() const { - return GetField(VT_FLAGATTR, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomMemberBinAttrInternal() const { - return GetPointer> *>(VT_ROOMMEMBERBINATTRINTERNAL); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USERINFO) && - verifier.VerifyTable(userInfo()) && - VerifyField(verifier, VT_JOINDATE, 8) && - VerifyField(verifier, VT_MEMBERID, 2) && - VerifyField(verifier, VT_TEAMID, 1) && - VerifyOffset(verifier, VT_ROOMGROUP) && - verifier.VerifyTable(roomGroup()) && - VerifyField(verifier, VT_NATTYPE, 1) && - VerifyField(verifier, VT_FLAGATTR, 4) && - VerifyOffset(verifier, VT_ROOMMEMBERBINATTRINTERNAL) && - verifier.VerifyVector(roomMemberBinAttrInternal()) && - verifier.VerifyVectorOfTables(roomMemberBinAttrInternal()) && - verifier.EndTable(); - } -}; - -struct RoomMemberDataInternalBuilder { - typedef RoomMemberDataInternal Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_userInfo(::flatbuffers::Offset userInfo) { - fbb_.AddOffset(RoomMemberDataInternal::VT_USERINFO, userInfo); - } - void add_joinDate(uint64_t joinDate) { - fbb_.AddElement(RoomMemberDataInternal::VT_JOINDATE, joinDate, 0); - } - void add_memberId(uint16_t memberId) { - fbb_.AddElement(RoomMemberDataInternal::VT_MEMBERID, memberId, 0); - } - void add_teamId(uint8_t teamId) { - fbb_.AddElement(RoomMemberDataInternal::VT_TEAMID, teamId, 0); - } - void add_roomGroup(::flatbuffers::Offset roomGroup) { - fbb_.AddOffset(RoomMemberDataInternal::VT_ROOMGROUP, roomGroup); - } - void add_natType(uint8_t natType) { - fbb_.AddElement(RoomMemberDataInternal::VT_NATTYPE, natType, 0); - } - void add_flagAttr(uint32_t flagAttr) { - fbb_.AddElement(RoomMemberDataInternal::VT_FLAGATTR, flagAttr, 0); - } - void add_roomMemberBinAttrInternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomMemberBinAttrInternal) { - fbb_.AddOffset(RoomMemberDataInternal::VT_ROOMMEMBERBINATTRINTERNAL, roomMemberBinAttrInternal); - } - explicit RoomMemberDataInternalBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomMemberDataInternal( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset userInfo = 0, - uint64_t joinDate = 0, - uint16_t memberId = 0, - uint8_t teamId = 0, - ::flatbuffers::Offset roomGroup = 0, - uint8_t natType = 0, - uint32_t flagAttr = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomMemberBinAttrInternal = 0) { - RoomMemberDataInternalBuilder builder_(_fbb); - builder_.add_joinDate(joinDate); - builder_.add_roomMemberBinAttrInternal(roomMemberBinAttrInternal); - builder_.add_flagAttr(flagAttr); - builder_.add_roomGroup(roomGroup); - builder_.add_userInfo(userInfo); - builder_.add_memberId(memberId); - builder_.add_natType(natType); - builder_.add_teamId(teamId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateRoomMemberDataInternalDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset userInfo = 0, - uint64_t joinDate = 0, - uint16_t memberId = 0, - uint8_t teamId = 0, - ::flatbuffers::Offset roomGroup = 0, - uint8_t natType = 0, - uint32_t flagAttr = 0, - const std::vector<::flatbuffers::Offset> *roomMemberBinAttrInternal = nullptr) { - auto roomMemberBinAttrInternal__ = roomMemberBinAttrInternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomMemberBinAttrInternal) : 0; - return CreateRoomMemberDataInternal( - _fbb, - userInfo, - joinDate, - memberId, - teamId, - roomGroup, - natType, - flagAttr, - roomMemberBinAttrInternal__); -} - -struct RoomGroup FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomGroupBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_GROUPID = 4, - VT_WITHPASSWORD = 6, - VT_LABEL = 8, - VT_SLOTNUM = 10, - VT_CURGROUPMEMBERNUM = 12 - }; - uint8_t groupId() const { - return GetField(VT_GROUPID, 0); - } - bool withPassword() const { - return GetField(VT_WITHPASSWORD, 0) != 0; - } - const ::flatbuffers::Vector *label() const { - return GetPointer *>(VT_LABEL); - } - uint32_t slotNum() const { - return GetField(VT_SLOTNUM, 0); - } - uint32_t curGroupMemberNum() const { - return GetField(VT_CURGROUPMEMBERNUM, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_GROUPID, 1) && - VerifyField(verifier, VT_WITHPASSWORD, 1) && - VerifyOffset(verifier, VT_LABEL) && - verifier.VerifyVector(label()) && - VerifyField(verifier, VT_SLOTNUM, 4) && - VerifyField(verifier, VT_CURGROUPMEMBERNUM, 4) && - verifier.EndTable(); - } -}; - -struct RoomGroupBuilder { - typedef RoomGroup Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_groupId(uint8_t groupId) { - fbb_.AddElement(RoomGroup::VT_GROUPID, groupId, 0); - } - void add_withPassword(bool withPassword) { - fbb_.AddElement(RoomGroup::VT_WITHPASSWORD, static_cast(withPassword), 0); - } - void add_label(::flatbuffers::Offset<::flatbuffers::Vector> label) { - fbb_.AddOffset(RoomGroup::VT_LABEL, label); - } - void add_slotNum(uint32_t slotNum) { - fbb_.AddElement(RoomGroup::VT_SLOTNUM, slotNum, 0); - } - void add_curGroupMemberNum(uint32_t curGroupMemberNum) { - fbb_.AddElement(RoomGroup::VT_CURGROUPMEMBERNUM, curGroupMemberNum, 0); - } - explicit RoomGroupBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomGroup( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint8_t groupId = 0, - bool withPassword = false, - ::flatbuffers::Offset<::flatbuffers::Vector> label = 0, - uint32_t slotNum = 0, - uint32_t curGroupMemberNum = 0) { - RoomGroupBuilder builder_(_fbb); - builder_.add_curGroupMemberNum(curGroupMemberNum); - builder_.add_slotNum(slotNum); - builder_.add_label(label); - builder_.add_withPassword(withPassword); - builder_.add_groupId(groupId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateRoomGroupDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint8_t groupId = 0, - bool withPassword = false, - const std::vector *label = nullptr, - uint32_t slotNum = 0, - uint32_t curGroupMemberNum = 0) { - auto label__ = label ? _fbb.CreateVector(*label) : 0; - return CreateRoomGroup( - _fbb, - groupId, - withPassword, - label__, - slotNum, - curGroupMemberNum); -} - -struct RoomDataInternal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomDataInternalBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SERVERID = 4, - VT_WORLDID = 6, - VT_LOBBYID = 8, - VT_ROOMID = 10, - VT_PASSWORDSLOTMASK = 12, - VT_MAXSLOT = 14, - VT_MEMBERLIST = 16, - VT_OWNERID = 18, - VT_ROOMGROUP = 20, - VT_FLAGATTR = 22, - VT_ROOMBINATTRINTERNAL = 24 - }; - uint16_t serverId() const { - return GetField(VT_SERVERID, 0); - } - uint32_t worldId() const { - return GetField(VT_WORLDID, 0); - } - uint64_t lobbyId() const { - return GetField(VT_LOBBYID, 0); - } - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - uint64_t passwordSlotMask() const { - return GetField(VT_PASSWORDSLOTMASK, 0); - } - uint32_t maxSlot() const { - return GetField(VT_MAXSLOT, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *memberList() const { - return GetPointer> *>(VT_MEMBERLIST); - } - uint16_t ownerId() const { - return GetField(VT_OWNERID, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomGroup() const { - return GetPointer> *>(VT_ROOMGROUP); - } - uint32_t flagAttr() const { - return GetField(VT_FLAGATTR, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomBinAttrInternal() const { - return GetPointer> *>(VT_ROOMBINATTRINTERNAL); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SERVERID, 2) && - VerifyField(verifier, VT_WORLDID, 4) && - VerifyField(verifier, VT_LOBBYID, 8) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyField(verifier, VT_PASSWORDSLOTMASK, 8) && - VerifyField(verifier, VT_MAXSLOT, 4) && - VerifyOffset(verifier, VT_MEMBERLIST) && - verifier.VerifyVector(memberList()) && - verifier.VerifyVectorOfTables(memberList()) && - VerifyField(verifier, VT_OWNERID, 2) && - VerifyOffset(verifier, VT_ROOMGROUP) && - verifier.VerifyVector(roomGroup()) && - verifier.VerifyVectorOfTables(roomGroup()) && - VerifyField(verifier, VT_FLAGATTR, 4) && - VerifyOffset(verifier, VT_ROOMBINATTRINTERNAL) && - verifier.VerifyVector(roomBinAttrInternal()) && - verifier.VerifyVectorOfTables(roomBinAttrInternal()) && - verifier.EndTable(); - } -}; - -struct RoomDataInternalBuilder { - typedef RoomDataInternal Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_serverId(uint16_t serverId) { - fbb_.AddElement(RoomDataInternal::VT_SERVERID, serverId, 0); - } - void add_worldId(uint32_t worldId) { - fbb_.AddElement(RoomDataInternal::VT_WORLDID, worldId, 0); - } - void add_lobbyId(uint64_t lobbyId) { - fbb_.AddElement(RoomDataInternal::VT_LOBBYID, lobbyId, 0); - } - void add_roomId(uint64_t roomId) { - fbb_.AddElement(RoomDataInternal::VT_ROOMID, roomId, 0); - } - void add_passwordSlotMask(uint64_t passwordSlotMask) { - fbb_.AddElement(RoomDataInternal::VT_PASSWORDSLOTMASK, passwordSlotMask, 0); - } - void add_maxSlot(uint32_t maxSlot) { - fbb_.AddElement(RoomDataInternal::VT_MAXSLOT, maxSlot, 0); - } - void add_memberList(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> memberList) { - fbb_.AddOffset(RoomDataInternal::VT_MEMBERLIST, memberList); - } - void add_ownerId(uint16_t ownerId) { - fbb_.AddElement(RoomDataInternal::VT_OWNERID, ownerId, 0); - } - void add_roomGroup(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomGroup) { - fbb_.AddOffset(RoomDataInternal::VT_ROOMGROUP, roomGroup); - } - void add_flagAttr(uint32_t flagAttr) { - fbb_.AddElement(RoomDataInternal::VT_FLAGATTR, flagAttr, 0); - } - void add_roomBinAttrInternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrInternal) { - fbb_.AddOffset(RoomDataInternal::VT_ROOMBINATTRINTERNAL, roomBinAttrInternal); - } - explicit RoomDataInternalBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomDataInternal( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t serverId = 0, - uint32_t worldId = 0, - uint64_t lobbyId = 0, - uint64_t roomId = 0, - uint64_t passwordSlotMask = 0, - uint32_t maxSlot = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> memberList = 0, - uint16_t ownerId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomGroup = 0, - uint32_t flagAttr = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrInternal = 0) { - RoomDataInternalBuilder builder_(_fbb); - builder_.add_passwordSlotMask(passwordSlotMask); - builder_.add_roomId(roomId); - builder_.add_lobbyId(lobbyId); - builder_.add_roomBinAttrInternal(roomBinAttrInternal); - builder_.add_flagAttr(flagAttr); - builder_.add_roomGroup(roomGroup); - builder_.add_memberList(memberList); - builder_.add_maxSlot(maxSlot); - builder_.add_worldId(worldId); - builder_.add_ownerId(ownerId); - builder_.add_serverId(serverId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateRoomDataInternalDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t serverId = 0, - uint32_t worldId = 0, - uint64_t lobbyId = 0, - uint64_t roomId = 0, - uint64_t passwordSlotMask = 0, - uint32_t maxSlot = 0, - const std::vector<::flatbuffers::Offset> *memberList = nullptr, - uint16_t ownerId = 0, - const std::vector<::flatbuffers::Offset> *roomGroup = nullptr, - uint32_t flagAttr = 0, - const std::vector<::flatbuffers::Offset> *roomBinAttrInternal = nullptr) { - auto memberList__ = memberList ? _fbb.CreateVector<::flatbuffers::Offset>(*memberList) : 0; - auto roomGroup__ = roomGroup ? _fbb.CreateVector<::flatbuffers::Offset>(*roomGroup) : 0; - auto roomBinAttrInternal__ = roomBinAttrInternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomBinAttrInternal) : 0; - return CreateRoomDataInternal( - _fbb, - serverId, - worldId, - lobbyId, - roomId, - passwordSlotMask, - maxSlot, - memberList__, - ownerId, - roomGroup__, - flagAttr, - roomBinAttrInternal__); -} - -struct RoomDataExternal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomDataExternalBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SERVERID = 4, - VT_WORLDID = 6, - VT_PUBLICSLOTNUM = 8, - VT_PRIVATESLOTNUM = 10, - VT_LOBBYID = 12, - VT_ROOMID = 14, - VT_OPENPUBLICSLOTNUM = 16, - VT_MAXSLOT = 18, - VT_OPENPRIVATESLOTNUM = 20, - VT_CURMEMBERNUM = 22, - VT_PASSWORDSLOTMASK = 24, - VT_OWNER = 26, - VT_ROOMGROUP = 28, - VT_FLAGATTR = 30, - VT_ROOMSEARCHABLEINTATTREXTERNAL = 32, - VT_ROOMSEARCHABLEBINATTREXTERNAL = 34, - VT_ROOMBINATTREXTERNAL = 36 - }; - uint16_t serverId() const { - return GetField(VT_SERVERID, 0); - } - uint32_t worldId() const { - return GetField(VT_WORLDID, 0); - } - uint16_t publicSlotNum() const { - return GetField(VT_PUBLICSLOTNUM, 0); - } - uint16_t privateSlotNum() const { - return GetField(VT_PRIVATESLOTNUM, 0); - } - uint64_t lobbyId() const { - return GetField(VT_LOBBYID, 0); - } - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - uint16_t openPublicSlotNum() const { - return GetField(VT_OPENPUBLICSLOTNUM, 0); - } - uint16_t maxSlot() const { - return GetField(VT_MAXSLOT, 0); - } - uint16_t openPrivateSlotNum() const { - return GetField(VT_OPENPRIVATESLOTNUM, 0); - } - uint16_t curMemberNum() const { - return GetField(VT_CURMEMBERNUM, 0); - } - uint64_t passwordSlotMask() const { - return GetField(VT_PASSWORDSLOTMASK, 0); - } - const UserInfo *owner() const { - return GetPointer(VT_OWNER); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomGroup() const { - return GetPointer> *>(VT_ROOMGROUP); - } - uint32_t flagAttr() const { - return GetField(VT_FLAGATTR, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomSearchableIntAttrExternal() const { - return GetPointer> *>(VT_ROOMSEARCHABLEINTATTREXTERNAL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomSearchableBinAttrExternal() const { - return GetPointer> *>(VT_ROOMSEARCHABLEBINATTREXTERNAL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomBinAttrExternal() const { - return GetPointer> *>(VT_ROOMBINATTREXTERNAL); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SERVERID, 2) && - VerifyField(verifier, VT_WORLDID, 4) && - VerifyField(verifier, VT_PUBLICSLOTNUM, 2) && - VerifyField(verifier, VT_PRIVATESLOTNUM, 2) && - VerifyField(verifier, VT_LOBBYID, 8) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyField(verifier, VT_OPENPUBLICSLOTNUM, 2) && - VerifyField(verifier, VT_MAXSLOT, 2) && - VerifyField(verifier, VT_OPENPRIVATESLOTNUM, 2) && - VerifyField(verifier, VT_CURMEMBERNUM, 2) && - VerifyField(verifier, VT_PASSWORDSLOTMASK, 8) && - VerifyOffset(verifier, VT_OWNER) && - verifier.VerifyTable(owner()) && - VerifyOffset(verifier, VT_ROOMGROUP) && - verifier.VerifyVector(roomGroup()) && - verifier.VerifyVectorOfTables(roomGroup()) && - VerifyField(verifier, VT_FLAGATTR, 4) && - VerifyOffset(verifier, VT_ROOMSEARCHABLEINTATTREXTERNAL) && - verifier.VerifyVector(roomSearchableIntAttrExternal()) && - verifier.VerifyVectorOfTables(roomSearchableIntAttrExternal()) && - VerifyOffset(verifier, VT_ROOMSEARCHABLEBINATTREXTERNAL) && - verifier.VerifyVector(roomSearchableBinAttrExternal()) && - verifier.VerifyVectorOfTables(roomSearchableBinAttrExternal()) && - VerifyOffset(verifier, VT_ROOMBINATTREXTERNAL) && - verifier.VerifyVector(roomBinAttrExternal()) && - verifier.VerifyVectorOfTables(roomBinAttrExternal()) && - verifier.EndTable(); - } -}; - -struct RoomDataExternalBuilder { - typedef RoomDataExternal Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_serverId(uint16_t serverId) { - fbb_.AddElement(RoomDataExternal::VT_SERVERID, serverId, 0); - } - void add_worldId(uint32_t worldId) { - fbb_.AddElement(RoomDataExternal::VT_WORLDID, worldId, 0); - } - void add_publicSlotNum(uint16_t publicSlotNum) { - fbb_.AddElement(RoomDataExternal::VT_PUBLICSLOTNUM, publicSlotNum, 0); - } - void add_privateSlotNum(uint16_t privateSlotNum) { - fbb_.AddElement(RoomDataExternal::VT_PRIVATESLOTNUM, privateSlotNum, 0); - } - void add_lobbyId(uint64_t lobbyId) { - fbb_.AddElement(RoomDataExternal::VT_LOBBYID, lobbyId, 0); - } - void add_roomId(uint64_t roomId) { - fbb_.AddElement(RoomDataExternal::VT_ROOMID, roomId, 0); - } - void add_openPublicSlotNum(uint16_t openPublicSlotNum) { - fbb_.AddElement(RoomDataExternal::VT_OPENPUBLICSLOTNUM, openPublicSlotNum, 0); - } - void add_maxSlot(uint16_t maxSlot) { - fbb_.AddElement(RoomDataExternal::VT_MAXSLOT, maxSlot, 0); - } - void add_openPrivateSlotNum(uint16_t openPrivateSlotNum) { - fbb_.AddElement(RoomDataExternal::VT_OPENPRIVATESLOTNUM, openPrivateSlotNum, 0); - } - void add_curMemberNum(uint16_t curMemberNum) { - fbb_.AddElement(RoomDataExternal::VT_CURMEMBERNUM, curMemberNum, 0); - } - void add_passwordSlotMask(uint64_t passwordSlotMask) { - fbb_.AddElement(RoomDataExternal::VT_PASSWORDSLOTMASK, passwordSlotMask, 0); - } - void add_owner(::flatbuffers::Offset owner) { - fbb_.AddOffset(RoomDataExternal::VT_OWNER, owner); - } - void add_roomGroup(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomGroup) { - fbb_.AddOffset(RoomDataExternal::VT_ROOMGROUP, roomGroup); - } - void add_flagAttr(uint32_t flagAttr) { - fbb_.AddElement(RoomDataExternal::VT_FLAGATTR, flagAttr, 0); - } - void add_roomSearchableIntAttrExternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableIntAttrExternal) { - fbb_.AddOffset(RoomDataExternal::VT_ROOMSEARCHABLEINTATTREXTERNAL, roomSearchableIntAttrExternal); - } - void add_roomSearchableBinAttrExternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableBinAttrExternal) { - fbb_.AddOffset(RoomDataExternal::VT_ROOMSEARCHABLEBINATTREXTERNAL, roomSearchableBinAttrExternal); - } - void add_roomBinAttrExternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrExternal) { - fbb_.AddOffset(RoomDataExternal::VT_ROOMBINATTREXTERNAL, roomBinAttrExternal); - } - explicit RoomDataExternalBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomDataExternal( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t serverId = 0, - uint32_t worldId = 0, - uint16_t publicSlotNum = 0, - uint16_t privateSlotNum = 0, - uint64_t lobbyId = 0, - uint64_t roomId = 0, - uint16_t openPublicSlotNum = 0, - uint16_t maxSlot = 0, - uint16_t openPrivateSlotNum = 0, - uint16_t curMemberNum = 0, - uint64_t passwordSlotMask = 0, - ::flatbuffers::Offset owner = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomGroup = 0, - uint32_t flagAttr = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableIntAttrExternal = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableBinAttrExternal = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrExternal = 0) { - RoomDataExternalBuilder builder_(_fbb); - builder_.add_passwordSlotMask(passwordSlotMask); - builder_.add_roomId(roomId); - builder_.add_lobbyId(lobbyId); - builder_.add_roomBinAttrExternal(roomBinAttrExternal); - builder_.add_roomSearchableBinAttrExternal(roomSearchableBinAttrExternal); - builder_.add_roomSearchableIntAttrExternal(roomSearchableIntAttrExternal); - builder_.add_flagAttr(flagAttr); - builder_.add_roomGroup(roomGroup); - builder_.add_owner(owner); - builder_.add_worldId(worldId); - builder_.add_curMemberNum(curMemberNum); - builder_.add_openPrivateSlotNum(openPrivateSlotNum); - builder_.add_maxSlot(maxSlot); - builder_.add_openPublicSlotNum(openPublicSlotNum); - builder_.add_privateSlotNum(privateSlotNum); - builder_.add_publicSlotNum(publicSlotNum); - builder_.add_serverId(serverId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateRoomDataExternalDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t serverId = 0, - uint32_t worldId = 0, - uint16_t publicSlotNum = 0, - uint16_t privateSlotNum = 0, - uint64_t lobbyId = 0, - uint64_t roomId = 0, - uint16_t openPublicSlotNum = 0, - uint16_t maxSlot = 0, - uint16_t openPrivateSlotNum = 0, - uint16_t curMemberNum = 0, - uint64_t passwordSlotMask = 0, - ::flatbuffers::Offset owner = 0, - const std::vector<::flatbuffers::Offset> *roomGroup = nullptr, - uint32_t flagAttr = 0, - const std::vector<::flatbuffers::Offset> *roomSearchableIntAttrExternal = nullptr, - const std::vector<::flatbuffers::Offset> *roomSearchableBinAttrExternal = nullptr, - const std::vector<::flatbuffers::Offset> *roomBinAttrExternal = nullptr) { - auto roomGroup__ = roomGroup ? _fbb.CreateVector<::flatbuffers::Offset>(*roomGroup) : 0; - auto roomSearchableIntAttrExternal__ = roomSearchableIntAttrExternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomSearchableIntAttrExternal) : 0; - auto roomSearchableBinAttrExternal__ = roomSearchableBinAttrExternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomSearchableBinAttrExternal) : 0; - auto roomBinAttrExternal__ = roomBinAttrExternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomBinAttrExternal) : 0; - return CreateRoomDataExternal( - _fbb, - serverId, - worldId, - publicSlotNum, - privateSlotNum, - lobbyId, - roomId, - openPublicSlotNum, - maxSlot, - openPrivateSlotNum, - curMemberNum, - passwordSlotMask, - owner, - roomGroup__, - flagAttr, - roomSearchableIntAttrExternal__, - roomSearchableBinAttrExternal__, - roomBinAttrExternal__); -} - -struct IntSearchFilter FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef IntSearchFilterBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SEARCHOPERATOR = 4, - VT_ATTR = 6 - }; - uint8_t searchOperator() const { - return GetField(VT_SEARCHOPERATOR, 0); - } - const IntAttr *attr() const { - return GetPointer(VT_ATTR); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SEARCHOPERATOR, 1) && - VerifyOffset(verifier, VT_ATTR) && - verifier.VerifyTable(attr()) && - verifier.EndTable(); - } -}; - -struct IntSearchFilterBuilder { - typedef IntSearchFilter Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_searchOperator(uint8_t searchOperator) { - fbb_.AddElement(IntSearchFilter::VT_SEARCHOPERATOR, searchOperator, 0); - } - void add_attr(::flatbuffers::Offset attr) { - fbb_.AddOffset(IntSearchFilter::VT_ATTR, attr); - } - explicit IntSearchFilterBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateIntSearchFilter( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint8_t searchOperator = 0, - ::flatbuffers::Offset attr = 0) { - IntSearchFilterBuilder builder_(_fbb); - builder_.add_attr(attr); - builder_.add_searchOperator(searchOperator); - return builder_.Finish(); -} - -struct BinSearchFilter FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef BinSearchFilterBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SEARCHOPERATOR = 4, - VT_ATTR = 6 - }; - uint8_t searchOperator() const { - return GetField(VT_SEARCHOPERATOR, 0); - } - const BinAttr *attr() const { - return GetPointer(VT_ATTR); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SEARCHOPERATOR, 1) && - VerifyOffset(verifier, VT_ATTR) && - verifier.VerifyTable(attr()) && - verifier.EndTable(); - } -}; - -struct BinSearchFilterBuilder { - typedef BinSearchFilter Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_searchOperator(uint8_t searchOperator) { - fbb_.AddElement(BinSearchFilter::VT_SEARCHOPERATOR, searchOperator, 0); - } - void add_attr(::flatbuffers::Offset attr) { - fbb_.AddOffset(BinSearchFilter::VT_ATTR, attr); - } - explicit BinSearchFilterBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateBinSearchFilter( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint8_t searchOperator = 0, - ::flatbuffers::Offset attr = 0) { - BinSearchFilterBuilder builder_(_fbb); - builder_.add_attr(attr); - builder_.add_searchOperator(searchOperator); - return builder_.Finish(); -} - -struct PresenceOptionData FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef PresenceOptionDataBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_DATA = 4, - VT_LEN = 6 - }; - const ::flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - uint32_t len() const { - return GetField(VT_LEN, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - VerifyField(verifier, VT_LEN, 4) && - verifier.EndTable(); - } -}; - -struct PresenceOptionDataBuilder { - typedef PresenceOptionData Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_data(::flatbuffers::Offset<::flatbuffers::Vector> data) { - fbb_.AddOffset(PresenceOptionData::VT_DATA, data); - } - void add_len(uint32_t len) { - fbb_.AddElement(PresenceOptionData::VT_LEN, len, 0); - } - explicit PresenceOptionDataBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreatePresenceOptionData( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> data = 0, - uint32_t len = 0) { - PresenceOptionDataBuilder builder_(_fbb); - builder_.add_len(len); - builder_.add_data(data); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreatePresenceOptionDataDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *data = nullptr, - uint32_t len = 0) { - auto data__ = data ? _fbb.CreateVector(*data) : 0; - return CreatePresenceOptionData( - _fbb, - data__, - len); -} - -struct RoomGroupPasswordConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomGroupPasswordConfigBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_GROUPID = 4, - VT_WITHPASSWORD = 6 - }; - uint8_t groupId() const { - return GetField(VT_GROUPID, 0); - } - bool withPassword() const { - return GetField(VT_WITHPASSWORD, 0) != 0; - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_GROUPID, 1) && - VerifyField(verifier, VT_WITHPASSWORD, 1) && - verifier.EndTable(); - } -}; - -struct RoomGroupPasswordConfigBuilder { - typedef RoomGroupPasswordConfig Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_groupId(uint8_t groupId) { - fbb_.AddElement(RoomGroupPasswordConfig::VT_GROUPID, groupId, 0); - } - void add_withPassword(bool withPassword) { - fbb_.AddElement(RoomGroupPasswordConfig::VT_WITHPASSWORD, static_cast(withPassword), 0); - } - explicit RoomGroupPasswordConfigBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomGroupPasswordConfig( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint8_t groupId = 0, - bool withPassword = false) { - RoomGroupPasswordConfigBuilder builder_(_fbb); - builder_.add_withPassword(withPassword); - builder_.add_groupId(groupId); - return builder_.Finish(); -} - -struct SearchRoomRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SearchRoomRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_OPTION = 4, - VT_WORLDID = 6, - VT_LOBBYID = 8, - VT_RANGEFILTER_STARTINDEX = 10, - VT_RANGEFILTER_MAX = 12, - VT_FLAGFILTER = 14, - VT_FLAGATTR = 16, - VT_INTFILTER = 18, - VT_BINFILTER = 20, - VT_ATTRID = 22 - }; - int32_t option() const { - return GetField(VT_OPTION, 0); - } - uint32_t worldId() const { - return GetField(VT_WORLDID, 0); - } - uint64_t lobbyId() const { - return GetField(VT_LOBBYID, 0); - } - uint32_t rangeFilter_startIndex() const { - return GetField(VT_RANGEFILTER_STARTINDEX, 0); - } - uint32_t rangeFilter_max() const { - return GetField(VT_RANGEFILTER_MAX, 0); - } - uint32_t flagFilter() const { - return GetField(VT_FLAGFILTER, 0); - } - uint32_t flagAttr() const { - return GetField(VT_FLAGATTR, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *intFilter() const { - return GetPointer> *>(VT_INTFILTER); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *binFilter() const { - return GetPointer> *>(VT_BINFILTER); - } - const ::flatbuffers::Vector *attrId() const { - return GetPointer *>(VT_ATTRID); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_OPTION, 4) && - VerifyField(verifier, VT_WORLDID, 4) && - VerifyField(verifier, VT_LOBBYID, 8) && - VerifyField(verifier, VT_RANGEFILTER_STARTINDEX, 4) && - VerifyField(verifier, VT_RANGEFILTER_MAX, 4) && - VerifyField(verifier, VT_FLAGFILTER, 4) && - VerifyField(verifier, VT_FLAGATTR, 4) && - VerifyOffset(verifier, VT_INTFILTER) && - verifier.VerifyVector(intFilter()) && - verifier.VerifyVectorOfTables(intFilter()) && - VerifyOffset(verifier, VT_BINFILTER) && - verifier.VerifyVector(binFilter()) && - verifier.VerifyVectorOfTables(binFilter()) && - VerifyOffset(verifier, VT_ATTRID) && - verifier.VerifyVector(attrId()) && - verifier.EndTable(); - } -}; - -struct SearchRoomRequestBuilder { - typedef SearchRoomRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_option(int32_t option) { - fbb_.AddElement(SearchRoomRequest::VT_OPTION, option, 0); - } - void add_worldId(uint32_t worldId) { - fbb_.AddElement(SearchRoomRequest::VT_WORLDID, worldId, 0); - } - void add_lobbyId(uint64_t lobbyId) { - fbb_.AddElement(SearchRoomRequest::VT_LOBBYID, lobbyId, 0); - } - void add_rangeFilter_startIndex(uint32_t rangeFilter_startIndex) { - fbb_.AddElement(SearchRoomRequest::VT_RANGEFILTER_STARTINDEX, rangeFilter_startIndex, 0); - } - void add_rangeFilter_max(uint32_t rangeFilter_max) { - fbb_.AddElement(SearchRoomRequest::VT_RANGEFILTER_MAX, rangeFilter_max, 0); - } - void add_flagFilter(uint32_t flagFilter) { - fbb_.AddElement(SearchRoomRequest::VT_FLAGFILTER, flagFilter, 0); - } - void add_flagAttr(uint32_t flagAttr) { - fbb_.AddElement(SearchRoomRequest::VT_FLAGATTR, flagAttr, 0); - } - void add_intFilter(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> intFilter) { - fbb_.AddOffset(SearchRoomRequest::VT_INTFILTER, intFilter); - } - void add_binFilter(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> binFilter) { - fbb_.AddOffset(SearchRoomRequest::VT_BINFILTER, binFilter); - } - void add_attrId(::flatbuffers::Offset<::flatbuffers::Vector> attrId) { - fbb_.AddOffset(SearchRoomRequest::VT_ATTRID, attrId); - } - explicit SearchRoomRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSearchRoomRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - int32_t option = 0, - uint32_t worldId = 0, - uint64_t lobbyId = 0, - uint32_t rangeFilter_startIndex = 0, - uint32_t rangeFilter_max = 0, - uint32_t flagFilter = 0, - uint32_t flagAttr = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> intFilter = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> binFilter = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> attrId = 0) { - SearchRoomRequestBuilder builder_(_fbb); - builder_.add_lobbyId(lobbyId); - builder_.add_attrId(attrId); - builder_.add_binFilter(binFilter); - builder_.add_intFilter(intFilter); - builder_.add_flagAttr(flagAttr); - builder_.add_flagFilter(flagFilter); - builder_.add_rangeFilter_max(rangeFilter_max); - builder_.add_rangeFilter_startIndex(rangeFilter_startIndex); - builder_.add_worldId(worldId); - builder_.add_option(option); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSearchRoomRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - int32_t option = 0, - uint32_t worldId = 0, - uint64_t lobbyId = 0, - uint32_t rangeFilter_startIndex = 0, - uint32_t rangeFilter_max = 0, - uint32_t flagFilter = 0, - uint32_t flagAttr = 0, - const std::vector<::flatbuffers::Offset> *intFilter = nullptr, - const std::vector<::flatbuffers::Offset> *binFilter = nullptr, - const std::vector *attrId = nullptr) { - auto intFilter__ = intFilter ? _fbb.CreateVector<::flatbuffers::Offset>(*intFilter) : 0; - auto binFilter__ = binFilter ? _fbb.CreateVector<::flatbuffers::Offset>(*binFilter) : 0; - auto attrId__ = attrId ? _fbb.CreateVector(*attrId) : 0; - return CreateSearchRoomRequest( - _fbb, - option, - worldId, - lobbyId, - rangeFilter_startIndex, - rangeFilter_max, - flagFilter, - flagAttr, - intFilter__, - binFilter__, - attrId__); -} - -struct SearchRoomResponse FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SearchRoomResponseBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_STARTINDEX = 4, - VT_TOTAL = 6, - VT_ROOMS = 8 - }; - uint32_t startIndex() const { - return GetField(VT_STARTINDEX, 0); - } - uint32_t total() const { - return GetField(VT_TOTAL, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *rooms() const { - return GetPointer> *>(VT_ROOMS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_STARTINDEX, 4) && - VerifyField(verifier, VT_TOTAL, 4) && - VerifyOffset(verifier, VT_ROOMS) && - verifier.VerifyVector(rooms()) && - verifier.VerifyVectorOfTables(rooms()) && - verifier.EndTable(); - } -}; - -struct SearchRoomResponseBuilder { - typedef SearchRoomResponse Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_startIndex(uint32_t startIndex) { - fbb_.AddElement(SearchRoomResponse::VT_STARTINDEX, startIndex, 0); - } - void add_total(uint32_t total) { - fbb_.AddElement(SearchRoomResponse::VT_TOTAL, total, 0); - } - void add_rooms(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> rooms) { - fbb_.AddOffset(SearchRoomResponse::VT_ROOMS, rooms); - } - explicit SearchRoomResponseBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSearchRoomResponse( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t startIndex = 0, - uint32_t total = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> rooms = 0) { - SearchRoomResponseBuilder builder_(_fbb); - builder_.add_rooms(rooms); - builder_.add_total(total); - builder_.add_startIndex(startIndex); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSearchRoomResponseDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t startIndex = 0, - uint32_t total = 0, - const std::vector<::flatbuffers::Offset> *rooms = nullptr) { - auto rooms__ = rooms ? _fbb.CreateVector<::flatbuffers::Offset>(*rooms) : 0; - return CreateSearchRoomResponse( - _fbb, - startIndex, - total, - rooms__); -} - -struct CreateJoinRoomRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef CreateJoinRoomRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_WORLDID = 4, - VT_LOBBYID = 6, - VT_MAXSLOT = 8, - VT_FLAGATTR = 10, - VT_ROOMBINATTRINTERNAL = 12, - VT_ROOMSEARCHABLEINTATTREXTERNAL = 14, - VT_ROOMSEARCHABLEBINATTREXTERNAL = 16, - VT_ROOMBINATTREXTERNAL = 18, - VT_ROOMPASSWORD = 20, - VT_GROUPCONFIG = 22, - VT_PASSWORDSLOTMASK = 24, - VT_ALLOWEDUSER = 26, - VT_BLOCKEDUSER = 28, - VT_JOINROOMGROUPLABEL = 30, - VT_ROOMMEMBERBINATTRINTERNAL = 32, - VT_TEAMID = 34, - VT_SIGOPTPARAM = 36 - }; - uint32_t worldId() const { - return GetField(VT_WORLDID, 0); - } - uint64_t lobbyId() const { - return GetField(VT_LOBBYID, 0); - } - uint32_t maxSlot() const { - return GetField(VT_MAXSLOT, 0); - } - uint32_t flagAttr() const { - return GetField(VT_FLAGATTR, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomBinAttrInternal() const { - return GetPointer> *>(VT_ROOMBINATTRINTERNAL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomSearchableIntAttrExternal() const { - return GetPointer> *>(VT_ROOMSEARCHABLEINTATTREXTERNAL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomSearchableBinAttrExternal() const { - return GetPointer> *>(VT_ROOMSEARCHABLEBINATTREXTERNAL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomBinAttrExternal() const { - return GetPointer> *>(VT_ROOMBINATTREXTERNAL); - } - const ::flatbuffers::Vector *roomPassword() const { - return GetPointer *>(VT_ROOMPASSWORD); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *groupConfig() const { - return GetPointer> *>(VT_GROUPCONFIG); - } - uint64_t passwordSlotMask() const { - return GetField(VT_PASSWORDSLOTMASK, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *allowedUser() const { - return GetPointer> *>(VT_ALLOWEDUSER); - } - const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *blockedUser() const { - return GetPointer> *>(VT_BLOCKEDUSER); - } - const ::flatbuffers::Vector *joinRoomGroupLabel() const { - return GetPointer *>(VT_JOINROOMGROUPLABEL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomMemberBinAttrInternal() const { - return GetPointer> *>(VT_ROOMMEMBERBINATTRINTERNAL); - } - uint8_t teamId() const { - return GetField(VT_TEAMID, 0); - } - const OptParam *sigOptParam() const { - return GetPointer(VT_SIGOPTPARAM); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_WORLDID, 4) && - VerifyField(verifier, VT_LOBBYID, 8) && - VerifyField(verifier, VT_MAXSLOT, 4) && - VerifyField(verifier, VT_FLAGATTR, 4) && - VerifyOffset(verifier, VT_ROOMBINATTRINTERNAL) && - verifier.VerifyVector(roomBinAttrInternal()) && - verifier.VerifyVectorOfTables(roomBinAttrInternal()) && - VerifyOffset(verifier, VT_ROOMSEARCHABLEINTATTREXTERNAL) && - verifier.VerifyVector(roomSearchableIntAttrExternal()) && - verifier.VerifyVectorOfTables(roomSearchableIntAttrExternal()) && - VerifyOffset(verifier, VT_ROOMSEARCHABLEBINATTREXTERNAL) && - verifier.VerifyVector(roomSearchableBinAttrExternal()) && - verifier.VerifyVectorOfTables(roomSearchableBinAttrExternal()) && - VerifyOffset(verifier, VT_ROOMBINATTREXTERNAL) && - verifier.VerifyVector(roomBinAttrExternal()) && - verifier.VerifyVectorOfTables(roomBinAttrExternal()) && - VerifyOffset(verifier, VT_ROOMPASSWORD) && - verifier.VerifyVector(roomPassword()) && - VerifyOffset(verifier, VT_GROUPCONFIG) && - verifier.VerifyVector(groupConfig()) && - verifier.VerifyVectorOfTables(groupConfig()) && - VerifyField(verifier, VT_PASSWORDSLOTMASK, 8) && - VerifyOffset(verifier, VT_ALLOWEDUSER) && - verifier.VerifyVector(allowedUser()) && - verifier.VerifyVectorOfStrings(allowedUser()) && - VerifyOffset(verifier, VT_BLOCKEDUSER) && - verifier.VerifyVector(blockedUser()) && - verifier.VerifyVectorOfStrings(blockedUser()) && - VerifyOffset(verifier, VT_JOINROOMGROUPLABEL) && - verifier.VerifyVector(joinRoomGroupLabel()) && - VerifyOffset(verifier, VT_ROOMMEMBERBINATTRINTERNAL) && - verifier.VerifyVector(roomMemberBinAttrInternal()) && - verifier.VerifyVectorOfTables(roomMemberBinAttrInternal()) && - VerifyField(verifier, VT_TEAMID, 1) && - VerifyOffset(verifier, VT_SIGOPTPARAM) && - verifier.VerifyTable(sigOptParam()) && - verifier.EndTable(); - } -}; - -struct CreateJoinRoomRequestBuilder { - typedef CreateJoinRoomRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_worldId(uint32_t worldId) { - fbb_.AddElement(CreateJoinRoomRequest::VT_WORLDID, worldId, 0); - } - void add_lobbyId(uint64_t lobbyId) { - fbb_.AddElement(CreateJoinRoomRequest::VT_LOBBYID, lobbyId, 0); - } - void add_maxSlot(uint32_t maxSlot) { - fbb_.AddElement(CreateJoinRoomRequest::VT_MAXSLOT, maxSlot, 0); - } - void add_flagAttr(uint32_t flagAttr) { - fbb_.AddElement(CreateJoinRoomRequest::VT_FLAGATTR, flagAttr, 0); - } - void add_roomBinAttrInternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrInternal) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMBINATTRINTERNAL, roomBinAttrInternal); - } - void add_roomSearchableIntAttrExternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableIntAttrExternal) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMSEARCHABLEINTATTREXTERNAL, roomSearchableIntAttrExternal); - } - void add_roomSearchableBinAttrExternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableBinAttrExternal) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMSEARCHABLEBINATTREXTERNAL, roomSearchableBinAttrExternal); - } - void add_roomBinAttrExternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrExternal) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMBINATTREXTERNAL, roomBinAttrExternal); - } - void add_roomPassword(::flatbuffers::Offset<::flatbuffers::Vector> roomPassword) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMPASSWORD, roomPassword); - } - void add_groupConfig(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> groupConfig) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_GROUPCONFIG, groupConfig); - } - void add_passwordSlotMask(uint64_t passwordSlotMask) { - fbb_.AddElement(CreateJoinRoomRequest::VT_PASSWORDSLOTMASK, passwordSlotMask, 0); - } - void add_allowedUser(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> allowedUser) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_ALLOWEDUSER, allowedUser); - } - void add_blockedUser(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> blockedUser) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_BLOCKEDUSER, blockedUser); - } - void add_joinRoomGroupLabel(::flatbuffers::Offset<::flatbuffers::Vector> joinRoomGroupLabel) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_JOINROOMGROUPLABEL, joinRoomGroupLabel); - } - void add_roomMemberBinAttrInternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomMemberBinAttrInternal) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMMEMBERBINATTRINTERNAL, roomMemberBinAttrInternal); - } - void add_teamId(uint8_t teamId) { - fbb_.AddElement(CreateJoinRoomRequest::VT_TEAMID, teamId, 0); - } - void add_sigOptParam(::flatbuffers::Offset sigOptParam) { - fbb_.AddOffset(CreateJoinRoomRequest::VT_SIGOPTPARAM, sigOptParam); - } - explicit CreateJoinRoomRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateCreateJoinRoomRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t worldId = 0, - uint64_t lobbyId = 0, - uint32_t maxSlot = 0, - uint32_t flagAttr = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrInternal = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableIntAttrExternal = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableBinAttrExternal = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrExternal = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> roomPassword = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> groupConfig = 0, - uint64_t passwordSlotMask = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> allowedUser = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> blockedUser = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> joinRoomGroupLabel = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomMemberBinAttrInternal = 0, - uint8_t teamId = 0, - ::flatbuffers::Offset sigOptParam = 0) { - CreateJoinRoomRequestBuilder builder_(_fbb); - builder_.add_passwordSlotMask(passwordSlotMask); - builder_.add_lobbyId(lobbyId); - builder_.add_sigOptParam(sigOptParam); - builder_.add_roomMemberBinAttrInternal(roomMemberBinAttrInternal); - builder_.add_joinRoomGroupLabel(joinRoomGroupLabel); - builder_.add_blockedUser(blockedUser); - builder_.add_allowedUser(allowedUser); - builder_.add_groupConfig(groupConfig); - builder_.add_roomPassword(roomPassword); - builder_.add_roomBinAttrExternal(roomBinAttrExternal); - builder_.add_roomSearchableBinAttrExternal(roomSearchableBinAttrExternal); - builder_.add_roomSearchableIntAttrExternal(roomSearchableIntAttrExternal); - builder_.add_roomBinAttrInternal(roomBinAttrInternal); - builder_.add_flagAttr(flagAttr); - builder_.add_maxSlot(maxSlot); - builder_.add_worldId(worldId); - builder_.add_teamId(teamId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateCreateJoinRoomRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t worldId = 0, - uint64_t lobbyId = 0, - uint32_t maxSlot = 0, - uint32_t flagAttr = 0, - const std::vector<::flatbuffers::Offset> *roomBinAttrInternal = nullptr, - const std::vector<::flatbuffers::Offset> *roomSearchableIntAttrExternal = nullptr, - const std::vector<::flatbuffers::Offset> *roomSearchableBinAttrExternal = nullptr, - const std::vector<::flatbuffers::Offset> *roomBinAttrExternal = nullptr, - const std::vector *roomPassword = nullptr, - const std::vector<::flatbuffers::Offset> *groupConfig = nullptr, - uint64_t passwordSlotMask = 0, - const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *allowedUser = nullptr, - const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *blockedUser = nullptr, - const std::vector *joinRoomGroupLabel = nullptr, - const std::vector<::flatbuffers::Offset> *roomMemberBinAttrInternal = nullptr, - uint8_t teamId = 0, - ::flatbuffers::Offset sigOptParam = 0) { - auto roomBinAttrInternal__ = roomBinAttrInternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomBinAttrInternal) : 0; - auto roomSearchableIntAttrExternal__ = roomSearchableIntAttrExternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomSearchableIntAttrExternal) : 0; - auto roomSearchableBinAttrExternal__ = roomSearchableBinAttrExternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomSearchableBinAttrExternal) : 0; - auto roomBinAttrExternal__ = roomBinAttrExternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomBinAttrExternal) : 0; - auto roomPassword__ = roomPassword ? _fbb.CreateVector(*roomPassword) : 0; - auto groupConfig__ = groupConfig ? _fbb.CreateVector<::flatbuffers::Offset>(*groupConfig) : 0; - auto allowedUser__ = allowedUser ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*allowedUser) : 0; - auto blockedUser__ = blockedUser ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*blockedUser) : 0; - auto joinRoomGroupLabel__ = joinRoomGroupLabel ? _fbb.CreateVector(*joinRoomGroupLabel) : 0; - auto roomMemberBinAttrInternal__ = roomMemberBinAttrInternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomMemberBinAttrInternal) : 0; - return CreateCreateJoinRoomRequest( - _fbb, - worldId, - lobbyId, - maxSlot, - flagAttr, - roomBinAttrInternal__, - roomSearchableIntAttrExternal__, - roomSearchableBinAttrExternal__, - roomBinAttrExternal__, - roomPassword__, - groupConfig__, - passwordSlotMask, - allowedUser__, - blockedUser__, - joinRoomGroupLabel__, - roomMemberBinAttrInternal__, - teamId, - sigOptParam); -} - -struct JoinRoomRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef JoinRoomRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMID = 4, - VT_ROOMPASSWORD = 6, - VT_JOINROOMGROUPLABEL = 8, - VT_ROOMMEMBERBINATTRINTERNAL = 10, - VT_OPTDATA = 12, - VT_TEAMID = 14 - }; - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - const ::flatbuffers::Vector *roomPassword() const { - return GetPointer *>(VT_ROOMPASSWORD); - } - const ::flatbuffers::Vector *joinRoomGroupLabel() const { - return GetPointer *>(VT_JOINROOMGROUPLABEL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomMemberBinAttrInternal() const { - return GetPointer> *>(VT_ROOMMEMBERBINATTRINTERNAL); - } - const PresenceOptionData *optData() const { - return GetPointer(VT_OPTDATA); - } - uint8_t teamId() const { - return GetField(VT_TEAMID, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyOffset(verifier, VT_ROOMPASSWORD) && - verifier.VerifyVector(roomPassword()) && - VerifyOffset(verifier, VT_JOINROOMGROUPLABEL) && - verifier.VerifyVector(joinRoomGroupLabel()) && - VerifyOffset(verifier, VT_ROOMMEMBERBINATTRINTERNAL) && - verifier.VerifyVector(roomMemberBinAttrInternal()) && - verifier.VerifyVectorOfTables(roomMemberBinAttrInternal()) && - VerifyOffset(verifier, VT_OPTDATA) && - verifier.VerifyTable(optData()) && - VerifyField(verifier, VT_TEAMID, 1) && - verifier.EndTable(); - } -}; - -struct JoinRoomRequestBuilder { - typedef JoinRoomRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomId(uint64_t roomId) { - fbb_.AddElement(JoinRoomRequest::VT_ROOMID, roomId, 0); - } - void add_roomPassword(::flatbuffers::Offset<::flatbuffers::Vector> roomPassword) { - fbb_.AddOffset(JoinRoomRequest::VT_ROOMPASSWORD, roomPassword); - } - void add_joinRoomGroupLabel(::flatbuffers::Offset<::flatbuffers::Vector> joinRoomGroupLabel) { - fbb_.AddOffset(JoinRoomRequest::VT_JOINROOMGROUPLABEL, joinRoomGroupLabel); - } - void add_roomMemberBinAttrInternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomMemberBinAttrInternal) { - fbb_.AddOffset(JoinRoomRequest::VT_ROOMMEMBERBINATTRINTERNAL, roomMemberBinAttrInternal); - } - void add_optData(::flatbuffers::Offset optData) { - fbb_.AddOffset(JoinRoomRequest::VT_OPTDATA, optData); - } - void add_teamId(uint8_t teamId) { - fbb_.AddElement(JoinRoomRequest::VT_TEAMID, teamId, 0); - } - explicit JoinRoomRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateJoinRoomRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> roomPassword = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> joinRoomGroupLabel = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomMemberBinAttrInternal = 0, - ::flatbuffers::Offset optData = 0, - uint8_t teamId = 0) { - JoinRoomRequestBuilder builder_(_fbb); - builder_.add_roomId(roomId); - builder_.add_optData(optData); - builder_.add_roomMemberBinAttrInternal(roomMemberBinAttrInternal); - builder_.add_joinRoomGroupLabel(joinRoomGroupLabel); - builder_.add_roomPassword(roomPassword); - builder_.add_teamId(teamId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateJoinRoomRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - const std::vector *roomPassword = nullptr, - const std::vector *joinRoomGroupLabel = nullptr, - const std::vector<::flatbuffers::Offset> *roomMemberBinAttrInternal = nullptr, - ::flatbuffers::Offset optData = 0, - uint8_t teamId = 0) { - auto roomPassword__ = roomPassword ? _fbb.CreateVector(*roomPassword) : 0; - auto joinRoomGroupLabel__ = joinRoomGroupLabel ? _fbb.CreateVector(*joinRoomGroupLabel) : 0; - auto roomMemberBinAttrInternal__ = roomMemberBinAttrInternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomMemberBinAttrInternal) : 0; - return CreateJoinRoomRequest( - _fbb, - roomId, - roomPassword__, - joinRoomGroupLabel__, - roomMemberBinAttrInternal__, - optData, - teamId); -} - -struct JoinRoomResponse FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef JoinRoomResponseBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOM_DATA = 4, - VT_SIGNALING_DATA = 6 - }; - const RoomDataInternal *room_data() const { - return GetPointer(VT_ROOM_DATA); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *signaling_data() const { - return GetPointer> *>(VT_SIGNALING_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_ROOM_DATA) && - verifier.VerifyTable(room_data()) && - VerifyOffset(verifier, VT_SIGNALING_DATA) && - verifier.VerifyVector(signaling_data()) && - verifier.VerifyVectorOfTables(signaling_data()) && - verifier.EndTable(); - } -}; - -struct JoinRoomResponseBuilder { - typedef JoinRoomResponse Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_room_data(::flatbuffers::Offset room_data) { - fbb_.AddOffset(JoinRoomResponse::VT_ROOM_DATA, room_data); - } - void add_signaling_data(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> signaling_data) { - fbb_.AddOffset(JoinRoomResponse::VT_SIGNALING_DATA, signaling_data); - } - explicit JoinRoomResponseBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateJoinRoomResponse( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset room_data = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> signaling_data = 0) { - JoinRoomResponseBuilder builder_(_fbb); - builder_.add_signaling_data(signaling_data); - builder_.add_room_data(room_data); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateJoinRoomResponseDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset room_data = 0, - const std::vector<::flatbuffers::Offset> *signaling_data = nullptr) { - auto signaling_data__ = signaling_data ? _fbb.CreateVector<::flatbuffers::Offset>(*signaling_data) : 0; - return CreateJoinRoomResponse( - _fbb, - room_data, - signaling_data__); -} - -struct LeaveRoomRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef LeaveRoomRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMID = 4, - VT_OPTDATA = 6 - }; - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - const PresenceOptionData *optData() const { - return GetPointer(VT_OPTDATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyOffset(verifier, VT_OPTDATA) && - verifier.VerifyTable(optData()) && - verifier.EndTable(); - } -}; - -struct LeaveRoomRequestBuilder { - typedef LeaveRoomRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomId(uint64_t roomId) { - fbb_.AddElement(LeaveRoomRequest::VT_ROOMID, roomId, 0); - } - void add_optData(::flatbuffers::Offset optData) { - fbb_.AddOffset(LeaveRoomRequest::VT_OPTDATA, optData); - } - explicit LeaveRoomRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateLeaveRoomRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - ::flatbuffers::Offset optData = 0) { - LeaveRoomRequestBuilder builder_(_fbb); - builder_.add_roomId(roomId); - builder_.add_optData(optData); - return builder_.Finish(); -} - -struct GetRoomDataExternalListRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetRoomDataExternalListRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMIDS = 4, - VT_ATTRIDS = 6 - }; - const ::flatbuffers::Vector *roomIds() const { - return GetPointer *>(VT_ROOMIDS); - } - const ::flatbuffers::Vector *attrIds() const { - return GetPointer *>(VT_ATTRIDS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_ROOMIDS) && - verifier.VerifyVector(roomIds()) && - VerifyOffset(verifier, VT_ATTRIDS) && - verifier.VerifyVector(attrIds()) && - verifier.EndTable(); - } -}; - -struct GetRoomDataExternalListRequestBuilder { - typedef GetRoomDataExternalListRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomIds(::flatbuffers::Offset<::flatbuffers::Vector> roomIds) { - fbb_.AddOffset(GetRoomDataExternalListRequest::VT_ROOMIDS, roomIds); - } - void add_attrIds(::flatbuffers::Offset<::flatbuffers::Vector> attrIds) { - fbb_.AddOffset(GetRoomDataExternalListRequest::VT_ATTRIDS, attrIds); - } - explicit GetRoomDataExternalListRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetRoomDataExternalListRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> roomIds = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> attrIds = 0) { - GetRoomDataExternalListRequestBuilder builder_(_fbb); - builder_.add_attrIds(attrIds); - builder_.add_roomIds(roomIds); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateGetRoomDataExternalListRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *roomIds = nullptr, - const std::vector *attrIds = nullptr) { - auto roomIds__ = roomIds ? _fbb.CreateVector(*roomIds) : 0; - auto attrIds__ = attrIds ? _fbb.CreateVector(*attrIds) : 0; - return CreateGetRoomDataExternalListRequest( - _fbb, - roomIds__, - attrIds__); -} - -struct GetRoomDataExternalListResponse FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetRoomDataExternalListResponseBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMS = 4 - }; - const ::flatbuffers::Vector<::flatbuffers::Offset> *rooms() const { - return GetPointer> *>(VT_ROOMS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_ROOMS) && - verifier.VerifyVector(rooms()) && - verifier.VerifyVectorOfTables(rooms()) && - verifier.EndTable(); - } -}; - -struct GetRoomDataExternalListResponseBuilder { - typedef GetRoomDataExternalListResponse Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_rooms(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> rooms) { - fbb_.AddOffset(GetRoomDataExternalListResponse::VT_ROOMS, rooms); - } - explicit GetRoomDataExternalListResponseBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetRoomDataExternalListResponse( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> rooms = 0) { - GetRoomDataExternalListResponseBuilder builder_(_fbb); - builder_.add_rooms(rooms); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateGetRoomDataExternalListResponseDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector<::flatbuffers::Offset> *rooms = nullptr) { - auto rooms__ = rooms ? _fbb.CreateVector<::flatbuffers::Offset>(*rooms) : 0; - return CreateGetRoomDataExternalListResponse( - _fbb, - rooms__); -} - -struct SetRoomDataExternalRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SetRoomDataExternalRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMID = 4, - VT_ROOMSEARCHABLEINTATTREXTERNAL = 6, - VT_ROOMSEARCHABLEBINATTREXTERNAL = 8, - VT_ROOMBINATTREXTERNAL = 10 - }; - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomSearchableIntAttrExternal() const { - return GetPointer> *>(VT_ROOMSEARCHABLEINTATTREXTERNAL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomSearchableBinAttrExternal() const { - return GetPointer> *>(VT_ROOMSEARCHABLEBINATTREXTERNAL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomBinAttrExternal() const { - return GetPointer> *>(VT_ROOMBINATTREXTERNAL); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyOffset(verifier, VT_ROOMSEARCHABLEINTATTREXTERNAL) && - verifier.VerifyVector(roomSearchableIntAttrExternal()) && - verifier.VerifyVectorOfTables(roomSearchableIntAttrExternal()) && - VerifyOffset(verifier, VT_ROOMSEARCHABLEBINATTREXTERNAL) && - verifier.VerifyVector(roomSearchableBinAttrExternal()) && - verifier.VerifyVectorOfTables(roomSearchableBinAttrExternal()) && - VerifyOffset(verifier, VT_ROOMBINATTREXTERNAL) && - verifier.VerifyVector(roomBinAttrExternal()) && - verifier.VerifyVectorOfTables(roomBinAttrExternal()) && - verifier.EndTable(); - } -}; - -struct SetRoomDataExternalRequestBuilder { - typedef SetRoomDataExternalRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomId(uint64_t roomId) { - fbb_.AddElement(SetRoomDataExternalRequest::VT_ROOMID, roomId, 0); - } - void add_roomSearchableIntAttrExternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableIntAttrExternal) { - fbb_.AddOffset(SetRoomDataExternalRequest::VT_ROOMSEARCHABLEINTATTREXTERNAL, roomSearchableIntAttrExternal); - } - void add_roomSearchableBinAttrExternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableBinAttrExternal) { - fbb_.AddOffset(SetRoomDataExternalRequest::VT_ROOMSEARCHABLEBINATTREXTERNAL, roomSearchableBinAttrExternal); - } - void add_roomBinAttrExternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrExternal) { - fbb_.AddOffset(SetRoomDataExternalRequest::VT_ROOMBINATTREXTERNAL, roomBinAttrExternal); - } - explicit SetRoomDataExternalRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSetRoomDataExternalRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableIntAttrExternal = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomSearchableBinAttrExternal = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrExternal = 0) { - SetRoomDataExternalRequestBuilder builder_(_fbb); - builder_.add_roomId(roomId); - builder_.add_roomBinAttrExternal(roomBinAttrExternal); - builder_.add_roomSearchableBinAttrExternal(roomSearchableBinAttrExternal); - builder_.add_roomSearchableIntAttrExternal(roomSearchableIntAttrExternal); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSetRoomDataExternalRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - const std::vector<::flatbuffers::Offset> *roomSearchableIntAttrExternal = nullptr, - const std::vector<::flatbuffers::Offset> *roomSearchableBinAttrExternal = nullptr, - const std::vector<::flatbuffers::Offset> *roomBinAttrExternal = nullptr) { - auto roomSearchableIntAttrExternal__ = roomSearchableIntAttrExternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomSearchableIntAttrExternal) : 0; - auto roomSearchableBinAttrExternal__ = roomSearchableBinAttrExternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomSearchableBinAttrExternal) : 0; - auto roomBinAttrExternal__ = roomBinAttrExternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomBinAttrExternal) : 0; - return CreateSetRoomDataExternalRequest( - _fbb, - roomId, - roomSearchableIntAttrExternal__, - roomSearchableBinAttrExternal__, - roomBinAttrExternal__); -} - -struct SetRoomDataInternalRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SetRoomDataInternalRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMID = 4, - VT_FLAGFILTER = 6, - VT_FLAGATTR = 8, - VT_ROOMBINATTRINTERNAL = 10, - VT_PASSWORDCONFIG = 12, - VT_PASSWORDSLOTMASK = 14, - VT_OWNERPRIVILEGERANK = 16 - }; - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - uint32_t flagFilter() const { - return GetField(VT_FLAGFILTER, 0); - } - uint32_t flagAttr() const { - return GetField(VT_FLAGATTR, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomBinAttrInternal() const { - return GetPointer> *>(VT_ROOMBINATTRINTERNAL); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *passwordConfig() const { - return GetPointer> *>(VT_PASSWORDCONFIG); - } - const ::flatbuffers::Vector *passwordSlotMask() const { - return GetPointer *>(VT_PASSWORDSLOTMASK); - } - const ::flatbuffers::Vector *ownerPrivilegeRank() const { - return GetPointer *>(VT_OWNERPRIVILEGERANK); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyField(verifier, VT_FLAGFILTER, 4) && - VerifyField(verifier, VT_FLAGATTR, 4) && - VerifyOffset(verifier, VT_ROOMBINATTRINTERNAL) && - verifier.VerifyVector(roomBinAttrInternal()) && - verifier.VerifyVectorOfTables(roomBinAttrInternal()) && - VerifyOffset(verifier, VT_PASSWORDCONFIG) && - verifier.VerifyVector(passwordConfig()) && - verifier.VerifyVectorOfTables(passwordConfig()) && - VerifyOffset(verifier, VT_PASSWORDSLOTMASK) && - verifier.VerifyVector(passwordSlotMask()) && - VerifyOffset(verifier, VT_OWNERPRIVILEGERANK) && - verifier.VerifyVector(ownerPrivilegeRank()) && - verifier.EndTable(); - } -}; - -struct SetRoomDataInternalRequestBuilder { - typedef SetRoomDataInternalRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomId(uint64_t roomId) { - fbb_.AddElement(SetRoomDataInternalRequest::VT_ROOMID, roomId, 0); - } - void add_flagFilter(uint32_t flagFilter) { - fbb_.AddElement(SetRoomDataInternalRequest::VT_FLAGFILTER, flagFilter, 0); - } - void add_flagAttr(uint32_t flagAttr) { - fbb_.AddElement(SetRoomDataInternalRequest::VT_FLAGATTR, flagAttr, 0); - } - void add_roomBinAttrInternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrInternal) { - fbb_.AddOffset(SetRoomDataInternalRequest::VT_ROOMBINATTRINTERNAL, roomBinAttrInternal); - } - void add_passwordConfig(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> passwordConfig) { - fbb_.AddOffset(SetRoomDataInternalRequest::VT_PASSWORDCONFIG, passwordConfig); - } - void add_passwordSlotMask(::flatbuffers::Offset<::flatbuffers::Vector> passwordSlotMask) { - fbb_.AddOffset(SetRoomDataInternalRequest::VT_PASSWORDSLOTMASK, passwordSlotMask); - } - void add_ownerPrivilegeRank(::flatbuffers::Offset<::flatbuffers::Vector> ownerPrivilegeRank) { - fbb_.AddOffset(SetRoomDataInternalRequest::VT_OWNERPRIVILEGERANK, ownerPrivilegeRank); - } - explicit SetRoomDataInternalRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSetRoomDataInternalRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - uint32_t flagFilter = 0, - uint32_t flagAttr = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomBinAttrInternal = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> passwordConfig = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> passwordSlotMask = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> ownerPrivilegeRank = 0) { - SetRoomDataInternalRequestBuilder builder_(_fbb); - builder_.add_roomId(roomId); - builder_.add_ownerPrivilegeRank(ownerPrivilegeRank); - builder_.add_passwordSlotMask(passwordSlotMask); - builder_.add_passwordConfig(passwordConfig); - builder_.add_roomBinAttrInternal(roomBinAttrInternal); - builder_.add_flagAttr(flagAttr); - builder_.add_flagFilter(flagFilter); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSetRoomDataInternalRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - uint32_t flagFilter = 0, - uint32_t flagAttr = 0, - const std::vector<::flatbuffers::Offset> *roomBinAttrInternal = nullptr, - const std::vector<::flatbuffers::Offset> *passwordConfig = nullptr, - const std::vector *passwordSlotMask = nullptr, - const std::vector *ownerPrivilegeRank = nullptr) { - auto roomBinAttrInternal__ = roomBinAttrInternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomBinAttrInternal) : 0; - auto passwordConfig__ = passwordConfig ? _fbb.CreateVector<::flatbuffers::Offset>(*passwordConfig) : 0; - auto passwordSlotMask__ = passwordSlotMask ? _fbb.CreateVector(*passwordSlotMask) : 0; - auto ownerPrivilegeRank__ = ownerPrivilegeRank ? _fbb.CreateVector(*ownerPrivilegeRank) : 0; - return CreateSetRoomDataInternalRequest( - _fbb, - roomId, - flagFilter, - flagAttr, - roomBinAttrInternal__, - passwordConfig__, - passwordSlotMask__, - ownerPrivilegeRank__); -} - -struct GetRoomMemberDataInternalRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetRoomMemberDataInternalRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMID = 4, - VT_MEMBERID = 6, - VT_ATTRID = 8 - }; - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - uint16_t memberId() const { - return GetField(VT_MEMBERID, 0); - } - const ::flatbuffers::Vector *attrId() const { - return GetPointer *>(VT_ATTRID); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyField(verifier, VT_MEMBERID, 2) && - VerifyOffset(verifier, VT_ATTRID) && - verifier.VerifyVector(attrId()) && - verifier.EndTable(); - } -}; - -struct GetRoomMemberDataInternalRequestBuilder { - typedef GetRoomMemberDataInternalRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomId(uint64_t roomId) { - fbb_.AddElement(GetRoomMemberDataInternalRequest::VT_ROOMID, roomId, 0); - } - void add_memberId(uint16_t memberId) { - fbb_.AddElement(GetRoomMemberDataInternalRequest::VT_MEMBERID, memberId, 0); - } - void add_attrId(::flatbuffers::Offset<::flatbuffers::Vector> attrId) { - fbb_.AddOffset(GetRoomMemberDataInternalRequest::VT_ATTRID, attrId); - } - explicit GetRoomMemberDataInternalRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetRoomMemberDataInternalRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - uint16_t memberId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> attrId = 0) { - GetRoomMemberDataInternalRequestBuilder builder_(_fbb); - builder_.add_roomId(roomId); - builder_.add_attrId(attrId); - builder_.add_memberId(memberId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateGetRoomMemberDataInternalRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - uint16_t memberId = 0, - const std::vector *attrId = nullptr) { - auto attrId__ = attrId ? _fbb.CreateVector(*attrId) : 0; - return CreateGetRoomMemberDataInternalRequest( - _fbb, - roomId, - memberId, - attrId__); -} - -struct SetRoomMemberDataInternalRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SetRoomMemberDataInternalRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMID = 4, - VT_MEMBERID = 6, - VT_TEAMID = 8, - VT_ROOMMEMBERBINATTRINTERNAL = 10 - }; - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - uint16_t memberId() const { - return GetField(VT_MEMBERID, 0); - } - uint8_t teamId() const { - return GetField(VT_TEAMID, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *roomMemberBinAttrInternal() const { - return GetPointer> *>(VT_ROOMMEMBERBINATTRINTERNAL); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyField(verifier, VT_MEMBERID, 2) && - VerifyField(verifier, VT_TEAMID, 1) && - VerifyOffset(verifier, VT_ROOMMEMBERBINATTRINTERNAL) && - verifier.VerifyVector(roomMemberBinAttrInternal()) && - verifier.VerifyVectorOfTables(roomMemberBinAttrInternal()) && - verifier.EndTable(); - } -}; - -struct SetRoomMemberDataInternalRequestBuilder { - typedef SetRoomMemberDataInternalRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomId(uint64_t roomId) { - fbb_.AddElement(SetRoomMemberDataInternalRequest::VT_ROOMID, roomId, 0); - } - void add_memberId(uint16_t memberId) { - fbb_.AddElement(SetRoomMemberDataInternalRequest::VT_MEMBERID, memberId, 0); - } - void add_teamId(uint8_t teamId) { - fbb_.AddElement(SetRoomMemberDataInternalRequest::VT_TEAMID, teamId, 0); - } - void add_roomMemberBinAttrInternal(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomMemberBinAttrInternal) { - fbb_.AddOffset(SetRoomMemberDataInternalRequest::VT_ROOMMEMBERBINATTRINTERNAL, roomMemberBinAttrInternal); - } - explicit SetRoomMemberDataInternalRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSetRoomMemberDataInternalRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - uint16_t memberId = 0, - uint8_t teamId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> roomMemberBinAttrInternal = 0) { - SetRoomMemberDataInternalRequestBuilder builder_(_fbb); - builder_.add_roomId(roomId); - builder_.add_roomMemberBinAttrInternal(roomMemberBinAttrInternal); - builder_.add_memberId(memberId); - builder_.add_teamId(teamId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSetRoomMemberDataInternalRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - uint16_t memberId = 0, - uint8_t teamId = 0, - const std::vector<::flatbuffers::Offset> *roomMemberBinAttrInternal = nullptr) { - auto roomMemberBinAttrInternal__ = roomMemberBinAttrInternal ? _fbb.CreateVector<::flatbuffers::Offset>(*roomMemberBinAttrInternal) : 0; - return CreateSetRoomMemberDataInternalRequest( - _fbb, - roomId, - memberId, - teamId, - roomMemberBinAttrInternal__); -} - -struct SetUserInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SetUserInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SERVERID = 4, - VT_USERBINATTR = 6 - }; - uint16_t serverId() const { - return GetField(VT_SERVERID, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *userBinAttr() const { - return GetPointer> *>(VT_USERBINATTR); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SERVERID, 2) && - VerifyOffset(verifier, VT_USERBINATTR) && - verifier.VerifyVector(userBinAttr()) && - verifier.VerifyVectorOfTables(userBinAttr()) && - verifier.EndTable(); - } -}; - -struct SetUserInfoBuilder { - typedef SetUserInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_serverId(uint16_t serverId) { - fbb_.AddElement(SetUserInfo::VT_SERVERID, serverId, 0); - } - void add_userBinAttr(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> userBinAttr) { - fbb_.AddOffset(SetUserInfo::VT_USERBINATTR, userBinAttr); - } - explicit SetUserInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSetUserInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t serverId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> userBinAttr = 0) { - SetUserInfoBuilder builder_(_fbb); - builder_.add_userBinAttr(userBinAttr); - builder_.add_serverId(serverId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSetUserInfoDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t serverId = 0, - const std::vector<::flatbuffers::Offset> *userBinAttr = nullptr) { - auto userBinAttr__ = userBinAttr ? _fbb.CreateVector<::flatbuffers::Offset>(*userBinAttr) : 0; - return CreateSetUserInfo( - _fbb, - serverId, - userBinAttr__); -} - -struct GetRoomDataInternalRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetRoomDataInternalRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMID = 4, - VT_ATTRID = 6 - }; - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - const ::flatbuffers::Vector *attrId() const { - return GetPointer *>(VT_ATTRID); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyOffset(verifier, VT_ATTRID) && - verifier.VerifyVector(attrId()) && - verifier.EndTable(); - } -}; - -struct GetRoomDataInternalRequestBuilder { - typedef GetRoomDataInternalRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomId(uint64_t roomId) { - fbb_.AddElement(GetRoomDataInternalRequest::VT_ROOMID, roomId, 0); - } - void add_attrId(::flatbuffers::Offset<::flatbuffers::Vector> attrId) { - fbb_.AddOffset(GetRoomDataInternalRequest::VT_ATTRID, attrId); - } - explicit GetRoomDataInternalRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetRoomDataInternalRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> attrId = 0) { - GetRoomDataInternalRequestBuilder builder_(_fbb); - builder_.add_roomId(roomId); - builder_.add_attrId(attrId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateGetRoomDataInternalRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - const std::vector *attrId = nullptr) { - auto attrId__ = attrId ? _fbb.CreateVector(*attrId) : 0; - return CreateGetRoomDataInternalRequest( - _fbb, - roomId, - attrId__); -} - -struct RoomMemberUpdateInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomMemberUpdateInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMMEMBERDATAINTERNAL = 4, - VT_EVENTCAUSE = 6, - VT_OPTDATA = 8 - }; - const RoomMemberDataInternal *roomMemberDataInternal() const { - return GetPointer(VT_ROOMMEMBERDATAINTERNAL); - } - uint8_t eventCause() const { - return GetField(VT_EVENTCAUSE, 0); - } - const PresenceOptionData *optData() const { - return GetPointer(VT_OPTDATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_ROOMMEMBERDATAINTERNAL) && - verifier.VerifyTable(roomMemberDataInternal()) && - VerifyField(verifier, VT_EVENTCAUSE, 1) && - VerifyOffset(verifier, VT_OPTDATA) && - verifier.VerifyTable(optData()) && - verifier.EndTable(); - } -}; - -struct RoomMemberUpdateInfoBuilder { - typedef RoomMemberUpdateInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomMemberDataInternal(::flatbuffers::Offset roomMemberDataInternal) { - fbb_.AddOffset(RoomMemberUpdateInfo::VT_ROOMMEMBERDATAINTERNAL, roomMemberDataInternal); - } - void add_eventCause(uint8_t eventCause) { - fbb_.AddElement(RoomMemberUpdateInfo::VT_EVENTCAUSE, eventCause, 0); - } - void add_optData(::flatbuffers::Offset optData) { - fbb_.AddOffset(RoomMemberUpdateInfo::VT_OPTDATA, optData); - } - explicit RoomMemberUpdateInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomMemberUpdateInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset roomMemberDataInternal = 0, - uint8_t eventCause = 0, - ::flatbuffers::Offset optData = 0) { - RoomMemberUpdateInfoBuilder builder_(_fbb); - builder_.add_optData(optData); - builder_.add_roomMemberDataInternal(roomMemberDataInternal); - builder_.add_eventCause(eventCause); - return builder_.Finish(); -} - -struct NotificationUserJoinedRoom FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef NotificationUserJoinedRoomBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOM_ID = 4, - VT_UPDATE_INFO = 6, - VT_SIGNALING = 8 - }; - uint64_t room_id() const { - return GetField(VT_ROOM_ID, 0); - } - const RoomMemberUpdateInfo *update_info() const { - return GetPointer(VT_UPDATE_INFO); - } - const SignalingAddr *signaling() const { - return GetPointer(VT_SIGNALING); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ROOM_ID, 8) && - VerifyOffset(verifier, VT_UPDATE_INFO) && - verifier.VerifyTable(update_info()) && - VerifyOffset(verifier, VT_SIGNALING) && - verifier.VerifyTable(signaling()) && - verifier.EndTable(); - } -}; - -struct NotificationUserJoinedRoomBuilder { - typedef NotificationUserJoinedRoom Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_room_id(uint64_t room_id) { - fbb_.AddElement(NotificationUserJoinedRoom::VT_ROOM_ID, room_id, 0); - } - void add_update_info(::flatbuffers::Offset update_info) { - fbb_.AddOffset(NotificationUserJoinedRoom::VT_UPDATE_INFO, update_info); - } - void add_signaling(::flatbuffers::Offset signaling) { - fbb_.AddOffset(NotificationUserJoinedRoom::VT_SIGNALING, signaling); - } - explicit NotificationUserJoinedRoomBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateNotificationUserJoinedRoom( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t room_id = 0, - ::flatbuffers::Offset update_info = 0, - ::flatbuffers::Offset signaling = 0) { - NotificationUserJoinedRoomBuilder builder_(_fbb); - builder_.add_room_id(room_id); - builder_.add_signaling(signaling); - builder_.add_update_info(update_info); - return builder_.Finish(); -} - -struct RoomUpdateInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomUpdateInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_EVENTCAUSE = 4, - VT_ERRORCODE = 6, - VT_OPTDATA = 8 - }; - uint8_t eventCause() const { - return GetField(VT_EVENTCAUSE, 0); - } - int32_t errorCode() const { - return GetField(VT_ERRORCODE, 0); - } - const PresenceOptionData *optData() const { - return GetPointer(VT_OPTDATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_EVENTCAUSE, 1) && - VerifyField(verifier, VT_ERRORCODE, 4) && - VerifyOffset(verifier, VT_OPTDATA) && - verifier.VerifyTable(optData()) && - verifier.EndTable(); - } -}; - -struct RoomUpdateInfoBuilder { - typedef RoomUpdateInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_eventCause(uint8_t eventCause) { - fbb_.AddElement(RoomUpdateInfo::VT_EVENTCAUSE, eventCause, 0); - } - void add_errorCode(int32_t errorCode) { - fbb_.AddElement(RoomUpdateInfo::VT_ERRORCODE, errorCode, 0); - } - void add_optData(::flatbuffers::Offset optData) { - fbb_.AddOffset(RoomUpdateInfo::VT_OPTDATA, optData); - } - explicit RoomUpdateInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomUpdateInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint8_t eventCause = 0, - int32_t errorCode = 0, - ::flatbuffers::Offset optData = 0) { - RoomUpdateInfoBuilder builder_(_fbb); - builder_.add_optData(optData); - builder_.add_errorCode(errorCode); - builder_.add_eventCause(eventCause); - return builder_.Finish(); -} - -struct RoomDataInternalUpdateInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomDataInternalUpdateInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NEWROOMDATAINTERNAL = 4, - VT_PREVFLAGATTR = 6, - VT_PREVROOMPASSWORDSLOTMASK = 8, - VT_NEWROOMGROUP = 10, - VT_NEWROOMBINATTRINTERNAL = 12 - }; - const RoomDataInternal *newRoomDataInternal() const { - return GetPointer(VT_NEWROOMDATAINTERNAL); - } - uint32_t prevFlagAttr() const { - return GetField(VT_PREVFLAGATTR, 0); - } - uint64_t prevRoomPasswordSlotMask() const { - return GetField(VT_PREVROOMPASSWORDSLOTMASK, 0); - } - const ::flatbuffers::Vector *newRoomGroup() const { - return GetPointer *>(VT_NEWROOMGROUP); - } - const ::flatbuffers::Vector *newRoomBinAttrInternal() const { - return GetPointer *>(VT_NEWROOMBINATTRINTERNAL); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_NEWROOMDATAINTERNAL) && - verifier.VerifyTable(newRoomDataInternal()) && - VerifyField(verifier, VT_PREVFLAGATTR, 4) && - VerifyField(verifier, VT_PREVROOMPASSWORDSLOTMASK, 8) && - VerifyOffset(verifier, VT_NEWROOMGROUP) && - verifier.VerifyVector(newRoomGroup()) && - VerifyOffset(verifier, VT_NEWROOMBINATTRINTERNAL) && - verifier.VerifyVector(newRoomBinAttrInternal()) && - verifier.EndTable(); - } -}; - -struct RoomDataInternalUpdateInfoBuilder { - typedef RoomDataInternalUpdateInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_newRoomDataInternal(::flatbuffers::Offset newRoomDataInternal) { - fbb_.AddOffset(RoomDataInternalUpdateInfo::VT_NEWROOMDATAINTERNAL, newRoomDataInternal); - } - void add_prevFlagAttr(uint32_t prevFlagAttr) { - fbb_.AddElement(RoomDataInternalUpdateInfo::VT_PREVFLAGATTR, prevFlagAttr, 0); - } - void add_prevRoomPasswordSlotMask(uint64_t prevRoomPasswordSlotMask) { - fbb_.AddElement(RoomDataInternalUpdateInfo::VT_PREVROOMPASSWORDSLOTMASK, prevRoomPasswordSlotMask, 0); - } - void add_newRoomGroup(::flatbuffers::Offset<::flatbuffers::Vector> newRoomGroup) { - fbb_.AddOffset(RoomDataInternalUpdateInfo::VT_NEWROOMGROUP, newRoomGroup); - } - void add_newRoomBinAttrInternal(::flatbuffers::Offset<::flatbuffers::Vector> newRoomBinAttrInternal) { - fbb_.AddOffset(RoomDataInternalUpdateInfo::VT_NEWROOMBINATTRINTERNAL, newRoomBinAttrInternal); - } - explicit RoomDataInternalUpdateInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomDataInternalUpdateInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset newRoomDataInternal = 0, - uint32_t prevFlagAttr = 0, - uint64_t prevRoomPasswordSlotMask = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> newRoomGroup = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> newRoomBinAttrInternal = 0) { - RoomDataInternalUpdateInfoBuilder builder_(_fbb); - builder_.add_prevRoomPasswordSlotMask(prevRoomPasswordSlotMask); - builder_.add_newRoomBinAttrInternal(newRoomBinAttrInternal); - builder_.add_newRoomGroup(newRoomGroup); - builder_.add_prevFlagAttr(prevFlagAttr); - builder_.add_newRoomDataInternal(newRoomDataInternal); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateRoomDataInternalUpdateInfoDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset newRoomDataInternal = 0, - uint32_t prevFlagAttr = 0, - uint64_t prevRoomPasswordSlotMask = 0, - const std::vector *newRoomGroup = nullptr, - const std::vector *newRoomBinAttrInternal = nullptr) { - auto newRoomGroup__ = newRoomGroup ? _fbb.CreateVector(*newRoomGroup) : 0; - auto newRoomBinAttrInternal__ = newRoomBinAttrInternal ? _fbb.CreateVector(*newRoomBinAttrInternal) : 0; - return CreateRoomDataInternalUpdateInfo( - _fbb, - newRoomDataInternal, - prevFlagAttr, - prevRoomPasswordSlotMask, - newRoomGroup__, - newRoomBinAttrInternal__); -} - -struct RoomMemberDataInternalUpdateInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomMemberDataInternalUpdateInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NEWROOMMEMBERDATAINTERNAL = 4, - VT_PREVFLAGATTR = 6, - VT_PREVTEAMID = 8, - VT_NEWROOMMEMBERBINATTRINTERNAL = 10 - }; - const RoomMemberDataInternal *newRoomMemberDataInternal() const { - return GetPointer(VT_NEWROOMMEMBERDATAINTERNAL); - } - uint32_t prevFlagAttr() const { - return GetField(VT_PREVFLAGATTR, 0); - } - uint8_t prevTeamId() const { - return GetField(VT_PREVTEAMID, 0); - } - const ::flatbuffers::Vector *newRoomMemberBinAttrInternal() const { - return GetPointer *>(VT_NEWROOMMEMBERBINATTRINTERNAL); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_NEWROOMMEMBERDATAINTERNAL) && - verifier.VerifyTable(newRoomMemberDataInternal()) && - VerifyField(verifier, VT_PREVFLAGATTR, 4) && - VerifyField(verifier, VT_PREVTEAMID, 1) && - VerifyOffset(verifier, VT_NEWROOMMEMBERBINATTRINTERNAL) && - verifier.VerifyVector(newRoomMemberBinAttrInternal()) && - verifier.EndTable(); - } -}; - -struct RoomMemberDataInternalUpdateInfoBuilder { - typedef RoomMemberDataInternalUpdateInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_newRoomMemberDataInternal(::flatbuffers::Offset newRoomMemberDataInternal) { - fbb_.AddOffset(RoomMemberDataInternalUpdateInfo::VT_NEWROOMMEMBERDATAINTERNAL, newRoomMemberDataInternal); - } - void add_prevFlagAttr(uint32_t prevFlagAttr) { - fbb_.AddElement(RoomMemberDataInternalUpdateInfo::VT_PREVFLAGATTR, prevFlagAttr, 0); - } - void add_prevTeamId(uint8_t prevTeamId) { - fbb_.AddElement(RoomMemberDataInternalUpdateInfo::VT_PREVTEAMID, prevTeamId, 0); - } - void add_newRoomMemberBinAttrInternal(::flatbuffers::Offset<::flatbuffers::Vector> newRoomMemberBinAttrInternal) { - fbb_.AddOffset(RoomMemberDataInternalUpdateInfo::VT_NEWROOMMEMBERBINATTRINTERNAL, newRoomMemberBinAttrInternal); - } - explicit RoomMemberDataInternalUpdateInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomMemberDataInternalUpdateInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset newRoomMemberDataInternal = 0, - uint32_t prevFlagAttr = 0, - uint8_t prevTeamId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> newRoomMemberBinAttrInternal = 0) { - RoomMemberDataInternalUpdateInfoBuilder builder_(_fbb); - builder_.add_newRoomMemberBinAttrInternal(newRoomMemberBinAttrInternal); - builder_.add_prevFlagAttr(prevFlagAttr); - builder_.add_newRoomMemberDataInternal(newRoomMemberDataInternal); - builder_.add_prevTeamId(prevTeamId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateRoomMemberDataInternalUpdateInfoDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset newRoomMemberDataInternal = 0, - uint32_t prevFlagAttr = 0, - uint8_t prevTeamId = 0, - const std::vector *newRoomMemberBinAttrInternal = nullptr) { - auto newRoomMemberBinAttrInternal__ = newRoomMemberBinAttrInternal ? _fbb.CreateVector(*newRoomMemberBinAttrInternal) : 0; - return CreateRoomMemberDataInternalUpdateInfo( - _fbb, - newRoomMemberDataInternal, - prevFlagAttr, - prevTeamId, - newRoomMemberBinAttrInternal__); -} - -struct GetPingInfoResponse FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetPingInfoResponseBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SERVERID = 4, - VT_WORLDID = 6, - VT_ROOMID = 8, - VT_RTT = 10 - }; - uint16_t serverId() const { - return GetField(VT_SERVERID, 0); - } - uint32_t worldId() const { - return GetField(VT_WORLDID, 0); - } - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - uint32_t rtt() const { - return GetField(VT_RTT, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SERVERID, 2) && - VerifyField(verifier, VT_WORLDID, 4) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyField(verifier, VT_RTT, 4) && - verifier.EndTable(); - } -}; - -struct GetPingInfoResponseBuilder { - typedef GetPingInfoResponse Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_serverId(uint16_t serverId) { - fbb_.AddElement(GetPingInfoResponse::VT_SERVERID, serverId, 0); - } - void add_worldId(uint32_t worldId) { - fbb_.AddElement(GetPingInfoResponse::VT_WORLDID, worldId, 0); - } - void add_roomId(uint64_t roomId) { - fbb_.AddElement(GetPingInfoResponse::VT_ROOMID, roomId, 0); - } - void add_rtt(uint32_t rtt) { - fbb_.AddElement(GetPingInfoResponse::VT_RTT, rtt, 0); - } - explicit GetPingInfoResponseBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetPingInfoResponse( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint16_t serverId = 0, - uint32_t worldId = 0, - uint64_t roomId = 0, - uint32_t rtt = 0) { - GetPingInfoResponseBuilder builder_(_fbb); - builder_.add_roomId(roomId); - builder_.add_rtt(rtt); - builder_.add_worldId(worldId); - builder_.add_serverId(serverId); - return builder_.Finish(); -} - -struct SendRoomMessageRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SendRoomMessageRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMID = 4, - VT_CASTTYPE = 6, - VT_DST = 8, - VT_MSG = 10, - VT_OPTION = 12 - }; - uint64_t roomId() const { - return GetField(VT_ROOMID, 0); - } - uint8_t castType() const { - return GetField(VT_CASTTYPE, 0); - } - const ::flatbuffers::Vector *dst() const { - return GetPointer *>(VT_DST); - } - const ::flatbuffers::Vector *msg() const { - return GetPointer *>(VT_MSG); - } - uint8_t option() const { - return GetField(VT_OPTION, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ROOMID, 8) && - VerifyField(verifier, VT_CASTTYPE, 1) && - VerifyOffset(verifier, VT_DST) && - verifier.VerifyVector(dst()) && - VerifyOffset(verifier, VT_MSG) && - verifier.VerifyVector(msg()) && - VerifyField(verifier, VT_OPTION, 1) && - verifier.EndTable(); - } -}; - -struct SendRoomMessageRequestBuilder { - typedef SendRoomMessageRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomId(uint64_t roomId) { - fbb_.AddElement(SendRoomMessageRequest::VT_ROOMID, roomId, 0); - } - void add_castType(uint8_t castType) { - fbb_.AddElement(SendRoomMessageRequest::VT_CASTTYPE, castType, 0); - } - void add_dst(::flatbuffers::Offset<::flatbuffers::Vector> dst) { - fbb_.AddOffset(SendRoomMessageRequest::VT_DST, dst); - } - void add_msg(::flatbuffers::Offset<::flatbuffers::Vector> msg) { - fbb_.AddOffset(SendRoomMessageRequest::VT_MSG, msg); - } - void add_option(uint8_t option) { - fbb_.AddElement(SendRoomMessageRequest::VT_OPTION, option, 0); - } - explicit SendRoomMessageRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSendRoomMessageRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - uint8_t castType = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> dst = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> msg = 0, - uint8_t option = 0) { - SendRoomMessageRequestBuilder builder_(_fbb); - builder_.add_roomId(roomId); - builder_.add_msg(msg); - builder_.add_dst(dst); - builder_.add_option(option); - builder_.add_castType(castType); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSendRoomMessageRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint64_t roomId = 0, - uint8_t castType = 0, - const std::vector *dst = nullptr, - const std::vector *msg = nullptr, - uint8_t option = 0) { - auto dst__ = dst ? _fbb.CreateVector(*dst) : 0; - auto msg__ = msg ? _fbb.CreateVector(*msg) : 0; - return CreateSendRoomMessageRequest( - _fbb, - roomId, - castType, - dst__, - msg__, - option); -} - -struct RoomMessageInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RoomMessageInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FILTERED = 4, - VT_CASTTYPE = 6, - VT_DST = 8, - VT_SRCMEMBER = 10, - VT_MSG = 12 - }; - bool filtered() const { - return GetField(VT_FILTERED, 0) != 0; - } - uint8_t castType() const { - return GetField(VT_CASTTYPE, 0); - } - const ::flatbuffers::Vector *dst() const { - return GetPointer *>(VT_DST); - } - const UserInfo *srcMember() const { - return GetPointer(VT_SRCMEMBER); - } - const ::flatbuffers::Vector *msg() const { - return GetPointer *>(VT_MSG); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FILTERED, 1) && - VerifyField(verifier, VT_CASTTYPE, 1) && - VerifyOffset(verifier, VT_DST) && - verifier.VerifyVector(dst()) && - VerifyOffset(verifier, VT_SRCMEMBER) && - verifier.VerifyTable(srcMember()) && - VerifyOffset(verifier, VT_MSG) && - verifier.VerifyVector(msg()) && - verifier.EndTable(); - } -}; - -struct RoomMessageInfoBuilder { - typedef RoomMessageInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_filtered(bool filtered) { - fbb_.AddElement(RoomMessageInfo::VT_FILTERED, static_cast(filtered), 0); - } - void add_castType(uint8_t castType) { - fbb_.AddElement(RoomMessageInfo::VT_CASTTYPE, castType, 0); - } - void add_dst(::flatbuffers::Offset<::flatbuffers::Vector> dst) { - fbb_.AddOffset(RoomMessageInfo::VT_DST, dst); - } - void add_srcMember(::flatbuffers::Offset srcMember) { - fbb_.AddOffset(RoomMessageInfo::VT_SRCMEMBER, srcMember); - } - void add_msg(::flatbuffers::Offset<::flatbuffers::Vector> msg) { - fbb_.AddOffset(RoomMessageInfo::VT_MSG, msg); - } - explicit RoomMessageInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRoomMessageInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - bool filtered = false, - uint8_t castType = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> dst = 0, - ::flatbuffers::Offset srcMember = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> msg = 0) { - RoomMessageInfoBuilder builder_(_fbb); - builder_.add_msg(msg); - builder_.add_srcMember(srcMember); - builder_.add_dst(dst); - builder_.add_castType(castType); - builder_.add_filtered(filtered); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateRoomMessageInfoDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - bool filtered = false, - uint8_t castType = 0, - const std::vector *dst = nullptr, - ::flatbuffers::Offset srcMember = 0, - const std::vector *msg = nullptr) { - auto dst__ = dst ? _fbb.CreateVector(*dst) : 0; - auto msg__ = msg ? _fbb.CreateVector(*msg) : 0; - return CreateRoomMessageInfo( - _fbb, - filtered, - castType, - dst__, - srcMember, - msg__); -} - -struct MessageDetails FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef MessageDetailsBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_COMMUNICATIONID = 4, - VT_MSGID = 6, - VT_MAINTYPE = 8, - VT_SUBTYPE = 10, - VT_MSGFEATURES = 12, - VT_SUBJECT = 14, - VT_BODY = 16, - VT_DATA = 18 - }; - const ::flatbuffers::String *communicationId() const { - return GetPointer(VT_COMMUNICATIONID); - } - uint64_t msgId() const { - return GetField(VT_MSGID, 0); - } - uint16_t mainType() const { - return GetField(VT_MAINTYPE, 0); - } - uint16_t subType() const { - return GetField(VT_SUBTYPE, 0); - } - uint32_t msgFeatures() const { - return GetField(VT_MSGFEATURES, 0); - } - const ::flatbuffers::String *subject() const { - return GetPointer(VT_SUBJECT); - } - const ::flatbuffers::String *body() const { - return GetPointer(VT_BODY); - } - const ::flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_COMMUNICATIONID) && - verifier.VerifyString(communicationId()) && - VerifyField(verifier, VT_MSGID, 8) && - VerifyField(verifier, VT_MAINTYPE, 2) && - VerifyField(verifier, VT_SUBTYPE, 2) && - VerifyField(verifier, VT_MSGFEATURES, 4) && - VerifyOffset(verifier, VT_SUBJECT) && - verifier.VerifyString(subject()) && - VerifyOffset(verifier, VT_BODY) && - verifier.VerifyString(body()) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - verifier.EndTable(); - } -}; - -struct MessageDetailsBuilder { - typedef MessageDetails Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_communicationId(::flatbuffers::Offset<::flatbuffers::String> communicationId) { - fbb_.AddOffset(MessageDetails::VT_COMMUNICATIONID, communicationId); - } - void add_msgId(uint64_t msgId) { - fbb_.AddElement(MessageDetails::VT_MSGID, msgId, 0); - } - void add_mainType(uint16_t mainType) { - fbb_.AddElement(MessageDetails::VT_MAINTYPE, mainType, 0); - } - void add_subType(uint16_t subType) { - fbb_.AddElement(MessageDetails::VT_SUBTYPE, subType, 0); - } - void add_msgFeatures(uint32_t msgFeatures) { - fbb_.AddElement(MessageDetails::VT_MSGFEATURES, msgFeatures, 0); - } - void add_subject(::flatbuffers::Offset<::flatbuffers::String> subject) { - fbb_.AddOffset(MessageDetails::VT_SUBJECT, subject); - } - void add_body(::flatbuffers::Offset<::flatbuffers::String> body) { - fbb_.AddOffset(MessageDetails::VT_BODY, body); - } - void add_data(::flatbuffers::Offset<::flatbuffers::Vector> data) { - fbb_.AddOffset(MessageDetails::VT_DATA, data); - } - explicit MessageDetailsBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMessageDetails( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::String> communicationId = 0, - uint64_t msgId = 0, - uint16_t mainType = 0, - uint16_t subType = 0, - uint32_t msgFeatures = 0, - ::flatbuffers::Offset<::flatbuffers::String> subject = 0, - ::flatbuffers::Offset<::flatbuffers::String> body = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> data = 0) { - MessageDetailsBuilder builder_(_fbb); - builder_.add_msgId(msgId); - builder_.add_data(data); - builder_.add_body(body); - builder_.add_subject(subject); - builder_.add_msgFeatures(msgFeatures); - builder_.add_communicationId(communicationId); - builder_.add_subType(subType); - builder_.add_mainType(mainType); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateMessageDetailsDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const char *communicationId = nullptr, - uint64_t msgId = 0, - uint16_t mainType = 0, - uint16_t subType = 0, - uint32_t msgFeatures = 0, - const char *subject = nullptr, - const char *body = nullptr, - const std::vector *data = nullptr) { - auto communicationId__ = communicationId ? _fbb.CreateString(communicationId) : 0; - auto subject__ = subject ? _fbb.CreateString(subject) : 0; - auto body__ = body ? _fbb.CreateString(body) : 0; - auto data__ = data ? _fbb.CreateVector(*data) : 0; - return CreateMessageDetails( - _fbb, - communicationId__, - msgId, - mainType, - subType, - msgFeatures, - subject__, - body__, - data__); -} - -struct SendMessageRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SendMessageRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_MESSAGE = 4, - VT_NPIDS = 6 - }; - const ::flatbuffers::Vector *message() const { - return GetPointer *>(VT_MESSAGE); - } - const MessageDetails *message_nested_root() const { - const auto _f = message(); - return _f ? ::flatbuffers::GetRoot(_f->Data()) - : nullptr; - } - const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *npids() const { - return GetPointer> *>(VT_NPIDS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_MESSAGE) && - verifier.VerifyVector(message()) && - verifier.VerifyNestedFlatBuffer(message(), nullptr) && - VerifyOffset(verifier, VT_NPIDS) && - verifier.VerifyVector(npids()) && - verifier.VerifyVectorOfStrings(npids()) && - verifier.EndTable(); - } -}; - -struct SendMessageRequestBuilder { - typedef SendMessageRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_message(::flatbuffers::Offset<::flatbuffers::Vector> message) { - fbb_.AddOffset(SendMessageRequest::VT_MESSAGE, message); - } - void add_npids(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> npids) { - fbb_.AddOffset(SendMessageRequest::VT_NPIDS, npids); - } - explicit SendMessageRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSendMessageRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> message = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> npids = 0) { - SendMessageRequestBuilder builder_(_fbb); - builder_.add_npids(npids); - builder_.add_message(message); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSendMessageRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *message = nullptr, - const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *npids = nullptr) { - auto message__ = message ? _fbb.CreateVector(*message) : 0; - auto npids__ = npids ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*npids) : 0; - return CreateSendMessageRequest( - _fbb, - message__, - npids__); -} - -struct BoardInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef BoardInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_RANKLIMIT = 4, - VT_UPDATEMODE = 6, - VT_SORTMODE = 8, - VT_UPLOADNUMLIMIT = 10, - VT_UPLOADSIZELIMIT = 12 - }; - uint32_t rankLimit() const { - return GetField(VT_RANKLIMIT, 0); - } - uint32_t updateMode() const { - return GetField(VT_UPDATEMODE, 0); - } - uint32_t sortMode() const { - return GetField(VT_SORTMODE, 0); - } - uint32_t uploadNumLimit() const { - return GetField(VT_UPLOADNUMLIMIT, 0); - } - uint32_t uploadSizeLimit() const { - return GetField(VT_UPLOADSIZELIMIT, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_RANKLIMIT, 4) && - VerifyField(verifier, VT_UPDATEMODE, 4) && - VerifyField(verifier, VT_SORTMODE, 4) && - VerifyField(verifier, VT_UPLOADNUMLIMIT, 4) && - VerifyField(verifier, VT_UPLOADSIZELIMIT, 4) && - verifier.EndTable(); - } -}; - -struct BoardInfoBuilder { - typedef BoardInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_rankLimit(uint32_t rankLimit) { - fbb_.AddElement(BoardInfo::VT_RANKLIMIT, rankLimit, 0); - } - void add_updateMode(uint32_t updateMode) { - fbb_.AddElement(BoardInfo::VT_UPDATEMODE, updateMode, 0); - } - void add_sortMode(uint32_t sortMode) { - fbb_.AddElement(BoardInfo::VT_SORTMODE, sortMode, 0); - } - void add_uploadNumLimit(uint32_t uploadNumLimit) { - fbb_.AddElement(BoardInfo::VT_UPLOADNUMLIMIT, uploadNumLimit, 0); - } - void add_uploadSizeLimit(uint32_t uploadSizeLimit) { - fbb_.AddElement(BoardInfo::VT_UPLOADSIZELIMIT, uploadSizeLimit, 0); - } - explicit BoardInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateBoardInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t rankLimit = 0, - uint32_t updateMode = 0, - uint32_t sortMode = 0, - uint32_t uploadNumLimit = 0, - uint32_t uploadSizeLimit = 0) { - BoardInfoBuilder builder_(_fbb); - builder_.add_uploadSizeLimit(uploadSizeLimit); - builder_.add_uploadNumLimit(uploadNumLimit); - builder_.add_sortMode(sortMode); - builder_.add_updateMode(updateMode); - builder_.add_rankLimit(rankLimit); - return builder_.Finish(); -} - -struct RecordScoreRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RecordScoreRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BOARDID = 4, - VT_PCID = 6, - VT_SCORE = 8, - VT_COMMENT = 10, - VT_DATA = 12 - }; - uint32_t boardId() const { - return GetField(VT_BOARDID, 0); - } - int32_t pcId() const { - return GetField(VT_PCID, 0); - } - int64_t score() const { - return GetField(VT_SCORE, 0); - } - const ::flatbuffers::String *comment() const { - return GetPointer(VT_COMMENT); - } - const ::flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BOARDID, 4) && - VerifyField(verifier, VT_PCID, 4) && - VerifyField(verifier, VT_SCORE, 8) && - VerifyOffset(verifier, VT_COMMENT) && - verifier.VerifyString(comment()) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - verifier.EndTable(); - } -}; - -struct RecordScoreRequestBuilder { - typedef RecordScoreRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_boardId(uint32_t boardId) { - fbb_.AddElement(RecordScoreRequest::VT_BOARDID, boardId, 0); - } - void add_pcId(int32_t pcId) { - fbb_.AddElement(RecordScoreRequest::VT_PCID, pcId, 0); - } - void add_score(int64_t score) { - fbb_.AddElement(RecordScoreRequest::VT_SCORE, score, 0); - } - void add_comment(::flatbuffers::Offset<::flatbuffers::String> comment) { - fbb_.AddOffset(RecordScoreRequest::VT_COMMENT, comment); - } - void add_data(::flatbuffers::Offset<::flatbuffers::Vector> data) { - fbb_.AddOffset(RecordScoreRequest::VT_DATA, data); - } - explicit RecordScoreRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRecordScoreRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t boardId = 0, - int32_t pcId = 0, - int64_t score = 0, - ::flatbuffers::Offset<::flatbuffers::String> comment = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> data = 0) { - RecordScoreRequestBuilder builder_(_fbb); - builder_.add_score(score); - builder_.add_data(data); - builder_.add_comment(comment); - builder_.add_pcId(pcId); - builder_.add_boardId(boardId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateRecordScoreRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t boardId = 0, - int32_t pcId = 0, - int64_t score = 0, - const char *comment = nullptr, - const std::vector *data = nullptr) { - auto comment__ = comment ? _fbb.CreateString(comment) : 0; - auto data__ = data ? _fbb.CreateVector(*data) : 0; - return CreateRecordScoreRequest( - _fbb, - boardId, - pcId, - score, - comment__, - data__); -} - -struct GetScoreRangeRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetScoreRangeRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BOARDID = 4, - VT_STARTRANK = 6, - VT_NUMRANKS = 8, - VT_WITHCOMMENT = 10, - VT_WITHGAMEINFO = 12 - }; - uint32_t boardId() const { - return GetField(VT_BOARDID, 0); - } - uint32_t startRank() const { - return GetField(VT_STARTRANK, 0); - } - uint32_t numRanks() const { - return GetField(VT_NUMRANKS, 0); - } - bool withComment() const { - return GetField(VT_WITHCOMMENT, 0) != 0; - } - bool withGameInfo() const { - return GetField(VT_WITHGAMEINFO, 0) != 0; - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BOARDID, 4) && - VerifyField(verifier, VT_STARTRANK, 4) && - VerifyField(verifier, VT_NUMRANKS, 4) && - VerifyField(verifier, VT_WITHCOMMENT, 1) && - VerifyField(verifier, VT_WITHGAMEINFO, 1) && - verifier.EndTable(); - } -}; - -struct GetScoreRangeRequestBuilder { - typedef GetScoreRangeRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_boardId(uint32_t boardId) { - fbb_.AddElement(GetScoreRangeRequest::VT_BOARDID, boardId, 0); - } - void add_startRank(uint32_t startRank) { - fbb_.AddElement(GetScoreRangeRequest::VT_STARTRANK, startRank, 0); - } - void add_numRanks(uint32_t numRanks) { - fbb_.AddElement(GetScoreRangeRequest::VT_NUMRANKS, numRanks, 0); - } - void add_withComment(bool withComment) { - fbb_.AddElement(GetScoreRangeRequest::VT_WITHCOMMENT, static_cast(withComment), 0); - } - void add_withGameInfo(bool withGameInfo) { - fbb_.AddElement(GetScoreRangeRequest::VT_WITHGAMEINFO, static_cast(withGameInfo), 0); - } - explicit GetScoreRangeRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetScoreRangeRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t boardId = 0, - uint32_t startRank = 0, - uint32_t numRanks = 0, - bool withComment = false, - bool withGameInfo = false) { - GetScoreRangeRequestBuilder builder_(_fbb); - builder_.add_numRanks(numRanks); - builder_.add_startRank(startRank); - builder_.add_boardId(boardId); - builder_.add_withGameInfo(withGameInfo); - builder_.add_withComment(withComment); - return builder_.Finish(); -} - -struct ScoreNpIdPcId FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef ScoreNpIdPcIdBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NPID = 4, - VT_PCID = 6 - }; - const ::flatbuffers::String *npid() const { - return GetPointer(VT_NPID); - } - int32_t pcId() const { - return GetField(VT_PCID, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_NPID) && - verifier.VerifyString(npid()) && - VerifyField(verifier, VT_PCID, 4) && - verifier.EndTable(); - } -}; - -struct ScoreNpIdPcIdBuilder { - typedef ScoreNpIdPcId Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_npid(::flatbuffers::Offset<::flatbuffers::String> npid) { - fbb_.AddOffset(ScoreNpIdPcId::VT_NPID, npid); - } - void add_pcId(int32_t pcId) { - fbb_.AddElement(ScoreNpIdPcId::VT_PCID, pcId, 0); - } - explicit ScoreNpIdPcIdBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateScoreNpIdPcId( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::String> npid = 0, - int32_t pcId = 0) { - ScoreNpIdPcIdBuilder builder_(_fbb); - builder_.add_pcId(pcId); - builder_.add_npid(npid); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateScoreNpIdPcIdDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const char *npid = nullptr, - int32_t pcId = 0) { - auto npid__ = npid ? _fbb.CreateString(npid) : 0; - return CreateScoreNpIdPcId( - _fbb, - npid__, - pcId); -} - -struct GetScoreNpIdRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetScoreNpIdRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BOARDID = 4, - VT_NPIDS = 6, - VT_WITHCOMMENT = 8, - VT_WITHGAMEINFO = 10 - }; - uint32_t boardId() const { - return GetField(VT_BOARDID, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *npids() const { - return GetPointer> *>(VT_NPIDS); - } - bool withComment() const { - return GetField(VT_WITHCOMMENT, 0) != 0; - } - bool withGameInfo() const { - return GetField(VT_WITHGAMEINFO, 0) != 0; - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BOARDID, 4) && - VerifyOffset(verifier, VT_NPIDS) && - verifier.VerifyVector(npids()) && - verifier.VerifyVectorOfTables(npids()) && - VerifyField(verifier, VT_WITHCOMMENT, 1) && - VerifyField(verifier, VT_WITHGAMEINFO, 1) && - verifier.EndTable(); - } -}; - -struct GetScoreNpIdRequestBuilder { - typedef GetScoreNpIdRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_boardId(uint32_t boardId) { - fbb_.AddElement(GetScoreNpIdRequest::VT_BOARDID, boardId, 0); - } - void add_npids(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> npids) { - fbb_.AddOffset(GetScoreNpIdRequest::VT_NPIDS, npids); - } - void add_withComment(bool withComment) { - fbb_.AddElement(GetScoreNpIdRequest::VT_WITHCOMMENT, static_cast(withComment), 0); - } - void add_withGameInfo(bool withGameInfo) { - fbb_.AddElement(GetScoreNpIdRequest::VT_WITHGAMEINFO, static_cast(withGameInfo), 0); - } - explicit GetScoreNpIdRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetScoreNpIdRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t boardId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> npids = 0, - bool withComment = false, - bool withGameInfo = false) { - GetScoreNpIdRequestBuilder builder_(_fbb); - builder_.add_npids(npids); - builder_.add_boardId(boardId); - builder_.add_withGameInfo(withGameInfo); - builder_.add_withComment(withComment); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateGetScoreNpIdRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t boardId = 0, - const std::vector<::flatbuffers::Offset> *npids = nullptr, - bool withComment = false, - bool withGameInfo = false) { - auto npids__ = npids ? _fbb.CreateVector<::flatbuffers::Offset>(*npids) : 0; - return CreateGetScoreNpIdRequest( - _fbb, - boardId, - npids__, - withComment, - withGameInfo); -} - -struct GetScoreFriendsRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetScoreFriendsRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BOARDID = 4, - VT_INCLUDE_SELF = 6, - VT_MAX = 8, - VT_WITHCOMMENT = 10, - VT_WITHGAMEINFO = 12 - }; - uint32_t boardId() const { - return GetField(VT_BOARDID, 0); - } - bool include_self() const { - return GetField(VT_INCLUDE_SELF, 0) != 0; - } - uint32_t max() const { - return GetField(VT_MAX, 0); - } - bool withComment() const { - return GetField(VT_WITHCOMMENT, 0) != 0; - } - bool withGameInfo() const { - return GetField(VT_WITHGAMEINFO, 0) != 0; - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BOARDID, 4) && - VerifyField(verifier, VT_INCLUDE_SELF, 1) && - VerifyField(verifier, VT_MAX, 4) && - VerifyField(verifier, VT_WITHCOMMENT, 1) && - VerifyField(verifier, VT_WITHGAMEINFO, 1) && - verifier.EndTable(); - } -}; - -struct GetScoreFriendsRequestBuilder { - typedef GetScoreFriendsRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_boardId(uint32_t boardId) { - fbb_.AddElement(GetScoreFriendsRequest::VT_BOARDID, boardId, 0); - } - void add_include_self(bool include_self) { - fbb_.AddElement(GetScoreFriendsRequest::VT_INCLUDE_SELF, static_cast(include_self), 0); - } - void add_max(uint32_t max) { - fbb_.AddElement(GetScoreFriendsRequest::VT_MAX, max, 0); - } - void add_withComment(bool withComment) { - fbb_.AddElement(GetScoreFriendsRequest::VT_WITHCOMMENT, static_cast(withComment), 0); - } - void add_withGameInfo(bool withGameInfo) { - fbb_.AddElement(GetScoreFriendsRequest::VT_WITHGAMEINFO, static_cast(withGameInfo), 0); - } - explicit GetScoreFriendsRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetScoreFriendsRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t boardId = 0, - bool include_self = false, - uint32_t max = 0, - bool withComment = false, - bool withGameInfo = false) { - GetScoreFriendsRequestBuilder builder_(_fbb); - builder_.add_max(max); - builder_.add_boardId(boardId); - builder_.add_withGameInfo(withGameInfo); - builder_.add_withComment(withComment); - builder_.add_include_self(include_self); - return builder_.Finish(); -} - -struct ScoreRankData FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef ScoreRankDataBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NPID = 4, - VT_ONLINENAME = 6, - VT_PCID = 8, - VT_RANK = 10, - VT_SCORE = 12, - VT_HASGAMEDATA = 14, - VT_RECORDDATE = 16 - }; - const ::flatbuffers::String *npId() const { - return GetPointer(VT_NPID); - } - const ::flatbuffers::String *onlineName() const { - return GetPointer(VT_ONLINENAME); - } - int32_t pcId() const { - return GetField(VT_PCID, 0); - } - uint32_t rank() const { - return GetField(VT_RANK, 0); - } - int64_t score() const { - return GetField(VT_SCORE, 0); - } - bool hasGameData() const { - return GetField(VT_HASGAMEDATA, 0) != 0; - } - uint64_t recordDate() const { - return GetField(VT_RECORDDATE, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_NPID) && - verifier.VerifyString(npId()) && - VerifyOffset(verifier, VT_ONLINENAME) && - verifier.VerifyString(onlineName()) && - VerifyField(verifier, VT_PCID, 4) && - VerifyField(verifier, VT_RANK, 4) && - VerifyField(verifier, VT_SCORE, 8) && - VerifyField(verifier, VT_HASGAMEDATA, 1) && - VerifyField(verifier, VT_RECORDDATE, 8) && - verifier.EndTable(); - } -}; - -struct ScoreRankDataBuilder { - typedef ScoreRankData Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_npId(::flatbuffers::Offset<::flatbuffers::String> npId) { - fbb_.AddOffset(ScoreRankData::VT_NPID, npId); - } - void add_onlineName(::flatbuffers::Offset<::flatbuffers::String> onlineName) { - fbb_.AddOffset(ScoreRankData::VT_ONLINENAME, onlineName); - } - void add_pcId(int32_t pcId) { - fbb_.AddElement(ScoreRankData::VT_PCID, pcId, 0); - } - void add_rank(uint32_t rank) { - fbb_.AddElement(ScoreRankData::VT_RANK, rank, 0); - } - void add_score(int64_t score) { - fbb_.AddElement(ScoreRankData::VT_SCORE, score, 0); - } - void add_hasGameData(bool hasGameData) { - fbb_.AddElement(ScoreRankData::VT_HASGAMEDATA, static_cast(hasGameData), 0); - } - void add_recordDate(uint64_t recordDate) { - fbb_.AddElement(ScoreRankData::VT_RECORDDATE, recordDate, 0); - } - explicit ScoreRankDataBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateScoreRankData( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::String> npId = 0, - ::flatbuffers::Offset<::flatbuffers::String> onlineName = 0, - int32_t pcId = 0, - uint32_t rank = 0, - int64_t score = 0, - bool hasGameData = false, - uint64_t recordDate = 0) { - ScoreRankDataBuilder builder_(_fbb); - builder_.add_recordDate(recordDate); - builder_.add_score(score); - builder_.add_rank(rank); - builder_.add_pcId(pcId); - builder_.add_onlineName(onlineName); - builder_.add_npId(npId); - builder_.add_hasGameData(hasGameData); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateScoreRankDataDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const char *npId = nullptr, - const char *onlineName = nullptr, - int32_t pcId = 0, - uint32_t rank = 0, - int64_t score = 0, - bool hasGameData = false, - uint64_t recordDate = 0) { - auto npId__ = npId ? _fbb.CreateString(npId) : 0; - auto onlineName__ = onlineName ? _fbb.CreateString(onlineName) : 0; - return CreateScoreRankData( - _fbb, - npId__, - onlineName__, - pcId, - rank, - score, - hasGameData, - recordDate); -} - -struct ScoreInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef ScoreInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_DATA = 4 - }; - const ::flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - verifier.EndTable(); - } -}; - -struct ScoreInfoBuilder { - typedef ScoreInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_data(::flatbuffers::Offset<::flatbuffers::Vector> data) { - fbb_.AddOffset(ScoreInfo::VT_DATA, data); - } - explicit ScoreInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateScoreInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> data = 0) { - ScoreInfoBuilder builder_(_fbb); - builder_.add_data(data); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateScoreInfoDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *data = nullptr) { - auto data__ = data ? _fbb.CreateVector(*data) : 0; - return CreateScoreInfo( - _fbb, - data__); -} - -struct GetScoreResponse FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetScoreResponseBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_RANKARRAY = 4, - VT_COMMENTARRAY = 6, - VT_INFOARRAY = 8, - VT_LASTSORTDATE = 10, - VT_TOTALRECORD = 12 - }; - const ::flatbuffers::Vector<::flatbuffers::Offset> *rankArray() const { - return GetPointer> *>(VT_RANKARRAY); - } - const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *commentArray() const { - return GetPointer> *>(VT_COMMENTARRAY); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *infoArray() const { - return GetPointer> *>(VT_INFOARRAY); - } - uint64_t lastSortDate() const { - return GetField(VT_LASTSORTDATE, 0); - } - uint32_t totalRecord() const { - return GetField(VT_TOTALRECORD, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_RANKARRAY) && - verifier.VerifyVector(rankArray()) && - verifier.VerifyVectorOfTables(rankArray()) && - VerifyOffset(verifier, VT_COMMENTARRAY) && - verifier.VerifyVector(commentArray()) && - verifier.VerifyVectorOfStrings(commentArray()) && - VerifyOffset(verifier, VT_INFOARRAY) && - verifier.VerifyVector(infoArray()) && - verifier.VerifyVectorOfTables(infoArray()) && - VerifyField(verifier, VT_LASTSORTDATE, 8) && - VerifyField(verifier, VT_TOTALRECORD, 4) && - verifier.EndTable(); - } -}; - -struct GetScoreResponseBuilder { - typedef GetScoreResponse Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_rankArray(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> rankArray) { - fbb_.AddOffset(GetScoreResponse::VT_RANKARRAY, rankArray); - } - void add_commentArray(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> commentArray) { - fbb_.AddOffset(GetScoreResponse::VT_COMMENTARRAY, commentArray); - } - void add_infoArray(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> infoArray) { - fbb_.AddOffset(GetScoreResponse::VT_INFOARRAY, infoArray); - } - void add_lastSortDate(uint64_t lastSortDate) { - fbb_.AddElement(GetScoreResponse::VT_LASTSORTDATE, lastSortDate, 0); - } - void add_totalRecord(uint32_t totalRecord) { - fbb_.AddElement(GetScoreResponse::VT_TOTALRECORD, totalRecord, 0); - } - explicit GetScoreResponseBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetScoreResponse( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> rankArray = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> commentArray = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> infoArray = 0, - uint64_t lastSortDate = 0, - uint32_t totalRecord = 0) { - GetScoreResponseBuilder builder_(_fbb); - builder_.add_lastSortDate(lastSortDate); - builder_.add_totalRecord(totalRecord); - builder_.add_infoArray(infoArray); - builder_.add_commentArray(commentArray); - builder_.add_rankArray(rankArray); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateGetScoreResponseDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector<::flatbuffers::Offset> *rankArray = nullptr, - const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *commentArray = nullptr, - const std::vector<::flatbuffers::Offset> *infoArray = nullptr, - uint64_t lastSortDate = 0, - uint32_t totalRecord = 0) { - auto rankArray__ = rankArray ? _fbb.CreateVector<::flatbuffers::Offset>(*rankArray) : 0; - auto commentArray__ = commentArray ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*commentArray) : 0; - auto infoArray__ = infoArray ? _fbb.CreateVector<::flatbuffers::Offset>(*infoArray) : 0; - return CreateGetScoreResponse( - _fbb, - rankArray__, - commentArray__, - infoArray__, - lastSortDate, - totalRecord); -} - -struct RecordScoreGameDataRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef RecordScoreGameDataRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BOARDID = 4, - VT_PCID = 6, - VT_SCORE = 8 - }; - uint32_t boardId() const { - return GetField(VT_BOARDID, 0); - } - int32_t pcId() const { - return GetField(VT_PCID, 0); - } - int64_t score() const { - return GetField(VT_SCORE, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BOARDID, 4) && - VerifyField(verifier, VT_PCID, 4) && - VerifyField(verifier, VT_SCORE, 8) && - verifier.EndTable(); - } -}; - -struct RecordScoreGameDataRequestBuilder { - typedef RecordScoreGameDataRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_boardId(uint32_t boardId) { - fbb_.AddElement(RecordScoreGameDataRequest::VT_BOARDID, boardId, 0); - } - void add_pcId(int32_t pcId) { - fbb_.AddElement(RecordScoreGameDataRequest::VT_PCID, pcId, 0); - } - void add_score(int64_t score) { - fbb_.AddElement(RecordScoreGameDataRequest::VT_SCORE, score, 0); - } - explicit RecordScoreGameDataRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateRecordScoreGameDataRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t boardId = 0, - int32_t pcId = 0, - int64_t score = 0) { - RecordScoreGameDataRequestBuilder builder_(_fbb); - builder_.add_score(score); - builder_.add_pcId(pcId); - builder_.add_boardId(boardId); - return builder_.Finish(); -} - -struct GetScoreGameDataRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetScoreGameDataRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BOARDID = 4, - VT_NPID = 6, - VT_PCID = 8 - }; - uint32_t boardId() const { - return GetField(VT_BOARDID, 0); - } - const ::flatbuffers::String *npId() const { - return GetPointer(VT_NPID); - } - int32_t pcId() const { - return GetField(VT_PCID, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BOARDID, 4) && - VerifyOffset(verifier, VT_NPID) && - verifier.VerifyString(npId()) && - VerifyField(verifier, VT_PCID, 4) && - verifier.EndTable(); - } -}; - -struct GetScoreGameDataRequestBuilder { - typedef GetScoreGameDataRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_boardId(uint32_t boardId) { - fbb_.AddElement(GetScoreGameDataRequest::VT_BOARDID, boardId, 0); - } - void add_npId(::flatbuffers::Offset<::flatbuffers::String> npId) { - fbb_.AddOffset(GetScoreGameDataRequest::VT_NPID, npId); - } - void add_pcId(int32_t pcId) { - fbb_.AddElement(GetScoreGameDataRequest::VT_PCID, pcId, 0); - } - explicit GetScoreGameDataRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetScoreGameDataRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t boardId = 0, - ::flatbuffers::Offset<::flatbuffers::String> npId = 0, - int32_t pcId = 0) { - GetScoreGameDataRequestBuilder builder_(_fbb); - builder_.add_pcId(pcId); - builder_.add_npId(npId); - builder_.add_boardId(boardId); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateGetScoreGameDataRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t boardId = 0, - const char *npId = nullptr, - int32_t pcId = 0) { - auto npId__ = npId ? _fbb.CreateString(npId) : 0; - return CreateGetScoreGameDataRequest( - _fbb, - boardId, - npId__, - pcId); -} - -struct TusUser FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusUserBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_VUSER = 4, - VT_NPID = 6 - }; - bool vuser() const { - return GetField(VT_VUSER, 0) != 0; - } - const ::flatbuffers::String *npid() const { - return GetPointer(VT_NPID); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_VUSER, 1) && - VerifyOffset(verifier, VT_NPID) && - verifier.VerifyString(npid()) && - verifier.EndTable(); - } -}; - -struct TusUserBuilder { - typedef TusUser Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_vuser(bool vuser) { - fbb_.AddElement(TusUser::VT_VUSER, static_cast(vuser), 0); - } - void add_npid(::flatbuffers::Offset<::flatbuffers::String> npid) { - fbb_.AddOffset(TusUser::VT_NPID, npid); - } - explicit TusUserBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusUser( - ::flatbuffers::FlatBufferBuilder &_fbb, - bool vuser = false, - ::flatbuffers::Offset<::flatbuffers::String> npid = 0) { - TusUserBuilder builder_(_fbb); - builder_.add_npid(npid); - builder_.add_vuser(vuser); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusUserDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - bool vuser = false, - const char *npid = nullptr) { - auto npid__ = npid ? _fbb.CreateString(npid) : 0; - return CreateTusUser( - _fbb, - vuser, - npid__); -} - -struct TusVariable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusVariableBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_OWNERID = 4, - VT_HASDATA = 6, - VT_LASTCHANGEDDATE = 8, - VT_LASTCHANGEDAUTHORID = 10, - VT_VARIABLE = 12, - VT_OLDVARIABLE = 14 - }; - const ::flatbuffers::String *ownerId() const { - return GetPointer(VT_OWNERID); - } - bool hasData() const { - return GetField(VT_HASDATA, 0) != 0; - } - uint64_t lastChangedDate() const { - return GetField(VT_LASTCHANGEDDATE, 0); - } - const ::flatbuffers::String *lastChangedAuthorId() const { - return GetPointer(VT_LASTCHANGEDAUTHORID); - } - int64_t variable() const { - return GetField(VT_VARIABLE, 0); - } - int64_t oldVariable() const { - return GetField(VT_OLDVARIABLE, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_OWNERID) && - verifier.VerifyString(ownerId()) && - VerifyField(verifier, VT_HASDATA, 1) && - VerifyField(verifier, VT_LASTCHANGEDDATE, 8) && - VerifyOffset(verifier, VT_LASTCHANGEDAUTHORID) && - verifier.VerifyString(lastChangedAuthorId()) && - VerifyField(verifier, VT_VARIABLE, 8) && - VerifyField(verifier, VT_OLDVARIABLE, 8) && - verifier.EndTable(); - } -}; - -struct TusVariableBuilder { - typedef TusVariable Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_ownerId(::flatbuffers::Offset<::flatbuffers::String> ownerId) { - fbb_.AddOffset(TusVariable::VT_OWNERID, ownerId); - } - void add_hasData(bool hasData) { - fbb_.AddElement(TusVariable::VT_HASDATA, static_cast(hasData), 0); - } - void add_lastChangedDate(uint64_t lastChangedDate) { - fbb_.AddElement(TusVariable::VT_LASTCHANGEDDATE, lastChangedDate, 0); - } - void add_lastChangedAuthorId(::flatbuffers::Offset<::flatbuffers::String> lastChangedAuthorId) { - fbb_.AddOffset(TusVariable::VT_LASTCHANGEDAUTHORID, lastChangedAuthorId); - } - void add_variable(int64_t variable) { - fbb_.AddElement(TusVariable::VT_VARIABLE, variable, 0); - } - void add_oldVariable(int64_t oldVariable) { - fbb_.AddElement(TusVariable::VT_OLDVARIABLE, oldVariable, 0); - } - explicit TusVariableBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusVariable( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::String> ownerId = 0, - bool hasData = false, - uint64_t lastChangedDate = 0, - ::flatbuffers::Offset<::flatbuffers::String> lastChangedAuthorId = 0, - int64_t variable = 0, - int64_t oldVariable = 0) { - TusVariableBuilder builder_(_fbb); - builder_.add_oldVariable(oldVariable); - builder_.add_variable(variable); - builder_.add_lastChangedDate(lastChangedDate); - builder_.add_lastChangedAuthorId(lastChangedAuthorId); - builder_.add_ownerId(ownerId); - builder_.add_hasData(hasData); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusVariableDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const char *ownerId = nullptr, - bool hasData = false, - uint64_t lastChangedDate = 0, - const char *lastChangedAuthorId = nullptr, - int64_t variable = 0, - int64_t oldVariable = 0) { - auto ownerId__ = ownerId ? _fbb.CreateString(ownerId) : 0; - auto lastChangedAuthorId__ = lastChangedAuthorId ? _fbb.CreateString(lastChangedAuthorId) : 0; - return CreateTusVariable( - _fbb, - ownerId__, - hasData, - lastChangedDate, - lastChangedAuthorId__, - variable, - oldVariable); -} - -struct TusVarResponse FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusVarResponseBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_VARS = 4 - }; - const ::flatbuffers::Vector<::flatbuffers::Offset> *vars() const { - return GetPointer> *>(VT_VARS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_VARS) && - verifier.VerifyVector(vars()) && - verifier.VerifyVectorOfTables(vars()) && - verifier.EndTable(); - } -}; - -struct TusVarResponseBuilder { - typedef TusVarResponse Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_vars(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> vars) { - fbb_.AddOffset(TusVarResponse::VT_VARS, vars); - } - explicit TusVarResponseBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusVarResponse( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> vars = 0) { - TusVarResponseBuilder builder_(_fbb); - builder_.add_vars(vars); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusVarResponseDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector<::flatbuffers::Offset> *vars = nullptr) { - auto vars__ = vars ? _fbb.CreateVector<::flatbuffers::Offset>(*vars) : 0; - return CreateTusVarResponse( - _fbb, - vars__); -} - -struct TusSetMultiSlotVariableRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusSetMultiSlotVariableRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USER = 4, - VT_SLOTIDARRAY = 6, - VT_VARIABLEARRAY = 8 - }; - const TusUser *user() const { - return GetPointer(VT_USER); - } - const ::flatbuffers::Vector *slotIdArray() const { - return GetPointer *>(VT_SLOTIDARRAY); - } - const ::flatbuffers::Vector *variableArray() const { - return GetPointer *>(VT_VARIABLEARRAY); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USER) && - verifier.VerifyTable(user()) && - VerifyOffset(verifier, VT_SLOTIDARRAY) && - verifier.VerifyVector(slotIdArray()) && - VerifyOffset(verifier, VT_VARIABLEARRAY) && - verifier.VerifyVector(variableArray()) && - verifier.EndTable(); - } -}; - -struct TusSetMultiSlotVariableRequestBuilder { - typedef TusSetMultiSlotVariableRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_user(::flatbuffers::Offset user) { - fbb_.AddOffset(TusSetMultiSlotVariableRequest::VT_USER, user); - } - void add_slotIdArray(::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray) { - fbb_.AddOffset(TusSetMultiSlotVariableRequest::VT_SLOTIDARRAY, slotIdArray); - } - void add_variableArray(::flatbuffers::Offset<::flatbuffers::Vector> variableArray) { - fbb_.AddOffset(TusSetMultiSlotVariableRequest::VT_VARIABLEARRAY, variableArray); - } - explicit TusSetMultiSlotVariableRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusSetMultiSlotVariableRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> variableArray = 0) { - TusSetMultiSlotVariableRequestBuilder builder_(_fbb); - builder_.add_variableArray(variableArray); - builder_.add_slotIdArray(slotIdArray); - builder_.add_user(user); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusSetMultiSlotVariableRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - const std::vector *slotIdArray = nullptr, - const std::vector *variableArray = nullptr) { - auto slotIdArray__ = slotIdArray ? _fbb.CreateVector(*slotIdArray) : 0; - auto variableArray__ = variableArray ? _fbb.CreateVector(*variableArray) : 0; - return CreateTusSetMultiSlotVariableRequest( - _fbb, - user, - slotIdArray__, - variableArray__); -} - -struct TusGetMultiSlotVariableRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusGetMultiSlotVariableRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USER = 4, - VT_SLOTIDARRAY = 6 - }; - const TusUser *user() const { - return GetPointer(VT_USER); - } - const ::flatbuffers::Vector *slotIdArray() const { - return GetPointer *>(VT_SLOTIDARRAY); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USER) && - verifier.VerifyTable(user()) && - VerifyOffset(verifier, VT_SLOTIDARRAY) && - verifier.VerifyVector(slotIdArray()) && - verifier.EndTable(); - } -}; - -struct TusGetMultiSlotVariableRequestBuilder { - typedef TusGetMultiSlotVariableRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_user(::flatbuffers::Offset user) { - fbb_.AddOffset(TusGetMultiSlotVariableRequest::VT_USER, user); - } - void add_slotIdArray(::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray) { - fbb_.AddOffset(TusGetMultiSlotVariableRequest::VT_SLOTIDARRAY, slotIdArray); - } - explicit TusGetMultiSlotVariableRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusGetMultiSlotVariableRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray = 0) { - TusGetMultiSlotVariableRequestBuilder builder_(_fbb); - builder_.add_slotIdArray(slotIdArray); - builder_.add_user(user); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusGetMultiSlotVariableRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - const std::vector *slotIdArray = nullptr) { - auto slotIdArray__ = slotIdArray ? _fbb.CreateVector(*slotIdArray) : 0; - return CreateTusGetMultiSlotVariableRequest( - _fbb, - user, - slotIdArray__); -} - -struct TusGetMultiUserVariableRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusGetMultiUserVariableRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USERS = 4, - VT_SLOTID = 6 - }; - const ::flatbuffers::Vector<::flatbuffers::Offset> *users() const { - return GetPointer> *>(VT_USERS); - } - int32_t slotId() const { - return GetField(VT_SLOTID, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USERS) && - verifier.VerifyVector(users()) && - verifier.VerifyVectorOfTables(users()) && - VerifyField(verifier, VT_SLOTID, 4) && - verifier.EndTable(); - } -}; - -struct TusGetMultiUserVariableRequestBuilder { - typedef TusGetMultiUserVariableRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_users(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> users) { - fbb_.AddOffset(TusGetMultiUserVariableRequest::VT_USERS, users); - } - void add_slotId(int32_t slotId) { - fbb_.AddElement(TusGetMultiUserVariableRequest::VT_SLOTID, slotId, 0); - } - explicit TusGetMultiUserVariableRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusGetMultiUserVariableRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> users = 0, - int32_t slotId = 0) { - TusGetMultiUserVariableRequestBuilder builder_(_fbb); - builder_.add_slotId(slotId); - builder_.add_users(users); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusGetMultiUserVariableRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector<::flatbuffers::Offset> *users = nullptr, - int32_t slotId = 0) { - auto users__ = users ? _fbb.CreateVector<::flatbuffers::Offset>(*users) : 0; - return CreateTusGetMultiUserVariableRequest( - _fbb, - users__, - slotId); -} - -struct TusGetFriendsVariableRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusGetFriendsVariableRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SLOTID = 4, - VT_INCLUDESELF = 6, - VT_SORTTYPE = 8, - VT_ARRAYNUM = 10 - }; - int32_t slotId() const { - return GetField(VT_SLOTID, 0); - } - bool includeSelf() const { - return GetField(VT_INCLUDESELF, 0) != 0; - } - int32_t sortType() const { - return GetField(VT_SORTTYPE, 0); - } - uint32_t arrayNum() const { - return GetField(VT_ARRAYNUM, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SLOTID, 4) && - VerifyField(verifier, VT_INCLUDESELF, 1) && - VerifyField(verifier, VT_SORTTYPE, 4) && - VerifyField(verifier, VT_ARRAYNUM, 4) && - verifier.EndTable(); - } -}; - -struct TusGetFriendsVariableRequestBuilder { - typedef TusGetFriendsVariableRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_slotId(int32_t slotId) { - fbb_.AddElement(TusGetFriendsVariableRequest::VT_SLOTID, slotId, 0); - } - void add_includeSelf(bool includeSelf) { - fbb_.AddElement(TusGetFriendsVariableRequest::VT_INCLUDESELF, static_cast(includeSelf), 0); - } - void add_sortType(int32_t sortType) { - fbb_.AddElement(TusGetFriendsVariableRequest::VT_SORTTYPE, sortType, 0); - } - void add_arrayNum(uint32_t arrayNum) { - fbb_.AddElement(TusGetFriendsVariableRequest::VT_ARRAYNUM, arrayNum, 0); - } - explicit TusGetFriendsVariableRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusGetFriendsVariableRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - int32_t slotId = 0, - bool includeSelf = false, - int32_t sortType = 0, - uint32_t arrayNum = 0) { - TusGetFriendsVariableRequestBuilder builder_(_fbb); - builder_.add_arrayNum(arrayNum); - builder_.add_sortType(sortType); - builder_.add_slotId(slotId); - builder_.add_includeSelf(includeSelf); - return builder_.Finish(); -} - -struct TusAddAndGetVariableRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusAddAndGetVariableRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USER = 4, - VT_SLOTID = 6, - VT_INVARIABLE = 8, - VT_ISLASTCHANGEDDATE = 10, - VT_ISLASTCHANGEDAUTHORID = 12 - }; - const TusUser *user() const { - return GetPointer(VT_USER); - } - int32_t slotId() const { - return GetField(VT_SLOTID, 0); - } - int64_t inVariable() const { - return GetField(VT_INVARIABLE, 0); - } - const ::flatbuffers::Vector *isLastChangedDate() const { - return GetPointer *>(VT_ISLASTCHANGEDDATE); - } - const ::flatbuffers::String *isLastChangedAuthorId() const { - return GetPointer(VT_ISLASTCHANGEDAUTHORID); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USER) && - verifier.VerifyTable(user()) && - VerifyField(verifier, VT_SLOTID, 4) && - VerifyField(verifier, VT_INVARIABLE, 8) && - VerifyOffset(verifier, VT_ISLASTCHANGEDDATE) && - verifier.VerifyVector(isLastChangedDate()) && - VerifyOffset(verifier, VT_ISLASTCHANGEDAUTHORID) && - verifier.VerifyString(isLastChangedAuthorId()) && - verifier.EndTable(); - } -}; - -struct TusAddAndGetVariableRequestBuilder { - typedef TusAddAndGetVariableRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_user(::flatbuffers::Offset user) { - fbb_.AddOffset(TusAddAndGetVariableRequest::VT_USER, user); - } - void add_slotId(int32_t slotId) { - fbb_.AddElement(TusAddAndGetVariableRequest::VT_SLOTID, slotId, 0); - } - void add_inVariable(int64_t inVariable) { - fbb_.AddElement(TusAddAndGetVariableRequest::VT_INVARIABLE, inVariable, 0); - } - void add_isLastChangedDate(::flatbuffers::Offset<::flatbuffers::Vector> isLastChangedDate) { - fbb_.AddOffset(TusAddAndGetVariableRequest::VT_ISLASTCHANGEDDATE, isLastChangedDate); - } - void add_isLastChangedAuthorId(::flatbuffers::Offset<::flatbuffers::String> isLastChangedAuthorId) { - fbb_.AddOffset(TusAddAndGetVariableRequest::VT_ISLASTCHANGEDAUTHORID, isLastChangedAuthorId); - } - explicit TusAddAndGetVariableRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusAddAndGetVariableRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - int32_t slotId = 0, - int64_t inVariable = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> isLastChangedDate = 0, - ::flatbuffers::Offset<::flatbuffers::String> isLastChangedAuthorId = 0) { - TusAddAndGetVariableRequestBuilder builder_(_fbb); - builder_.add_inVariable(inVariable); - builder_.add_isLastChangedAuthorId(isLastChangedAuthorId); - builder_.add_isLastChangedDate(isLastChangedDate); - builder_.add_slotId(slotId); - builder_.add_user(user); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusAddAndGetVariableRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - int32_t slotId = 0, - int64_t inVariable = 0, - const std::vector *isLastChangedDate = nullptr, - const char *isLastChangedAuthorId = nullptr) { - auto isLastChangedDate__ = isLastChangedDate ? _fbb.CreateVector(*isLastChangedDate) : 0; - auto isLastChangedAuthorId__ = isLastChangedAuthorId ? _fbb.CreateString(isLastChangedAuthorId) : 0; - return CreateTusAddAndGetVariableRequest( - _fbb, - user, - slotId, - inVariable, - isLastChangedDate__, - isLastChangedAuthorId__); -} - -struct TusTryAndSetVariableRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusTryAndSetVariableRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USER = 4, - VT_SLOTID = 6, - VT_OPETYPE = 8, - VT_VARIABLE = 10, - VT_ISLASTCHANGEDDATE = 12, - VT_ISLASTCHANGEDAUTHORID = 14, - VT_COMPAREVALUE = 16 - }; - const TusUser *user() const { - return GetPointer(VT_USER); - } - int32_t slotId() const { - return GetField(VT_SLOTID, 0); - } - int32_t opeType() const { - return GetField(VT_OPETYPE, 0); - } - int64_t variable() const { - return GetField(VT_VARIABLE, 0); - } - const ::flatbuffers::Vector *isLastChangedDate() const { - return GetPointer *>(VT_ISLASTCHANGEDDATE); - } - const ::flatbuffers::String *isLastChangedAuthorId() const { - return GetPointer(VT_ISLASTCHANGEDAUTHORID); - } - const ::flatbuffers::Vector *compareValue() const { - return GetPointer *>(VT_COMPAREVALUE); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USER) && - verifier.VerifyTable(user()) && - VerifyField(verifier, VT_SLOTID, 4) && - VerifyField(verifier, VT_OPETYPE, 4) && - VerifyField(verifier, VT_VARIABLE, 8) && - VerifyOffset(verifier, VT_ISLASTCHANGEDDATE) && - verifier.VerifyVector(isLastChangedDate()) && - VerifyOffset(verifier, VT_ISLASTCHANGEDAUTHORID) && - verifier.VerifyString(isLastChangedAuthorId()) && - VerifyOffset(verifier, VT_COMPAREVALUE) && - verifier.VerifyVector(compareValue()) && - verifier.EndTable(); - } -}; - -struct TusTryAndSetVariableRequestBuilder { - typedef TusTryAndSetVariableRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_user(::flatbuffers::Offset user) { - fbb_.AddOffset(TusTryAndSetVariableRequest::VT_USER, user); - } - void add_slotId(int32_t slotId) { - fbb_.AddElement(TusTryAndSetVariableRequest::VT_SLOTID, slotId, 0); - } - void add_opeType(int32_t opeType) { - fbb_.AddElement(TusTryAndSetVariableRequest::VT_OPETYPE, opeType, 0); - } - void add_variable(int64_t variable) { - fbb_.AddElement(TusTryAndSetVariableRequest::VT_VARIABLE, variable, 0); - } - void add_isLastChangedDate(::flatbuffers::Offset<::flatbuffers::Vector> isLastChangedDate) { - fbb_.AddOffset(TusTryAndSetVariableRequest::VT_ISLASTCHANGEDDATE, isLastChangedDate); - } - void add_isLastChangedAuthorId(::flatbuffers::Offset<::flatbuffers::String> isLastChangedAuthorId) { - fbb_.AddOffset(TusTryAndSetVariableRequest::VT_ISLASTCHANGEDAUTHORID, isLastChangedAuthorId); - } - void add_compareValue(::flatbuffers::Offset<::flatbuffers::Vector> compareValue) { - fbb_.AddOffset(TusTryAndSetVariableRequest::VT_COMPAREVALUE, compareValue); - } - explicit TusTryAndSetVariableRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusTryAndSetVariableRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - int32_t slotId = 0, - int32_t opeType = 0, - int64_t variable = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> isLastChangedDate = 0, - ::flatbuffers::Offset<::flatbuffers::String> isLastChangedAuthorId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> compareValue = 0) { - TusTryAndSetVariableRequestBuilder builder_(_fbb); - builder_.add_variable(variable); - builder_.add_compareValue(compareValue); - builder_.add_isLastChangedAuthorId(isLastChangedAuthorId); - builder_.add_isLastChangedDate(isLastChangedDate); - builder_.add_opeType(opeType); - builder_.add_slotId(slotId); - builder_.add_user(user); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusTryAndSetVariableRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - int32_t slotId = 0, - int32_t opeType = 0, - int64_t variable = 0, - const std::vector *isLastChangedDate = nullptr, - const char *isLastChangedAuthorId = nullptr, - const std::vector *compareValue = nullptr) { - auto isLastChangedDate__ = isLastChangedDate ? _fbb.CreateVector(*isLastChangedDate) : 0; - auto isLastChangedAuthorId__ = isLastChangedAuthorId ? _fbb.CreateString(isLastChangedAuthorId) : 0; - auto compareValue__ = compareValue ? _fbb.CreateVector(*compareValue) : 0; - return CreateTusTryAndSetVariableRequest( - _fbb, - user, - slotId, - opeType, - variable, - isLastChangedDate__, - isLastChangedAuthorId__, - compareValue__); -} - -struct TusDeleteMultiSlotVariableRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusDeleteMultiSlotVariableRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USER = 4, - VT_SLOTIDARRAY = 6 - }; - const TusUser *user() const { - return GetPointer(VT_USER); - } - const ::flatbuffers::Vector *slotIdArray() const { - return GetPointer *>(VT_SLOTIDARRAY); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USER) && - verifier.VerifyTable(user()) && - VerifyOffset(verifier, VT_SLOTIDARRAY) && - verifier.VerifyVector(slotIdArray()) && - verifier.EndTable(); - } -}; - -struct TusDeleteMultiSlotVariableRequestBuilder { - typedef TusDeleteMultiSlotVariableRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_user(::flatbuffers::Offset user) { - fbb_.AddOffset(TusDeleteMultiSlotVariableRequest::VT_USER, user); - } - void add_slotIdArray(::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray) { - fbb_.AddOffset(TusDeleteMultiSlotVariableRequest::VT_SLOTIDARRAY, slotIdArray); - } - explicit TusDeleteMultiSlotVariableRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusDeleteMultiSlotVariableRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray = 0) { - TusDeleteMultiSlotVariableRequestBuilder builder_(_fbb); - builder_.add_slotIdArray(slotIdArray); - builder_.add_user(user); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusDeleteMultiSlotVariableRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - const std::vector *slotIdArray = nullptr) { - auto slotIdArray__ = slotIdArray ? _fbb.CreateVector(*slotIdArray) : 0; - return CreateTusDeleteMultiSlotVariableRequest( - _fbb, - user, - slotIdArray__); -} - -struct TusSetDataRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusSetDataRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USER = 4, - VT_SLOTID = 6, - VT_DATA = 8, - VT_INFO = 10, - VT_ISLASTCHANGEDDATE = 12, - VT_ISLASTCHANGEDAUTHORID = 14 - }; - const TusUser *user() const { - return GetPointer(VT_USER); - } - int32_t slotId() const { - return GetField(VT_SLOTID, 0); - } - const ::flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - const ::flatbuffers::Vector *info() const { - return GetPointer *>(VT_INFO); - } - const ::flatbuffers::Vector *isLastChangedDate() const { - return GetPointer *>(VT_ISLASTCHANGEDDATE); - } - const ::flatbuffers::String *isLastChangedAuthorId() const { - return GetPointer(VT_ISLASTCHANGEDAUTHORID); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USER) && - verifier.VerifyTable(user()) && - VerifyField(verifier, VT_SLOTID, 4) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - VerifyOffset(verifier, VT_INFO) && - verifier.VerifyVector(info()) && - VerifyOffset(verifier, VT_ISLASTCHANGEDDATE) && - verifier.VerifyVector(isLastChangedDate()) && - VerifyOffset(verifier, VT_ISLASTCHANGEDAUTHORID) && - verifier.VerifyString(isLastChangedAuthorId()) && - verifier.EndTable(); - } -}; - -struct TusSetDataRequestBuilder { - typedef TusSetDataRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_user(::flatbuffers::Offset user) { - fbb_.AddOffset(TusSetDataRequest::VT_USER, user); - } - void add_slotId(int32_t slotId) { - fbb_.AddElement(TusSetDataRequest::VT_SLOTID, slotId, 0); - } - void add_data(::flatbuffers::Offset<::flatbuffers::Vector> data) { - fbb_.AddOffset(TusSetDataRequest::VT_DATA, data); - } - void add_info(::flatbuffers::Offset<::flatbuffers::Vector> info) { - fbb_.AddOffset(TusSetDataRequest::VT_INFO, info); - } - void add_isLastChangedDate(::flatbuffers::Offset<::flatbuffers::Vector> isLastChangedDate) { - fbb_.AddOffset(TusSetDataRequest::VT_ISLASTCHANGEDDATE, isLastChangedDate); - } - void add_isLastChangedAuthorId(::flatbuffers::Offset<::flatbuffers::String> isLastChangedAuthorId) { - fbb_.AddOffset(TusSetDataRequest::VT_ISLASTCHANGEDAUTHORID, isLastChangedAuthorId); - } - explicit TusSetDataRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusSetDataRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - int32_t slotId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> data = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> info = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> isLastChangedDate = 0, - ::flatbuffers::Offset<::flatbuffers::String> isLastChangedAuthorId = 0) { - TusSetDataRequestBuilder builder_(_fbb); - builder_.add_isLastChangedAuthorId(isLastChangedAuthorId); - builder_.add_isLastChangedDate(isLastChangedDate); - builder_.add_info(info); - builder_.add_data(data); - builder_.add_slotId(slotId); - builder_.add_user(user); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusSetDataRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - int32_t slotId = 0, - const std::vector *data = nullptr, - const std::vector *info = nullptr, - const std::vector *isLastChangedDate = nullptr, - const char *isLastChangedAuthorId = nullptr) { - auto data__ = data ? _fbb.CreateVector(*data) : 0; - auto info__ = info ? _fbb.CreateVector(*info) : 0; - auto isLastChangedDate__ = isLastChangedDate ? _fbb.CreateVector(*isLastChangedDate) : 0; - auto isLastChangedAuthorId__ = isLastChangedAuthorId ? _fbb.CreateString(isLastChangedAuthorId) : 0; - return CreateTusSetDataRequest( - _fbb, - user, - slotId, - data__, - info__, - isLastChangedDate__, - isLastChangedAuthorId__); -} - -struct TusDataStatus FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusDataStatusBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_OWNERID = 4, - VT_HASDATA = 6, - VT_LASTCHANGEDDATE = 8, - VT_LASTCHANGEDAUTHORID = 10, - VT_INFO = 12 - }; - const ::flatbuffers::String *ownerId() const { - return GetPointer(VT_OWNERID); - } - bool hasData() const { - return GetField(VT_HASDATA, 0) != 0; - } - uint64_t lastChangedDate() const { - return GetField(VT_LASTCHANGEDDATE, 0); - } - const ::flatbuffers::String *lastChangedAuthorId() const { - return GetPointer(VT_LASTCHANGEDAUTHORID); - } - const ::flatbuffers::Vector *info() const { - return GetPointer *>(VT_INFO); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_OWNERID) && - verifier.VerifyString(ownerId()) && - VerifyField(verifier, VT_HASDATA, 1) && - VerifyField(verifier, VT_LASTCHANGEDDATE, 8) && - VerifyOffset(verifier, VT_LASTCHANGEDAUTHORID) && - verifier.VerifyString(lastChangedAuthorId()) && - VerifyOffset(verifier, VT_INFO) && - verifier.VerifyVector(info()) && - verifier.EndTable(); - } -}; - -struct TusDataStatusBuilder { - typedef TusDataStatus Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_ownerId(::flatbuffers::Offset<::flatbuffers::String> ownerId) { - fbb_.AddOffset(TusDataStatus::VT_OWNERID, ownerId); - } - void add_hasData(bool hasData) { - fbb_.AddElement(TusDataStatus::VT_HASDATA, static_cast(hasData), 0); - } - void add_lastChangedDate(uint64_t lastChangedDate) { - fbb_.AddElement(TusDataStatus::VT_LASTCHANGEDDATE, lastChangedDate, 0); - } - void add_lastChangedAuthorId(::flatbuffers::Offset<::flatbuffers::String> lastChangedAuthorId) { - fbb_.AddOffset(TusDataStatus::VT_LASTCHANGEDAUTHORID, lastChangedAuthorId); - } - void add_info(::flatbuffers::Offset<::flatbuffers::Vector> info) { - fbb_.AddOffset(TusDataStatus::VT_INFO, info); - } - explicit TusDataStatusBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusDataStatus( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::String> ownerId = 0, - bool hasData = false, - uint64_t lastChangedDate = 0, - ::flatbuffers::Offset<::flatbuffers::String> lastChangedAuthorId = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> info = 0) { - TusDataStatusBuilder builder_(_fbb); - builder_.add_lastChangedDate(lastChangedDate); - builder_.add_info(info); - builder_.add_lastChangedAuthorId(lastChangedAuthorId); - builder_.add_ownerId(ownerId); - builder_.add_hasData(hasData); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusDataStatusDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const char *ownerId = nullptr, - bool hasData = false, - uint64_t lastChangedDate = 0, - const char *lastChangedAuthorId = nullptr, - const std::vector *info = nullptr) { - auto ownerId__ = ownerId ? _fbb.CreateString(ownerId) : 0; - auto lastChangedAuthorId__ = lastChangedAuthorId ? _fbb.CreateString(lastChangedAuthorId) : 0; - auto info__ = info ? _fbb.CreateVector(*info) : 0; - return CreateTusDataStatus( - _fbb, - ownerId__, - hasData, - lastChangedDate, - lastChangedAuthorId__, - info__); -} - -struct TusData FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusDataBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_STATUS = 4, - VT_DATA = 6 - }; - const TusDataStatus *status() const { - return GetPointer(VT_STATUS); - } - const ::flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_STATUS) && - verifier.VerifyTable(status()) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - verifier.EndTable(); - } -}; - -struct TusDataBuilder { - typedef TusData Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_status(::flatbuffers::Offset status) { - fbb_.AddOffset(TusData::VT_STATUS, status); - } - void add_data(::flatbuffers::Offset<::flatbuffers::Vector> data) { - fbb_.AddOffset(TusData::VT_DATA, data); - } - explicit TusDataBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusData( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset status = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> data = 0) { - TusDataBuilder builder_(_fbb); - builder_.add_data(data); - builder_.add_status(status); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusDataDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset status = 0, - const std::vector *data = nullptr) { - auto data__ = data ? _fbb.CreateVector(*data) : 0; - return CreateTusData( - _fbb, - status, - data__); -} - -struct TusDataStatusResponse FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusDataStatusResponseBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_STATUS = 4 - }; - const ::flatbuffers::Vector<::flatbuffers::Offset> *status() const { - return GetPointer> *>(VT_STATUS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_STATUS) && - verifier.VerifyVector(status()) && - verifier.VerifyVectorOfTables(status()) && - verifier.EndTable(); - } -}; - -struct TusDataStatusResponseBuilder { - typedef TusDataStatusResponse Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_status(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> status) { - fbb_.AddOffset(TusDataStatusResponse::VT_STATUS, status); - } - explicit TusDataStatusResponseBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusDataStatusResponse( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> status = 0) { - TusDataStatusResponseBuilder builder_(_fbb); - builder_.add_status(status); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusDataStatusResponseDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector<::flatbuffers::Offset> *status = nullptr) { - auto status__ = status ? _fbb.CreateVector<::flatbuffers::Offset>(*status) : 0; - return CreateTusDataStatusResponse( - _fbb, - status__); -} - -struct TusGetDataRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusGetDataRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USER = 4, - VT_SLOTID = 6 - }; - const TusUser *user() const { - return GetPointer(VT_USER); - } - int32_t slotId() const { - return GetField(VT_SLOTID, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USER) && - verifier.VerifyTable(user()) && - VerifyField(verifier, VT_SLOTID, 4) && - verifier.EndTable(); - } -}; - -struct TusGetDataRequestBuilder { - typedef TusGetDataRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_user(::flatbuffers::Offset user) { - fbb_.AddOffset(TusGetDataRequest::VT_USER, user); - } - void add_slotId(int32_t slotId) { - fbb_.AddElement(TusGetDataRequest::VT_SLOTID, slotId, 0); - } - explicit TusGetDataRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusGetDataRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - int32_t slotId = 0) { - TusGetDataRequestBuilder builder_(_fbb); - builder_.add_slotId(slotId); - builder_.add_user(user); - return builder_.Finish(); -} - -struct TusGetMultiSlotDataStatusRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusGetMultiSlotDataStatusRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USER = 4, - VT_SLOTIDARRAY = 6 - }; - const TusUser *user() const { - return GetPointer(VT_USER); - } - const ::flatbuffers::Vector *slotIdArray() const { - return GetPointer *>(VT_SLOTIDARRAY); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USER) && - verifier.VerifyTable(user()) && - VerifyOffset(verifier, VT_SLOTIDARRAY) && - verifier.VerifyVector(slotIdArray()) && - verifier.EndTable(); - } -}; - -struct TusGetMultiSlotDataStatusRequestBuilder { - typedef TusGetMultiSlotDataStatusRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_user(::flatbuffers::Offset user) { - fbb_.AddOffset(TusGetMultiSlotDataStatusRequest::VT_USER, user); - } - void add_slotIdArray(::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray) { - fbb_.AddOffset(TusGetMultiSlotDataStatusRequest::VT_SLOTIDARRAY, slotIdArray); - } - explicit TusGetMultiSlotDataStatusRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusGetMultiSlotDataStatusRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray = 0) { - TusGetMultiSlotDataStatusRequestBuilder builder_(_fbb); - builder_.add_slotIdArray(slotIdArray); - builder_.add_user(user); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusGetMultiSlotDataStatusRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - const std::vector *slotIdArray = nullptr) { - auto slotIdArray__ = slotIdArray ? _fbb.CreateVector(*slotIdArray) : 0; - return CreateTusGetMultiSlotDataStatusRequest( - _fbb, - user, - slotIdArray__); -} - -struct TusGetMultiUserDataStatusRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusGetMultiUserDataStatusRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USERS = 4, - VT_SLOTID = 6 - }; - const ::flatbuffers::Vector<::flatbuffers::Offset> *users() const { - return GetPointer> *>(VT_USERS); - } - int32_t slotId() const { - return GetField(VT_SLOTID, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USERS) && - verifier.VerifyVector(users()) && - verifier.VerifyVectorOfTables(users()) && - VerifyField(verifier, VT_SLOTID, 4) && - verifier.EndTable(); - } -}; - -struct TusGetMultiUserDataStatusRequestBuilder { - typedef TusGetMultiUserDataStatusRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_users(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> users) { - fbb_.AddOffset(TusGetMultiUserDataStatusRequest::VT_USERS, users); - } - void add_slotId(int32_t slotId) { - fbb_.AddElement(TusGetMultiUserDataStatusRequest::VT_SLOTID, slotId, 0); - } - explicit TusGetMultiUserDataStatusRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusGetMultiUserDataStatusRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> users = 0, - int32_t slotId = 0) { - TusGetMultiUserDataStatusRequestBuilder builder_(_fbb); - builder_.add_slotId(slotId); - builder_.add_users(users); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusGetMultiUserDataStatusRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector<::flatbuffers::Offset> *users = nullptr, - int32_t slotId = 0) { - auto users__ = users ? _fbb.CreateVector<::flatbuffers::Offset>(*users) : 0; - return CreateTusGetMultiUserDataStatusRequest( - _fbb, - users__, - slotId); -} - -struct TusGetFriendsDataStatusRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusGetFriendsDataStatusRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SLOTID = 4, - VT_INCLUDESELF = 6, - VT_SORTTYPE = 8, - VT_ARRAYNUM = 10 - }; - int32_t slotId() const { - return GetField(VT_SLOTID, 0); - } - bool includeSelf() const { - return GetField(VT_INCLUDESELF, 0) != 0; - } - int32_t sortType() const { - return GetField(VT_SORTTYPE, 0); - } - uint32_t arrayNum() const { - return GetField(VT_ARRAYNUM, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SLOTID, 4) && - VerifyField(verifier, VT_INCLUDESELF, 1) && - VerifyField(verifier, VT_SORTTYPE, 4) && - VerifyField(verifier, VT_ARRAYNUM, 4) && - verifier.EndTable(); - } -}; - -struct TusGetFriendsDataStatusRequestBuilder { - typedef TusGetFriendsDataStatusRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_slotId(int32_t slotId) { - fbb_.AddElement(TusGetFriendsDataStatusRequest::VT_SLOTID, slotId, 0); - } - void add_includeSelf(bool includeSelf) { - fbb_.AddElement(TusGetFriendsDataStatusRequest::VT_INCLUDESELF, static_cast(includeSelf), 0); - } - void add_sortType(int32_t sortType) { - fbb_.AddElement(TusGetFriendsDataStatusRequest::VT_SORTTYPE, sortType, 0); - } - void add_arrayNum(uint32_t arrayNum) { - fbb_.AddElement(TusGetFriendsDataStatusRequest::VT_ARRAYNUM, arrayNum, 0); - } - explicit TusGetFriendsDataStatusRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusGetFriendsDataStatusRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - int32_t slotId = 0, - bool includeSelf = false, - int32_t sortType = 0, - uint32_t arrayNum = 0) { - TusGetFriendsDataStatusRequestBuilder builder_(_fbb); - builder_.add_arrayNum(arrayNum); - builder_.add_sortType(sortType); - builder_.add_slotId(slotId); - builder_.add_includeSelf(includeSelf); - return builder_.Finish(); -} - -struct TusDeleteMultiSlotDataRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef TusDeleteMultiSlotDataRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_USER = 4, - VT_SLOTIDARRAY = 6 - }; - const TusUser *user() const { - return GetPointer(VT_USER); - } - const ::flatbuffers::Vector *slotIdArray() const { - return GetPointer *>(VT_SLOTIDARRAY); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_USER) && - verifier.VerifyTable(user()) && - VerifyOffset(verifier, VT_SLOTIDARRAY) && - verifier.VerifyVector(slotIdArray()) && - verifier.EndTable(); - } -}; - -struct TusDeleteMultiSlotDataRequestBuilder { - typedef TusDeleteMultiSlotDataRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_user(::flatbuffers::Offset user) { - fbb_.AddOffset(TusDeleteMultiSlotDataRequest::VT_USER, user); - } - void add_slotIdArray(::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray) { - fbb_.AddOffset(TusDeleteMultiSlotDataRequest::VT_SLOTIDARRAY, slotIdArray); - } - explicit TusDeleteMultiSlotDataRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateTusDeleteMultiSlotDataRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> slotIdArray = 0) { - TusDeleteMultiSlotDataRequestBuilder builder_(_fbb); - builder_.add_slotIdArray(slotIdArray); - builder_.add_user(user); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateTusDeleteMultiSlotDataRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset user = 0, - const std::vector *slotIdArray = nullptr) { - auto slotIdArray__ = slotIdArray ? _fbb.CreateVector(*slotIdArray) : 0; - return CreateTusDeleteMultiSlotDataRequest( - _fbb, - user, - slotIdArray__); -} - -struct SetPresenceRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SetPresenceRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_TITLE = 4, - VT_STATUS = 6, - VT_COMMENT = 8, - VT_DATA = 10 - }; - const ::flatbuffers::String *title() const { - return GetPointer(VT_TITLE); - } - const ::flatbuffers::String *status() const { - return GetPointer(VT_STATUS); - } - const ::flatbuffers::String *comment() const { - return GetPointer(VT_COMMENT); - } - const ::flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_TITLE) && - verifier.VerifyString(title()) && - VerifyOffset(verifier, VT_STATUS) && - verifier.VerifyString(status()) && - VerifyOffset(verifier, VT_COMMENT) && - verifier.VerifyString(comment()) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - verifier.EndTable(); - } -}; - -struct SetPresenceRequestBuilder { - typedef SetPresenceRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_title(::flatbuffers::Offset<::flatbuffers::String> title) { - fbb_.AddOffset(SetPresenceRequest::VT_TITLE, title); - } - void add_status(::flatbuffers::Offset<::flatbuffers::String> status) { - fbb_.AddOffset(SetPresenceRequest::VT_STATUS, status); - } - void add_comment(::flatbuffers::Offset<::flatbuffers::String> comment) { - fbb_.AddOffset(SetPresenceRequest::VT_COMMENT, comment); - } - void add_data(::flatbuffers::Offset<::flatbuffers::Vector> data) { - fbb_.AddOffset(SetPresenceRequest::VT_DATA, data); - } - explicit SetPresenceRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSetPresenceRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::String> title = 0, - ::flatbuffers::Offset<::flatbuffers::String> status = 0, - ::flatbuffers::Offset<::flatbuffers::String> comment = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> data = 0) { - SetPresenceRequestBuilder builder_(_fbb); - builder_.add_data(data); - builder_.add_comment(comment); - builder_.add_status(status); - builder_.add_title(title); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSetPresenceRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const char *title = nullptr, - const char *status = nullptr, - const char *comment = nullptr, - const std::vector *data = nullptr) { - auto title__ = title ? _fbb.CreateString(title) : 0; - auto status__ = status ? _fbb.CreateString(status) : 0; - auto comment__ = comment ? _fbb.CreateString(comment) : 0; - auto data__ = data ? _fbb.CreateVector(*data) : 0; - return CreateSetPresenceRequest( - _fbb, - title__, - status__, - comment__, - data__); -} - -struct MatchingSearchCondition FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef MatchingSearchConditionBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ATTR_TYPE = 4, - VT_ATTR_ID = 6, - VT_COMP_OP = 8, - VT_COMP_VALUE = 10 - }; - uint32_t attr_type() const { - return GetField(VT_ATTR_TYPE, 0); - } - uint32_t attr_id() const { - return GetField(VT_ATTR_ID, 0); - } - uint32_t comp_op() const { - return GetField(VT_COMP_OP, 0); - } - uint32_t comp_value() const { - return GetField(VT_COMP_VALUE, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ATTR_TYPE, 4) && - VerifyField(verifier, VT_ATTR_ID, 4) && - VerifyField(verifier, VT_COMP_OP, 4) && - VerifyField(verifier, VT_COMP_VALUE, 4) && - verifier.EndTable(); - } -}; - -struct MatchingSearchConditionBuilder { - typedef MatchingSearchCondition Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_attr_type(uint32_t attr_type) { - fbb_.AddElement(MatchingSearchCondition::VT_ATTR_TYPE, attr_type, 0); - } - void add_attr_id(uint32_t attr_id) { - fbb_.AddElement(MatchingSearchCondition::VT_ATTR_ID, attr_id, 0); - } - void add_comp_op(uint32_t comp_op) { - fbb_.AddElement(MatchingSearchCondition::VT_COMP_OP, comp_op, 0); - } - void add_comp_value(uint32_t comp_value) { - fbb_.AddElement(MatchingSearchCondition::VT_COMP_VALUE, comp_value, 0); - } - explicit MatchingSearchConditionBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMatchingSearchCondition( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t attr_type = 0, - uint32_t attr_id = 0, - uint32_t comp_op = 0, - uint32_t comp_value = 0) { - MatchingSearchConditionBuilder builder_(_fbb); - builder_.add_comp_value(comp_value); - builder_.add_comp_op(comp_op); - builder_.add_attr_id(attr_id); - builder_.add_attr_type(attr_type); - return builder_.Finish(); -} - -struct MatchingAttr FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef MatchingAttrBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ATTR_TYPE = 4, - VT_ATTR_ID = 6, - VT_NUM = 8, - VT_DATA = 10 - }; - uint32_t attr_type() const { - return GetField(VT_ATTR_TYPE, 0); - } - uint32_t attr_id() const { - return GetField(VT_ATTR_ID, 0); - } - uint32_t num() const { - return GetField(VT_NUM, 0); - } - const ::flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ATTR_TYPE, 4) && - VerifyField(verifier, VT_ATTR_ID, 4) && - VerifyField(verifier, VT_NUM, 4) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - verifier.EndTable(); - } -}; - -struct MatchingAttrBuilder { - typedef MatchingAttr Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_attr_type(uint32_t attr_type) { - fbb_.AddElement(MatchingAttr::VT_ATTR_TYPE, attr_type, 0); - } - void add_attr_id(uint32_t attr_id) { - fbb_.AddElement(MatchingAttr::VT_ATTR_ID, attr_id, 0); - } - void add_num(uint32_t num) { - fbb_.AddElement(MatchingAttr::VT_NUM, num, 0); - } - void add_data(::flatbuffers::Offset<::flatbuffers::Vector> data) { - fbb_.AddOffset(MatchingAttr::VT_DATA, data); - } - explicit MatchingAttrBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMatchingAttr( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t attr_type = 0, - uint32_t attr_id = 0, - uint32_t num = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> data = 0) { - MatchingAttrBuilder builder_(_fbb); - builder_.add_data(data); - builder_.add_num(num); - builder_.add_attr_id(attr_id); - builder_.add_attr_type(attr_type); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateMatchingAttrDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t attr_type = 0, - uint32_t attr_id = 0, - uint32_t num = 0, - const std::vector *data = nullptr) { - auto data__ = data ? _fbb.CreateVector(*data) : 0; - return CreateMatchingAttr( - _fbb, - attr_type, - attr_id, - num, - data__); -} - -struct CreateRoomGUIRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef CreateRoomGUIRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_TOTAL_SLOTS = 4, - VT_PRIVATE_SLOTS = 6, - VT_PRIVILEGE_GRANT = 8, - VT_STEALTH = 10, - VT_GAME_ATTRS = 12 - }; - uint32_t total_slots() const { - return GetField(VT_TOTAL_SLOTS, 0); - } - uint32_t private_slots() const { - return GetField(VT_PRIVATE_SLOTS, 0); - } - bool privilege_grant() const { - return GetField(VT_PRIVILEGE_GRANT, 0) != 0; - } - bool stealth() const { - return GetField(VT_STEALTH, 0) != 0; - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *game_attrs() const { - return GetPointer> *>(VT_GAME_ATTRS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_TOTAL_SLOTS, 4) && - VerifyField(verifier, VT_PRIVATE_SLOTS, 4) && - VerifyField(verifier, VT_PRIVILEGE_GRANT, 1) && - VerifyField(verifier, VT_STEALTH, 1) && - VerifyOffset(verifier, VT_GAME_ATTRS) && - verifier.VerifyVector(game_attrs()) && - verifier.VerifyVectorOfTables(game_attrs()) && - verifier.EndTable(); - } -}; - -struct CreateRoomGUIRequestBuilder { - typedef CreateRoomGUIRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_total_slots(uint32_t total_slots) { - fbb_.AddElement(CreateRoomGUIRequest::VT_TOTAL_SLOTS, total_slots, 0); - } - void add_private_slots(uint32_t private_slots) { - fbb_.AddElement(CreateRoomGUIRequest::VT_PRIVATE_SLOTS, private_slots, 0); - } - void add_privilege_grant(bool privilege_grant) { - fbb_.AddElement(CreateRoomGUIRequest::VT_PRIVILEGE_GRANT, static_cast(privilege_grant), 0); - } - void add_stealth(bool stealth) { - fbb_.AddElement(CreateRoomGUIRequest::VT_STEALTH, static_cast(stealth), 0); - } - void add_game_attrs(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> game_attrs) { - fbb_.AddOffset(CreateRoomGUIRequest::VT_GAME_ATTRS, game_attrs); - } - explicit CreateRoomGUIRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateCreateRoomGUIRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t total_slots = 0, - uint32_t private_slots = 0, - bool privilege_grant = false, - bool stealth = false, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> game_attrs = 0) { - CreateRoomGUIRequestBuilder builder_(_fbb); - builder_.add_game_attrs(game_attrs); - builder_.add_private_slots(private_slots); - builder_.add_total_slots(total_slots); - builder_.add_stealth(stealth); - builder_.add_privilege_grant(privilege_grant); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateCreateRoomGUIRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t total_slots = 0, - uint32_t private_slots = 0, - bool privilege_grant = false, - bool stealth = false, - const std::vector<::flatbuffers::Offset> *game_attrs = nullptr) { - auto game_attrs__ = game_attrs ? _fbb.CreateVector<::flatbuffers::Offset>(*game_attrs) : 0; - return CreateCreateRoomGUIRequest( - _fbb, - total_slots, - private_slots, - privilege_grant, - stealth, - game_attrs__); -} - -struct GUIUserInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GUIUserInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_INFO = 4, - VT_OWNER = 6 - }; - const UserInfo *info() const { - return GetPointer(VT_INFO); - } - bool owner() const { - return GetField(VT_OWNER, 0) != 0; - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_INFO) && - verifier.VerifyTable(info()) && - VerifyField(verifier, VT_OWNER, 1) && - verifier.EndTable(); - } -}; - -struct GUIUserInfoBuilder { - typedef GUIUserInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_info(::flatbuffers::Offset info) { - fbb_.AddOffset(GUIUserInfo::VT_INFO, info); - } - void add_owner(bool owner) { - fbb_.AddElement(GUIUserInfo::VT_OWNER, static_cast(owner), 0); - } - explicit GUIUserInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGUIUserInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset info = 0, - bool owner = false) { - GUIUserInfoBuilder builder_(_fbb); - builder_.add_info(info); - builder_.add_owner(owner); - return builder_.Finish(); -} - -struct MatchingRoomStatus FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef MatchingRoomStatusBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ID = 4, - VT_MEMBERS = 6, - VT_KICK_ACTOR = 8, - VT_OPT = 10 - }; - const ::flatbuffers::Vector *id() const { - return GetPointer *>(VT_ID); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *members() const { - return GetPointer> *>(VT_MEMBERS); - } - const ::flatbuffers::String *kick_actor() const { - return GetPointer(VT_KICK_ACTOR); - } - const ::flatbuffers::Vector *opt() const { - return GetPointer *>(VT_OPT); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_ID) && - verifier.VerifyVector(id()) && - VerifyOffset(verifier, VT_MEMBERS) && - verifier.VerifyVector(members()) && - verifier.VerifyVectorOfTables(members()) && - VerifyOffset(verifier, VT_KICK_ACTOR) && - verifier.VerifyString(kick_actor()) && - VerifyOffset(verifier, VT_OPT) && - verifier.VerifyVector(opt()) && - verifier.EndTable(); - } -}; - -struct MatchingRoomStatusBuilder { - typedef MatchingRoomStatus Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_id(::flatbuffers::Offset<::flatbuffers::Vector> id) { - fbb_.AddOffset(MatchingRoomStatus::VT_ID, id); - } - void add_members(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> members) { - fbb_.AddOffset(MatchingRoomStatus::VT_MEMBERS, members); - } - void add_kick_actor(::flatbuffers::Offset<::flatbuffers::String> kick_actor) { - fbb_.AddOffset(MatchingRoomStatus::VT_KICK_ACTOR, kick_actor); - } - void add_opt(::flatbuffers::Offset<::flatbuffers::Vector> opt) { - fbb_.AddOffset(MatchingRoomStatus::VT_OPT, opt); - } - explicit MatchingRoomStatusBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMatchingRoomStatus( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> id = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> members = 0, - ::flatbuffers::Offset<::flatbuffers::String> kick_actor = 0, - ::flatbuffers::Offset<::flatbuffers::Vector> opt = 0) { - MatchingRoomStatusBuilder builder_(_fbb); - builder_.add_opt(opt); - builder_.add_kick_actor(kick_actor); - builder_.add_members(members); - builder_.add_id(id); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateMatchingRoomStatusDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *id = nullptr, - const std::vector<::flatbuffers::Offset> *members = nullptr, - const char *kick_actor = nullptr, - const std::vector *opt = nullptr) { - auto id__ = id ? _fbb.CreateVector(*id) : 0; - auto members__ = members ? _fbb.CreateVector<::flatbuffers::Offset>(*members) : 0; - auto kick_actor__ = kick_actor ? _fbb.CreateString(kick_actor) : 0; - auto opt__ = opt ? _fbb.CreateVector(*opt) : 0; - return CreateMatchingRoomStatus( - _fbb, - id__, - members__, - kick_actor__, - opt__); -} - -struct GetRoomListGUIRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef GetRoomListGUIRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_RANGE_START = 4, - VT_RANGE_MAX = 6, - VT_CONDS = 8, - VT_ATTRS = 10 - }; - uint32_t range_start() const { - return GetField(VT_RANGE_START, 0); - } - uint32_t range_max() const { - return GetField(VT_RANGE_MAX, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *conds() const { - return GetPointer> *>(VT_CONDS); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *attrs() const { - return GetPointer> *>(VT_ATTRS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_RANGE_START, 4) && - VerifyField(verifier, VT_RANGE_MAX, 4) && - VerifyOffset(verifier, VT_CONDS) && - verifier.VerifyVector(conds()) && - verifier.VerifyVectorOfTables(conds()) && - VerifyOffset(verifier, VT_ATTRS) && - verifier.VerifyVector(attrs()) && - verifier.VerifyVectorOfTables(attrs()) && - verifier.EndTable(); - } -}; - -struct GetRoomListGUIRequestBuilder { - typedef GetRoomListGUIRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_range_start(uint32_t range_start) { - fbb_.AddElement(GetRoomListGUIRequest::VT_RANGE_START, range_start, 0); - } - void add_range_max(uint32_t range_max) { - fbb_.AddElement(GetRoomListGUIRequest::VT_RANGE_MAX, range_max, 0); - } - void add_conds(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> conds) { - fbb_.AddOffset(GetRoomListGUIRequest::VT_CONDS, conds); - } - void add_attrs(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> attrs) { - fbb_.AddOffset(GetRoomListGUIRequest::VT_ATTRS, attrs); - } - explicit GetRoomListGUIRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateGetRoomListGUIRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t range_start = 0, - uint32_t range_max = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> conds = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> attrs = 0) { - GetRoomListGUIRequestBuilder builder_(_fbb); - builder_.add_attrs(attrs); - builder_.add_conds(conds); - builder_.add_range_max(range_max); - builder_.add_range_start(range_start); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateGetRoomListGUIRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t range_start = 0, - uint32_t range_max = 0, - const std::vector<::flatbuffers::Offset> *conds = nullptr, - const std::vector<::flatbuffers::Offset> *attrs = nullptr) { - auto conds__ = conds ? _fbb.CreateVector<::flatbuffers::Offset>(*conds) : 0; - auto attrs__ = attrs ? _fbb.CreateVector<::flatbuffers::Offset>(*attrs) : 0; - return CreateGetRoomListGUIRequest( - _fbb, - range_start, - range_max, - conds__, - attrs__); -} - -struct MatchingRoom FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef MatchingRoomBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ID = 4, - VT_ATTR = 6 - }; - const ::flatbuffers::Vector *id() const { - return GetPointer *>(VT_ID); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *attr() const { - return GetPointer> *>(VT_ATTR); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_ID) && - verifier.VerifyVector(id()) && - VerifyOffset(verifier, VT_ATTR) && - verifier.VerifyVector(attr()) && - verifier.VerifyVectorOfTables(attr()) && - verifier.EndTable(); - } -}; - -struct MatchingRoomBuilder { - typedef MatchingRoom Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_id(::flatbuffers::Offset<::flatbuffers::Vector> id) { - fbb_.AddOffset(MatchingRoom::VT_ID, id); - } - void add_attr(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> attr) { - fbb_.AddOffset(MatchingRoom::VT_ATTR, attr); - } - explicit MatchingRoomBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMatchingRoom( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> id = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> attr = 0) { - MatchingRoomBuilder builder_(_fbb); - builder_.add_attr(attr); - builder_.add_id(id); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateMatchingRoomDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *id = nullptr, - const std::vector<::flatbuffers::Offset> *attr = nullptr) { - auto id__ = id ? _fbb.CreateVector(*id) : 0; - auto attr__ = attr ? _fbb.CreateVector<::flatbuffers::Offset>(*attr) : 0; - return CreateMatchingRoom( - _fbb, - id__, - attr__); -} - -struct MatchingRoomList FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef MatchingRoomListBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_START = 4, - VT_TOTAL = 6, - VT_ROOMS = 8 - }; - uint32_t start() const { - return GetField(VT_START, 0); - } - uint32_t total() const { - return GetField(VT_TOTAL, 0); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *rooms() const { - return GetPointer> *>(VT_ROOMS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_START, 4) && - VerifyField(verifier, VT_TOTAL, 4) && - VerifyOffset(verifier, VT_ROOMS) && - verifier.VerifyVector(rooms()) && - verifier.VerifyVectorOfTables(rooms()) && - verifier.EndTable(); - } -}; - -struct MatchingRoomListBuilder { - typedef MatchingRoomList Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_start(uint32_t start) { - fbb_.AddElement(MatchingRoomList::VT_START, start, 0); - } - void add_total(uint32_t total) { - fbb_.AddElement(MatchingRoomList::VT_TOTAL, total, 0); - } - void add_rooms(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> rooms) { - fbb_.AddOffset(MatchingRoomList::VT_ROOMS, rooms); - } - explicit MatchingRoomListBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMatchingRoomList( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t start = 0, - uint32_t total = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> rooms = 0) { - MatchingRoomListBuilder builder_(_fbb); - builder_.add_rooms(rooms); - builder_.add_total(total); - builder_.add_start(start); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateMatchingRoomListDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - uint32_t start = 0, - uint32_t total = 0, - const std::vector<::flatbuffers::Offset> *rooms = nullptr) { - auto rooms__ = rooms ? _fbb.CreateVector<::flatbuffers::Offset>(*rooms) : 0; - return CreateMatchingRoomList( - _fbb, - start, - total, - rooms__); -} - -struct MatchingGuiRoomId FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef MatchingGuiRoomIdBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ID = 4 - }; - const ::flatbuffers::Vector *id() const { - return GetPointer *>(VT_ID); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_ID) && - verifier.VerifyVector(id()) && - verifier.EndTable(); - } -}; - -struct MatchingGuiRoomIdBuilder { - typedef MatchingGuiRoomId Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_id(::flatbuffers::Offset<::flatbuffers::Vector> id) { - fbb_.AddOffset(MatchingGuiRoomId::VT_ID, id); - } - explicit MatchingGuiRoomIdBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMatchingGuiRoomId( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> id = 0) { - MatchingGuiRoomIdBuilder builder_(_fbb); - builder_.add_id(id); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateMatchingGuiRoomIdDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *id = nullptr) { - auto id__ = id ? _fbb.CreateVector(*id) : 0; - return CreateMatchingGuiRoomId( - _fbb, - id__); -} - -struct SetRoomSearchFlagGUI FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SetRoomSearchFlagGUIBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOMID = 4, - VT_STEALTH = 6 - }; - const ::flatbuffers::Vector *roomid() const { - return GetPointer *>(VT_ROOMID); - } - bool stealth() const { - return GetField(VT_STEALTH, 0) != 0; - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_ROOMID) && - verifier.VerifyVector(roomid()) && - VerifyField(verifier, VT_STEALTH, 1) && - verifier.EndTable(); - } -}; - -struct SetRoomSearchFlagGUIBuilder { - typedef SetRoomSearchFlagGUI Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_roomid(::flatbuffers::Offset<::flatbuffers::Vector> roomid) { - fbb_.AddOffset(SetRoomSearchFlagGUI::VT_ROOMID, roomid); - } - void add_stealth(bool stealth) { - fbb_.AddElement(SetRoomSearchFlagGUI::VT_STEALTH, static_cast(stealth), 0); - } - explicit SetRoomSearchFlagGUIBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSetRoomSearchFlagGUI( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> roomid = 0, - bool stealth = false) { - SetRoomSearchFlagGUIBuilder builder_(_fbb); - builder_.add_roomid(roomid); - builder_.add_stealth(stealth); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSetRoomSearchFlagGUIDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *roomid = nullptr, - bool stealth = false) { - auto roomid__ = roomid ? _fbb.CreateVector(*roomid) : 0; - return CreateSetRoomSearchFlagGUI( - _fbb, - roomid__, - stealth); -} - -struct QuickMatchGUIRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef QuickMatchGUIRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_CONDS = 4, - VT_AVAILABLE_NUM = 6 - }; - const ::flatbuffers::Vector<::flatbuffers::Offset> *conds() const { - return GetPointer> *>(VT_CONDS); - } - uint32_t available_num() const { - return GetField(VT_AVAILABLE_NUM, 0); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_CONDS) && - verifier.VerifyVector(conds()) && - verifier.VerifyVectorOfTables(conds()) && - VerifyField(verifier, VT_AVAILABLE_NUM, 4) && - verifier.EndTable(); - } -}; - -struct QuickMatchGUIRequestBuilder { - typedef QuickMatchGUIRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_conds(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> conds) { - fbb_.AddOffset(QuickMatchGUIRequest::VT_CONDS, conds); - } - void add_available_num(uint32_t available_num) { - fbb_.AddElement(QuickMatchGUIRequest::VT_AVAILABLE_NUM, available_num, 0); - } - explicit QuickMatchGUIRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateQuickMatchGUIRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> conds = 0, - uint32_t available_num = 0) { - QuickMatchGUIRequestBuilder builder_(_fbb); - builder_.add_available_num(available_num); - builder_.add_conds(conds); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateQuickMatchGUIRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector<::flatbuffers::Offset> *conds = nullptr, - uint32_t available_num = 0) { - auto conds__ = conds ? _fbb.CreateVector<::flatbuffers::Offset>(*conds) : 0; - return CreateQuickMatchGUIRequest( - _fbb, - conds__, - available_num); -} - -struct SearchJoinRoomGUIRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef SearchJoinRoomGUIRequestBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_CONDS = 4, - VT_ATTRS = 6 - }; - const ::flatbuffers::Vector<::flatbuffers::Offset> *conds() const { - return GetPointer> *>(VT_CONDS); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *attrs() const { - return GetPointer> *>(VT_ATTRS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_CONDS) && - verifier.VerifyVector(conds()) && - verifier.VerifyVectorOfTables(conds()) && - VerifyOffset(verifier, VT_ATTRS) && - verifier.VerifyVector(attrs()) && - verifier.VerifyVectorOfTables(attrs()) && - verifier.EndTable(); - } -}; - -struct SearchJoinRoomGUIRequestBuilder { - typedef SearchJoinRoomGUIRequest Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_conds(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> conds) { - fbb_.AddOffset(SearchJoinRoomGUIRequest::VT_CONDS, conds); - } - void add_attrs(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> attrs) { - fbb_.AddOffset(SearchJoinRoomGUIRequest::VT_ATTRS, attrs); - } - explicit SearchJoinRoomGUIRequestBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateSearchJoinRoomGUIRequest( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> conds = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> attrs = 0) { - SearchJoinRoomGUIRequestBuilder builder_(_fbb); - builder_.add_attrs(attrs); - builder_.add_conds(conds); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateSearchJoinRoomGUIRequestDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector<::flatbuffers::Offset> *conds = nullptr, - const std::vector<::flatbuffers::Offset> *attrs = nullptr) { - auto conds__ = conds ? _fbb.CreateVector<::flatbuffers::Offset>(*conds) : 0; - auto attrs__ = attrs ? _fbb.CreateVector<::flatbuffers::Offset>(*attrs) : 0; - return CreateSearchJoinRoomGUIRequest( - _fbb, - conds__, - attrs__); -} - -struct MatchingSearchJoinRoomInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef MatchingSearchJoinRoomInfoBuilder Builder; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ROOM = 4, - VT_ATTR = 6 - }; - const MatchingRoomStatus *room() const { - return GetPointer(VT_ROOM); - } - const ::flatbuffers::Vector<::flatbuffers::Offset> *attr() const { - return GetPointer> *>(VT_ATTR); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_ROOM) && - verifier.VerifyTable(room()) && - VerifyOffset(verifier, VT_ATTR) && - verifier.VerifyVector(attr()) && - verifier.VerifyVectorOfTables(attr()) && - verifier.EndTable(); - } -}; - -struct MatchingSearchJoinRoomInfoBuilder { - typedef MatchingSearchJoinRoomInfo Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_room(::flatbuffers::Offset room) { - fbb_.AddOffset(MatchingSearchJoinRoomInfo::VT_ROOM, room); - } - void add_attr(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> attr) { - fbb_.AddOffset(MatchingSearchJoinRoomInfo::VT_ATTR, attr); - } - explicit MatchingSearchJoinRoomInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateMatchingSearchJoinRoomInfo( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset room = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> attr = 0) { - MatchingSearchJoinRoomInfoBuilder builder_(_fbb); - builder_.add_attr(attr); - builder_.add_room(room); - return builder_.Finish(); -} - -inline ::flatbuffers::Offset CreateMatchingSearchJoinRoomInfoDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset room = 0, - const std::vector<::flatbuffers::Offset> *attr = nullptr) { - auto attr__ = attr ? _fbb.CreateVector<::flatbuffers::Offset>(*attr) : 0; - return CreateMatchingSearchJoinRoomInfo( - _fbb, - room, - attr__); -} - -#endif // FLATBUFFERS_GENERATED_NP2STRUCTS_H_ diff --git a/rpcs3/Emu/NP/ip_address.cpp b/rpcs3/Emu/NP/ip_address.cpp index ce7b460272..7d9d972d7c 100644 --- a/rpcs3/Emu/NP/ip_address.cpp +++ b/rpcs3/Emu/NP/ip_address.cpp @@ -66,28 +66,30 @@ namespace np return sockaddr_ipv6; } - u32 register_ip(const flatbuffers::Vector* vec) + u32 register_ip(const std::string& ip_bytes) { - if (vec->size() == 4) + if (ip_bytes.size() == 4) { - const u32 ip = static_cast(vec->Get(0)) << 24 | static_cast(vec->Get(1)) << 16 | - static_cast(vec->Get(2)) << 8 | static_cast(vec->Get(3)); + const u32 ip = static_cast(static_cast(ip_bytes[0])) << 24 | + static_cast(static_cast(ip_bytes[1])) << 16 | + static_cast(static_cast(ip_bytes[2])) << 8 | + static_cast(static_cast(ip_bytes[3])); u32 result_ip = std::bit_cast>(ip); return result_ip; } - else if (vec->size() == 16) + else if (ip_bytes.size() == 16) { std::array ipv6_addr{}; - std::memcpy(ipv6_addr.data(), vec->Data(), 16); + std::memcpy(ipv6_addr.data(), ip_bytes.data(), 16); auto& translator = g_fxo->get(); return translator.register_ipv6(ipv6_addr); } else { - fmt::throw_exception("Received ip address with size = %d", vec->size()); + fmt::throw_exception("Received ip address with size = %d", ip_bytes.size()); } } diff --git a/rpcs3/Emu/NP/ip_address.h b/rpcs3/Emu/NP/ip_address.h index 3857275aac..f019e299cb 100644 --- a/rpcs3/Emu/NP/ip_address.h +++ b/rpcs3/Emu/NP/ip_address.h @@ -1,10 +1,9 @@ #pragma once #include +#include #include -#include - #include "util/types.hpp" #include "Utilities/mutex.h" @@ -67,7 +66,7 @@ namespace np std::vector> ipv4_to_ipv6; }; - u32 register_ip(const flatbuffers::Vector* vec); + u32 register_ip(const std::string& ip_bytes); enum class IPV6_SUPPORT : u8 { diff --git a/rpcs3/Emu/NP/np_notifications.cpp b/rpcs3/Emu/NP/np_notifications.cpp index 55b74ec761..d5756a8351 100644 --- a/rpcs3/Emu/NP/np_notifications.cpp +++ b/rpcs3/Emu/NP/np_notifications.cpp @@ -5,7 +5,7 @@ #include "Emu/NP/np_handler.h" #include "Emu/NP/np_helpers.h" #include "Emu/NP/np_structs_extra.h" -#include "Emu/NP/fb_helpers.h" +#include "Emu/NP/pb_helpers.h" #include "Emu/NP/signaling_handler.h" #include "Emu/NP/ip_address.h" @@ -15,7 +15,7 @@ namespace np { void np_handler::notif_user_joined_room(vec_stream& noti) { - const auto* notification = noti.get_flatbuffer(); + auto notification = noti.get_protobuf(); if (noti.is_error()) { @@ -23,7 +23,7 @@ namespace np return; } - ensure(notification->update_info()); + ensure(notification->has_update_info()); const u32 event_key = get_event_key(); const auto [include_onlinename, include_avatarurl] = get_match2_context_options(room_event_cb_ctx); @@ -45,10 +45,11 @@ namespace np extra_nps::print_SceNpMatching2RoomMemberDataInternal(notif_data->roomMemberDataInternal.get_ptr()); // We initiate signaling if necessary - if (const auto* signaling_info = notification->signaling()) + if (notification->has_signaling()) { - const u32 addr_p2p = register_ip(signaling_info->ip()); - const u16 port_p2p = signaling_info->port(); + const auto& signaling_info = notification->signaling(); + const u32 addr_p2p = register_ip(signaling_info.ip()); + const u16 port_p2p = signaling_info.port().value(); const u16 member_id = notif_data->roomMemberDataInternal->memberId; const SceNpId& npid = notif_data->roomMemberDataInternal->userInfo.npId; @@ -74,7 +75,7 @@ namespace np void np_handler::notif_user_left_room(vec_stream& noti) { u64 room_id = noti.get(); - const auto* update_info = noti.get_flatbuffer(); + auto update_info = noti.get_protobuf(); if (noti.is_error()) { @@ -87,7 +88,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberUpdateInfo, sizeof(SceNpMatching2RoomMemberUpdateInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(edata, update_info, notif_data, include_onlinename, include_avatarurl); + RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(edata, *update_info, notif_data, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); // Ensures we do not call the callback if the room is not in the cache(ie we left the room already) @@ -113,7 +114,7 @@ namespace np void np_handler::notif_room_destroyed(vec_stream& noti) { u64 room_id = noti.get(); - const auto* update_info = noti.get_flatbuffer(); + auto update_info = noti.get_protobuf(); if (noti.is_error()) { @@ -125,7 +126,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomUpdateInfo, sizeof(SceNpMatching2RoomUpdateInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomUpdateInfo_to_SceNpMatching2RoomUpdateInfo(update_info, notif_data); + RoomUpdateInfo_to_SceNpMatching2RoomUpdateInfo(*update_info, notif_data); np_memory.shrink_allocation(edata.addr(), edata.size()); rpcn_log.notice("Received notification that room(%d) was destroyed", room_id); @@ -146,7 +147,7 @@ namespace np void np_handler::notif_updated_room_data_internal(vec_stream& noti) { SceNpMatching2RoomId room_id = noti.get(); - const auto* update_info = noti.get_flatbuffer(); + auto update_info = noti.get_protobuf(); if (noti.is_error()) { @@ -159,7 +160,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomDataInternalUpdateInfo, sizeof(SceNpMatching2RoomDataInternalUpdateInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(edata, update_info, notif_data, npid, include_onlinename, include_avatarurl); + RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(edata, *update_info, notif_data, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); np_cache.insert_room(notif_data->newRoomDataInternal.get_ptr()); @@ -181,7 +182,7 @@ namespace np void np_handler::notif_updated_room_member_data_internal(vec_stream& noti) { SceNpMatching2RoomId room_id = noti.get(); - const auto* update_info = noti.get_flatbuffer(); + auto update_info = noti.get_protobuf(); if (noti.is_error()) { @@ -194,7 +195,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberDataInternalUpdateInfo, sizeof(SceNpMatching2RoomMemberDataInternalUpdateInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(edata, update_info, notif_data, include_onlinename, include_avatarurl); + RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(edata, *update_info, notif_data, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); if (!np_cache.add_member(room_id, notif_data->newRoomMemberDataInternal.get_ptr())) @@ -220,7 +221,7 @@ namespace np { u64 room_id = noti.get(); u16 member_id = noti.get(); - const auto* message_info = noti.get_flatbuffer(); + auto message_info = noti.get_protobuf(); if (noti.is_error()) { @@ -233,7 +234,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMessageInfo, sizeof(SceNpMatching2RoomMessageInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(edata, message_info, notif_data, include_onlinename, include_avatarurl); + RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(edata, *message_info, notif_data, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); rpcn_log.notice("Received notification of a room message from member(%d) in room(%d)", member_id, room_id); @@ -250,19 +251,19 @@ namespace np void np_handler::notif_signaling_helper(vec_stream& noti) { - const auto* matching_info = noti.get_flatbuffer(); + auto matching_info = noti.get_protobuf(); - if (noti.is_error() || !matching_info->addr() || !matching_info->npid() || !matching_info->addr()->ip()) + if (noti.is_error() || !matching_info->has_addr() || matching_info->npid().empty() || matching_info->addr().ip().empty()) { rpcn_log.error("Received faulty SignalingHelper notification"); return; } SceNpId npid_p2p; - string_to_npid(matching_info->npid()->string_view(), npid_p2p); + string_to_npid(matching_info->npid(), npid_p2p); - const u32 addr_p2p = register_ip(matching_info->addr()->ip()); - const u16 port_p2p = matching_info->addr()->port(); + const u32 addr_p2p = register_ip(matching_info->addr().ip()); + const u16 port_p2p = matching_info->addr().port().value(); auto& sigh = g_fxo->get>(); sigh.send_information_packets(addr_p2p, port_p2p, npid_p2p); @@ -270,7 +271,7 @@ namespace np void np_handler::generic_gui_notification_handler(vec_stream& noti, std::string_view name, s32 notification_type) { - const auto* update_info = noti.get_flatbuffer(); + auto update_info = noti.get_protobuf(); if (noti.is_error()) { @@ -290,7 +291,7 @@ namespace np event_data edata(np_memory.allocate(MAX_SceNpMatchingRoomStatus_SIZE), sizeof(SceNpMatchingRoomStatus), MAX_SceNpMatchingRoomStatus_SIZE); auto* room_status = reinterpret_cast(edata.data()); - MatchingRoomStatus_to_SceNpMatchingRoomStatus(edata, update_info, room_status); + MatchingRoomStatus_to_SceNpMatchingRoomStatus(edata, *update_info, room_status); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatchingRoomStatus(room_status); @@ -351,7 +352,7 @@ namespace np void np_handler::notif_quickmatch_complete_gui(vec_stream& noti) { - const auto* update_info = noti.get_flatbuffer(); + auto update_info = noti.get_protobuf(); if (noti.is_error()) { @@ -363,7 +364,7 @@ namespace np event_data edata(np_memory.allocate(MAX_SceNpMatchingJoinedRoomInfo_SIZE), sizeof(SceNpMatchingJoinedRoomInfo), MAX_SceNpMatchingJoinedRoomInfo_SIZE); auto* room_info = reinterpret_cast(edata.data()); - MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(edata, update_info, room_info); + MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(edata, *update_info, room_info); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatchingJoinedRoomInfo(room_info); diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index 23e3d7ca75..1c9102ba2a 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -14,7 +14,7 @@ #include "np_contexts.h" #include "np_helpers.h" #include "np_structs_extra.h" -#include "fb_helpers.h" +#include "pb_helpers.h" #include "Emu/NP/signaling_handler.h" #include "Emu/NP/ip_address.h" @@ -200,7 +200,7 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to CreateRoom command"); const u32 event_key = get_event_key(); @@ -209,7 +209,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_CreateJoinRoom, sizeof(SceNpMatching2CreateJoinRoomResponse)); auto* room_resp = reinterpret_cast(edata.data()); auto* room_info = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), room_resp->roomDataInternal); - RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp, room_info, npid, include_onlinename, include_avatarurl); + RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, *resp, room_info, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); np_cache.insert_room(room_info); @@ -262,9 +262,9 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to JoinRoom command"); - ensure(resp->room_data()); + ensure(resp->has_room_data()); const u32 event_key = get_event_key(); const auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); @@ -280,19 +280,19 @@ namespace np extra_nps::print_SceNpMatching2RoomDataInternal(room_info); // We initiate signaling if necessary - if (const auto* signaling_data = resp->signaling_data()) + if (resp->signaling_data_size() > 0) { - const u64 room_id = resp->room_data()->roomId(); + const u64 room_id = resp->room_data().roomid(); - for (unsigned int i = 0; i < signaling_data->size(); i++) + for (int i = 0; i < resp->signaling_data_size(); i++) { - const auto* signaling_info = signaling_data->Get(i); - ensure(signaling_info->addr()); + const auto& signaling_info = resp->signaling_data(i); + ensure(signaling_info.has_addr()); - const u32 addr_p2p = register_ip(signaling_info->addr()->ip()); - const u16 port_p2p = signaling_info->addr()->port(); + const u32 addr_p2p = register_ip(signaling_info.addr().ip()); + const u16 port_p2p = signaling_info.addr().port().value(); - const u16 member_id = signaling_info->member_id(); + const u16 member_id = signaling_info.member_id().value(); const auto [npid_res, npid_p2p] = np_cache.get_npid(room_id, member_id); if (npid_res != CELL_OK) @@ -379,7 +379,7 @@ namespace np ensure(error == rpcn::ErrorType::NoError, "Unexpected error in SearchRoom reply"); - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to SearchRoom command"); const u32 event_key = get_event_key(); @@ -387,7 +387,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_SearchRoom, sizeof(SceNpMatching2SearchRoomResponse)); auto* search_resp = reinterpret_cast(edata.data()); // The online_name and avatar_url are naturally filtered by the reply from the server - SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(edata, resp, search_resp); + SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(edata, *resp, search_resp); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatching2SearchRoomResponse(search_resp); @@ -418,7 +418,7 @@ namespace np ensure(error == rpcn::ErrorType::NoError, "Unexpected error in GetRoomDataExternalList reply"); - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to GetRoomDataExternalList command"); const u32 event_key = get_event_key(); @@ -426,7 +426,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetRoomDataExternalList, sizeof(SceNpMatching2GetRoomDataExternalListResponse)); auto* sce_get_room_ext_resp = reinterpret_cast(edata.data()); - GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(edata, resp, sce_get_room_ext_resp, include_onlinename, include_avatarurl); + GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(edata, *resp, sce_get_room_ext_resp, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatching2GetRoomDataExternalListResponse(sce_get_room_ext_resp); @@ -504,7 +504,7 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to GetRoomDataInternal command"); const u32 event_key = get_event_key(); @@ -513,7 +513,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetRoomDataInternal, sizeof(SceNpMatching2GetRoomDataInternalResponse)); auto* room_resp = reinterpret_cast(edata.data()); auto* room_info = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), room_resp->roomDataInternal); - RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp, room_info, npid, include_onlinename, include_avatarurl); + RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, *resp, room_info, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); np_cache.insert_room(room_info); @@ -594,7 +594,7 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to GetRoomMemberDataInternal command"); const u32 event_key = get_event_key(); @@ -603,7 +603,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetRoomMemberDataInternal, sizeof(SceNpMatching2GetRoomMemberDataInternalResponse)); auto* mdata_resp = reinterpret_cast(edata.data()); auto* mdata_info = edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal), mdata_resp->roomMemberDataInternal); - RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, resp, nullptr, mdata_info, include_onlinename, include_avatarurl); + RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, *resp, nullptr, mdata_info, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); @@ -709,14 +709,14 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to PingRoomOwner command"); const u32 event_key = get_event_key(); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_SignalingGetPingInfo, sizeof(SceNpMatching2SignalingGetPingInfoResponse)); auto* final_ping_resp = reinterpret_cast(edata.data()); - GetPingInfoResponse_to_SceNpMatching2SignalingGetPingInfoResponse(resp, final_ping_resp); + GetPingInfoResponse_to_SceNpMatching2SignalingGetPingInfoResponse(*resp, final_ping_resp); np_memory.shrink_allocation(edata.addr(), edata.size()); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); } @@ -789,12 +789,12 @@ namespace np default: fmt::throw_exception("Unexpected error in reply to RequestSignalingInfos: %d", static_cast(error)); } - const auto* resp = reply.get_flatbuffer(); - ensure(!reply.is_error() && resp->ip(), "Malformed reply to RequestSignalingInfos command"); + const auto resp = reply.get_protobuf(); + ensure(!reply.is_error() && !resp->ip().empty(), "Malformed reply to RequestSignalingInfos command"); u32 addr = register_ip(resp->ip()); auto& sigh = g_fxo->get>(); - sigh.start_sig(conn_id, addr, resp->port()); + sigh.start_sig(conn_id, addr, resp->port().value()); } u32 np_handler::get_lobby_info_list(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetLobbyInfoListRequest* req) @@ -970,15 +970,15 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to GetBoardInfos command"); const SceNpScoreBoardInfo board_info{ - .rankLimit = resp->rankLimit(), - .updateMode = resp->updateMode(), - .sortMode = resp->sortMode(), - .uploadNumLimit = resp->uploadNumLimit(), - .uploadSizeLimit = resp->uploadSizeLimit() + .rankLimit = resp->ranklimit(), + .updateMode = resp->updatemode(), + .sortMode = resp->sortmode(), + .uploadNumLimit = resp->uploadnumlimit(), + .uploadSizeLimit = resp->uploadsizelimit() }; std::lock_guard lock(score_trans->mutex); @@ -1195,22 +1195,22 @@ namespace np } template - void set_rankdata_values(T& cur_rank, const ScoreRankData* fb_rankdata) + void set_rankdata_values(T& cur_rank, const np2_structs::ScoreRankData& pb_rankdata) { - string_to_npid(fb_rankdata->npId()->string_view(), cur_rank.npId); - string_to_online_name(fb_rankdata->onlineName()->string_view(), cur_rank.onlineName); + string_to_npid(pb_rankdata.npid(), cur_rank.npId); + string_to_online_name(pb_rankdata.onlinename(), cur_rank.onlineName); static_assert(std::is_same_v || std::is_same_v); if constexpr (std::is_same_v) - cur_rank.pcId = fb_rankdata->pcId(); + cur_rank.pcId = pb_rankdata.pcid(); - cur_rank.serialRank = fb_rankdata->rank(); - cur_rank.rank = fb_rankdata->rank(); - cur_rank.highestRank = fb_rankdata->rank(); - cur_rank.scoreValue = fb_rankdata->score(); - cur_rank.hasGameData = fb_rankdata->hasGameData(); - cur_rank.recordDate.tick = fb_rankdata->recordDate(); + cur_rank.serialRank = pb_rankdata.rank(); + cur_rank.rank = pb_rankdata.rank(); + cur_rank.highestRank = pb_rankdata.rank(); + cur_rank.scoreValue = pb_rankdata.score(); + cur_rank.hasGameData = pb_rankdata.hasgamedata(); + cur_rank.recordDate.tick = pb_rankdata.recorddate(); } void np_handler::handle_GetScoreResponse(u32 req_id, rpcn::ErrorType error, vec_stream& reply, bool simple_result) @@ -1232,15 +1232,14 @@ namespace np default: fmt::throw_exception("Unexpected error in GetScoreResponse: %d", static_cast(error)); } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Error parsing response in handle_GetScoreResponse"); const auto* tdata = std::get_if(&score_trans->tdata); ensure(tdata); - ensure(resp->rankArray() && resp->rankArray()->size() <= tdata->arrayNum); + ensure(static_cast(resp->rankarray_size()) <= tdata->arrayNum); memset(tdata->rankArray.get_ptr(), 0, tdata->rankArraySize); - auto* fb_rankarray = resp->rankArray(); vm::ptr rankPlayerArray = vm::static_ptr_cast(tdata->rankArray); vm::ptr rankPlayerArray_deprecated = vm::static_ptr_cast(tdata->rankArray); @@ -1249,12 +1248,12 @@ namespace np u32 num_scores_registered = 0; - for (flatbuffers::uoffset_t i = 0; i < fb_rankarray->size(); i++) + for (int i = 0; i < resp->rankarray_size(); i++) { - const auto* fb_rankdata = fb_rankarray->Get(i); - ensure(fb_rankdata->npId() && fb_rankdata->onlineName()); + const auto& pb_rankdata = resp->rankarray(i); + ensure(!pb_rankdata.npid().empty() && !pb_rankdata.onlinename().empty()); - if (fb_rankdata->recordDate() == 0) + if (pb_rankdata.recorddate() == 0) continue; num_scores_registered++; @@ -1264,75 +1263,73 @@ namespace np if (tdata->deprecated) { rankPlayerArray_deprecated[i].hasData = 1; - set_rankdata_values(rankPlayerArray_deprecated[i].rankData, fb_rankdata); + set_rankdata_values(rankPlayerArray_deprecated[i].rankData, pb_rankdata); } else { rankPlayerArray[i].hasData = 1; - set_rankdata_values(rankPlayerArray[i].rankData, fb_rankdata); + set_rankdata_values(rankPlayerArray[i].rankData, pb_rankdata); } } else { if (tdata->deprecated) { - set_rankdata_values(rankArray_deprecated[i], fb_rankdata); + set_rankdata_values(rankArray_deprecated[i], pb_rankdata); } else { - set_rankdata_values(rankArray[i], fb_rankdata); + set_rankdata_values(rankArray[i], pb_rankdata); } } } if (tdata->commentArray) { - ensure(resp->commentArray() && resp->commentArray()->size() <= tdata->arrayNum); + ensure(static_cast(resp->commentarray_size()) <= tdata->arrayNum); memset(tdata->commentArray.get_ptr(), 0, sizeof(SceNpScoreComment) * tdata->arrayNum); - auto* fb_commentarray = resp->commentArray(); - for (flatbuffers::uoffset_t i = 0; i < fb_commentarray->size(); i++) + for (int i = 0; i < resp->commentarray_size(); i++) { - const auto* fb_comment = fb_commentarray->Get(i); - strcpy_trunc(tdata->commentArray[i].data, fb_comment->string_view()); + const auto& pb_comment = resp->commentarray(i); + strcpy_trunc(tdata->commentArray[i].data, pb_comment); } } if (tdata->infoArray) { - ensure(resp->infoArray() && resp->infoArray()->size() <= tdata->arrayNum); - auto* fb_infoarray = resp->infoArray(); + ensure(static_cast(resp->infoarray_size()) <= tdata->arrayNum); if ((tdata->arrayNum * sizeof(SceNpScoreGameInfo)) == tdata->infoArraySize) { vm::ptr ptr_gameinfo = vm::static_ptr_cast(tdata->infoArray); memset(ptr_gameinfo.get_ptr(), 0, sizeof(SceNpScoreGameInfo) * tdata->arrayNum); - for (flatbuffers::uoffset_t i = 0; i < fb_infoarray->size(); i++) + for (int i = 0; i < resp->infoarray_size(); i++) { - const auto* fb_info = fb_infoarray->Get(i); - ensure(fb_info->data()->size() <= SCE_NP_SCORE_GAMEINFO_SIZE); - memcpy(ptr_gameinfo[i].nativeData, fb_info->data()->data(), fb_info->data()->size()); + const auto& pb_info = resp->infoarray(i); + ensure(pb_info.data().size() <= SCE_NP_SCORE_GAMEINFO_SIZE); + memcpy(ptr_gameinfo[i].nativeData, pb_info.data().data(), pb_info.data().size()); } } else { vm::ptr ptr_vargameinfo = vm::static_ptr_cast(tdata->infoArray); memset(ptr_vargameinfo.get_ptr(), 0, sizeof(SceNpScoreVariableSizeGameInfo) * tdata->arrayNum); - for (flatbuffers::uoffset_t i = 0; i < fb_infoarray->size(); i++) + for (int i = 0; i < resp->infoarray_size(); i++) { - const auto* fb_info = fb_infoarray->Get(i); - ensure(fb_info->data()->size() <= SCE_NP_SCORE_VARIABLE_SIZE_GAMEINFO_MAXSIZE); - ptr_vargameinfo[i].infoSize = fb_info->data()->size(); - memcpy(ptr_vargameinfo[i].data, fb_info->data(), fb_info->data()->size()); + const auto& pb_info = resp->infoarray(i); + ensure(pb_info.data().size() <= SCE_NP_SCORE_VARIABLE_SIZE_GAMEINFO_MAXSIZE); + ptr_vargameinfo[i].infoSize = ::narrow(pb_info.data().size()); + memcpy(ptr_vargameinfo[i].data, pb_info.data().data(), pb_info.data().size()); } } } - tdata->lastSortDate->tick = resp->lastSortDate(); - *tdata->totalRecord = resp->totalRecord(); + tdata->lastSortDate->tick = resp->lastsortdate(); + *tdata->totalRecord = resp->totalrecord(); if (num_scores_registered) - score_trans->result = simple_result ? CELL_OK : not_an_error(fb_rankarray->size()); + score_trans->result = simple_result ? CELL_OK : not_an_error(resp->rankarray_size()); else score_trans->result = SCE_NP_COMMUNITY_SERVER_ERROR_GAME_RANKING_NOT_FOUND; @@ -1446,39 +1443,37 @@ namespace np default: fmt::throw_exception("Unexpected error in handle_TusVarResponse: %d", static_cast(error)); } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Error parsing response in handle_TusVarResponse"); const auto* tdata = std::get_if(&tus_trans->tdata); ensure(tdata); - ensure(resp->vars() && resp->vars()->size() <= static_cast(tdata->arrayNum)); - - const auto* fb_vars = resp->vars(); + ensure(static_cast(resp->vars_size()) <= static_cast(tdata->arrayNum)); memset(tdata->variableArray.get_ptr(), 0, sizeof(SceNpTusVariable) * tdata->arrayNum); - for (flatbuffers::uoffset_t i = 0; i < fb_vars->size(); i++) + for (int i = 0; i < resp->vars_size(); i++) { auto* cur_var = &tdata->variableArray[i]; - const auto* cur_fb_var = fb_vars->Get(i); + const auto& cur_pb_var = resp->vars(i); - ensure(cur_fb_var->ownerId()); - string_to_npid(cur_fb_var->ownerId()->string_view(), cur_var->ownerId); + ensure(!cur_pb_var.ownerid().empty()); + string_to_npid(cur_pb_var.ownerid(), cur_var->ownerId); - if (!cur_fb_var->hasData()) + if (!cur_pb_var.hasdata()) { continue; } - ensure(cur_fb_var->lastChangedAuthorId()); + ensure(!cur_pb_var.lastchangedauthorid().empty()); cur_var->hasData = 1; - cur_var->lastChangedDate.tick = cur_fb_var->lastChangedDate(); - string_to_npid(cur_fb_var->lastChangedAuthorId()->string_view(), cur_var->lastChangedAuthorId); - cur_var->variable = cur_fb_var->variable(); - cur_var->oldVariable = cur_fb_var->oldVariable(); + cur_var->lastChangedDate.tick = cur_pb_var.lastchangeddate(); + string_to_npid(cur_pb_var.lastchangedauthorid(), cur_var->lastChangedAuthorId); + cur_var->variable = cur_pb_var.variable(); + cur_var->oldVariable = cur_pb_var.oldvariable(); } - tus_trans->result = not_an_error(fb_vars->size()); + tus_trans->result = not_an_error(resp->vars_size()); tus_trans->wake_cond.notify_one(); } @@ -1504,7 +1499,7 @@ namespace np default: fmt::throw_exception("Unexpected error in handle_TusVariable: %d", static_cast(error)); } - const auto* fb_var = reply.get_flatbuffer(); + auto pb_var = reply.get_protobuf(); ensure(!reply.is_error(), "Error parsing response in handle_TusVariable"); const auto* tdata = std::get_if(&tus_trans->tdata); @@ -1513,17 +1508,17 @@ namespace np auto* var = tdata->outVariable.get_ptr(); memset(var, 0, sizeof(SceNpTusVariable)); - ensure(fb_var->ownerId()); - string_to_npid(fb_var->ownerId()->string_view(), var->ownerId); + ensure(!pb_var->ownerid().empty()); + string_to_npid(pb_var->ownerid(), var->ownerId); - if (fb_var->hasData()) + if (pb_var->hasdata()) { - ensure(fb_var->lastChangedAuthorId()); + ensure(!pb_var->lastchangedauthorid().empty()); var->hasData = 1; - var->lastChangedDate.tick = fb_var->lastChangedDate(); - string_to_npid(fb_var->lastChangedAuthorId()->string_view(), var->lastChangedAuthorId); - var->variable = fb_var->variable(); - var->oldVariable = fb_var->oldVariable(); + var->lastChangedDate.tick = pb_var->lastchangeddate(); + string_to_npid(pb_var->lastchangedauthorid(), var->lastChangedAuthorId); + var->variable = pb_var->variable(); + var->oldVariable = pb_var->oldvariable(); } tus_trans->result = CELL_OK; @@ -1552,42 +1547,37 @@ namespace np default: fmt::throw_exception("Unexpected error in handle_TusDataStatusResponse: %d", static_cast(error)); } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Error parsing response in handle_TusDataStatusReponse"); const auto* tdata = std::get_if(&tus_trans->tdata); ensure(tdata); - ensure(resp->status() && resp->status()->size() <= static_cast(tdata->arrayNum)); - - const auto* fb_status = resp->status(); + ensure(static_cast(resp->status_size()) <= static_cast(tdata->arrayNum)); memset(tdata->statusArray.get_ptr(), 0, sizeof(SceNpTusDataStatus) * tdata->arrayNum); - for (flatbuffers::uoffset_t i = 0; i < fb_status->size(); i++) + for (int i = 0; i < resp->status_size(); i++) { auto* cur_status = &tdata->statusArray[i]; - const auto* cur_fb_status = fb_status->Get(i); + const auto& cur_pb_status = resp->status(i); - ensure(cur_fb_status->ownerId()); - string_to_npid(cur_fb_status->ownerId()->string_view(), cur_status->ownerId); + ensure(!cur_pb_status.ownerid().empty()); + string_to_npid(cur_pb_status.ownerid(), cur_status->ownerId); - if (!cur_fb_status->hasData()) + if (!cur_pb_status.hasdata()) { continue; } - ensure(cur_fb_status->lastChangedAuthorId()); + ensure(!cur_pb_status.lastchangedauthorid().empty()); cur_status->hasData = 1; - cur_status->lastChangedDate.tick = cur_fb_status->lastChangedDate(); - string_to_npid(cur_fb_status->lastChangedAuthorId()->string_view(), cur_status->lastChangedAuthorId); - cur_status->info.infoSize = cur_fb_status->info() ? cur_fb_status->info()->size() : 0; - for (flatbuffers::uoffset_t i = 0; i < cur_status->info.infoSize; i++) - { - cur_status->info.data[i] = cur_fb_status->info()->Get(i); - } + cur_status->lastChangedDate.tick = cur_pb_status.lastchangeddate(); + string_to_npid(cur_pb_status.lastchangedauthorid(), cur_status->lastChangedAuthorId); + cur_status->info.infoSize = ::narrow(cur_pb_status.info().size()); + memcpy(cur_status->info.data, cur_pb_status.info().data(), cur_pb_status.info().size()); } - tus_trans->result = not_an_error(fb_status->size()); + tus_trans->result = not_an_error(resp->status_size()); tus_trans->wake_cond.notify_one(); } @@ -1798,48 +1788,39 @@ namespace np default: fmt::throw_exception("Unexpected error in reply to TusGetData: %d", static_cast(error)); } - const auto* fb_data = reply.get_flatbuffer(); + auto pb_data = reply.get_protobuf(); ensure(!reply.is_error(), "Error parsing response in reply_tus_get_data"); auto* tdata = std::get_if(&tus_trans->tdata); ensure(tdata); - const auto* fb_status = fb_data->status(); - ensure(fb_status && fb_status->ownerId()); - if (!fb_status) - return; // Sanity check to make compiler happy + ensure(pb_data->has_status() && !pb_data->status().ownerid().empty()); + const auto& pb_status = pb_data->status(); auto* data_status = tdata->dataStatus.get_ptr(); auto* data = static_cast(tdata->data.get_ptr()); memset(data_status, 0, sizeof(SceNpTusDataStatus)); - string_to_npid(fb_status->ownerId()->string_view(), data_status->ownerId); + string_to_npid(pb_status.ownerid(), data_status->ownerId); - if (fb_status->hasData()) + if (pb_status.hasdata()) { data_status->hasData = 1; - data_status->lastChangedDate.tick = fb_status->lastChangedDate(); - string_to_npid(fb_status->lastChangedAuthorId()->string_view(), data_status->lastChangedAuthorId); + data_status->lastChangedDate.tick = pb_status.lastchangeddate(); + string_to_npid(pb_status.lastchangedauthorid(), data_status->lastChangedAuthorId); data_status->data = tdata->data; - data_status->dataSize = fb_data->data() ? fb_data->data()->size() : 0; - data_status->info.infoSize = fb_status->info() ? fb_status->info()->size() : 0; - + data_status->dataSize = ::narrow(pb_data->data().size()); + data_status->info.infoSize = ::narrow(pb_status.info().size()); + const u32 to_copy = std::min(data_status->dataSize, tdata->recvSize); - for (flatbuffers::uoffset_t i = 0; i < to_copy; i++) - { - data[i] = fb_data->data()->Get(i); - } + memcpy(data, pb_data->data().data(), to_copy); + const u32 bytes_left = data_status->dataSize - to_copy; - tdata->tus_data.reserve(bytes_left); - for (flatbuffers::uoffset_t i = to_copy; i < bytes_left; i++) + if (bytes_left > 0) { - tdata->tus_data.push_back(fb_data->data()->Get(i)); + tdata->tus_data.assign(pb_data->data().begin() + to_copy, pb_data->data().end()); } - for (flatbuffers::uoffset_t i = 0; i < data_status->info.infoSize; i++) - { - fb_status->info()->Get(i); - } tus_trans->result = not_an_error(to_copy); } else diff --git a/rpcs3/Emu/NP/np_requests_gui.cpp b/rpcs3/Emu/NP/np_requests_gui.cpp index 7782287053..be6026afa6 100644 --- a/rpcs3/Emu/NP/np_requests_gui.cpp +++ b/rpcs3/Emu/NP/np_requests_gui.cpp @@ -6,7 +6,7 @@ #include "np_handler.h" #include "np_contexts.h" #include "np_structs_extra.h" -#include "fb_helpers.h" +#include "pb_helpers.h" LOG_CHANNEL(rpcn_log, "rpcn"); @@ -165,12 +165,12 @@ namespace np return; ensure(error == rpcn::ErrorType::NoError, "Unexpected error in CreateRoomGUI reply"); - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to CreateRoomGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingJoinedRoomInfo_SIZE), sizeof(SceNpMatchingJoinedRoomInfo), MAX_SceNpMatchingJoinedRoomInfo_SIZE); auto* room_info = reinterpret_cast(edata.data()); - MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(edata, resp, room_info); + MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(edata, *resp, room_info); np_memory.shrink_allocation(edata.addr(), edata.size()); gui_cache.add_room(room_info->room_status.id); @@ -230,12 +230,12 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to JoinRoomGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingJoinedRoomInfo_SIZE), sizeof(SceNpMatchingJoinedRoomInfo), MAX_SceNpMatchingJoinedRoomInfo_SIZE); auto* room_info = reinterpret_cast(edata.data()); - MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(edata, resp, room_info); + MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(edata, *resp, room_info); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatchingJoinedRoomInfo(room_info); @@ -291,12 +291,12 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to LeaveRoomGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingRoomStatus_SIZE), sizeof(SceNpMatchingRoomStatus), MAX_SceNpMatchingRoomStatus_SIZE); auto* room_status = reinterpret_cast(edata.data()); - MatchingRoomStatus_to_SceNpMatchingRoomStatus(edata, resp, room_status); + MatchingRoomStatus_to_SceNpMatchingRoomStatus(edata, *resp, room_status); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatchingRoomStatus(room_status); @@ -343,12 +343,12 @@ namespace np return; ensure(error == rpcn::ErrorType::NoError, "Unexpected error in GetRoomListGUI reply"); - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to GetRoomListGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingRoomList_SIZE), sizeof(SceNpMatchingRoomList), MAX_SceNpMatchingRoomList_SIZE); auto* room_list = reinterpret_cast(edata.data()); - MatchingRoomList_to_SceNpMatchingRoomList(edata, resp, room_list); + MatchingRoomList_to_SceNpMatchingRoomList(edata, *resp, room_list); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatchingRoomList(room_list); @@ -443,12 +443,12 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to GetRoomSearchFlagGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingRoom_SIZE), sizeof(SceNpMatchingRoom), MAX_SceNpMatchingRoom_SIZE); auto* room_info = reinterpret_cast(edata.data()); - MatchingRoom_to_SceNpMatchingRoom(edata, resp, room_info); + MatchingRoom_to_SceNpMatchingRoom(edata, *resp, room_info); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatchingRoom(room_info); @@ -538,12 +538,12 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to GetRoomInfoGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingRoom_SIZE), sizeof(SceNpMatchingRoom), MAX_SceNpMatchingRoom_SIZE); auto* room_info = reinterpret_cast(edata.data()); - MatchingRoom_to_SceNpMatchingRoom(edata, resp, room_info); + MatchingRoom_to_SceNpMatchingRoom(edata, *resp, room_info); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatchingRoom(room_info); @@ -576,12 +576,12 @@ namespace np return; ensure(error == rpcn::ErrorType::NoError, "Unexpected error in QuickMatchGUI reply"); - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to QuickMatchGUI command"); SceNpRoomId room_id{}; - ensure(resp->id() && resp->id()->size() == sizeof(SceNpRoomId::opt)); - std::memcpy(room_id.opt, resp->id()->data(), sizeof(SceNpRoomId::opt)); + ensure(!resp->id().empty() && resp->id().size() == sizeof(SceNpRoomId::opt)); + std::memcpy(room_id.opt, resp->id().data(), sizeof(SceNpRoomId::opt)); const auto [_, inserted] = pending_quickmatching.insert_or_assign(room_id, ctx->ctx_id); ensure(inserted); @@ -657,12 +657,12 @@ namespace np return; } - const auto* resp = reply.get_flatbuffer(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to SearchJoinRoomGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingSearchJoinRoomInfo_SIZE), sizeof(SceNpMatchingSearchJoinRoomInfo), MAX_SceNpMatchingSearchJoinRoomInfo_SIZE); auto* room_info = reinterpret_cast(edata.data()); - MatchingSearchJoinRoomInfo_to_SceNpMatchingSearchJoinRoomInfo(edata, resp, room_info); + MatchingSearchJoinRoomInfo_to_SceNpMatchingSearchJoinRoomInfo(edata, *resp, room_info); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_SceNpMatchingSearchJoinRoomInfo(room_info); diff --git a/rpcs3/Emu/NP/pb_helpers.cpp b/rpcs3/Emu/NP/pb_helpers.cpp new file mode 100644 index 0000000000..c00eed8496 --- /dev/null +++ b/rpcs3/Emu/NP/pb_helpers.cpp @@ -0,0 +1,635 @@ +#include "stdafx.h" +#include "Emu/Cell/lv2/sys_process.h" +#include "pb_helpers.h" + +LOG_CHANNEL(rpcn_log, "rpcn"); + +namespace np +{ + void BinAttr_to_SceNpMatching2BinAttr(event_data& edata, const np2_structs::BinAttr& bin_attr, SceNpMatching2BinAttr* binattr_info) + { + binattr_info->id = bin_attr.id().value(); + binattr_info->size = ::narrow(bin_attr.data().size()); + auto* ptr = edata.allocate(binattr_info->size, binattr_info->ptr); + memcpy(ptr, bin_attr.data().data(), bin_attr.data().size()); + } + + void BinAttrs_to_SceNpMatching2BinAttrs(event_data& edata, const google::protobuf::RepeatedPtrField& pb_attrs, SceNpMatching2BinAttr* binattr_info) + { + for (int i = 0; i < pb_attrs.size(); i++) + { + const auto& cur_pb_attr = pb_attrs.Get(i); + auto* cur_binattr = binattr_info + i; + + BinAttr_to_SceNpMatching2BinAttr(edata, cur_pb_attr, cur_binattr); + } + } + + void RoomMemberBinAttrInternal_to_SceNpMatching2RoomMemberBinAttrInternal(event_data& edata, const np2_structs::RoomMemberBinAttrInternal& pb_attr, SceNpMatching2RoomMemberBinAttrInternal* binattr_info) + { + binattr_info->updateDate.tick = pb_attr.updatedate(); + BinAttr_to_SceNpMatching2BinAttr(edata, pb_attr.data(), &binattr_info->data); + } + + void RoomBinAttrInternal_to_SceNpMatching2RoomBinAttrInternal(event_data& edata, const np2_structs::BinAttrInternal& pb_attr, SceNpMatching2RoomBinAttrInternal* binattr_info) + { + binattr_info->updateDate.tick = pb_attr.updatedate(); + binattr_info->updateMemberId = pb_attr.updatememberid().value(); + BinAttr_to_SceNpMatching2BinAttr(edata, pb_attr.data(), &binattr_info->data); + } + + void RoomGroup_to_SceNpMatching2RoomGroup(const np2_structs::RoomGroup& pb_group, SceNpMatching2RoomGroup* sce_group) + { + sce_group->groupId = pb_group.groupid().value(); + sce_group->withPassword = pb_group.withpassword(); + sce_group->withLabel = !pb_group.label().empty(); + if (!pb_group.label().empty()) + { + const auto& label = pb_group.label(); + for (usz l_index = 0; l_index < label.size() && l_index < sizeof(sce_group->label.data); l_index++) + { + sce_group->label.data[l_index] = static_cast(label[l_index]); + } + } + sce_group->slotNum = pb_group.slotnum(); + sce_group->curGroupMemberNum = pb_group.curgroupmembernum(); + } + + void RoomGroups_to_SceNpMatching2RoomGroups(const google::protobuf::RepeatedPtrField& pb_groups, SceNpMatching2RoomGroup* sce_groups) + { + for (int i = 0; i < pb_groups.size(); i++) + { + const auto& pb_group = pb_groups.Get(i); + SceNpMatching2RoomGroup* sce_group = &sce_groups[i]; + RoomGroup_to_SceNpMatching2RoomGroup(pb_group, sce_group); + } + } + + void UserInfo_to_SceNpUserInfo(const np2_structs::UserInfo& user, SceNpUserInfo* user_info) + { + if (!user.npid().empty()) + { + std::memcpy(user_info->userId.handle.data, user.npid().c_str(), std::min(16, user.npid().size())); + } + + if (!user.onlinename().empty()) + { + std::memcpy(user_info->name.data, user.onlinename().c_str(), std::min(48, user.onlinename().size())); + } + + if (!user.avatarurl().empty()) + { + std::memcpy(user_info->icon.data, user.avatarurl().c_str(), std::min(127, user.avatarurl().size())); + } + } + + void UserInfo_to_SceNpUserInfo2(event_data& edata, const np2_structs::UserInfo& user, SceNpUserInfo2* user_info, bool include_onlinename, bool include_avatarurl) + { + if (!user.npid().empty()) + std::memcpy(user_info->npId.handle.data, user.npid().c_str(), std::min(16, user.npid().size())); + + if (include_onlinename && !user.onlinename().empty()) + { + auto* ptr = edata.allocate(sizeof(SceNpOnlineName), user_info->onlineName); + std::memcpy(ptr->data, user.onlinename().c_str(), std::min(48, user.onlinename().size())); + } + if (include_avatarurl && !user.avatarurl().empty()) + { + auto* ptr = edata.allocate(sizeof(SceNpAvatarUrl), user_info->avatarUrl); + std::memcpy(ptr->data, user.avatarurl().c_str(), std::min(127, user.avatarurl().size())); + } + } + + void RoomDataExternal_to_SceNpMatching2RoomDataExternal(event_data& edata, const np2_structs::RoomDataExternal& room, SceNpMatching2RoomDataExternal* room_info, bool include_onlinename, bool include_avatarurl) + { + room_info->serverId = room.serverid().value(); + room_info->worldId = room.worldid(); + room_info->lobbyId = room.lobbyid(); + room_info->roomId = room.roomid(); + room_info->maxSlot = room.maxslot().value(); + room_info->curMemberNum = room.curmembernum().value(); + room_info->passwordSlotMask = room.passwordslotmask(); + + s32 sdk_ver; + process_get_sdk_version(process_getpid(), sdk_ver); + + // Structure changed in sdk 3.3.0 + if (sdk_ver >= 0x330000) + { + room_info->publicSlotNum = room.publicslotnum().value(); + room_info->privateSlotNum = room.privateslotnum().value(); + room_info->openPublicSlotNum = room.openpublicslotnum().value(); + room_info->openPrivateSlotNum = room.openprivateslotnum().value(); + } + else + { + room_info->publicSlotNum = 0; + room_info->privateSlotNum = 0; + room_info->openPublicSlotNum = 0; + room_info->openPrivateSlotNum = 0; + } + + if (room.has_owner()) + { + auto* ptr_owner = edata.allocate(sizeof(SceNpUserInfo2), room_info->owner); + UserInfo_to_SceNpUserInfo2(edata, room.owner(), ptr_owner, include_onlinename, include_avatarurl); + } + + if (room.roomgroup_size() != 0) + { + room_info->roomGroupNum = room.roomgroup_size(); + auto* ptr_groups = edata.allocate(sizeof(SceNpMatching2RoomGroup) * room_info->roomGroupNum, room_info->roomGroup); + RoomGroups_to_SceNpMatching2RoomGroups(room.roomgroup(), ptr_groups); + } + + room_info->flagAttr = room.flagattr(); + + if (room.roomsearchableintattrexternal_size() != 0) + { + room_info->roomSearchableIntAttrExternalNum = room.roomsearchableintattrexternal_size(); + auto* ptr_int_attr = edata.allocate(sizeof(SceNpMatching2IntAttr) * room_info->roomSearchableIntAttrExternalNum, room_info->roomSearchableIntAttrExternal); + for (int a_index = 0; a_index < room.roomsearchableintattrexternal_size(); a_index++) + { + const auto& pb_int_attr = room.roomsearchableintattrexternal(a_index); + ptr_int_attr[a_index].id = pb_int_attr.id().value(); + ptr_int_attr[a_index].num = pb_int_attr.num(); + } + } + + if (room.roomsearchablebinattrexternal_size() != 0) + { + room_info->roomSearchableBinAttrExternalNum = room.roomsearchablebinattrexternal_size(); + auto* ptr_bin_attr = edata.allocate(sizeof(SceNpMatching2BinAttr) * room_info->roomSearchableBinAttrExternalNum, room_info->roomSearchableBinAttrExternal); + BinAttrs_to_SceNpMatching2BinAttrs(edata, room.roomsearchablebinattrexternal(), ptr_bin_attr); + } + + if (room.roombinattrexternal_size() != 0) + { + room_info->roomBinAttrExternalNum = room.roombinattrexternal_size(); + auto* ptr_bin_attr = edata.allocate(sizeof(SceNpMatching2BinAttr) * room_info->roomBinAttrExternalNum, room_info->roomBinAttrExternal); + BinAttrs_to_SceNpMatching2BinAttrs(edata, room.roombinattrexternal(), ptr_bin_attr); + } + } + + void SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(event_data& edata, const np2_structs::SearchRoomResponse& resp, SceNpMatching2SearchRoomResponse* search_resp) + { + search_resp->range.size = resp.rooms_size(); + search_resp->range.startIndex = resp.startindex(); + search_resp->range.total = resp.total(); + + SceNpMatching2RoomDataExternal* prev_room = nullptr; + for (int i = 0; i < resp.rooms_size(); i++) + { + const auto& pb_room = resp.rooms(i); + SceNpMatching2RoomDataExternal* cur_room; + cur_room = edata.allocate(sizeof(SceNpMatching2RoomDataExternal), (i > 0) ? prev_room->next : search_resp->roomDataExternal); + RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, pb_room, cur_room, true, true); + prev_room = cur_room; + } + } + + void GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(event_data& edata, const np2_structs::GetRoomDataExternalListResponse& resp, SceNpMatching2GetRoomDataExternalListResponse* get_resp, bool include_onlinename, bool include_avatarurl) + { + get_resp->roomDataExternalNum = resp.rooms_size(); + + SceNpMatching2RoomDataExternal* prev_room = nullptr; + for (int i = 0; i < resp.rooms_size(); i++) + { + const auto& pb_room = resp.rooms(i); + SceNpMatching2RoomDataExternal* cur_room; + + cur_room = edata.allocate(sizeof(SceNpMatching2RoomDataExternal), (i > 0) ? prev_room->next : get_resp->roomDataExternal); + + RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, pb_room, cur_room, include_onlinename, include_avatarurl); + prev_room = cur_room; + } + } + + u16 RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const np2_structs::RoomDataInternal& resp, SceNpMatching2RoomDataInternal* room_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl) + { + u16 member_id = 0; + room_info->serverId = resp.serverid().value(); + room_info->worldId = resp.worldid(); + room_info->lobbyId = resp.lobbyid(); + room_info->roomId = resp.roomid(); + room_info->passwordSlotMask = resp.passwordslotmask(); + room_info->maxSlot = resp.maxslot(); + + if (resp.roomgroup_size() != 0) + { + room_info->roomGroupNum = resp.roomgroup_size(); + auto* ptr_groups = edata.allocate(sizeof(SceNpMatching2RoomGroup) * room_info->roomGroupNum, room_info->roomGroup); + RoomGroups_to_SceNpMatching2RoomGroups(resp.roomgroup(), ptr_groups); + } + + room_info->memberList.membersNum = static_cast(resp.memberlist_size()); + edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal) * room_info->memberList.membersNum, room_info->memberList.members); + + for (int i = 0; i < resp.memberlist_size(); i++) + { + const auto& pb_member = resp.memberlist(i); + SceNpMatching2RoomMemberDataInternal* sce_member = &room_info->memberList.members[i]; + + if (i < (resp.memberlist_size() - 1)) + { + sce_member->next = room_info->memberList.members + i + 1; + edata.add_relocation(sce_member->next); + } + + RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, pb_member, room_info, sce_member, include_onlinename, include_avatarurl); + } + + for (u32 i = 0; i < room_info->memberList.membersNum; i++) + { + SceNpMatching2RoomMemberDataInternal* sce_member = &room_info->memberList.members[i]; + if (strcmp(sce_member->userInfo.npId.handle.data, npid.handle.data) == 0) + { + room_info->memberList.me = room_info->memberList.members + i; + edata.add_relocation(room_info->memberList.me); + member_id = sce_member->memberId; + break; + } + } + + for (u32 i = 0; i < room_info->memberList.membersNum; i++) + { + SceNpMatching2RoomMemberDataInternal* sce_member = &room_info->memberList.members[i]; + if (sce_member->memberId == resp.ownerid().value()) + { + room_info->memberList.owner = room_info->memberList.members + i; + edata.add_relocation(room_info->memberList.owner); + break; + } + } + + room_info->flagAttr = resp.flagattr(); + + if (resp.roombinattrinternal_size() != 0) + { + room_info->roomBinAttrInternalNum = resp.roombinattrinternal_size(); + auto* ptr_bin_attr = edata.allocate(sizeof(SceNpMatching2RoomBinAttrInternal) * room_info->roomBinAttrInternalNum, room_info->roomBinAttrInternal); + + for (u32 b_index = 0; b_index < room_info->roomBinAttrInternalNum; b_index++) + { + const auto& pb_bin_attr = resp.roombinattrinternal(b_index); + ptr_bin_attr[b_index].updateDate.tick = pb_bin_attr.updatedate(); + ptr_bin_attr[b_index].updateMemberId = pb_bin_attr.updatememberid().value(); + + ptr_bin_attr[b_index].data.id = pb_bin_attr.data().id().value(); + ptr_bin_attr[b_index].data.size = ::narrow(pb_bin_attr.data().data().size()); + auto* ptr_bin_attr_data = edata.allocate(ptr_bin_attr[b_index].data.size, ptr_bin_attr[b_index].data.ptr); + memcpy(ptr_bin_attr_data, pb_bin_attr.data().data().data(), pb_bin_attr.data().data().size()); + } + } + + return member_id; + } + + void RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(event_data& edata, const np2_structs::RoomMemberDataInternal& member_data, const SceNpMatching2RoomDataInternal* room_info, SceNpMatching2RoomMemberDataInternal* sce_member_data, bool include_onlinename, bool include_avatarurl) + { + UserInfo_to_SceNpUserInfo2(edata, member_data.userinfo(), &sce_member_data->userInfo, include_onlinename, include_avatarurl); + sce_member_data->joinDate.tick = member_data.joindate(); + sce_member_data->memberId = member_data.memberid(); + sce_member_data->teamId = member_data.teamid().value(); + + if (member_data.has_roomgroup()) + { + const auto& pb_roomgroup = member_data.roomgroup(); + if (room_info) + { + // If we have SceNpMatching2RoomDataInternal available we point the pointers to the group there + sce_member_data->roomGroup = room_info->roomGroup + (pb_roomgroup.groupid().value() - 1); + edata.add_relocation(sce_member_data->roomGroup); + } + else + { + // Otherwise we allocate for it + auto* ptr_group = edata.allocate(sizeof(SceNpMatching2RoomGroup), sce_member_data->roomGroup); + RoomGroup_to_SceNpMatching2RoomGroup(pb_roomgroup, ptr_group); + } + } + + sce_member_data->natType = member_data.nattype().value(); + sce_member_data->flagAttr = member_data.flagattr(); + + if (member_data.roommemberbinattrinternal_size() != 0) + { + sce_member_data->roomMemberBinAttrInternalNum = member_data.roommemberbinattrinternal_size(); + auto* sce_binattrs = edata.allocate(sizeof(SceNpMatching2RoomMemberBinAttrInternal) * sce_member_data->roomMemberBinAttrInternalNum, sce_member_data->roomMemberBinAttrInternal); + for (u32 b_index = 0; b_index < sce_member_data->roomMemberBinAttrInternalNum; b_index++) + { + const auto& pb_battr = member_data.roommemberbinattrinternal(b_index); + sce_binattrs[b_index].updateDate.tick = pb_battr.updatedate(); + + sce_binattrs[b_index].data.id = pb_battr.data().id().value(); + sce_binattrs[b_index].data.size = ::narrow(pb_battr.data().data().size()); + auto* sce_binattr_data = edata.allocate(sce_binattrs[b_index].data.size, sce_binattrs[b_index].data.ptr); + memcpy(sce_binattr_data, pb_battr.data().data().data(), pb_battr.data().data().size()); + } + } + } + + void RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(event_data& edata, const np2_structs::RoomMemberUpdateInfo& update_info, SceNpMatching2RoomMemberUpdateInfo* sce_update_info, bool include_onlinename, bool include_avatarurl) + { + sce_update_info->eventCause = 0; + if (update_info.has_optdata()) + { + const auto& opt_data = update_info.optdata(); + sce_update_info->optData.length = ::narrow(opt_data.data().size()); + for (usz i = 0; i < 16 && i < opt_data.data().size(); i++) + { + sce_update_info->optData.data[i] = static_cast(opt_data.data()[i]); + } + } + + if (update_info.has_roommemberdatainternal()) + { + const auto& pb_member = update_info.roommemberdatainternal(); + auto* ptr_roomemberinternal = edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal), sce_update_info->roomMemberDataInternal); + + // TODO: Pass room_info + RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, pb_member, nullptr, ptr_roomemberinternal, include_onlinename, include_avatarurl); + } + } + + void RoomUpdateInfo_to_SceNpMatching2RoomUpdateInfo(const np2_structs::RoomUpdateInfo& update_info, SceNpMatching2RoomUpdateInfo* sce_update_info) + { + sce_update_info->errorCode = 0; + sce_update_info->eventCause = 0; + if (update_info.has_optdata()) + { + const auto& opt_data = update_info.optdata(); + sce_update_info->optData.length = ::narrow(opt_data.data().size()); + for (usz i = 0; i < 16 && i < opt_data.data().size(); i++) + { + sce_update_info->optData.data[i] = static_cast(opt_data.data()[i]); + } + } + } + + void RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(event_data& edata, const np2_structs::RoomDataInternalUpdateInfo& update_info, SceNpMatching2RoomDataInternalUpdateInfo* sce_update_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl) + { + auto* sce_room_data = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), sce_update_info->newRoomDataInternal); + RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, update_info.newroomdatainternal(), sce_room_data, npid, include_onlinename, include_avatarurl); + + if (sce_room_data->flagAttr != update_info.prevflagattr()) + { + sce_update_info->newFlagAttr = sce_update_info->newRoomDataInternal.ptr(&SceNpMatching2RoomDataInternal::flagAttr); + edata.add_relocation(sce_update_info->newFlagAttr); + auto* ptr_sce_prevflag = edata.allocate(sizeof(SceNpMatching2FlagAttr), sce_update_info->prevFlagAttr); + *ptr_sce_prevflag = update_info.prevflagattr(); + } + + if (sce_room_data->passwordSlotMask != update_info.prevroompasswordslotmask()) + { + sce_update_info->newRoomPasswordSlotMask = sce_update_info->newRoomDataInternal.ptr(&SceNpMatching2RoomDataInternal::passwordSlotMask); + edata.add_relocation(sce_update_info->newRoomPasswordSlotMask); + auto* ptr_sce_prevpass = edata.allocate(sizeof(SceNpMatching2RoomPasswordSlotMask), sce_update_info->prevRoomPasswordSlotMask); + *ptr_sce_prevpass = update_info.prevroompasswordslotmask(); + } + + if (!update_info.newroomgroup().empty()) + { + rpcn_log.todo("RoomDataInternalUpdateInfo::newRoomGroup"); + // TODO + // sce_update_info->newRoomGroupNum = update_info.newroomgroup().size(); + // vm::ptr group_info(allocate(sizeof(SceNpMatching2RoomGroup) * sce_update_info->newRoomGroupNum)); + // RoomGroups_to_SceNpMatching2RoomGroup(update_info.newroomgroup(), group_info); + // sce_update_info->newRoomGroup = group_info; + } + + if (update_info.newroombinattrinternal_size() != 0) + { + const auto get_ptr_for_binattr = [&](u16 binattr_id) -> vm::bptr + { + vm::bptr ret_ptr = sce_room_data->roomBinAttrInternal; + for (u32 i = 0; i < sce_room_data->roomBinAttrInternalNum; i++) + { + if (ret_ptr->data.id == binattr_id) + return ret_ptr; + + ret_ptr++; + } + rpcn_log.fatal("RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo: Couldn't find matching roomBinAttrInternal!"); + return vm::null; + }; + + sce_update_info->newRoomBinAttrInternalNum = update_info.newroombinattrinternal_size(); + edata.allocate_ptr_array(sce_update_info->newRoomBinAttrInternalNum, sce_update_info->newRoomBinAttrInternal); + for (u32 i = 0; i < sce_update_info->newRoomBinAttrInternalNum; i++) + { + sce_update_info->newRoomBinAttrInternal[i] = get_ptr_for_binattr(update_info.newroombinattrinternal(i).value()); + } + } + } + + void RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(event_data& edata, const np2_structs::RoomMemberDataInternalUpdateInfo& update_info, SceNpMatching2RoomMemberDataInternalUpdateInfo* sce_update_info, bool include_onlinename, bool include_avatarurl) + { + auto* sce_room_member_data = edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal), sce_update_info->newRoomMemberDataInternal); + RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, update_info.newroommemberdatainternal(), nullptr, sce_room_member_data, include_onlinename, include_avatarurl); + + if (sce_update_info->newRoomMemberDataInternal->flagAttr != update_info.prevflagattr()) + { + sce_update_info->newFlagAttr = sce_update_info->newRoomMemberDataInternal.ptr(&SceNpMatching2RoomMemberDataInternal::flagAttr); + edata.add_relocation(sce_update_info->newFlagAttr); + auto* ptr_sce_prevflag = edata.allocate(sizeof(SceNpMatching2FlagAttr), sce_update_info->prevFlagAttr); + *ptr_sce_prevflag = update_info.prevflagattr(); + } + + if (sce_update_info->newRoomMemberDataInternal->teamId != update_info.prevteamid().value()) + { + sce_update_info->newTeamId = sce_update_info->newRoomMemberDataInternal.ptr(&SceNpMatching2RoomMemberDataInternal::teamId); + edata.add_relocation(sce_update_info->newTeamId); + } + + if (update_info.newroommemberbinattrinternal_size() != 0) + { + const auto get_ptr_for_binattr = [&](u16 binattr_id) -> vm::bptr + { + vm::bptr ret_ptr = sce_room_member_data->roomMemberBinAttrInternal; + for (u32 i = 0; i < sce_room_member_data->roomMemberBinAttrInternalNum; i++) + { + if (ret_ptr->data.id == binattr_id) + return ret_ptr; + + ret_ptr++; + } + rpcn_log.fatal("RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo: Couldn't find matching roomMemberBinAttrInternal!"); + return vm::null; + }; + + sce_update_info->newRoomMemberBinAttrInternalNum = update_info.newroommemberbinattrinternal_size(); + edata.allocate_ptr_array(sce_update_info->newRoomMemberBinAttrInternalNum, sce_update_info->newRoomMemberBinAttrInternal); + for (u32 i = 0; i < sce_update_info->newRoomMemberBinAttrInternalNum; i++) + { + sce_update_info->newRoomMemberBinAttrInternal[i] = get_ptr_for_binattr(update_info.newroommemberbinattrinternal(i).value()); + } + } + } + + void GetPingInfoResponse_to_SceNpMatching2SignalingGetPingInfoResponse(const np2_structs::GetPingInfoResponse& resp, SceNpMatching2SignalingGetPingInfoResponse* sce_resp) + { + sce_resp->serverId = resp.serverid().value(); + sce_resp->worldId = resp.worldid(); + sce_resp->roomId = resp.roomid(); + sce_resp->rtt = resp.rtt(); + } + + void RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(event_data& edata, const np2_structs::RoomMessageInfo& mi, SceNpMatching2RoomMessageInfo* sce_mi, bool include_onlinename, bool include_avatarurl) + { + sce_mi->filtered = mi.filtered(); + sce_mi->castType = mi.casttype().value(); + + if (sce_mi->castType != SCE_NP_MATCHING2_CASTTYPE_BROADCAST) + { + edata.allocate(sizeof(SceNpMatching2RoomMessageDestination), sce_mi->dst); + } + + switch (sce_mi->castType) + { + case SCE_NP_MATCHING2_CASTTYPE_BROADCAST: break; + case SCE_NP_MATCHING2_CASTTYPE_UNICAST: sce_mi->dst->unicastTarget = mi.dst(0).value(); break; + case SCE_NP_MATCHING2_CASTTYPE_MULTICAST: + { + sce_mi->dst->multicastTarget.memberIdNum = mi.dst_size(); + edata.allocate(sizeof(u16) * mi.dst_size(), sce_mi->dst->multicastTarget.memberId); + for (int i = 0; i < mi.dst_size(); i++) + { + sce_mi->dst->multicastTarget.memberId[i] = mi.dst(i).value(); + } + break; + } + case SCE_NP_MATCHING2_CASTTYPE_MULTICAST_TEAM: sce_mi->dst->multicastTargetTeamId = ::narrow(mi.dst(0).value()); break; + default: ensure(false); + } + + if (mi.has_srcmember()) + { + auto* ptr_sce_userinfo = edata.allocate(sizeof(SceNpUserInfo2), sce_mi->srcMember); + UserInfo_to_SceNpUserInfo2(edata, mi.srcmember(), ptr_sce_userinfo, include_onlinename, include_avatarurl); + } + + if (!mi.msg().empty()) + { + sce_mi->msgLen = ::narrow(mi.msg().size()); + auto* ptr_msg_data = static_cast(edata.allocate(mi.msg().size(), sce_mi->msg)); + memcpy(ptr_msg_data, mi.msg().data(), mi.msg().size()); + } + } + + void MatchingRoomStatus_to_SceNpMatchingRoomStatus(event_data& edata, const np2_structs::MatchingRoomStatus& resp, SceNpMatchingRoomStatus* room_status) + { + const auto& vec_id = resp.id(); + ensure(vec_id.size() == 28, "Invalid room id in MatchingRoomStatus"); + + for (usz i = 0; i < 28; i++) + { + room_status->id.opt[i] = static_cast(vec_id[i]); + } + + // In some events the member list can be empty + if (resp.members_size() > 0) + { + room_status->num = resp.members_size(); + SceNpMatchingRoomMember* prev_member{}; + + for (int i = 0; i < resp.members_size(); i++) + { + auto* cur_member = edata.allocate(sizeof(SceNpMatchingRoomMember), (i > 0) ? prev_member->next : room_status->members); + const auto& member = resp.members(i); + ensure(member.has_info(), "Invalid member in MatchingRoomStatus list"); + + cur_member->owner = member.owner() ? 1 : 0; + UserInfo_to_SceNpUserInfo(member.info(), &cur_member->user_info); + + prev_member = cur_member; + } + } + + if (!resp.kick_actor().empty()) + { + auto* npid = edata.allocate(sizeof(SceNpId), room_status->kick_actor); + std::memcpy(npid->handle.data, resp.kick_actor().c_str(), std::min(16, resp.kick_actor().size())); + } + + if (!resp.opt().empty()) + { + room_status->opt_len = ::narrow(resp.opt().size()); + u8* opt_data = static_cast(edata.allocate(resp.opt().size(), room_status->opt)); + + memcpy(opt_data, resp.opt().data(), resp.opt().size()); + } + } + + void MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(event_data& edata, const np2_structs::MatchingRoomStatus& resp, SceNpMatchingJoinedRoomInfo* room_info) + { + // The use of SceNpLobbyId is unclear as it is never specified by the client except in further operations, so we always set it to a series of 0 and a 1 + room_info->lobbyid.opt[27] = 1; + MatchingRoomStatus_to_SceNpMatchingRoomStatus(edata, resp, &room_info->room_status); + } + + void MatchingAttr_to_SceNpMatchingAttr(event_data& edata, const google::protobuf::RepeatedPtrField& attr_list, vm::bptr& first_attr) + { + if (attr_list.size() > 0) + { + SceNpMatchingAttr* cur_attr = nullptr; + + for (int i_attr = 0; i_attr < attr_list.size(); i_attr++) + { + const auto& attr = attr_list.Get(i_attr); + cur_attr = edata.allocate(sizeof(SceNpMatchingAttr), cur_attr ? cur_attr->next : first_attr); + + cur_attr->type = attr.attr_type(); + cur_attr->id = attr.attr_id(); + if (!attr.data().empty()) + { + cur_attr->value.data.size = ::narrow(attr.data().size()); + u8* data_ptr = static_cast(edata.allocate(attr.data().size(), cur_attr->value.data.ptr)); + memcpy(data_ptr, attr.data().data(), attr.data().size()); + } + else + { + cur_attr->value.num = attr.num(); + } + } + } + } + + void MatchingRoom_to_SceNpMatchingRoom(event_data& edata, const np2_structs::MatchingRoom& resp, SceNpMatchingRoom* room) + { + ensure(room && resp.id().size() == sizeof(SceNpRoomId::opt)); + memcpy(room->id.opt, resp.id().data(), sizeof(SceNpRoomId::opt)); + MatchingAttr_to_SceNpMatchingAttr(edata, resp.attr(), room->attr); + } + + void MatchingRoomList_to_SceNpMatchingRoomList(event_data& edata, const np2_structs::MatchingRoomList& resp, SceNpMatchingRoomList* room_list) + { + // The use of SceNpLobbyId is unclear as it is never specified by the client except in further operations, so we always set it to a series of 0 and a 1 + room_list->lobbyid.opt[27] = 1; + room_list->range.start = resp.start(); + room_list->range.total = resp.total(); + + if (resp.rooms_size() > 0) + { + room_list->range.results = resp.rooms_size(); + + SceNpMatchingRoom* cur_room = nullptr; + + for (int i = 0; i < resp.rooms_size(); i++) + { + const auto& room = resp.rooms(i); + cur_room = edata.allocate(sizeof(SceNpMatchingRoom), cur_room ? cur_room->next : room_list->head); + MatchingRoom_to_SceNpMatchingRoom(edata, room, cur_room); + } + } + } + + void MatchingSearchJoinRoomInfo_to_SceNpMatchingSearchJoinRoomInfo(event_data& edata, const np2_structs::MatchingSearchJoinRoomInfo& resp, SceNpMatchingSearchJoinRoomInfo* room_info) + { + ensure(resp.has_room()); + room_info->lobbyid.opt[27] = 1; + MatchingRoomStatus_to_SceNpMatchingRoomStatus(edata, resp.room(), &room_info->room_status); + MatchingAttr_to_SceNpMatchingAttr(edata, resp.attr(), room_info->attr); + } + +} // namespace np diff --git a/rpcs3/Emu/NP/pb_helpers.h b/rpcs3/Emu/NP/pb_helpers.h new file mode 100644 index 0000000000..a11c092f9c --- /dev/null +++ b/rpcs3/Emu/NP/pb_helpers.h @@ -0,0 +1,35 @@ +#pragma once + +#include "Emu/Cell/Modules/sceNp.h" +#include "Emu/Cell/Modules/sceNp2.h" +#include "np_event_data.h" +#include "generated/np2_structs.pb.h" + +namespace np +{ + void BinAttr_to_SceNpMatching2BinAttr(event_data& edata, const np2_structs::BinAttr& bin_attr, SceNpMatching2BinAttr* binattr_info); + void BinAttrs_to_SceNpMatching2BinAttrs(event_data& edata, const google::protobuf::RepeatedPtrField& pb_attrs, SceNpMatching2BinAttr* binattr_info); + void RoomMemberBinAttrInternal_to_SceNpMatching2RoomMemberBinAttrInternal(event_data& edata, const np2_structs::RoomMemberBinAttrInternal& pb_attr, SceNpMatching2RoomMemberBinAttrInternal* binattr_info); + void RoomBinAttrInternal_to_SceNpMatching2RoomBinAttrInternal(event_data& edata, const np2_structs::BinAttrInternal& pb_attr, SceNpMatching2RoomBinAttrInternal* binattr_info); + void RoomGroup_to_SceNpMatching2RoomGroup(const np2_structs::RoomGroup& pb_group, SceNpMatching2RoomGroup* sce_group); + void RoomGroups_to_SceNpMatching2RoomGroups(const google::protobuf::RepeatedPtrField& pb_groups, SceNpMatching2RoomGroup* sce_groups); + void UserInfo_to_SceNpUserInfo(const np2_structs::UserInfo& user, SceNpUserInfo* user_info); + void UserInfo_to_SceNpUserInfo2(event_data& edata, const np2_structs::UserInfo& user, SceNpUserInfo2* user_info, bool include_onlinename, bool include_avatarurl); + void RoomDataExternal_to_SceNpMatching2RoomDataExternal(event_data& edata, const np2_structs::RoomDataExternal& room, SceNpMatching2RoomDataExternal* room_info, bool include_onlinename, bool include_avatarurl); + void SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(event_data& edata, const np2_structs::SearchRoomResponse& resp, SceNpMatching2SearchRoomResponse* search_resp); + void GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(event_data& edata, const np2_structs::GetRoomDataExternalListResponse& resp, SceNpMatching2GetRoomDataExternalListResponse* get_resp, bool include_onlinename, bool include_avatarurl); + u16 RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const np2_structs::RoomDataInternal& resp, SceNpMatching2RoomDataInternal* room_resp, const SceNpId& npid, bool include_onlinename, bool include_avatarurl); + void RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(event_data& edata, const np2_structs::RoomMemberDataInternal& member_data, const SceNpMatching2RoomDataInternal* room_info, SceNpMatching2RoomMemberDataInternal* sce_member_data, bool include_onlinename, bool include_avatarurl); + void RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(event_data& edata, const np2_structs::RoomMemberUpdateInfo& resp, SceNpMatching2RoomMemberUpdateInfo* room_info, bool include_onlinename, bool include_avatarurl); + void RoomUpdateInfo_to_SceNpMatching2RoomUpdateInfo(const np2_structs::RoomUpdateInfo& update_info, SceNpMatching2RoomUpdateInfo* sce_update_info); + void GetPingInfoResponse_to_SceNpMatching2SignalingGetPingInfoResponse(const np2_structs::GetPingInfoResponse& resp, SceNpMatching2SignalingGetPingInfoResponse* sce_resp); + void RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(event_data& edata, const np2_structs::RoomMessageInfo& mi, SceNpMatching2RoomMessageInfo* sce_mi, bool include_onlinename, bool include_avatarurl); + void RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(event_data& edata, const np2_structs::RoomDataInternalUpdateInfo& update_info, SceNpMatching2RoomDataInternalUpdateInfo* sce_update_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl); + void RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(event_data& edata, const np2_structs::RoomMemberDataInternalUpdateInfo& update_info, SceNpMatching2RoomMemberDataInternalUpdateInfo* sce_update_info, bool include_onlinename, bool include_avatarurl); + void MatchingRoomStatus_to_SceNpMatchingRoomStatus(event_data& edata, const np2_structs::MatchingRoomStatus& resp, SceNpMatchingRoomStatus* room_status); + void MatchingRoomStatus_to_SceNpMatchingJoinedRoomInfo(event_data& edata, const np2_structs::MatchingRoomStatus& resp, SceNpMatchingJoinedRoomInfo* room_info); + void MatchingRoom_to_SceNpMatchingRoom(event_data& edata, const np2_structs::MatchingRoom& resp, SceNpMatchingRoom* room); + void MatchingRoomList_to_SceNpMatchingRoomList(event_data& edata, const np2_structs::MatchingRoomList& resp, SceNpMatchingRoomList* room_list); + void MatchingSearchJoinRoomInfo_to_SceNpMatchingSearchJoinRoomInfo(event_data& edata, const np2_structs::MatchingSearchJoinRoomInfo& resp, SceNpMatchingSearchJoinRoomInfo* room_info); + void MatchingAttr_to_SceNpMatchingAttr(event_data& edata, const google::protobuf::RepeatedPtrField& attr_list, vm::bptr& first_attr); +} // namespace np diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index dc0af98f6c..2b58310f1c 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -16,7 +16,7 @@ #include "Emu/system_config.h" #include "Emu/RSX/Overlays/overlay_message.h" -#include "generated/np2_structs_generated.h" +#include "generated/np2_structs.pb.h" #ifdef _WIN32 #include @@ -256,7 +256,7 @@ namespace rpcn rpcn_log.notice("online: %s, pr_com_id: %s, pr_title: %s, pr_status: %s, pr_comment: %s, pr_data: %s", online ? "true" : "false", pr_com_id.data, pr_title, pr_status, pr_comment, fmt::buf_to_hexstring(pr_data.data(), pr_data.size())); } - constexpr u32 RPCN_PROTOCOL_VERSION = 28; + constexpr u32 RPCN_PROTOCOL_VERSION = 29; constexpr usz RPCN_HEADER_SIZE = 15; const char* error_to_explanation(rpcn::ErrorType error) @@ -1658,57 +1658,55 @@ namespace rpcn bool rpcn_client::createjoin_room(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2CreateJoinRoomRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::CreateJoinRoomRequest pb_req; + + pb_req.set_worldid(req->worldId); + pb_req.set_lobbyid(req->lobbyId); + pb_req.set_maxslot(req->maxSlot); + pb_req.set_flagattr(req->flagAttr); + pb_req.mutable_teamid()->set_value(req->teamId); - flatbuffers::Offset>> final_searchintattrexternal_vec; if (req->roomSearchableIntAttrExternalNum && req->roomSearchableIntAttrExternal) { - std::vector> davec; for (u32 i = 0; i < req->roomSearchableIntAttrExternalNum; i++) { - auto bin = CreateIntAttr(builder, req->roomSearchableIntAttrExternal[i].id, req->roomSearchableIntAttrExternal[i].num); - davec.push_back(bin); + auto* attr = pb_req.add_roomsearchableintattrexternal(); + attr->mutable_id()->set_value(req->roomSearchableIntAttrExternal[i].id); + attr->set_num(req->roomSearchableIntAttrExternal[i].num); } - final_searchintattrexternal_vec = builder.CreateVector(davec); } // WWE SmackDown vs. RAW 2009 passes roomBinAttrExternal in roomSearchableBinAttrExternal so we parse based on attribute ids - flatbuffers::Offset>> final_binattrinternal_vec; - flatbuffers::Offset>> final_searchbinattrexternal_vec; - flatbuffers::Offset>> final_binattrexternal_vec; - - std::vector> davec_binattrinternal; - std::vector> davec_searchable_binattrexternal; - std::vector> davec_binattrexternal; - - auto put_binattr = [&](SceNpMatching2AttributeId id, flatbuffers::Offset bin) + auto put_binattr = [&](const SceNpMatching2BinAttr& binattr) { - switch (id) + np2_structs::BinAttr* attr = nullptr; + switch (binattr.id) { case SCE_NP_MATCHING2_ROOM_BIN_ATTR_INTERNAL_1_ID: case SCE_NP_MATCHING2_ROOM_BIN_ATTR_INTERNAL_2_ID: - davec_binattrinternal.push_back(bin); + attr = pb_req.add_roombinattrinternal(); break; case SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_1_ID: case SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_2_ID: - davec_binattrexternal.push_back(bin); + attr = pb_req.add_roombinattrexternal(); break; case SCE_NP_MATCHING2_ROOM_SEARCHABLE_BIN_ATTR_EXTERNAL_1_ID: - davec_searchable_binattrexternal.push_back(bin); + attr = pb_req.add_roomsearchablebinattrexternal(); break; default: - rpcn_log.error("Unexpected bin attribute id in createjoin_room request: 0x%x", id); - break; + rpcn_log.error("Unexpected bin attribute id in createjoin_room request: 0x%x", binattr.id); + return; } + attr->mutable_id()->set_value(binattr.id); + attr->set_data(binattr.ptr.get_ptr(), binattr.size); }; if (req->roomBinAttrInternalNum && req->roomBinAttrInternal) { for (u32 i = 0; i < req->roomBinAttrInternalNum; i++) { - auto bin = CreateBinAttr(builder, req->roomBinAttrInternal[i].id, builder.CreateVector(req->roomBinAttrInternal[i].ptr.get_ptr(), req->roomBinAttrInternal[i].size)); - put_binattr(req->roomBinAttrInternal[i].id, bin); + put_binattr(req->roomBinAttrInternal[i]); } } @@ -1716,8 +1714,7 @@ namespace rpcn { for (u32 i = 0; i < req->roomSearchableBinAttrExternalNum; i++) { - auto bin = CreateBinAttr(builder, req->roomSearchableBinAttrExternal[i].id, builder.CreateVector(req->roomSearchableBinAttrExternal[i].ptr.get_ptr(), req->roomSearchableBinAttrExternal[i].size)); - put_binattr(req->roomSearchableBinAttrExternal[i].id, bin); + put_binattr(req->roomSearchableBinAttrExternal[i]); } } @@ -1725,38 +1722,30 @@ namespace rpcn { for (u32 i = 0; i < req->roomBinAttrExternalNum; i++) { - auto bin = CreateBinAttr(builder, req->roomBinAttrExternal[i].id, builder.CreateVector(req->roomBinAttrExternal[i].ptr.get_ptr(), req->roomBinAttrExternal[i].size)); - put_binattr(req->roomBinAttrExternal[i].id, bin); + put_binattr(req->roomBinAttrExternal[i]); } } - if (!davec_binattrinternal.empty()) - final_binattrinternal_vec = builder.CreateVector(davec_binattrinternal); - - if (!davec_searchable_binattrexternal.empty()) - final_searchbinattrexternal_vec = builder.CreateVector(davec_searchable_binattrexternal); - - if (!davec_binattrexternal.empty()) - final_binattrexternal_vec = builder.CreateVector(davec_binattrexternal); - - flatbuffers::Offset> final_roompassword; if (req->roomPassword) - final_roompassword = builder.CreateVector(req->roomPassword->data, 8); - flatbuffers::Offset>> final_groupconfigs_vec; + pb_req.set_roompassword(req->roomPassword->data, 8); + if (req->groupConfigNum && req->groupConfig) { - std::vector> davec; for (u32 i = 0; i < req->groupConfigNum; i++) { - auto bin = CreateGroupConfig(builder, req->groupConfig[i].slotNum, req->groupConfig[i].withLabel ? builder.CreateVector(req->groupConfig[i].label.data, 8) : 0, req->groupConfig[i].withPassword); - davec.push_back(bin); + auto* gc = pb_req.add_groupconfig(); + gc->set_slotnum(req->groupConfig[i].slotNum); + gc->set_withpassword(req->groupConfig[i].withPassword); + if (req->groupConfig[i].withLabel) + gc->set_label(req->groupConfig[i].label.data, 8); } - final_groupconfigs_vec = builder.CreateVector(davec); } - flatbuffers::Offset>> final_allowedusers_vec; + + if (req->passwordSlotMask) + pb_req.set_passwordslotmask(*req->passwordSlotMask); + if (req->allowedUserNum && req->allowedUser) { - std::vector> davec; for (u32 i = 0; i < req->allowedUserNum; i++) { // Some games just give us garbage, make sure npid is valid before passing @@ -1765,221 +1754,207 @@ namespace rpcn { continue; } - - auto bin = builder.CreateString(req->allowedUser[i].handle.data); - davec.push_back(bin); + pb_req.add_alloweduser(req->allowedUser[i].handle.data); } - final_allowedusers_vec = builder.CreateVector(davec); } - flatbuffers::Offset>> final_blockedusers_vec; + if (req->blockedUserNum && req->blockedUser) { - std::vector> davec; for (u32 i = 0; i < req->blockedUserNum; i++) { if (!np::is_valid_npid(req->blockedUser[i])) { continue; } - - auto bin = builder.CreateString(req->blockedUser[i].handle.data); - davec.push_back(bin); + pb_req.add_blockeduser(req->blockedUser[i].handle.data); } - final_blockedusers_vec = builder.CreateVector(davec); } - flatbuffers::Offset> final_grouplabel; + if (req->joinRoomGroupLabel) - final_grouplabel = builder.CreateVector(req->joinRoomGroupLabel->data, 8); - flatbuffers::Offset>> final_memberbinattrinternal_vec; + pb_req.set_joinroomgrouplabel(req->joinRoomGroupLabel->data, 8); + if (req->roomMemberBinAttrInternalNum && req->roomMemberBinAttrInternal) { - std::vector> davec; for (u32 i = 0; i < req->roomMemberBinAttrInternalNum; i++) { - auto bin = CreateBinAttr( - builder, req->roomMemberBinAttrInternal[i].id, builder.CreateVector(reinterpret_cast(req->roomMemberBinAttrInternal[i].ptr.get_ptr()), req->roomMemberBinAttrInternal[i].size)); - davec.push_back(bin); + auto* attr = pb_req.add_roommemberbinattrinternal(); + attr->mutable_id()->set_value(req->roomMemberBinAttrInternal[i].id); + attr->set_data(req->roomMemberBinAttrInternal[i].ptr.get_ptr(), req->roomMemberBinAttrInternal[i].size); } - final_memberbinattrinternal_vec = builder.CreateVector(davec); } - flatbuffers::Offset final_optparam; + if (req->sigOptParam) - final_optparam = CreateOptParam(builder, req->sigOptParam->type, req->sigOptParam->flag, req->sigOptParam->hubMemberId); - u64 final_passwordSlotMask = 0; - if (req->passwordSlotMask) - final_passwordSlotMask = *req->passwordSlotMask; + { + auto* opt = pb_req.mutable_sigoptparam(); + opt->mutable_type()->set_value(req->sigOptParam->type); + opt->mutable_flag()->set_value(req->sigOptParam->flag); + opt->mutable_hubmemberid()->set_value(req->sigOptParam->hubMemberId); + } - auto req_finished = CreateCreateJoinRoomRequest(builder, req->worldId, req->lobbyId, req->maxSlot, req->flagAttr, final_binattrinternal_vec, final_searchintattrexternal_vec, - final_searchbinattrexternal_vec, final_binattrexternal_vec, final_roompassword, final_groupconfigs_vec, final_passwordSlotMask, final_allowedusers_vec, final_blockedusers_vec, final_grouplabel, - final_memberbinattrinternal_vec, req->teamId, final_optparam); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::CreateRoom, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::CreateRoom, req_id); } bool rpcn_client::join_room(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2JoinRoomRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::JoinRoomRequest pb_req; + + pb_req.set_roomid(req->roomId); + pb_req.mutable_teamid()->set_value(req->teamId); - flatbuffers::Offset> final_roompassword; if (req->roomPassword) - final_roompassword = builder.CreateVector(req->roomPassword->data, 8); - flatbuffers::Offset> final_grouplabel; + pb_req.set_roompassword(req->roomPassword->data, 8); + if (req->joinRoomGroupLabel) - final_grouplabel = builder.CreateVector(req->joinRoomGroupLabel->data, 8); - flatbuffers::Offset>> final_memberbinattrinternal_vec; + pb_req.set_joinroomgrouplabel(req->joinRoomGroupLabel->data, 8); + if (req->roomMemberBinAttrInternalNum && req->roomMemberBinAttrInternal) { - std::vector> davec; for (u32 i = 0; i < req->roomMemberBinAttrInternalNum; i++) { - auto bin = CreateBinAttr(builder, req->roomMemberBinAttrInternal[i].id, builder.CreateVector(req->roomMemberBinAttrInternal[i].ptr.get_ptr(), req->roomMemberBinAttrInternal[i].size)); - davec.push_back(bin); + auto* attr = pb_req.add_roommemberbinattrinternal(); + attr->mutable_id()->set_value(req->roomMemberBinAttrInternal[i].id); + attr->set_data(req->roomMemberBinAttrInternal[i].ptr.get_ptr(), req->roomMemberBinAttrInternal[i].size); } - final_memberbinattrinternal_vec = builder.CreateVector(davec); } - flatbuffers::Offset final_optdata = CreatePresenceOptionData(builder, builder.CreateVector(req->optData.data, 16), req->optData.length); - auto req_finished = CreateJoinRoomRequest(builder, req->roomId, final_roompassword, final_grouplabel, final_memberbinattrinternal_vec, final_optdata, req->teamId); - builder.Finish(req_finished); + auto* optdata = pb_req.mutable_optdata(); + optdata->set_data(req->optData.data, 16); + optdata->set_len(req->optData.length); - return forge_request_with_com_id(builder, communication_id, CommandType::JoinRoom, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::JoinRoom, req_id); } bool rpcn_client::leave_room(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2LeaveRoomRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); - flatbuffers::Offset final_optdata = CreatePresenceOptionData(builder, builder.CreateVector(req->optData.data, 16), req->optData.length); - auto req_finished = CreateLeaveRoomRequest(builder, req->roomId, final_optdata); - builder.Finish(req_finished); + np2_structs::LeaveRoomRequest pb_req; + pb_req.set_roomid(req->roomId); - return forge_request_with_com_id(builder, communication_id, CommandType::LeaveRoom, req_id); + auto* optdata = pb_req.mutable_optdata(); + optdata->set_data(req->optData.data, 16); + optdata->set_len(req->optData.length); + + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::LeaveRoom, req_id); } bool rpcn_client::search_room(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SearchRoomRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); - flatbuffers::Offset>> final_intfilter_vec; + np2_structs::SearchRoomRequest pb_req; + + pb_req.set_option(req->option); + pb_req.set_worldid(req->worldId); + pb_req.set_lobbyid(req->lobbyId); + pb_req.set_rangefilter_startindex(req->rangeFilter.startIndex); + pb_req.set_rangefilter_max(req->rangeFilter.max); + pb_req.set_flagfilter(req->flagFilter); + pb_req.set_flagattr(req->flagAttr); + if (req->intFilterNum && req->intFilter) { - std::vector> davec{}; for (u32 i = 0; i < req->intFilterNum; i++) { - auto int_attr = CreateIntAttr(builder, req->intFilter[i].attr.id, req->intFilter[i].attr.num); - auto bin = CreateIntSearchFilter(builder, req->intFilter[i].searchOperator, int_attr); - davec.push_back(bin); + auto* filter = pb_req.add_intfilter(); + filter->mutable_searchoperator()->set_value(req->intFilter[i].searchOperator); + auto* attr = filter->mutable_attr(); + attr->mutable_id()->set_value(req->intFilter[i].attr.id); + attr->set_num(req->intFilter[i].attr.num); } - final_intfilter_vec = builder.CreateVector(davec); } - flatbuffers::Offset>> final_binfilter_vec; + if (req->binFilterNum && req->binFilter) { - std::vector> davec; for (u32 i = 0; i < req->binFilterNum; i++) { - auto bin_attr = CreateBinAttr(builder, req->binFilter[i].attr.id, builder.CreateVector(req->binFilter[i].attr.ptr.get_ptr(), req->binFilter[i].attr.size)); - auto bin = CreateBinSearchFilter(builder, req->binFilter[i].searchOperator, bin_attr); - davec.push_back(bin); + auto* filter = pb_req.add_binfilter(); + filter->mutable_searchoperator()->set_value(req->binFilter[i].searchOperator); + auto* attr = filter->mutable_attr(); + attr->mutable_id()->set_value(req->binFilter[i].attr.id); + attr->set_data(req->binFilter[i].attr.ptr.get_ptr(), req->binFilter[i].attr.size); } - final_binfilter_vec = builder.CreateVector(davec); } - flatbuffers::Offset> attrid_vec; if (req->attrIdNum && req->attrId) { - std::vector attr_ids; for (u32 i = 0; i < req->attrIdNum; i++) { - attr_ids.push_back(req->attrId[i]); + pb_req.add_attrid()->set_value(req->attrId[i]); } - attrid_vec = builder.CreateVector(attr_ids); } - SearchRoomRequestBuilder s_req(builder); - s_req.add_option(req->option); - s_req.add_worldId(req->worldId); - s_req.add_lobbyId(req->lobbyId); - s_req.add_rangeFilter_startIndex(req->rangeFilter.startIndex); - s_req.add_rangeFilter_max(req->rangeFilter.max); - s_req.add_flagFilter(req->flagFilter); - s_req.add_flagAttr(req->flagAttr); - if (req->intFilterNum) - s_req.add_intFilter(final_intfilter_vec); - if (req->binFilterNum) - s_req.add_binFilter(final_binfilter_vec); - if (req->attrIdNum) - s_req.add_attrId(attrid_vec); + std::string serialized; + pb_req.SerializeToString(&serialized); - auto req_finished = s_req.Finish(); - builder.Finish(req_finished); - - return forge_request_with_com_id(builder, communication_id, CommandType::SearchRoom, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::SearchRoom, req_id); } bool rpcn_client::get_roomdata_external_list(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2GetRoomDataExternalListRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); - std::vector roomIds; + np2_structs::GetRoomDataExternalListRequest pb_req; + for (u32 i = 0; i < req->roomIdNum && req->roomId; i++) { - roomIds.push_back(req->roomId[i]); + pb_req.add_roomids(req->roomId[i]); } - std::vector attrIds; + for (u32 i = 0; i < req->attrIdNum && req->attrId; i++) { - attrIds.push_back(req->attrId[i]); + pb_req.add_attrids()->set_value(req->attrId[i]); } - auto req_finished = CreateGetRoomDataExternalListRequestDirect(builder, &roomIds, &attrIds); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::GetRoomDataExternalList, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::GetRoomDataExternalList, req_id); } bool rpcn_client::set_roomdata_external(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SetRoomDataExternalRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); - flatbuffers::Offset>> final_searchintattrexternal_vec; + np2_structs::SetRoomDataExternalRequest pb_req; + pb_req.set_roomid(req->roomId); + if (req->roomSearchableIntAttrExternalNum && req->roomSearchableIntAttrExternal) { - std::vector> davec; for (u32 i = 0; i < req->roomSearchableIntAttrExternalNum; i++) { - auto bin = CreateIntAttr(builder, req->roomSearchableIntAttrExternal[i].id, req->roomSearchableIntAttrExternal[i].num); - davec.push_back(bin); + auto* attr = pb_req.add_roomsearchableintattrexternal(); + attr->mutable_id()->set_value(req->roomSearchableIntAttrExternal[i].id); + attr->set_num(req->roomSearchableIntAttrExternal[i].num); } - final_searchintattrexternal_vec = builder.CreateVector(davec); } - flatbuffers::Offset>> final_searchbinattrexternal_vec; - flatbuffers::Offset>> final_binattrexternal_vec; - - std::vector> davec_searchable_binattrexternal; - std::vector> davec_binattrexternal; - - auto put_binattr = [&](SceNpMatching2AttributeId id, flatbuffers::Offset bin) + auto put_binattr = [&](const SceNpMatching2BinAttr& binattr) { - switch (id) + np2_structs::BinAttr* attr = nullptr; + switch (binattr.id) { case SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_1_ID: case SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_2_ID: - davec_binattrexternal.push_back(bin); + attr = pb_req.add_roombinattrexternal(); break; case SCE_NP_MATCHING2_ROOM_SEARCHABLE_BIN_ATTR_EXTERNAL_1_ID: - davec_searchable_binattrexternal.push_back(bin); + attr = pb_req.add_roomsearchablebinattrexternal(); break; default: - rpcn_log.error("Unexpected bin attribute id in set_roomdata_external request: 0x%x", id); - break; + rpcn_log.error("Unexpected bin attribute id in set_roomdata_external request: 0x%x", binattr.id); + return; } + attr->mutable_id()->set_value(binattr.id); + attr->set_data(binattr.ptr.get_ptr(), binattr.size); }; if (req->roomSearchableBinAttrExternalNum && req->roomSearchableBinAttrExternal) { for (u32 i = 0; i < req->roomSearchableBinAttrExternalNum; i++) { - auto bin = CreateBinAttr(builder, req->roomSearchableBinAttrExternal[i].id, builder.CreateVector(req->roomSearchableBinAttrExternal[i].ptr.get_ptr(), req->roomSearchableBinAttrExternal[i].size)); - put_binattr(req->roomSearchableBinAttrExternal[i].id, bin); + put_binattr(req->roomSearchableBinAttrExternal[i]); } } @@ -1987,155 +1962,143 @@ namespace rpcn { for (u32 i = 0; i < req->roomBinAttrExternalNum; i++) { - auto bin = CreateBinAttr(builder, req->roomBinAttrExternal[i].id, builder.CreateVector(req->roomBinAttrExternal[i].ptr.get_ptr(), req->roomBinAttrExternal[i].size)); - put_binattr(req->roomBinAttrExternal[i].id, bin); + put_binattr(req->roomBinAttrExternal[i]); } } - if (!davec_searchable_binattrexternal.empty()) - final_searchbinattrexternal_vec = builder.CreateVector(davec_searchable_binattrexternal); + std::string serialized; + pb_req.SerializeToString(&serialized); - if (!davec_binattrexternal.empty()) - final_binattrexternal_vec = builder.CreateVector(davec_binattrexternal); - - auto req_finished = CreateSetRoomDataExternalRequest(builder, req->roomId, final_searchintattrexternal_vec, final_searchbinattrexternal_vec, final_binattrexternal_vec); - builder.Finish(req_finished); - - return forge_request_with_com_id(builder, communication_id, CommandType::SetRoomDataExternal, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::SetRoomDataExternal, req_id); } bool rpcn_client::get_roomdata_internal(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2GetRoomDataInternalRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::GetRoomDataInternalRequest pb_req; + pb_req.set_roomid(req->roomId); - flatbuffers::Offset> final_attr_ids_vec; if (req->attrIdNum && req->attrId) { - std::vector attr_ids; for (u32 i = 0; i < req->attrIdNum; i++) { - attr_ids.push_back(req->attrId[i]); + pb_req.add_attrid()->set_value(req->attrId[i]); } - final_attr_ids_vec = builder.CreateVector(attr_ids); } - auto req_finished = CreateGetRoomDataInternalRequest(builder, req->roomId, final_attr_ids_vec); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::GetRoomDataInternal, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::GetRoomDataInternal, req_id); } bool rpcn_client::set_roomdata_internal(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SetRoomDataInternalRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); - flatbuffers::Offset>> final_binattrinternal_vec; + np2_structs::SetRoomDataInternalRequest pb_req; + pb_req.set_roomid(req->roomId); + pb_req.set_flagfilter(req->flagFilter); + pb_req.set_flagattr(req->flagAttr); + if (req->roomBinAttrInternalNum && req->roomBinAttrInternal) { - std::vector> davec; for (u32 i = 0; i < req->roomBinAttrInternalNum; i++) { - auto bin = CreateBinAttr(builder, req->roomBinAttrInternal[i].id, builder.CreateVector(req->roomBinAttrInternal[i].ptr.get_ptr(), req->roomBinAttrInternal[i].size)); - davec.push_back(bin); + auto* attr = pb_req.add_roombinattrinternal(); + attr->mutable_id()->set_value(req->roomBinAttrInternal[i].id); + attr->set_data(req->roomBinAttrInternal[i].ptr.get_ptr(), req->roomBinAttrInternal[i].size); } - final_binattrinternal_vec = builder.CreateVector(davec); } - flatbuffers::Offset>> final_grouppasswordconfig_vec; + if (req->passwordConfigNum && req->passwordConfig) { - std::vector> davec; for (u32 i = 0; i < req->passwordConfigNum; i++) { - auto rg = CreateRoomGroupPasswordConfig(builder, req->passwordConfig[i].groupId, req->passwordConfig[i].withPassword); - davec.push_back(rg); + auto* cfg = pb_req.add_passwordconfig(); + cfg->mutable_groupid()->set_value(req->passwordConfig[i].groupId); + cfg->set_withpassword(req->passwordConfig[i].withPassword); } - final_grouppasswordconfig_vec = builder.CreateVector(davec); } - flatbuffers::Offset> final_passwordSlotMask; if (req->passwordSlotMask) { - const u64 value = *req->passwordSlotMask; - final_passwordSlotMask = builder.CreateVector(&value, 1); + pb_req.add_passwordslotmask(*req->passwordSlotMask); } - flatbuffers::Offset> final_ownerprivilege_vec; if (req->ownerPrivilegeRankNum && req->ownerPrivilegeRank) { - std::vector priv_ranks; for (u32 i = 0; i < req->ownerPrivilegeRankNum; i++) { - priv_ranks.push_back(req->ownerPrivilegeRank[i]); + pb_req.add_ownerprivilegerank()->set_value(req->ownerPrivilegeRank[i]); } - final_ownerprivilege_vec = builder.CreateVector(priv_ranks); } - auto req_finished = - CreateSetRoomDataInternalRequest(builder, req->roomId, req->flagFilter, req->flagAttr, final_binattrinternal_vec, final_grouppasswordconfig_vec, final_passwordSlotMask, final_ownerprivilege_vec); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::SetRoomDataInternal, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::SetRoomDataInternal, req_id); } bool rpcn_client::get_roommemberdata_internal(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2GetRoomMemberDataInternalRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); - flatbuffers::Offset> final_attrid_vec; + np2_structs::GetRoomMemberDataInternalRequest pb_req; + pb_req.set_roomid(req->roomId); + pb_req.mutable_memberid()->set_value(req->memberId); + if (req->attrIdNum && req->attrId) { - std::vector attrid_vec; for (u32 i = 0; i < req->attrIdNum; i++) { - attrid_vec.push_back(req->attrId[i]); + pb_req.add_attrid()->set_value(req->attrId[i]); } - final_attrid_vec = builder.CreateVector(attrid_vec); } - auto req_finished = CreateGetRoomMemberDataInternalRequest(builder, req->roomId, req->memberId, final_attrid_vec); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::GetRoomMemberDataInternal, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::GetRoomMemberDataInternal, req_id); } bool rpcn_client::set_roommemberdata_internal(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SetRoomMemberDataInternalRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); - flatbuffers::Offset>> final_binattrinternal_vec; + np2_structs::SetRoomMemberDataInternalRequest pb_req; + pb_req.set_roomid(req->roomId); + pb_req.mutable_memberid()->set_value(req->memberId); + pb_req.mutable_teamid()->set_value(req->teamId); + if (req->roomMemberBinAttrInternalNum && req->roomMemberBinAttrInternal) { - std::vector> davec; for (u32 i = 0; i < req->roomMemberBinAttrInternalNum; i++) { - auto bin = CreateBinAttr(builder, req->roomMemberBinAttrInternal[i].id, builder.CreateVector(req->roomMemberBinAttrInternal[i].ptr.get_ptr(), req->roomMemberBinAttrInternal[i].size)); - davec.push_back(bin); + auto* attr = pb_req.add_roommemberbinattrinternal(); + attr->mutable_id()->set_value(req->roomMemberBinAttrInternal[i].id); + attr->set_data(req->roomMemberBinAttrInternal[i].ptr.get_ptr(), req->roomMemberBinAttrInternal[i].size); } - final_binattrinternal_vec = builder.CreateVector(davec); } - auto req_finished = CreateSetRoomMemberDataInternalRequest(builder, req->roomId, req->memberId, req->teamId, final_binattrinternal_vec); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::SetRoomMemberDataInternal, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::SetRoomMemberDataInternal, req_id); } bool rpcn_client::set_userinfo(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SetUserInfoRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); - flatbuffers::Offset>> final_memberbinattr_vec; + np2_structs::SetUserInfo pb_req; + pb_req.mutable_serverid()->set_value(req->serverId); + if (req->userBinAttrNum && req->userBinAttr) { - std::vector> davec; for (u32 i = 0; i < req->userBinAttrNum; i++) { - auto bin = CreateBinAttr(builder, req->userBinAttr[i].id, builder.CreateVector(req->userBinAttr[i].ptr.get_ptr(), req->userBinAttr[i].size)); - davec.push_back(bin); + auto* attr = pb_req.add_userbinattr(); + attr->mutable_id()->set_value(req->userBinAttr[i].id); + attr->set_data(req->userBinAttr[i].ptr.get_ptr(), req->userBinAttr[i].size); } - final_memberbinattr_vec = builder.CreateVector(davec); } - auto req_finished = CreateSetUserInfo(builder, req->serverId, final_memberbinattr_vec); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::SetUserInfo, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::SetUserInfo, req_id); } bool rpcn_client::ping_room_owner(u32 req_id, const SceNpCommunicationId& communication_id, u64 room_id) @@ -2150,34 +2113,38 @@ namespace rpcn bool rpcn_client::send_room_message(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SendRoomMessageRequest* req) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::SendRoomMessageRequest pb_req; + pb_req.set_roomid(req->roomId); + pb_req.mutable_casttype()->set_value(req->castType); + pb_req.mutable_option()->set_value(req->option); - std::vector dst; switch (req->castType) { case SCE_NP_MATCHING2_CASTTYPE_BROADCAST: break; case SCE_NP_MATCHING2_CASTTYPE_UNICAST: - dst.push_back(req->dst.unicastTarget); + pb_req.add_dst()->set_value(req->dst.unicastTarget); break; case SCE_NP_MATCHING2_CASTTYPE_MULTICAST: for (u32 i = 0; i < req->dst.multicastTarget.memberIdNum && req->dst.multicastTarget.memberId; i++) { - dst.push_back(req->dst.multicastTarget.memberId[i]); + pb_req.add_dst()->set_value(req->dst.multicastTarget.memberId[i]); } break; case SCE_NP_MATCHING2_CASTTYPE_MULTICAST_TEAM: - dst.push_back(req->dst.multicastTargetTeamId); + pb_req.add_dst()->set_value(req->dst.multicastTargetTeamId); break; default: ensure(false); break; } - auto req_finished = CreateSendRoomMessageRequest(builder, req->roomId, req->castType, builder.CreateVector(dst.data(), dst.size()), builder.CreateVector(reinterpret_cast(req->msg.get_ptr()), req->msgLen), req->option); - builder.Finish(req_finished); + pb_req.set_msg(req->msg.get_ptr(), req->msgLen); - return forge_request_with_com_id(builder, communication_id, CommandType::SendRoomMessage, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::SendRoomMessage, req_id); } bool rpcn_client::req_sign_infos(u32 req_id, const std::string& npid) @@ -2203,32 +2170,32 @@ namespace rpcn bool rpcn_client::send_message(const message_data& msg_data, const std::set& npids) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::MessageDetails pb_message; + pb_message.set_communicationid(static_cast(msg_data.commId.data)); + pb_message.set_msgid(msg_data.msgId); + pb_message.mutable_maintype()->set_value(msg_data.mainType); + pb_message.mutable_subtype()->set_value(msg_data.subType); + pb_message.set_msgfeatures(msg_data.msgFeatures); + pb_message.set_subject(msg_data.subject); + pb_message.set_body(msg_data.body); + pb_message.set_data(msg_data.data.data(), msg_data.data.size()); - flatbuffers::FlatBufferBuilder nested_builder(1024); - auto fb_message = CreateMessageDetailsDirect(nested_builder, static_cast(msg_data.commId.data), msg_data.msgId, msg_data.mainType, msg_data.subType, msg_data.msgFeatures, msg_data.subject.c_str(), msg_data.body.c_str(), &msg_data.data); - nested_builder.Finish(fb_message); - builder.ForceVectorAlignment(nested_builder.GetSize(), sizeof(uint8_t), nested_builder.GetBufferMinAlignment()); - auto nested_flatbuffer_vector = builder.CreateVector(nested_builder.GetBufferPointer(), nested_builder.GetSize()); + std::string serialized_message; + pb_message.SerializeToString(&serialized_message); - std::vector> davec; + np2_structs::SendMessageRequest pb_req; + pb_req.set_message(serialized_message); for (const auto& npid : npids) { - auto s_npid = builder.CreateString(npid); - davec.push_back(s_npid); + pb_req.add_npids(npid); } - auto npids_vector = builder.CreateVector(davec); - // auto npids = builder.Create - auto fb_sendmessage = CreateSendMessageRequest(builder, nested_flatbuffer_vector, npids_vector); + std::string serialized; + pb_req.SerializeToString(&serialized); - builder.Finish(fb_sendmessage); - const u8* buf = builder.GetBufferPointer(); - const usz bufsize = builder.GetSize(); - std::vector data(bufsize + sizeof(u32)); - - reinterpret_cast&>(data[0]) = static_cast(bufsize); - memcpy(data.data() + sizeof(u32), buf, bufsize); + std::vector data(serialized.size() + sizeof(u32)); + reinterpret_cast&>(data[0]) = static_cast(serialized.size()); + memcpy(data.data() + sizeof(u32), serialized.data(), serialized.size()); return forge_send(CommandType::SendMessage, rpcn_request_counter.fetch_add(1), data); } @@ -2244,63 +2211,91 @@ namespace rpcn bool rpcn_client::record_score(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScoreBoardId board_id, SceNpScorePcId char_id, SceNpScoreValue score, const std::optional comment, const std::optional> score_data) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::RecordScoreRequest pb_req; + pb_req.set_boardid(board_id); + pb_req.set_pcid(char_id); + pb_req.set_score(score); + if (comment) + { + pb_req.set_comment(*comment); + } + if (score_data) + { + pb_req.set_data(score_data->data(), score_data->size()); + } - auto req_finished = CreateRecordScoreRequestDirect(builder, board_id, char_id, score, comment ? (*comment).c_str() : nullptr, score_data ? &*score_data : nullptr); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::RecordScore, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::RecordScore, req_id); } bool rpcn_client::get_score_range(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScoreBoardId board_id, u32 start_rank, u32 num_rank, bool with_comment, bool with_gameinfo) { - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateGetScoreRangeRequest(builder, board_id, start_rank, num_rank, with_comment, with_gameinfo); - builder.Finish(req_finished); + np2_structs::GetScoreRangeRequest pb_req; + pb_req.set_boardid(board_id); + pb_req.set_startrank(start_rank); + pb_req.set_numranks(num_rank); + pb_req.set_withcomment(with_comment); + pb_req.set_withgameinfo(with_gameinfo); - return forge_request_with_com_id(builder, communication_id, CommandType::GetScoreRange, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::GetScoreRange, req_id); } bool rpcn_client::get_score_npid(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScoreBoardId board_id, const std::vector>& npids, bool with_comment, bool with_gameinfo) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::GetScoreNpIdRequest pb_req; + pb_req.set_boardid(board_id); + pb_req.set_withcomment(with_comment); + pb_req.set_withgameinfo(with_gameinfo); - std::vector> davec; for (usz i = 0; i < npids.size(); i++) { - auto npid = CreateScoreNpIdPcId(builder, builder.CreateString(static_cast(npids[i].first.handle.data)), npids[i].second); - davec.push_back(npid); + auto* npid_entry = pb_req.add_npids(); + npid_entry->set_npid(static_cast(npids[i].first.handle.data)); + npid_entry->set_pcid(npids[i].second); } - auto req_finished = CreateGetScoreNpIdRequest(builder, board_id, builder.CreateVector(davec), with_comment, with_gameinfo); + std::string serialized; + pb_req.SerializeToString(&serialized); - builder.Finish(req_finished); - - return forge_request_with_com_id(builder, communication_id, CommandType::GetScoreNpid, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::GetScoreNpid, req_id); } bool rpcn_client::get_score_friend(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScoreBoardId board_id, bool include_self, bool with_comment, bool with_gameinfo, u32 max_entries) { - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateGetScoreFriendsRequest(builder, board_id, include_self, max_entries, with_comment, with_gameinfo); - builder.Finish(req_finished); + np2_structs::GetScoreFriendsRequest pb_req; + pb_req.set_boardid(board_id); + pb_req.set_include_self(include_self); + pb_req.set_max(max_entries); + pb_req.set_withcomment(with_comment); + pb_req.set_withgameinfo(with_gameinfo); - return forge_request_with_com_id(builder, communication_id, CommandType::GetScoreFriends, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::GetScoreFriends, req_id); } bool rpcn_client::record_score_data(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScorePcId pc_id, SceNpScoreBoardId board_id, s64 score, const std::vector& score_data) { - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateRecordScoreGameDataRequest(builder, board_id, pc_id, score); - builder.Finish(req_finished); + np2_structs::RecordScoreGameDataRequest pb_req; + pb_req.set_boardid(board_id); + pb_req.set_pcid(pc_id); + pb_req.set_score(score); - const u8* buf = builder.GetBufferPointer(); - const usz bufsize = builder.GetSize(); + std::string serialized; + pb_req.SerializeToString(&serialized); + + const usz bufsize = serialized.size(); std::vector data(COMMUNICATION_ID_SIZE + sizeof(u32) + bufsize + sizeof(u32) + score_data.size()); rpcn_client::write_communication_id(communication_id, data); reinterpret_cast&>(data[COMMUNICATION_ID_SIZE]) = static_cast(bufsize); - memcpy(data.data() + COMMUNICATION_ID_SIZE + sizeof(u32), buf, bufsize); + memcpy(data.data() + COMMUNICATION_ID_SIZE + sizeof(u32), serialized.data(), bufsize); reinterpret_cast&>(data[COMMUNICATION_ID_SIZE + sizeof(u32) + bufsize]) = static_cast(score_data.size()); memcpy(data.data() + COMMUNICATION_ID_SIZE + sizeof(u32) + bufsize + sizeof(u32), score_data.data(), score_data.size()); @@ -2309,247 +2304,304 @@ namespace rpcn bool rpcn_client::get_score_data(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScorePcId pc_id, SceNpScoreBoardId board_id, const SceNpId& npid) { - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateGetScoreGameDataRequest(builder, board_id, builder.CreateString(reinterpret_cast(npid.handle.data)), pc_id); - builder.Finish(req_finished); + np2_structs::GetScoreGameDataRequest pb_req; + pb_req.set_boardid(board_id); + pb_req.set_npid(reinterpret_cast(npid.handle.data)); + pb_req.set_pcid(pc_id); - return forge_request_with_com_id(builder, communication_id, CommandType::GetScoreData, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::GetScoreData, req_id); } bool rpcn_client::tus_set_multislot_variable(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, vm::cptr variableArray, s32 arrayNum, bool vuser) { - const std::vector slotid_array(slotIdArray.get_ptr(), slotIdArray.get_ptr() + arrayNum); - const std::vector variable_array(variableArray.get_ptr(), variableArray.get_ptr() + arrayNum); + np2_structs::TusSetMultiSlotVariableRequest pb_req; + auto* user = pb_req.mutable_user(); + user->set_vuser(vuser); + user->set_npid(targetNpId.data); - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateTusSetMultiSlotVariableRequest(builder, CreateTusUser(builder, vuser, builder.CreateString(targetNpId.data)), builder.CreateVector(slotid_array), builder.CreateVector(variable_array)); - builder.Finish(req_finished); + for (s32 i = 0; i < arrayNum; i++) + { + pb_req.add_slotidarray(slotIdArray[i]); + pb_req.add_variablearray(variableArray[i]); + } - return forge_request_with_com_id(builder, communication_id, CommandType::TusSetMultiSlotVariable, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::TusSetMultiSlotVariable, req_id); } bool rpcn_client::tus_get_multislot_variable(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, s32 arrayNum, bool vuser) { - const std::vector slotid_array(slotIdArray.get_ptr(), slotIdArray.get_ptr() + arrayNum); + np2_structs::TusGetMultiSlotVariableRequest pb_req; + auto* user = pb_req.mutable_user(); + user->set_vuser(vuser); + user->set_npid(targetNpId.data); - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateTusGetMultiSlotVariableRequest(builder, CreateTusUser(builder, vuser, builder.CreateString(targetNpId.data)), builder.CreateVector(slotid_array)); - builder.Finish(req_finished); + for (s32 i = 0; i < arrayNum; i++) + { + pb_req.add_slotidarray(slotIdArray[i]); + } - return forge_request_with_com_id(builder, communication_id, CommandType::TusGetMultiSlotVariable, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::TusGetMultiSlotVariable, req_id); } bool rpcn_client::tus_get_multiuser_variable(u32 req_id, const SceNpCommunicationId& communication_id, const std::vector& targetNpIdArray, SceNpTusSlotId slotId, s32 arrayNum, bool vuser) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::TusGetMultiUserVariableRequest pb_req; + pb_req.set_slotid(slotId); - std::vector> davec; for (s32 i = 0; i < std::min(arrayNum, ::narrow(targetNpIdArray.size())); i++) { - davec.push_back(CreateTusUser(builder, vuser, builder.CreateString(targetNpIdArray[i].data))); + auto* user = pb_req.add_users(); + user->set_vuser(vuser); + user->set_npid(targetNpIdArray[i].data); } - auto req_finished = CreateTusGetMultiUserVariableRequest(builder, builder.CreateVector(davec), slotId); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::TusGetMultiUserVariable, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::TusGetMultiUserVariable, req_id); } bool rpcn_client::tus_get_friends_variable(u32 req_id, const SceNpCommunicationId& communication_id, SceNpTusSlotId slotId, bool includeSelf, s32 sortType, s32 arrayNum) { - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateTusGetFriendsVariableRequest(builder, slotId, includeSelf, sortType, arrayNum); - builder.Finish(req_finished); + np2_structs::TusGetFriendsVariableRequest pb_req; + pb_req.set_slotid(slotId); + pb_req.set_includeself(includeSelf); + pb_req.set_sorttype(sortType); + pb_req.set_arraynum(arrayNum); - return forge_request_with_com_id(builder, communication_id, CommandType::TusGetFriendsVariable, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::TusGetFriendsVariable, req_id); } bool rpcn_client::tus_add_and_get_variable(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpOnlineId& targetNpId, SceNpTusSlotId slotId, s64 inVariable, vm::ptr option, bool vuser) { - flatbuffers::FlatBufferBuilder builder(1024); - - flatbuffers::Offset> isLastChangedDate; - flatbuffers::Offset isLastChangedAuthorId; + np2_structs::TusAddAndGetVariableRequest pb_req; + auto* user = pb_req.mutable_user(); + user->set_vuser(vuser); + user->set_npid(targetNpId.data); + pb_req.set_slotid(slotId); + pb_req.set_invariable(inVariable); if (option) { if (option->isLastChangedDate) { - std::vector is_last_changed_date_vec; - is_last_changed_date_vec.push_back(option->isLastChangedDate->tick); - isLastChangedDate = builder.CreateVector(is_last_changed_date_vec); + pb_req.add_islastchangeddate(option->isLastChangedDate->tick); } if (option->isLastChangedAuthorId) { - isLastChangedAuthorId = builder.CreateString(option->isLastChangedAuthorId->handle.data); + pb_req.set_islastchangedauthorid(option->isLastChangedAuthorId->handle.data); } } - auto req_finished = CreateTusAddAndGetVariableRequest(builder, CreateTusUser(builder, vuser, builder.CreateString(targetNpId.data)), slotId, inVariable, isLastChangedDate, isLastChangedAuthorId); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::TusAddAndGetVariable, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::TusAddAndGetVariable, req_id); } bool rpcn_client::tus_try_and_set_variable(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpOnlineId& targetNpId, SceNpTusSlotId slotId, s32 opeType, s64 variable, vm::ptr option, bool vuser) { - flatbuffers::FlatBufferBuilder builder(1024); - - flatbuffers::Offset> isLastChangedDate; - flatbuffers::Offset isLastChangedAuthorId; - flatbuffers::Offset> compareValue; + np2_structs::TusTryAndSetVariableRequest pb_req; + auto* user = pb_req.mutable_user(); + user->set_vuser(vuser); + user->set_npid(targetNpId.data); + pb_req.set_slotid(slotId); + pb_req.set_opetype(opeType); + pb_req.set_variable(variable); if (option) { if (option->isLastChangedDate) { - std::vector is_last_changed_date_vec; - is_last_changed_date_vec.push_back(option->isLastChangedDate->tick); - isLastChangedDate = builder.CreateVector(is_last_changed_date_vec); + pb_req.add_islastchangeddate(option->isLastChangedDate->tick); } if (option->isLastChangedAuthorId) { - isLastChangedAuthorId = builder.CreateString(option->isLastChangedAuthorId->handle.data); + pb_req.set_islastchangedauthorid(option->isLastChangedAuthorId->handle.data); } if (option->compareValue) { - std::vector compare_value_vec; - compare_value_vec.push_back(*(option->compareValue)); - compareValue = builder.CreateVector(compare_value_vec); + pb_req.add_comparevalue(*(option->compareValue)); } } - auto req_finished = CreateTusTryAndSetVariableRequest(builder, CreateTusUser(builder, vuser, builder.CreateString(targetNpId.data)), slotId, opeType, variable, isLastChangedDate, isLastChangedAuthorId, compareValue); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::TusTryAndSetVariable, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::TusTryAndSetVariable, req_id); } bool rpcn_client::tus_delete_multislot_variable(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, s32 arrayNum, bool vuser) { - const std::vector slotid_array(slotIdArray.get_ptr(), slotIdArray.get_ptr() + arrayNum); + np2_structs::TusDeleteMultiSlotVariableRequest pb_req; + auto* user = pb_req.mutable_user(); + user->set_vuser(vuser); + user->set_npid(targetNpId.data); - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateTusDeleteMultiSlotVariableRequest(builder, CreateTusUser(builder, vuser, builder.CreateString(targetNpId.data)), builder.CreateVector(slotid_array)); - builder.Finish(req_finished); + for (s32 i = 0; i < arrayNum; i++) + { + pb_req.add_slotidarray(slotIdArray[i]); + } - return forge_request_with_com_id(builder, communication_id, CommandType::TusDeleteMultiSlotVariable, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::TusDeleteMultiSlotVariable, req_id); } bool rpcn_client::tus_set_data(u32 req_id, SceNpCommunicationId& communication_id, const SceNpOnlineId& targetNpId, SceNpTusSlotId slotId, const std::vector& tus_data, vm::cptr info, vm::ptr option, bool vuser) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::TusSetDataRequest pb_req; + auto* user = pb_req.mutable_user(); + user->set_vuser(vuser); + user->set_npid(targetNpId.data); + pb_req.set_slotid(slotId); + pb_req.set_data(tus_data.data(), tus_data.size()); - flatbuffers::Offset> isLastChangedDate; - flatbuffers::Offset isLastChangedAuthorId; + if (info) + { + pb_req.set_info(info->data, static_cast(info->infoSize)); + } if (option) { if (option->isLastChangedDate) { - std::vector is_last_changed_date_vec; - is_last_changed_date_vec.push_back(option->isLastChangedDate->tick); - isLastChangedDate = builder.CreateVector(is_last_changed_date_vec); + pb_req.add_islastchangeddate(option->isLastChangedDate->tick); } if (option->isLastChangedAuthorId) { - isLastChangedAuthorId = builder.CreateString(option->isLastChangedAuthorId->handle.data); + pb_req.set_islastchangedauthorid(option->isLastChangedAuthorId->handle.data); } } - flatbuffers::Offset> fb_info; + std::string serialized; + pb_req.SerializeToString(&serialized); - if (info) - { - fb_info = builder.CreateVector(info->data, static_cast(info->infoSize)); - } - - auto req_finished = CreateTusSetDataRequest(builder, CreateTusUser(builder, vuser, builder.CreateString(targetNpId.data)), slotId, builder.CreateVector(tus_data), fb_info, isLastChangedDate, isLastChangedAuthorId); - builder.Finish(req_finished); - - return forge_request_with_com_id(builder, communication_id, CommandType::TusSetData, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::TusSetData, req_id); } bool rpcn_client::tus_get_data(u32 req_id, SceNpCommunicationId& communication_id, const SceNpOnlineId& targetNpId, SceNpTusSlotId slotId, bool vuser) { - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateTusGetDataRequest(builder, CreateTusUser(builder, vuser, builder.CreateString(targetNpId.data)), slotId); - builder.Finish(req_finished); + np2_structs::TusGetDataRequest pb_req; + auto* user = pb_req.mutable_user(); + user->set_vuser(vuser); + user->set_npid(targetNpId.data); + pb_req.set_slotid(slotId); - return forge_request_with_com_id(builder, communication_id, CommandType::TusGetData, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::TusGetData, req_id); } bool rpcn_client::tus_get_multislot_data_status(u32 req_id, SceNpCommunicationId& communication_id, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, s32 arrayNum, bool vuser) { - const std::vector slotid_array(slotIdArray.get_ptr(), slotIdArray.get_ptr() + arrayNum); + np2_structs::TusGetMultiSlotDataStatusRequest pb_req; + auto* user = pb_req.mutable_user(); + user->set_vuser(vuser); + user->set_npid(targetNpId.data); - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateTusGetMultiSlotDataStatusRequest(builder, CreateTusUser(builder, vuser, builder.CreateString(targetNpId.data)), builder.CreateVector(slotid_array)); - builder.Finish(req_finished); + for (s32 i = 0; i < arrayNum; i++) + { + pb_req.add_slotidarray(slotIdArray[i]); + } - return forge_request_with_com_id(builder, communication_id, CommandType::TusGetMultiSlotDataStatus, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::TusGetMultiSlotDataStatus, req_id); } bool rpcn_client::tus_get_multiuser_data_status(u32 req_id, SceNpCommunicationId& communication_id, const std::vector& targetNpIdArray, SceNpTusSlotId slotId, s32 arrayNum, bool vuser) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::TusGetMultiUserDataStatusRequest pb_req; + pb_req.set_slotid(slotId); - std::vector> davec; for (s32 i = 0; i < std::min(arrayNum, ::narrow(targetNpIdArray.size())); i++) { - davec.push_back(CreateTusUser(builder, vuser, builder.CreateString(targetNpIdArray[i].data))); + auto* user = pb_req.add_users(); + user->set_vuser(vuser); + user->set_npid(targetNpIdArray[i].data); } - auto req_finished = CreateTusGetMultiUserDataStatusRequest(builder, builder.CreateVector(davec), slotId); - builder.Finish(req_finished); + std::string serialized; + pb_req.SerializeToString(&serialized); - return forge_request_with_com_id(builder, communication_id, CommandType::TusGetMultiUserDataStatus, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::TusGetMultiUserDataStatus, req_id); } bool rpcn_client::tus_get_friends_data_status(u32 req_id, SceNpCommunicationId& communication_id, SceNpTusSlotId slotId, bool includeSelf, s32 sortType, s32 arrayNum) { - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateTusGetFriendsDataStatusRequest(builder, slotId, includeSelf, sortType, arrayNum); - builder.Finish(req_finished); + np2_structs::TusGetFriendsDataStatusRequest pb_req; + pb_req.set_slotid(slotId); + pb_req.set_includeself(includeSelf); + pb_req.set_sorttype(sortType); + pb_req.set_arraynum(arrayNum); - return forge_request_with_com_id(builder, communication_id, CommandType::TusGetFriendsDataStatus, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::TusGetFriendsDataStatus, req_id); } bool rpcn_client::tus_delete_multislot_data(u32 req_id, SceNpCommunicationId& communication_id, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, s32 arrayNum, bool vuser) { - const std::vector slotid_array(slotIdArray.get_ptr(), slotIdArray.get_ptr() + arrayNum); + np2_structs::TusDeleteMultiSlotDataRequest pb_req; + auto* user = pb_req.mutable_user(); + user->set_vuser(vuser); + user->set_npid(targetNpId.data); - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateTusDeleteMultiSlotDataRequest(builder, CreateTusUser(builder, vuser, builder.CreateString(targetNpId.data)), builder.CreateVector(slotid_array)); - builder.Finish(req_finished); + for (s32 i = 0; i < arrayNum; i++) + { + pb_req.add_slotidarray(slotIdArray[i]); + } - return forge_request_with_com_id(builder, communication_id, CommandType::TusDeleteMultiSlotData, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, communication_id, CommandType::TusDeleteMultiSlotData, req_id); } bool rpcn_client::send_presence(const SceNpCommunicationId& pr_com_id, const std::string& pr_title, const std::string& pr_status, const std::string& pr_comment, const std::vector& pr_data) { - flatbuffers::FlatBufferBuilder builder(1024); - auto req_finished = CreateSetPresenceRequest(builder, builder.CreateString(pr_title), builder.CreateString(pr_status), builder.CreateString(pr_comment), builder.CreateVector(pr_data)); - builder.Finish(req_finished); + np2_structs::SetPresenceRequest pb_req; + pb_req.set_title(pr_title); + pb_req.set_status(pr_status); + pb_req.set_comment(pr_comment); + pb_req.set_data(pr_data.data(), pr_data.size()); - return forge_request_with_com_id(builder, pr_com_id, CommandType::SetPresence, rpcn_request_counter.fetch_add(1)); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, pr_com_id, CommandType::SetPresence, rpcn_request_counter.fetch_add(1)); } bool rpcn_client::createjoin_room_gui(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatchingAttr* attr_list) { - flatbuffers::FlatBufferBuilder builder(1024); + np2_structs::CreateRoomGUIRequest pb_req; u32 total_slots = 0; u32 private_slots = 0; bool privilege_grant = false; bool stealth = false; - std::vector> vec_attrs; - for (const SceNpMatchingAttr* cur_attr = attr_list; cur_attr != nullptr; cur_attr = cur_attr->next ? cur_attr->next.get_ptr() : nullptr) { switch (cur_attr->type) @@ -2584,17 +2636,21 @@ namespace rpcn ensure(cur_attr->id >= 1u && cur_attr->id <= 16u, "Invalid game bin attribute id"); ensure(cur_attr->value.data.size <= 64u || ((cur_attr->id == 1u || cur_attr->id == 2u) && cur_attr->value.data.size <= 256u), "Invalid game bin size"); - const std::vector vec_data(static_cast(cur_attr->value.data.ptr.get_ptr()), static_cast(cur_attr->value.data.ptr.get_ptr()) + cur_attr->value.data.size); - auto attr = CreateMatchingAttrDirect(builder, cur_attr->type, cur_attr->id, 0, &vec_data); - vec_attrs.push_back(attr); + auto* attr = pb_req.add_game_attrs(); + attr->set_attr_type(cur_attr->type); + attr->set_attr_id(cur_attr->id); + attr->set_num(0); + attr->set_data(cur_attr->value.data.ptr.get_ptr(), cur_attr->value.data.size); break; } case SCE_NP_MATCHING_ATTR_TYPE_GAME_NUM: { ensure(cur_attr->id >= 1u && cur_attr->id <= 16u, "Invalid game num attribute id"); - auto attr = CreateMatchingAttrDirect(builder, cur_attr->type, cur_attr->id, cur_attr->value.num, nullptr); - vec_attrs.push_back(attr); + auto* attr = pb_req.add_game_attrs(); + attr->set_attr_type(cur_attr->type); + attr->set_attr_id(cur_attr->id); + attr->set_num(cur_attr->value.num); break; } default: @@ -2602,187 +2658,185 @@ namespace rpcn } } - flatbuffers::Offset>> final_attrs_vec; + pb_req.set_total_slots(total_slots); + pb_req.set_private_slots(private_slots); + pb_req.set_privilege_grant(privilege_grant); + pb_req.set_stealth(stealth); - if (!vec_attrs.empty()) - { - final_attrs_vec = builder.CreateVector(vec_attrs); - } + std::string serialized; + pb_req.SerializeToString(&serialized); - auto req_finished = CreateCreateRoomGUIRequest(builder, total_slots, private_slots, privilege_grant, stealth, final_attrs_vec); - builder.Finish(req_finished); - - return forge_request_with_com_id(builder, communication_id, CommandType::CreateRoomGUI, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::CreateRoomGUI, req_id); } bool rpcn_client::join_room_gui(u32 req_id, const SceNpRoomId& room_id) { - flatbuffers::FlatBufferBuilder builder(1024); - const std::vector vec_room_id(room_id.opt, room_id.opt + sizeof(room_id.opt)); - auto req_finished = CreateMatchingGuiRoomIdDirect(builder, &vec_room_id); - builder.Finish(req_finished); - return forge_request_with_data(builder, CommandType::JoinRoomGUI, req_id); + np2_structs::MatchingGuiRoomId pb_req; + pb_req.set_id(room_id.opt, sizeof(room_id.opt)); + + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_data(serialized, CommandType::JoinRoomGUI, req_id); } bool rpcn_client::leave_room_gui(u32 req_id, const SceNpRoomId& room_id) { - flatbuffers::FlatBufferBuilder builder(1024); - const std::vector vec_room_id(room_id.opt, room_id.opt + sizeof(room_id.opt)); - auto req_finished = CreateMatchingGuiRoomIdDirect(builder, &vec_room_id); - builder.Finish(req_finished); - return forge_request_with_data(builder, CommandType::LeaveRoomGUI, req_id); + np2_structs::MatchingGuiRoomId pb_req; + pb_req.set_id(room_id.opt, sizeof(room_id.opt)); + + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_data(serialized, CommandType::LeaveRoomGUI, req_id); } bool rpcn_client::get_room_list_gui(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatchingReqRange* range, vm::ptr cond, vm::ptr attr) { - flatbuffers::FlatBufferBuilder builder(1024); - - const s32 range_start = range->start; - const u32 range_max = range->max; - - std::vector> vec_conds; - std::vector> vec_attrs; + np2_structs::GetRoomListGUIRequest pb_req; + pb_req.set_range_start(range->start); + pb_req.set_range_max(range->max); for (auto cur_cond = cond; cur_cond; cur_cond = cur_cond->next) { - auto fb_cond = CreateMatchingSearchCondition(builder, cur_cond->target_attr_type, cur_cond->target_attr_id, cur_cond->comp_op, cur_cond->compared.value.num); - vec_conds.push_back(fb_cond); + auto* pb_cond = pb_req.add_conds(); + pb_cond->set_attr_type(cur_cond->target_attr_type); + pb_cond->set_attr_id(cur_cond->target_attr_id); + pb_cond->set_comp_op(cur_cond->comp_op); + pb_cond->set_comp_value(cur_cond->compared.value.num); } for (auto cur_attr = attr; cur_attr; cur_attr = cur_attr->next) { - auto fb_attr = CreateMatchingAttr(builder, cur_attr->type, cur_attr->id); - vec_attrs.push_back(fb_attr); + auto* pb_attr = pb_req.add_attrs(); + pb_attr->set_attr_type(cur_attr->type); + pb_attr->set_attr_id(cur_attr->id); } - flatbuffers::Offset>> final_conds_vec; - flatbuffers::Offset>> final_attrs_vec; + std::string serialized; + pb_req.SerializeToString(&serialized); - if (!vec_conds.empty()) - { - final_conds_vec = builder.CreateVector(vec_conds); - } - - if (!vec_attrs.empty()) - { - final_attrs_vec = builder.CreateVector(vec_attrs); - } - - auto req_finished = CreateGetRoomListGUIRequest(builder, range_start, range_max, final_conds_vec, final_attrs_vec); - builder.Finish(req_finished); - - return forge_request_with_com_id(builder, communication_id, CommandType::GetRoomListGUI, req_id); + return forge_request_with_com_id(serialized, communication_id, CommandType::GetRoomListGUI, req_id); } bool rpcn_client::set_room_search_flag_gui(u32 req_id, const SceNpRoomId& room_id, bool stealth) { - flatbuffers::FlatBufferBuilder builder(1024); - const std::vector vec_room_id(room_id.opt, room_id.opt + sizeof(room_id.opt)); - auto req_finished = CreateSetRoomSearchFlagGUIDirect(builder, &vec_room_id, stealth); - builder.Finish(req_finished); - return forge_request_with_data(builder, CommandType::SetRoomSearchFlagGUI, req_id); + np2_structs::SetRoomSearchFlagGUI pb_req; + pb_req.set_roomid(room_id.opt, sizeof(room_id.opt)); + pb_req.set_stealth(stealth); + + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_data(serialized, CommandType::SetRoomSearchFlagGUI, req_id); } bool rpcn_client::get_room_search_flag_gui(u32 req_id, const SceNpRoomId& room_id) { - flatbuffers::FlatBufferBuilder builder(1024); - const std::vector vec_room_id(room_id.opt, room_id.opt + sizeof(room_id.opt)); - auto req_finished = CreateMatchingGuiRoomIdDirect(builder, &vec_room_id); - builder.Finish(req_finished); - return forge_request_with_data(builder, CommandType::GetRoomSearchFlagGUI, req_id); + np2_structs::MatchingGuiRoomId pb_req; + pb_req.set_id(room_id.opt, sizeof(room_id.opt)); + + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_data(serialized, CommandType::GetRoomSearchFlagGUI, req_id); } bool rpcn_client::set_room_info_gui(u32 req_id, const SceNpRoomId& room_id, vm::ptr attrs) { - flatbuffers::FlatBufferBuilder builder(1024); - const std::vector vec_room_id(room_id.opt, room_id.opt + sizeof(room_id.opt)); - std::vector> vec_attrs; + np2_structs::MatchingRoom pb_req; + pb_req.set_id(room_id.opt, sizeof(room_id.opt)); for (auto cur_attr = attrs; cur_attr; cur_attr = cur_attr->next) { - u32 num = 0; - flatbuffers::Offset> fb_vec_data = 0; + auto* pb_attr = pb_req.add_attr(); + pb_attr->set_attr_type(cur_attr->type); + pb_attr->set_attr_id(cur_attr->id); switch (cur_attr->type) { case SCE_NP_MATCHING_ATTR_TYPE_GAME_BIN: { - const std::vector vec_data(static_cast(cur_attr->value.data.ptr.get_ptr()), static_cast(cur_attr->value.data.ptr.get_ptr()) + cur_attr->value.data.size); - fb_vec_data = builder.CreateVector(vec_data); + pb_attr->set_data(cur_attr->value.data.ptr.get_ptr(), cur_attr->value.data.size); break; } case SCE_NP_MATCHING_ATTR_TYPE_GAME_NUM: { - num = cur_attr->value.num; + pb_attr->set_num(cur_attr->value.num); break; } default: fmt::throw_exception("Invalid attr type reached set_room_info_gui"); } - - auto fb_attr = CreateMatchingAttr(builder, cur_attr->type, cur_attr->id, num, fb_vec_data); - vec_attrs.push_back(fb_attr); } - auto req_finished = CreateMatchingRoomDirect(builder, &vec_room_id, &vec_attrs); - builder.Finish(req_finished); - return forge_request_with_data(builder, CommandType::SetRoomInfoGUI, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_data(serialized, CommandType::SetRoomInfoGUI, req_id); } bool rpcn_client::get_room_info_gui(u32 req_id, const SceNpRoomId& room_id, vm::ptr attrs) { - flatbuffers::FlatBufferBuilder builder(1024); - const std::vector vec_room_id(room_id.opt, room_id.opt + sizeof(room_id.opt)); - std::vector> vec_attrs; + np2_structs::MatchingRoom pb_req; + pb_req.set_id(room_id.opt, sizeof(room_id.opt)); for (auto cur_attr = attrs; cur_attr; cur_attr = cur_attr->next) { - auto fb_attr = CreateMatchingAttr(builder, cur_attr->type, cur_attr->id); - vec_attrs.push_back(fb_attr); + auto* pb_attr = pb_req.add_attr(); + pb_attr->set_attr_type(cur_attr->type); + pb_attr->set_attr_id(cur_attr->id); } - auto req_finished = CreateMatchingRoomDirect(builder, &vec_room_id, &vec_attrs); - builder.Finish(req_finished); - return forge_request_with_data(builder, CommandType::GetRoomInfoGUI, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_data(serialized, CommandType::GetRoomInfoGUI, req_id); } bool rpcn_client::quickmatch_gui(u32 req_id, const SceNpCommunicationId& com_id, vm::cptr cond, s32 available_num) { - flatbuffers::FlatBufferBuilder builder(1024); - std::vector> vec_conds; + np2_structs::QuickMatchGUIRequest pb_req; + pb_req.set_available_num(available_num); for (auto cur_cond = cond; cur_cond; cur_cond = cur_cond->next) { - auto fb_cond = CreateMatchingSearchCondition(builder, cur_cond->target_attr_type, cur_cond->target_attr_id, cur_cond->comp_op, cur_cond->compared.value.num); - vec_conds.push_back(fb_cond); + auto* pb_cond = pb_req.add_conds(); + pb_cond->set_attr_type(cur_cond->target_attr_type); + pb_cond->set_attr_id(cur_cond->target_attr_id); + pb_cond->set_comp_op(cur_cond->comp_op); + pb_cond->set_comp_value(cur_cond->compared.value.num); } - auto req_finished = CreateQuickMatchGUIRequestDirect(builder, &vec_conds, available_num); - builder.Finish(req_finished); - return forge_request_with_com_id(builder, com_id, CommandType::QuickMatchGUI, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, com_id, CommandType::QuickMatchGUI, req_id); } bool rpcn_client::searchjoin_gui(u32 req_id, const SceNpCommunicationId& com_id, vm::cptr cond, vm::cptr attr) { - flatbuffers::FlatBufferBuilder builder(1024); - - std::vector> vec_conds; - std::vector> vec_attrs; + np2_structs::SearchJoinRoomGUIRequest pb_req; for (auto cur_cond = cond; cur_cond; cur_cond = cur_cond->next) { - auto fb_cond = CreateMatchingSearchCondition(builder, cur_cond->target_attr_type, cur_cond->target_attr_id, cur_cond->comp_op, cur_cond->compared.value.num); - vec_conds.push_back(fb_cond); + auto* pb_cond = pb_req.add_conds(); + pb_cond->set_attr_type(cur_cond->target_attr_type); + pb_cond->set_attr_id(cur_cond->target_attr_id); + pb_cond->set_comp_op(cur_cond->comp_op); + pb_cond->set_comp_value(cur_cond->compared.value.num); } for (auto cur_attr = attr; cur_attr; cur_attr = cur_attr->next) { - auto fb_attr = CreateMatchingAttr(builder, cur_attr->type, cur_attr->id); - vec_attrs.push_back(fb_attr); + auto* pb_attr = pb_req.add_attrs(); + pb_attr->set_attr_type(cur_attr->type); + pb_attr->set_attr_id(cur_attr->id); } - auto req_finished = CreateSearchJoinRoomGUIRequestDirect(builder, vec_conds.empty() ? nullptr : &vec_conds, vec_attrs.empty() ? nullptr : &vec_attrs); - builder.Finish(req_finished); - return forge_request_with_com_id(builder, com_id, CommandType::SearchJoinRoomGUI, req_id); + std::string serialized; + pb_req.SerializeToString(&serialized); + + return forge_request_with_com_id(serialized, com_id, CommandType::SearchJoinRoomGUI, req_id); } void rpcn_client::write_communication_id(const SceNpCommunicationId& com_id, std::vector& data) @@ -2793,28 +2847,26 @@ namespace rpcn memcpy(data.data(), com_id_str.data(), COMMUNICATION_ID_SIZE); } - bool rpcn_client::forge_request_with_com_id(const flatbuffers::FlatBufferBuilder& builder, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id) + bool rpcn_client::forge_request_with_com_id(const std::string& serialized_data, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id) { - const u8* buf = builder.GetBufferPointer(); - const usz bufsize = builder.GetSize(); + const usz bufsize = serialized_data.size(); std::vector data(COMMUNICATION_ID_SIZE + sizeof(u32) + bufsize); rpcn_client::write_communication_id(com_id, data); reinterpret_cast&>(data[COMMUNICATION_ID_SIZE]) = static_cast(bufsize); - memcpy(data.data() + COMMUNICATION_ID_SIZE + sizeof(u32), buf, bufsize); + memcpy(data.data() + COMMUNICATION_ID_SIZE + sizeof(u32), serialized_data.data(), bufsize); return forge_send(command, packet_id, data); } - bool rpcn_client::forge_request_with_data(const flatbuffers::FlatBufferBuilder& builder, CommandType command, u64 packet_id) + bool rpcn_client::forge_request_with_data(const std::string& serialized_data, CommandType command, u64 packet_id) { - const u8* buf = builder.GetBufferPointer(); - const usz bufsize = builder.GetSize(); + const usz bufsize = serialized_data.size(); std::vector data(sizeof(u32) + bufsize); reinterpret_cast&>(data[0]) = static_cast(bufsize); - memcpy(data.data() + sizeof(u32), buf, bufsize); + memcpy(data.data() + sizeof(u32), serialized_data.data(), bufsize); return forge_send(command, packet_id, data); } @@ -3066,15 +3118,15 @@ namespace rpcn // Unserialize the message vec_stream sdata(data); std::string sender = sdata.get_string(false); - auto* fb_mdata = sdata.get_flatbuffer(); + auto pb_mdata = sdata.get_protobuf(); if (sdata.is_error()) { return; } - if (!fb_mdata->communicationId() || fb_mdata->communicationId()->size() == 0 || fb_mdata->communicationId()->size() > 9 || - !fb_mdata->subject() || !fb_mdata->body() || !fb_mdata->data()) + if (pb_mdata->communicationid().empty() || pb_mdata->communicationid().size() > 9 || + pb_mdata->subject().empty() || pb_mdata->body().empty()) { rpcn_log.warning("Discarded invalid message!"); return; @@ -3082,14 +3134,14 @@ namespace rpcn message_data mdata = { .msgId = message_counter, - .mainType = fb_mdata->mainType(), - .subType = fb_mdata->subType(), - .msgFeatures = fb_mdata->msgFeatures(), - .subject = fb_mdata->subject()->str(), - .body = fb_mdata->body()->str()}; + .mainType = ::narrow(pb_mdata->maintype().value()), + .subType = ::narrow(pb_mdata->subtype().value()), + .msgFeatures = pb_mdata->msgfeatures(), + .subject = pb_mdata->subject(), + .body = pb_mdata->body()}; - strcpy_trunc(mdata.commId.data, fb_mdata->communicationId()->str()); - mdata.data.assign(fb_mdata->data()->Data(), fb_mdata->data()->Data() + fb_mdata->data()->size()); + strcpy_trunc(mdata.commId.data, pb_mdata->communicationid()); + mdata.data.assign(pb_mdata->data().begin(), pb_mdata->data().end()); // Save the message and call callbacks { diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index 3781711912..ba043d2d17 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -26,7 +26,6 @@ #include "Emu/Cell/Modules/sceNp.h" #include "Emu/Cell/Modules/sceNp2.h" #include "Emu/Cell/Modules/sceNpTus.h" -#include #ifdef __clang__ #pragma clang diagnostic push @@ -130,31 +129,27 @@ public: } template - const T* get_flatbuffer() + std::unique_ptr get_protobuf() { auto rawdata_vec = get_rawdata(); if (error) return nullptr; - if (vec.empty()) + if (rawdata_vec.empty()) { error = true; return nullptr; } - const T* ret = flatbuffers::GetRoot(rawdata_vec.data()); - flatbuffers::Verifier verifier(rawdata_vec.data(), rawdata_vec.size()); - - if (!ret->Verify(verifier)) + auto msg = std::make_unique(); + if (!msg->ParseFromArray(rawdata_vec.data(), static_cast(rawdata_vec.size()))) { error = true; return nullptr; } - aligned_bufs.push_back(std::move(rawdata_vec)); - - return ret; + return msg; } // Setters @@ -177,7 +172,6 @@ public: protected: std::vector& vec; - std::vector> aligned_bufs; usz i = 0; bool error = false; }; @@ -399,8 +393,8 @@ namespace rpcn std::vector forge_request(rpcn::CommandType command, u64 packet_id, const std::vector& data) const; bool forge_send(rpcn::CommandType command, u64 packet_id, const std::vector& data); - bool forge_request_with_com_id(const flatbuffers::FlatBufferBuilder& builder, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id); - bool forge_request_with_data(const flatbuffers::FlatBufferBuilder& builder, CommandType command, u64 packet_id); + bool forge_request_with_com_id(const std::string& serialized_data, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id); + bool forge_request_with_data(const std::string& serialized_data, CommandType command, u64 packet_id); bool forge_send_reply(rpcn::CommandType command, u64 packet_id, const std::vector& data, std::vector& reply_data); bool error_and_disconnect(const std::string& error_mgs); diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 15c4a26d81..8df2ef3092 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -40,7 +40,7 @@ Use - ..\3rdparty\miniupnp\miniupnp\miniupnpc\include;..\3rdparty\wolfssl\wolfssl;..\3rdparty\flatbuffers\include;..\3rdparty\libusb\libusb\libusb;..\3rdparty\yaml-cpp\yaml-cpp\include;..\3rdparty\SoundTouch\soundtouch\include;..\3rdparty\rtmidi\rtmidi;..\3rdparty\zlib\zlib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\include;$(VULKAN_SDK)\Include;..\3rdparty\zstd\zstd\lib;$(SolutionDir)3rdparty\fusion\fusion\Fusion;$(SolutionDir)3rdparty\wolfssl\extra\win32;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(SolutionDir)3rdparty\glslang\glslang;$(SolutionDir)3rdparty\curl\curl\include + ..\3rdparty\miniupnp\miniupnp\miniupnpc\include;..\3rdparty\wolfssl\wolfssl;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build\include;..\3rdparty\libusb\libusb\libusb;..\3rdparty\yaml-cpp\yaml-cpp\include;..\3rdparty\SoundTouch\soundtouch\include;..\3rdparty\rtmidi\rtmidi;..\3rdparty\zlib\zlib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\include;$(VULKAN_SDK)\Include;..\3rdparty\zstd\zstd\lib;$(SolutionDir)3rdparty\fusion\fusion\Fusion;$(SolutionDir)3rdparty\wolfssl\extra\win32;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(SolutionDir)3rdparty\glslang\glslang;$(SolutionDir)3rdparty\curl\curl\include MaxSpeed AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL3;ZLIB_CONST;WOLFSSL_USER_SETTINGS;CURL_STATICLIB;%(PreprocessorDefinitions) AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL3;ZLIB_CONST;WOLFSSL_USER_SETTINGS;CURL_STATICLIB;%(PreprocessorDefinitions) @@ -177,7 +177,7 @@ - + @@ -192,6 +192,9 @@ + + NotUsing + @@ -631,8 +634,8 @@ - - + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 09f4b3c2b6..5ca602fbec 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -996,7 +996,7 @@ Emu\GPU\RSX\Overlays - + Emu\NP @@ -1053,6 +1053,9 @@ Emu\NP + + Emu\NP + Emu\NP @@ -2283,7 +2286,7 @@ Emu\NP - + Emu\NP @@ -2755,7 +2758,7 @@ Emu\GPU\RSX\Host Mini-Driver - + Emu\NP diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 028f2e74c8..5fbf0491e9 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -69,7 +69,7 @@ - $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\include;$(SolutionDir)3rdparty\SoundTouch\soundtouch\include;$(SolutionDir)3rdparty\cubeb\extra;$(SolutionDir)3rdparty\cubeb\cubeb\include\;$(SolutionDir)3rdparty\flatbuffers\include;$(SolutionDir)3rdparty\wolfssl\wolfssl;$(SolutionDir)3rdparty\wolfssl\extra\win32;$(SolutionDir)3rdparty\curl\curl\include;$(SolutionDir)3rdparty\rtmidi\rtmidi;$(SolutionDir)3rdparty\libusb\libusb\libusb;$(VULKAN_SDK)\Include;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtSvgWidgets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtMultimedia;$(QTDIR)\mkspecs\win32-msvc;.\release;.\QTGeneratedFiles\$(ConfigurationName);.\QTGeneratedFiles;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\include;$(SolutionDir)3rdparty\SoundTouch\soundtouch\include;$(SolutionDir)3rdparty\cubeb\extra;$(SolutionDir)3rdparty\cubeb\cubeb\include\;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build\include;$(SolutionDir)3rdparty\wolfssl\wolfssl;$(SolutionDir)3rdparty\wolfssl\extra\win32;$(SolutionDir)3rdparty\curl\curl\include;$(SolutionDir)3rdparty\rtmidi\rtmidi;$(SolutionDir)3rdparty\libusb\libusb\libusb;$(VULKAN_SDK)\Include;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtSvgWidgets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtMultimedia;$(QTDIR)\mkspecs\win32-msvc;.\release;.\QTGeneratedFiles\$(ConfigurationName);.\QTGeneratedFiles;%(AdditionalIncludeDirectories) /Zc:__cplusplus -Zc:strictStrings -Zc:throwingNew- -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions) release\ false @@ -88,7 +88,7 @@ opencv_world4120.lib;DbgHelp.lib;Ole32.lib;gdi32.lib;hidapi.lib;libusb-1.0.lib;winmm.lib;miniupnpc_static.lib;rtmidi.lib;imm32.lib;ksuser.lib;version.lib;OpenAL32.lib;XAudio.lib;GLGSRender.lib;shlwapi.lib;VKGSRender.lib;vulkan-1.lib;wolfssl.lib;libcurl.lib;Wldap32.lib;glslang.lib;OSDependent.lib;SPIRV.lib;MachineIndependent.lib;GenericCodeGen.lib;Advapi32.lib;user32.lib;zlib.lib;zstd.lib;libpng16.lib;asmjit.lib;yaml-cpp.lib;discord-rpc.lib;emucore.lib;dxgi.lib;shell32.lib;Qt6Core.lib;Qt6Gui.lib;Qt6Widgets.lib;Qt6Concurrent.lib;Qt6Multimedia.lib;Qt6MultimediaWidgets.lib;Qt6Svg.lib;Qt6SvgWidgets.lib;7zip.lib;libcubeb.lib;cubeb.lib;soundtouch.lib;Avrt.lib;SDL.lib;fusion.lib;%(AdditionalDependencies) - $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\x64\lib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\glslang;$(SolutionDir)build\lib_ext\$(CONFIGURATION)-$(PLATFORM);$(QTDIR)\lib;$(VULKAN_SDK)\Lib;%(AdditionalLibraryDirectories) + $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\x64\lib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\glslang;$(SolutionDir)build\lib_ext\$(CONFIGURATION)-$(PLATFORM);$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build\lib;$(QTDIR)\lib;$(VULKAN_SDK)\Lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true Debug @@ -130,7 +130,7 @@ - $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\include;$(SolutionDir)3rdparty\SoundTouch\soundtouch\include;$(SolutionDir)3rdparty\cubeb\extra;$(SolutionDir)3rdparty\cubeb\cubeb\include\;$(SolutionDir)3rdparty\flatbuffers\include;$(SolutionDir)3rdparty\wolfssl\wolfssl;$(SolutionDir)3rdparty\wolfssl\extra\win32;$(SolutionDir)3rdparty\curl\curl\include;$(SolutionDir)3rdparty\rtmidi\rtmidi;$(SolutionDir)3rdparty\libusb\libusb\libusb;$(VULKAN_SDK)\Include;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtSvgWidgets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtMultimedia;$(QTDIR)\mkspecs\win32-msvc;.\debug;.\QTGeneratedFiles\$(ConfigurationName);.\QTGeneratedFiles;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\include;$(SolutionDir)3rdparty\SoundTouch\soundtouch\include;$(SolutionDir)3rdparty\cubeb\extra;$(SolutionDir)3rdparty\cubeb\cubeb\include\;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build\include;$(SolutionDir)3rdparty\wolfssl\wolfssl;$(SolutionDir)3rdparty\wolfssl\extra\win32;$(SolutionDir)3rdparty\curl\curl\include;$(SolutionDir)3rdparty\rtmidi\rtmidi;$(SolutionDir)3rdparty\libusb\libusb\libusb;$(VULKAN_SDK)\Include;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtSvgWidgets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtMultimedia;$(QTDIR)\mkspecs\win32-msvc;.\debug;.\QTGeneratedFiles\$(ConfigurationName);.\QTGeneratedFiles;%(AdditionalIncludeDirectories) /Zc:__cplusplus -Zc:strictStrings -Zc:throwingNew- -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions) debug\ false @@ -148,7 +148,7 @@ opencv_world4120.lib;DbgHelp.lib;Ole32.lib;gdi32.lib;hidapi.lib;libusb-1.0.lib;winmm.lib;miniupnpc_static.lib;rtmidi.lib;imm32.lib;ksuser.lib;version.lib;OpenAL32.lib;XAudio.lib;GLGSRender.lib;shlwapi.lib;VKGSRender.lib;vulkan-1.lib;wolfssl.lib;libcurl.lib;Wldap32.lib;glslangd.lib;OSDependentd.lib;SPIRVd.lib;MachineIndependentd.lib;GenericCodeGend.lib;Advapi32.lib;user32.lib;zlib.lib;zstd.lib;libpng16.lib;asmjit.lib;yaml-cpp.lib;discord-rpc.lib;emucore.lib;dxgi.lib;shell32.lib;Qt6Cored.lib;Qt6Guid.lib;Qt6Widgetsd.lib;Qt6Concurrentd.lib;Qt6Multimediad.lib;Qt6MultimediaWidgetsd.lib;Qt6Svgd.lib;Qt6SvgWidgetsd.lib;7zip.lib;libcubeb.lib;cubeb.lib;soundtouch.lib;Avrt.lib;SDL.lib;fusion.lib;%(AdditionalDependencies) - $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\x64\lib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\glslang;$(SolutionDir)build\lib\$(CONFIGURATION)-$(PLATFORM);$(QTDIR)\lib;$(VULKAN_SDK)\Lib;%(AdditionalLibraryDirectories) + $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\x64\lib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\glslang;$(SolutionDir)build\lib\$(CONFIGURATION)-$(PLATFORM);$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build\lib;$(QTDIR)\lib;$(VULKAN_SDK)\Lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /VERBOSE %(AdditionalOptions) true Debug @@ -1215,21 +1215,21 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" @@ -1237,11 +1237,11 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" @@ -1399,31 +1399,31 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\rtmidi\rtmidi" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\rtmidi\rtmidi" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\rtmidi\rtmidi" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\rtmidi\rtmidi" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\rtmidi\rtmidi" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\rtmidi\rtmidi" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\rtmidi\rtmidi" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\rtmidi\rtmidi" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" @@ -1441,10 +1441,10 @@ Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) $(QTDIR)\bin\moc.exe;%(FullPath) @@ -1466,52 +1466,52 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" @@ -1529,7 +1529,7 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -1539,7 +1539,7 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -1549,7 +1549,7 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -1559,7 +1559,7 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -1569,11 +1569,11 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" @@ -1582,10 +1582,10 @@ Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) $(QTDIR)\bin\moc.exe;%(FullPath) @@ -1593,31 +1593,31 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" @@ -1626,31 +1626,31 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" @@ -1658,61 +1658,61 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" @@ -1781,41 +1781,41 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" @@ -1845,11 +1845,11 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" diff --git a/rpcs3/tests/rpcs3_test.vcxproj b/rpcs3/tests/rpcs3_test.vcxproj index 867a6e651f..263334d19e 100644 --- a/rpcs3/tests/rpcs3_test.vcxproj +++ b/rpcs3/tests/rpcs3_test.vcxproj @@ -49,7 +49,7 @@ rpcs3.lib;opencv_world4120.lib;DbgHelp.lib;Ole32.lib;gdi32.lib;hidapi.lib;libusb-1.0.lib;winmm.lib;miniupnpc_static.lib;rtmidi.lib;imm32.lib;ksuser.lib;version.lib;OpenAL32.lib;XAudio.lib;GLGSRender.lib;shlwapi.lib;VKGSRender.lib;vulkan-1.lib;wolfssl.lib;libcurl.lib;Wldap32.lib;glslang.lib;OSDependent.lib;SPIRV.lib;MachineIndependent.lib;GenericCodeGen.lib;Advapi32.lib;user32.lib;zlib.lib;zstd.lib;libpng16.lib;asmjit.lib;yaml-cpp.lib;discord-rpc.lib;emucore.lib;dxgi.lib;shell32.lib;Qt6Core.lib;Qt6Gui.lib;Qt6Widgets.lib;Qt6Concurrent.lib;Qt6Multimedia.lib;Qt6MultimediaWidgets.lib;Qt6Svg.lib;Qt6SvgWidgets.lib;7zip.lib;libcubeb.lib;cubeb.lib;soundtouch.lib;Avrt.lib;SDL.lib;fusion.lib;%(AdditionalDependencies) - $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\x64\lib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\glslang;$(SolutionDir)build\lib_ext\$(CONFIGURATION)-$(PLATFORM);$(QTDIR)\lib;$(VULKAN_SDK)\Lib;%(AdditionalLibraryDirectories) + $(SolutionDir)3rdparty\opencv\opencv\opencv412\build\x64\lib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\glslang;$(SolutionDir)build\lib_ext\$(CONFIGURATION)-$(PLATFORM);$(SolutionDir)build\lib\$(Configuration)-$(Platform)\protobuf_build\lib;$(QTDIR)\lib;$(VULKAN_SDK)\Lib;%(AdditionalLibraryDirectories) Console true From aec981935ce45a0eccb4b97c216d71703ebbd6f7 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 24 Jan 2026 13:45:49 +0100 Subject: [PATCH 167/630] Migration bugfixes --- rpcs3/Emu/NP/np_requests.cpp | 3 ++- rpcs3/Emu/NP/rpcn_client.h | 6 ------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index 1c9102ba2a..bcc97a2b25 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -1251,11 +1251,12 @@ namespace np for (int i = 0; i < resp->rankarray_size(); i++) { const auto& pb_rankdata = resp->rankarray(i); - ensure(!pb_rankdata.npid().empty() && !pb_rankdata.onlinename().empty()); if (pb_rankdata.recorddate() == 0) continue; + ensure(!pb_rankdata.npid().empty() && !pb_rankdata.onlinename().empty()); + num_scores_registered++; if (tdata->player_rank_data) diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index ba043d2d17..e3c3f47ba9 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -136,12 +136,6 @@ public: if (error) return nullptr; - if (rawdata_vec.empty()) - { - error = true; - return nullptr; - } - auto msg = std::make_unique(); if (!msg->ParseFromArray(rawdata_vec.data(), static_cast(rawdata_vec.size()))) { From a5f570996f2c825ddd65b6d4709f066eaa951f5e Mon Sep 17 00:00:00 2001 From: Rosalie Wanders Date: Thu, 22 Jan 2026 20:13:00 +0100 Subject: [PATCH 168/630] Qt: change UI labels based on device product type --- rpcs3/rpcs3qt/pad_settings_dialog.cpp | 105 ++++++++++++++++++++++++++ rpcs3/rpcs3qt/pad_settings_dialog.h | 1 + 2 files changed, 106 insertions(+) diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.cpp b/rpcs3/rpcs3qt/pad_settings_dialog.cpp index 2940143a27..21be0db0af 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/pad_settings_dialog.cpp @@ -184,6 +184,11 @@ pad_settings_dialog::pad_settings_dialog(std::shared_ptr gui_setti if (index < 0) return; HandleDeviceClassChange(ui->chooseClass->currentData().toUInt()); }); + connect(ui->chooseProduct, &QComboBox::currentIndexChanged, this, [this](int index) + { + if (index < 0) return; + HandleDeviceProductChange(ui->chooseProduct->currentData().toUInt()); + }); ui->chb_show_emulated_values->setChecked(m_gui_settings->GetValue(gui::pads_show_emulated).toBool()); @@ -1790,6 +1795,106 @@ void pad_settings_dialog::HandleDeviceClassChange(u32 class_id) const } } +void pad_settings_dialog::HandleDeviceProductChange(u32 product_id) const +{ + QString cross_title = tr("Cross"); + QString circle_title = tr("Circle"); + QString square_title = tr("Square"); + QString triangle_title = tr("Triangle"); + QString dpad_up_title = tr("Up"); + QString dpad_down_title = tr("Down"); + QString right_stick_up_title = tr("Up"); + QString right_stick_down_title = tr("Down"); + QString right_stick_right_title = tr("Right"); + QString l1_title = tr("L1"); + QString l2_title = tr("L2"); + QString l3_title = tr("L3"); + QString r1_title = tr("R1"); + QString r3_title = tr("R3"); + + switch (static_cast(product_id)) + { + case input::product_type::red_octane_gh_guitar: + { + cross_title = tr("Green Fret"); + circle_title = tr("Red Fret"); + square_title = tr("Yellow Fret"); + triangle_title = tr("Blue Fret"); + dpad_up_title = tr("Strum Up"); + dpad_down_title = tr("Strum Down"); + right_stick_right_title = tr("Whammy"); + l1_title = tr("Orange Fret"); + break; + } + case input::product_type::harmonix_rockband_guitar: + { + cross_title = tr("Green Fret"); + circle_title = tr("Red Fret"); + square_title = tr("Blue Fret"); + triangle_title = tr("Yellow Fret"); + dpad_up_title = tr("Strum Up"); + dpad_down_title = tr("Strum Down"); + right_stick_up_title = tr("Pickup Switch Up"); + right_stick_down_title = tr("Pickup Switch Down"); + right_stick_right_title = tr("Whammy"); + l1_title = tr("Orange Fret"); + l2_title = tr("Solo Modifier"); + r1_title = tr("Tilt"); + break; + } + case input::product_type::red_octane_gh_drum_kit: + { + cross_title = tr("Green Pad"); + circle_title = tr("Red Pad"); + square_title = tr("Blue Pad"); + triangle_title = tr("Yellow Pad"); + l1_title = tr("Foot Pedal"); + r1_title = tr("Orange Pad"); + break; + } + case input::product_type::harmonix_rockband_drum_kit: + { + cross_title = tr("Green Pad"); + circle_title = tr("Red Pad"); + square_title = tr("Blue Pad"); + triangle_title = tr("Yellow Pad"); + l1_title = tr("Foot Pedal"); + break; + } + case input::product_type::harmonix_rockband_drum_kit_2: + { + cross_title = tr("Green Pad"); + circle_title = tr("Red Pad"); + square_title = tr("Blue Pad"); + triangle_title = tr("Yellow Pad"); + l1_title = tr("Foot Pedal"); + l3_title = tr("Pad Modifier"); + r1_title = tr("Double Bass Pedal"); + r3_title = tr("Cymbal Modifier"); + break; + } + default: + { + break; + } + } + + ui->gb_triangle->setTitle(triangle_title); + ui->gb_circle->setTitle(circle_title); + ui->gb_cross->setTitle(cross_title); + ui->gb_square->setTitle(square_title); + ui->gb_dpad_up->setTitle(dpad_up_title); + ui->gb_dpad_down->setTitle(dpad_down_title); + ui->gb_right_stick_up->setTitle(right_stick_up_title); + ui->gb_right_stick_down->setTitle(right_stick_down_title); + ui->gb_right_stick_right->setTitle(right_stick_right_title); + ui->gb_l1->setTitle(l1_title); + ui->gb_l2->setTitle(l2_title); + ui->gb_l3->setTitle(l3_title); + ui->gb_r1->setTitle(r1_title); + ui->gb_r3->setTitle(r3_title); +} + void pad_settings_dialog::AddConfigFile() { QInputDialog* dialog = new QInputDialog(this); diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.h b/rpcs3/rpcs3qt/pad_settings_dialog.h index e9e56903df..0e31b0a297 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.h +++ b/rpcs3/rpcs3qt/pad_settings_dialog.h @@ -101,6 +101,7 @@ private Q_SLOTS: void ChangeConfig(const QString& config_file); void ChangeDevice(int index); void HandleDeviceClassChange(u32 class_id) const; + void HandleDeviceProductChange(u32 product_id) const; void AddConfigFile(); void RemoveConfigFile(); /** Update the current player config with the GUI values. */ From ef9ff09e1798f0da892b5b6a2f74b20ee2eda46f Mon Sep 17 00:00:00 2001 From: Skiski Date: Sat, 24 Jan 2026 18:35:00 +0100 Subject: [PATCH 169/630] change velocity for RB3 pro guitar when it stays the same twice in a row (#18064) There is a bug when you play twice in a row with the same velocity on a string. The second note is not taken into account as the game does not notice any change in the velocity. It is because the velocity is never reset (or at least not very often). The idea is to check if the velocity of the string is the same as the previous one. And if it is, we just flip the last bit. Since the accepted values goes from 6 to 127, from what I've seen, it should be ok. I don't have an official RB3 pro guitar, but I have a YouRock Guitar that is compatible and works perfectly with a real MPA. When I use midi in rpcs3, I miss notes because of that bug. I've add a log message to test the patch and in a streak of nearly 150 notes, I should have missed nearly 20 notes. I had absolutely no missed note with thanks to the patch. fixes https://github.com/RPCS3/rpcs3/issues/18062 --------- Co-authored-by: Romain Janvier --- rpcs3/Emu/Io/RB3MidiGuitar.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Io/RB3MidiGuitar.cpp b/rpcs3/Emu/Io/RB3MidiGuitar.cpp index 9895722638..1d6d10bb76 100644 --- a/rpcs3/Emu/Io/RB3MidiGuitar.cpp +++ b/rpcs3/Emu/Io/RB3MidiGuitar.cpp @@ -265,7 +265,16 @@ void usb_device_rb3_midi_guitar::parse_midi_message(u8* msg, usz size) // read strings if (size == 8 && msg[0] == 0xF0 && msg[4] == 0x05) { - button_state.string_velocities[msg[5] - 1] = msg[6]; + // if the velocity remains the same, the game does not know that you've just played a string + u8& velocity = ::at32(button_state.string_velocities, msg[5] - 1); + if (msg[6] != 0 && msg[6] == velocity) + { + velocity = msg[6] ^ 1; // to be sure to change the velocity + } + else + { + velocity = msg[6]; + } } // read buttons From f70b5e0c1ccec69697adcbcb4c5bcff092dec145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20L=C3=B3pez=20Guimaraes?= Date: Wed, 14 Jan 2026 18:21:56 +0000 Subject: [PATCH 170/630] cellVdec: Add support for all MPEG4 profile levels The names are based from the maximum resolution that the PS3 supports and the levels that are listed on the MPEG-4 Part 2 Wikipedia. The PS3 uses a separate decoder for MPEG4 instead of DivX, so the handling on cellVdecGetPicItem should probably be separate too. However, research needs to be done on that side and things seem to be working with what we currently have. --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 81 +++++++++++++++++++++++++++-- rpcs3/Emu/Cell/Modules/cellVdec.h | 20 +++++-- 2 files changed, 95 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index 49975b632c..2a8f855d6b 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -780,6 +780,83 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 break; } case CELL_VDEC_CODEC_TYPE_MPEG4: + { + cellVdec.warning("cellVdecQueryAttr: MPEG4 (profile=%d)", profile); + + const vm::ptr sinfo = vm::cast(spec_addr); + + if (sinfo) + { + if (sinfo->thisSize != sizeof(CellVdecMpeg4SpecificInfo)) + { + return { CELL_VDEC_ERROR_ARG, "Invalid MPEG4 specific info size %d", sinfo->thisSize }; + } + } + + // TODO: sinfo + + const u32 maxDecH = sinfo ? +sinfo->maxDecodedFrameHeight : 0; + const u32 maxDecW = sinfo ? +sinfo->maxDecodedFrameWidth : 0; + + switch (profile) + { + case CELL_VDEC_MPEG4_SP_L1: + { + if (maxDecW > 176 || maxDecH > 144) + { + return { CELL_VDEC_ERROR_ARG, "Invalid max decoded frame size %dx%d for profile %d", maxDecH, maxDecW, profile }; + } + + memSize = new_sdk ? 0x8B78B : 0xBB70B; + break; + } + case CELL_VDEC_MPEG4_SP_L2: + case CELL_VDEC_MPEG4_SP_L3: + { + if (maxDecW > 352 || maxDecH > 288) + { + return { CELL_VDEC_ERROR_ARG, "Invalid max decoded frame size %dx%d for profile %d", maxDecH, maxDecW, profile }; + } + + memSize = new_sdk ? 0xEFE0B : 0x11FD8B; + break; + } + case CELL_VDEC_MPEG4_SP_D1_NTSC: + { + if (maxDecW > 720 || maxDecH > 480) + { + return { CELL_VDEC_ERROR_ARG, "Invalid max decoded frame size %dx%d for profile %d", maxDecH, maxDecW, profile }; + } + + memSize = new_sdk ? 0x22DB0B : 0x25DA8B; + break; + } + case CELL_VDEC_MPEG4_SP_VGA: + { + if (maxDecW > 640 || maxDecH > 480) + { + return { CELL_VDEC_ERROR_ARG, "Invalid max decoded frame size %dx%d for profile %d", maxDecH, maxDecW, profile }; + } + + memSize = new_sdk ? 0x1FC00B : 0x22BF8B; + break; + } + case CELL_VDEC_MPEG4_SP_D1_PAL: + { + if (maxDecW > 720 || maxDecH > 576) + { + return { CELL_VDEC_ERROR_ARG, "Invalid max decoded frame size %dx%d for profile %d", maxDecH, maxDecW, profile }; + } + + memSize = new_sdk ? 0x28570B : 0x2B568B; + break; + } + default: return { CELL_VDEC_ERROR_ARG, "Invalid MPEG4 profile %d", profile }; + } + + decoderVerLower = 0x1080000; + break; + } case CELL_VDEC_CODEC_TYPE_DIVX: { cellVdec.warning("cellVdecQueryAttr: DivX (profile=%d)", profile); @@ -822,9 +899,6 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 { case CELL_VDEC_DIVX_QMOBILE : memSize = new_sdk ? 0x11B720 : 0x1DEF30; break; case CELL_VDEC_DIVX_MOBILE : memSize = new_sdk ? 0x19A740 : 0x26DED0; break; - case CELL_VDEC_MPEG4_PROFILE_1: - case CELL_VDEC_MPEG4_PROFILE_3: - case CELL_VDEC_MPEG4_PROFILE_4: // just a guess based on the profile used by singstar before and after update case CELL_VDEC_DIVX_HOME_THEATER: memSize = new_sdk ? 0x386A60 : 0x498060; break; case CELL_VDEC_DIVX_HD_720 : memSize = new_sdk ? 0x692070 : 0x805690; break; case CELL_VDEC_DIVX_HD_1080 : memSize = new_sdk ? 0xD78100 : 0xFC9870; break; @@ -1527,6 +1601,7 @@ error_code cellVdecGetPicItem(ppu_thread& ppu, u32 handle, vm::pptrreserved[0] = 0; avc->reserved[1] = 0; } + // TODO: handle MPEG4 properly else if (vdec->type == CELL_VDEC_CODEC_TYPE_MPEG4 || vdec->type == CELL_VDEC_CODEC_TYPE_DIVX) { const vm::ptr dvx = picinfo_addr; diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.h b/rpcs3/Emu/Cell/Modules/cellVdec.h index c8d6df4ae4..b18530ca33 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.h +++ b/rpcs3/Emu/Cell/Modules/cellVdec.h @@ -389,9 +389,6 @@ struct CellVdecAvcInfo // DIVX Profile enum DIVX_level : u8 { - CELL_VDEC_MPEG4_PROFILE_1 = 1, // SingStar Vol.2 / Vol.3 - CELL_VDEC_MPEG4_PROFILE_3 = 3, // Used for SingStar recordings - CELL_VDEC_MPEG4_PROFILE_4 = 4, // SingStar Pop CELL_VDEC_DIVX_QMOBILE = 10, CELL_VDEC_DIVX_MOBILE = 11, CELL_VDEC_DIVX_HOME_THEATER = 12, @@ -676,3 +673,20 @@ struct CellVdecMpeg2Info u8 ccData[2][128]; be_t reserved[2]; }; + +enum MPEG4_level +{ + CELL_VDEC_MPEG4_SP_L1, + CELL_VDEC_MPEG4_SP_L2, + CELL_VDEC_MPEG4_SP_L3, + CELL_VDEC_MPEG4_SP_D1_NTSC, + CELL_VDEC_MPEG4_SP_VGA, + CELL_VDEC_MPEG4_SP_D1_PAL, +}; + +struct CellVdecMpeg4SpecificInfo +{ + be_t thisSize; + be_t maxDecodedFrameWidth; + be_t maxDecodedFrameHeight; +}; From 4b07ac4f27218e9b52deaf29aecd8d221476bdbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20L=C3=B3pez=20Guimaraes?= Date: Wed, 14 Jan 2026 18:29:59 +0000 Subject: [PATCH 171/630] cellVdec: Document all supported codecs These are all the codecs that the PS3 can handle. There are some numbers skipped on the codecs enum, but this is intentional: there isn't a codec assigned to those. --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 6 ++---- rpcs3/Emu/Cell/Modules/cellVdec.h | 13 +++++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index 2a8f855d6b..2f1cb6862b 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -1200,8 +1200,7 @@ error_code cellVdecDecodeAu(ppu_thread& ppu, u32 handle, CellVdecDecodeMode mode return { CELL_VDEC_ERROR_ARG, "mode=%d", +mode }; } - // TODO: what does the 3 stand for ? - if ((mode == (CELL_VDEC_DEC_MODE_B_SKIP | CELL_VDEC_DEC_MODE_PB_SKIP) && vdec->type != 3) || + if ((mode == (CELL_VDEC_DEC_MODE_B_SKIP | CELL_VDEC_DEC_MODE_PB_SKIP) && vdec->type != CELL_VDEC_CODEC_TYPE_VC1) || (mode == CELL_VDEC_DEC_MODE_PB_SKIP && vdec->type != CELL_VDEC_CODEC_TYPE_AVC)) { return { CELL_VDEC_ERROR_ARG, "mode=%d, type=%d", +mode, vdec->type }; @@ -1248,8 +1247,7 @@ error_code cellVdecDecodeAuEx2(ppu_thread& ppu, u32 handle, CellVdecDecodeMode m return { CELL_VDEC_ERROR_ARG, "mode=%d", +mode }; } - // TODO: what does the 3 stand for ? - if ((mode == (CELL_VDEC_DEC_MODE_B_SKIP | CELL_VDEC_DEC_MODE_PB_SKIP) && vdec->type != 3) || + if ((mode == (CELL_VDEC_DEC_MODE_B_SKIP | CELL_VDEC_DEC_MODE_PB_SKIP) && vdec->type != CELL_VDEC_CODEC_TYPE_VC1) || (mode == CELL_VDEC_DEC_MODE_PB_SKIP && vdec->type != CELL_VDEC_CODEC_TYPE_AVC)) { return { CELL_VDEC_ERROR_ARG, "mode=%d, type=%d", +mode, vdec->type }; diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.h b/rpcs3/Emu/Cell/Modules/cellVdec.h index b18530ca33..a1f9c3ae50 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.h +++ b/rpcs3/Emu/Cell/Modules/cellVdec.h @@ -14,10 +14,15 @@ enum CellVdecError : u32 enum CellVdecCodecType : s32 { - CELL_VDEC_CODEC_TYPE_MPEG2 = 0, - CELL_VDEC_CODEC_TYPE_AVC = 1, - CELL_VDEC_CODEC_TYPE_MPEG4 = 2, - CELL_VDEC_CODEC_TYPE_DIVX = 5, + CELL_VDEC_CODEC_TYPE_MPEG2 = 0, + CELL_VDEC_CODEC_TYPE_AVC = 1, + CELL_VDEC_CODEC_TYPE_MPEG4 = 2, + CELL_VDEC_CODEC_TYPE_VC1 = 3, + CELL_VDEC_CODEC_TYPE_DIVX = 5, + CELL_VDEC_CODEC_TYPE_JVT = 7, + CELL_VDEC_CODEC_TYPE_DIVX3_11 = 9, + CELL_VDEC_CODEC_TYPE_MVC = 11, + CELL_VDEC_CODEC_TYPE_MVC2 = 13, // seems the same as CELL_VDEC_CODEC_TYPE_MVC? CELL_VDEC_CODEC_TYPE_MAX }; From b41c2754ce0d49d92dfb7843180abb8682b4a599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20L=C3=B3pez=20Guimaraes?= Date: Wed, 14 Jan 2026 20:02:43 +0000 Subject: [PATCH 172/630] cellVdec: Remove resolved TODOs --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index 2f1cb6862b..5cf5e64a51 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -726,8 +726,6 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 } } - // TODO: sinfo - const u32 maxDecH = sinfo ? +sinfo->maxDecodedFrameHeight : 0; const u32 maxDecW = sinfo ? +sinfo->maxDecodedFrameWidth : 0; @@ -793,8 +791,6 @@ static error_code vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 } } - // TODO: sinfo - const u32 maxDecH = sinfo ? +sinfo->maxDecodedFrameHeight : 0; const u32 maxDecW = sinfo ? +sinfo->maxDecodedFrameWidth : 0; From a646a66ead2001c83ccd07dcd5558dc5d1f053af Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Sat, 10 Jan 2026 21:16:19 +0000 Subject: [PATCH 173/630] [macOS] Fix release naming --- .ci/deploy-mac.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.ci/deploy-mac.sh b/.ci/deploy-mac.sh index 8b6301f8b9..53212357d0 100755 --- a/.ci/deploy-mac.sh +++ b/.ci/deploy-mac.sh @@ -76,7 +76,11 @@ echo "[InternetShortcut]" > Quickstart.url echo "URL=https://rpcs3.net/quickstart" >> Quickstart.url echo "IconIndex=0" >> Quickstart.url -ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${COMM_TAG}-${COMM_COUNT}-${COMM_HASH}_macos.7z" +if [ "$AARCH64" -eq 1 ]; then + ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${COMM_TAG}-${COMM_COUNT}-${COMM_HASH}_macos_arm64.7z" +else + ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${COMM_TAG}-${COMM_COUNT}-${COMM_HASH}_macos.7z" +fi 7z a -mx9 "$ARCHIVE_FILEPATH" RPCS3.app Quickstart.url FILESIZE=$(stat -f %z "$ARCHIVE_FILEPATH") SHA256SUM=$(shasum -a 256 "$ARCHIVE_FILEPATH" | awk '{ print $1 }') From 7a12e806669d10a6a9f5d107b3cc1ce46062b82c Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Sat, 10 Jan 2026 21:16:19 +0000 Subject: [PATCH 174/630] [macOS] Specify plist version --- .ci/build-mac.sh | 14 +++++++++++++- .ci/deploy-mac.sh | 14 ++------------ rpcs3/rpcs3.plist.in | 6 ++---- rpcs3/rpcs3_version.cpp | 2 -- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/.ci/build-mac.sh b/.ci/build-mac.sh index 9eb27681b7..2f43e05e74 100755 --- a/.ci/build-mac.sh +++ b/.ci/build-mac.sh @@ -1,4 +1,13 @@ #!/bin/sh -ex +# Gather explicit version number and number of commits +COMM_TAG=$(awk '/version{.*}/ { printf("%d.%d.%d", $5, $6, $7) }' rpcs3/rpcs3_version.cpp) +COMM_COUNT=$(git rev-list --count HEAD) +COMM_HASH=$(git rev-parse --short=8 HEAD) + +# AVVER is used for GitHub releases, it is the version number. LVER is used for release naming. +AVVER="${COMM_TAG}-${COMM_COUNT}" +export LVER="${COMM_TAG}-${COMM_COUNT}-${COMM_HASH}" +echo "AVVER=$AVVER" >> .ci/ci-vars.env export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 @@ -13,7 +22,6 @@ else arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader molten-vk arch -x86_64 /usr/local/bin/brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative - arch -x86_64 /usr/local/bin/brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" fi export CXX=clang++ @@ -80,6 +88,8 @@ cmake .. \ -DRUN_RPCS3_TESTS="${RUN_UNIT_TESTS}" \ -DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \ -DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \ + -DMACOSX_BUNDLE_SHORT_VERSION_STRING="${COMM_TAG}" \ + -DMACOSX_BUNDLE_BUNDLE_VERSION="${COMM_COUNT}" \ -DSTATIC_LINK_LLVM=ON \ -DUSE_SDL=ON \ -DUSE_DISCORD_RPC=ON \ @@ -100,6 +110,8 @@ cmake .. \ -DCMAKE_TOOLCHAIN_FILE=buildfiles/cmake/TCDarwinX86_64.cmake \ -DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \ -DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \ + -DMACOSX_BUNDLE_SHORT_VERSION_STRING="${COMM_TAG}" \ + -DMACOSX_BUNDLE_BUNDLE_VERSION="${COMM_COUNT}"\ -DSTATIC_LINK_LLVM=ON \ -DUSE_SDL=ON \ -DUSE_DISCORD_RPC=ON \ diff --git a/.ci/deploy-mac.sh b/.ci/deploy-mac.sh index 53212357d0..76e34c4b3b 100755 --- a/.ci/deploy-mac.sh +++ b/.ci/deploy-mac.sh @@ -3,16 +3,6 @@ # shellcheck disable=SC2086 cd build || exit 1 -# Gather explicit version number and number of commits -COMM_TAG=$(awk '/version{.*}/ { printf("%d.%d.%d", $5, $6, $7) }' ../rpcs3/rpcs3_version.cpp) -COMM_COUNT=$(git rev-list --count HEAD) -COMM_HASH=$(git rev-parse --short=8 HEAD) - -AVVER="${COMM_TAG}-${COMM_COUNT}" - -# AVVER is used for GitHub releases, it is the version number. -echo "AVVER=$AVVER" >> ../.ci/ci-vars.env - cd bin mkdir -p "rpcs3.app/Contents/Resources/vulkan/icd.d" || true wget https://github.com/KhronosGroup/MoltenVK/releases/download/v1.4.1/MoltenVK-macos-privateapi.tar @@ -77,9 +67,9 @@ echo "URL=https://rpcs3.net/quickstart" >> Quickstart.url echo "IconIndex=0" >> Quickstart.url if [ "$AARCH64" -eq 1 ]; then - ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${COMM_TAG}-${COMM_COUNT}-${COMM_HASH}_macos_arm64.7z" + ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos_arm64.7z" else - ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${COMM_TAG}-${COMM_COUNT}-${COMM_HASH}_macos.7z" + ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos.7z" fi 7z a -mx9 "$ARCHIVE_FILEPATH" RPCS3.app Quickstart.url FILESIZE=$(stat -f %z "$ARCHIVE_FILEPATH") diff --git a/rpcs3/rpcs3.plist.in b/rpcs3/rpcs3.plist.in index a854779d9d..93a4f2c186 100644 --- a/rpcs3/rpcs3.plist.in +++ b/rpcs3/rpcs3.plist.in @@ -12,16 +12,14 @@ rpcs3.icns CFBundleIdentifier net.rpcs3.rpcs3 - CFBundleLongVersionString - ${RPCS3_GIT_TAG} CFBundleName RPCS3 CFBundlePackageType APPL CFBundleShortVersionString - ${RPCS3_GIT_TAG} + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} CFBundleVersion - ${RPCS3_GIT_TAG} + ${MACOSX_BUNDLE_BUNDLE_VERSION} CFBundleSupportedPlatforms MacOSX diff --git a/rpcs3/rpcs3_version.cpp b/rpcs3/rpcs3_version.cpp index e7666e7b81..19d107e582 100644 --- a/rpcs3/rpcs3_version.cpp +++ b/rpcs3/rpcs3_version.cpp @@ -24,8 +24,6 @@ namespace rpcs3 return std::make_pair(std::move(commit_and_hash[0]), std::move(commit_and_hash[1])); } - // TODO: Make this accessible from cmake and keep in sync with MACOSX_BUNDLE_BUNDLE_VERSION. - // Currently accessible by Windows and Linux build scripts, see implementations when doing MACOSX const utils::version& get_version() { static constexpr utils::version version{ 0, 0, 39, utils::version_type::alpha, 1, RPCS3_GIT_VERSION }; From fbd5bbcfa32a83aea9823dae1a34e637f6e56d5e Mon Sep 17 00:00:00 2001 From: schm1dtmac Date: Wed, 14 Jan 2026 14:41:12 +0000 Subject: [PATCH 175/630] Address review comments --- .ci/deploy-mac.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/deploy-mac.sh b/.ci/deploy-mac.sh index 76e34c4b3b..70db614b59 100755 --- a/.ci/deploy-mac.sh +++ b/.ci/deploy-mac.sh @@ -67,7 +67,7 @@ echo "URL=https://rpcs3.net/quickstart" >> Quickstart.url echo "IconIndex=0" >> Quickstart.url if [ "$AARCH64" -eq 1 ]; then - ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos_arm64.7z" + ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos_aarch64.7z" else ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos.7z" fi From 1e0909c579cb786e6e6a44b1ce0d0f9c79366ad9 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 24 Jan 2026 12:57:11 +0100 Subject: [PATCH 176/630] CI: download dependency if the filename is the same but the checksum changed --- .ci/setup-llvm.sh | 18 +++++++++++++++--- .ci/setup-windows.sh | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/.ci/setup-llvm.sh b/.ci/setup-llvm.sh index a54901309e..d296d2a3e4 100644 --- a/.ci/setup-llvm.sh +++ b/.ci/setup-llvm.sh @@ -28,11 +28,23 @@ download_and_verify() correctChecksum="$2" algo="$3" fileName="$4" + path="$DEPS_CACHE_DIR/$fileName" for _ in 1 2 3; do - [ -e "$DEPS_CACHE_DIR/$fileName" ] || curl -fLo "$DEPS_CACHE_DIR/$fileName" "$url" - fileChecksum=$("${algo}sum" "$DEPS_CACHE_DIR/$fileName" | awk '{ print $1 }') - [ "$fileChecksum" = "$correctChecksum" ] && return 0 + # Check if the file exists and the checksum is correct + if [ -e "$path" ]; then + fileChecksum=$("${algo}sum" "$path" | awk '{ print $1 }') + [ "$fileChecksum" = "$correctChecksum" ] && return 0 + fi + + # Otherwise download the file + curl -fLo "$path" "$url" + + # Check again if the file exists and the checksum is correct + if [ -e "$path" ]; then + fileChecksum=$("${algo}sum" "$path" | awk '{ print $1 }') + [ "$fileChecksum" = "$correctChecksum" ] && return 0 + fi done return 1; diff --git a/.ci/setup-windows.sh b/.ci/setup-windows.sh index d874c7a7f0..aade55fc95 100755 --- a/.ci/setup-windows.sh +++ b/.ci/setup-windows.sh @@ -53,11 +53,23 @@ download_and_verify() correctChecksum="$2" algo="$3" fileName="$4" + path="$DEPS_CACHE_DIR/$fileName" for _ in 1 2 3; do - [ -e "$DEPS_CACHE_DIR/$fileName" ] || curl -fLo "$DEPS_CACHE_DIR/$fileName" "$url" - fileChecksum=$("${algo}sum" "$DEPS_CACHE_DIR/$fileName" | awk '{ print $1 }') - [ "$fileChecksum" = "$correctChecksum" ] && return 0 + # Check if the file exists and the checksum is correct + if [ -e "$path" ]; then + fileChecksum=$("${algo}sum" "$path" | awk '{ print $1 }') + [ "$fileChecksum" = "$correctChecksum" ] && return 0 + fi + + # Otherwise download the file + curl -fLo "$path" "$url" + + # Check again if the file exists and the checksum is correct + if [ -e "$path" ]; then + fileChecksum=$("${algo}sum" "$path" | awk '{ print $1 }') + [ "$fileChecksum" = "$correctChecksum" ] && return 0 + fi done return 1; From ae8e28282c937083d45c248d9c6d5aa7e33906d4 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 12 Jan 2026 23:14:08 +0300 Subject: [PATCH 177/630] rsx/zcull: Fix silly copypasta - Find+Replace bug --- rpcs3/Emu/RSX/RSXZCULL.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXZCULL.cpp b/rpcs3/Emu/RSX/RSXZCULL.cpp index 63e39a8314..54b7ed4139 100644 --- a/rpcs3/Emu/RSX/RSXZCULL.cpp +++ b/rpcs3/Emu/RSX/RSXZCULL.cpp @@ -106,9 +106,9 @@ namespace rsx void ZCULL_control::set_status(class ::rsx::thread* ptimer, bool surface_active, bool zpass_active, bool zcull_stats_active, bool flush_queue) { - surface_active = surface_active; - zpass_count_enabled = zpass_active; - stats_enabled = zcull_stats_active; + this->surface_active = surface_active; + this->zpass_count_enabled = zpass_active; + this->stats_enabled = zcull_stats_active; check_state(ptimer, flush_queue); From 590a0bbcad75a96c678fa2a403a96026dd41806f Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 16 Nov 2025 14:26:41 +0300 Subject: [PATCH 178/630] vk: Include GCM format in debug name for temp texture-cache resources --- rpcs3/Emu/RSX/VK/VKTextureCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index 454038c962..1e910f0f81 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -716,7 +716,7 @@ namespace vk view_swizzle = source->native_component_map; } - image->set_debug_name("Temp view"); + image->set_debug_name(fmt::format("Temp view, fmt=0x%x", gcm_format)); image->set_native_component_layout(view_swizzle); auto view = image->get_view(remap_vector); From 131eee2eedd9ae6e2a46bbfb5efa27dc39bb6497 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 16 Nov 2025 14:25:46 +0300 Subject: [PATCH 179/630] rsx: Fix convolution filter decoding --- rpcs3/Emu/RSX/RSXTexture.cpp | 2 +- rpcs3/Emu/RSX/gcm_enums.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index 9b8f4bfb2e..52f8183545 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -251,7 +251,7 @@ namespace rsx u8 fragment_texture::convolution_filter() const { - return ((registers[NV4097_SET_TEXTURE_FILTER + (m_index * 8)] >> 13) & 0xf); + return ((registers[NV4097_SET_TEXTURE_FILTER + (m_index * 8)] >> 13) & 0x7); } u8 fragment_texture::argb_signed() const diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index 07901aa78c..6662df1653 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -967,6 +967,8 @@ namespace gcm CELL_GCM_TEXTURE_LINEAR_LINEAR = 6, CELL_GCM_TEXTURE_CONVOLUTION_MIN = 7, CELL_GCM_TEXTURE_CONVOLUTION_MAG = 4, + + // Convolution mode CELL_GCM_TEXTURE_CONVOLUTION_QUINCUNX = 1, CELL_GCM_TEXTURE_CONVOLUTION_GAUSSIAN = 2, CELL_GCM_TEXTURE_CONVOLUTION_QUINCUNX_ALT = 3, From b9f5d85d161278909cc286873b1a897666052d24 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 24 Jan 2026 22:52:41 +0300 Subject: [PATCH 180/630] rsx: Lower harmless errors to warnings --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 2 +- rpcs3/Emu/RSX/VK/VKTextureCache.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 8dc2c27664..ae3b8e37e9 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -768,7 +768,7 @@ namespace gl { default: // TODO - err_once("Format incompatibility detected, reporting failure to force data copy (GL_INTERNAL_FORMAT=0x%X, GCM_FORMAT=0x%X)", static_cast(ifmt), gcm_format); + warn_once("Format incompatibility detected, reporting failure to force data copy (GL_INTERNAL_FORMAT=0x%X, GCM_FORMAT=0x%X)", static_cast(ifmt), gcm_format); return false; case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT: return (ifmt == gl::texture::internal_format::rgba16f); diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index 1e910f0f81..d1b0e536ef 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -1258,7 +1258,7 @@ namespace vk { default: //TODO - err_once("Format incompatibility detected, reporting failure to force data copy (VK_FORMAT=0x%X, GCM_FORMAT=0x%X)", static_cast(vk_format), gcm_format); + warn_once("Format incompatibility detected, reporting failure to force data copy (VK_FORMAT=0x%X, GCM_FORMAT=0x%X)", static_cast(vk_format), gcm_format); return false; #ifndef __APPLE__ case CELL_GCM_TEXTURE_R5G6B5: From f883718b238e6897635201a67ca11537ce197510 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Sun, 25 Jan 2026 00:33:29 +0200 Subject: [PATCH 181/630] USB: Complete Summonride figures - Support the last 3 riders discovered by @RipleyTom - Simplify the creator dialog --- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 3 +- rpcs3/rpcs3qt/kamen_rider_dialog.cpp | 243 ++++++++++----------------- rpcs3/rpcs3qt/kamen_rider_dialog.h | 2 +- 3 files changed, 93 insertions(+), 155 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index dffd211aed..64f27227d3 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -247,8 +247,9 @@ private: // uDraw GameTablet {0x20D6, 0xCB17, 0xCB17, "uDraw GameTablet", nullptr, nullptr}, - // DVB-T + // TV Tuners {0x1415, 0x0003, 0x0003, "PlayTV SCEH-0036", nullptr, nullptr}, + // {0x054c, 0x04b2, 0x04b2, "Torne CECH-ZD1 J", nullptr, nullptr}, // PSP Devices {0x054C, 0x01C8, 0x01C8, "PSP Type A", nullptr, nullptr}, diff --git a/rpcs3/rpcs3qt/kamen_rider_dialog.cpp b/rpcs3/rpcs3qt/kamen_rider_dialog.cpp index 53fd2e07e0..20202a68f2 100644 --- a/rpcs3/rpcs3qt/kamen_rider_dialog.cpp +++ b/rpcs3/rpcs3qt/kamen_rider_dialog.cpp @@ -16,85 +16,84 @@ #include kamen_rider_dialog* kamen_rider_dialog::inst = nullptr; -std::array>, UI_FIG_NUM> kamen_rider_dialog::figure_slots = {}; +std::array>, UI_FIG_NUM> kamen_rider_dialog::figure_slots = {}; QString last_kamen_rider_path; -static const std::map, const std::string> list_kamen_riders = { - // Character ID [0x1b], ERC type [0x1a], Figure type [0x19] - {{0x10, 0x01, 0x10}, "Kamen Rider Drive (Wind)"}, - {{0x10, 0x01, 0x20}, "Kamen Rider Drive (Water)"}, - {{0x10, 0x01, 0x30}, "Kamen Rider Drive (Fire)"}, - {{0x10, 0x01, 0x40}, "Kamen Rider Drive (Light)"}, - {{0x10, 0x01, 0x50}, "Kamen Rider Drive (Dark)"}, - {{0x20, 0x01, 0x00}, "Kamen Rider Drive - Type Wild"}, - {{0x20, 0x02, 0x00}, "Kamen Rider Drive - Type Wild Gyasha Ver"}, - // {{ , , }, "Kamen Rider Drive - Type Speed Flare"}, - // {{ , , }, "Kamen Rider Drive - Type Technic"}, // 1.05 update - {{0x11, 0x01, 0x10}, "Kamen Rider Gaim (Wind)"}, - {{0x11, 0x01, 0x20}, "Kamen Rider Gaim (Water)"}, - {{0x21, 0x01, 0x00}, "Kamen Rider Gaim - Jimber Lemon Arms"}, - {{0x21, 0x02, 0x00}, "Kamen Rider Gaim - Kachidoki Arms"}, - {{0x21, 0x03, 0x00}, "Kamen Rider Gaim - Kiwami Arms"}, - {{0x12, 0x01, 0x20}, "Kamen Rider Wizard (Water)"}, - {{0x12, 0x01, 0x30}, "Kamen Rider Wizard (Fire)"}, - {{0x22, 0x01, 0x00}, "Kamen Rider Wizard - Infinity Style"}, - {{0x22, 0x02, 0x00}, "Kamen Rider Wizard - All Dragon"}, - {{0x22, 0x03, 0x00}, "Kamen Rider Wizard - Infinity Gold Dragon"}, - {{0x13, 0x01, 0x40}, "Kamen Rider Fourze (Light)"}, - {{0x23, 0x01, 0x00}, "Kamen Rider Fourze - Magnet States"}, - {{0x23, 0x02, 0x00}, "Kamen Rider Fourze - Cosmic States"}, - {{0x23, 0x03, 0x00}, "Kamen Rider Fourze - Meteor Nadeshiko Fusion States"}, - {{0x14, 0x01, 0x20}, "Kamen Rider OOO (Water)"}, - {{0x24, 0x01, 0x00}, "Kamen Rider OOO - Super Tatoba Combo"}, - {{0x24, 0x02, 0x00}, "Kamen Rider OOO - Putotyra Combo"}, - {{0x24, 0x04, 0x00}, "Kamen Rider OOO - Tajadol Combo"}, - {{0x15, 0x01, 0x10}, "Kamen Rider W (Double) (Wind)"}, - {{0x25, 0x01, 0x00}, "Kamen Rider W (Double) - Cyclone Joker Extreme"}, - {{0x25, 0x02, 0x00}, "Kamen Rider W (Double) - Cyclone Joker Gold Extreme"}, - {{0x25, 0x03, 0x00}, "Kamen Rider W (Double) - Fang Joker"}, - {{0x16, 0x01, 0x50}, "Kamen Rider Decade (Dark)"}, - {{0x26, 0x01, 0x00}, "Kamen Rider Decade - Complete Form"}, - {{0x26, 0x02, 0x00}, "Kamen Rider Decade - Strongest Complete Form"}, - {{0x26, 0x03, 0x00}, "Kamen Rider Decade - Final Form"}, - {{0x17, 0x01, 0x50}, "Kamen Rider Kiva (Dark)"}, - {{0x27, 0x01, 0x00}, "Kamen Rider Kiva - Dogabaki Form"}, - {{0x27, 0x02, 0x00}, "Kamen Rider Kiva - Emperor Form"}, - {{0x18, 0x01, 0x40}, "Kamen Rider Den-O (Light)"}, - {{0x28, 0x01, 0x00}, "Kamen Rider Den-O - Super Climax Form"}, - {{0x28, 0x02, 0x00}, "Kamen Rider Den-O - Liner Form"}, - {{0x28, 0x03, 0x00}, "Kamen Rider Den-O - Climax Form"}, - {{0x19, 0x01, 0x30}, "Kamen Rider Kabuto (Fire)"}, - {{0x29, 0x01, 0x00}, "Kamen Rider Kabuto - Hyper Form"}, - {{0x29, 0x02, 0x00}, "Kamen Rider Kabuto - Masked Form"}, - {{0x1a, 0x01, 0x30}, "Kamen Rider Hibiki (Fire)"}, - {{0x2a, 0x01, 0x00}, "Kamen Rider Hibiki - Kurenai"}, - {{0x2a, 0x02, 0x00}, "Kamen Rider Hibiki - Armed"}, - {{0x1b, 0x01, 0x50}, "Kamen Rider Blade (Dark)"}, - {{0x2b, 0x01, 0x00}, "Kamen Rider Blade - Joker Form"}, - {{0x2b, 0x02, 0x00}, "Kamen Rider Blade - King Form"}, - {{0x1c, 0x01, 0x50}, "Kamen Rider Faiz (Dark)"}, - {{0x2c, 0x01, 0x00}, "Kamen Rider Faiz - Axel Form"}, - {{0x2c, 0x02, 0x00}, "Kamen Rider Faiz - Blaster Form"}, - {{0x1d, 0x01, 0x10}, "Kamen Rider Ryuki (Wind)"}, - {{0x2d, 0x01, 0x00}, "Kamen Rider Ryuki - Dragreder"}, - {{0x2d, 0x02, 0x00}, "Kamen Rider Ryuki - Survive"}, - {{0x1e, 0x01, 0x20}, "Kamen Rider Agito (Water)"}, - {{0x2e, 0x01, 0x00}, "Kamen Rider Agito - Shining Form"}, - {{0x2e, 0x02, 0x00}, "Kamen Rider Agito - Burning Form"}, - {{0x1f, 0x01, 0x40}, "Kamen Rider Kuuga (Light)"}, - {{0x2f, 0x01, 0x00}, "Kamen Rider Kuuga - Ultimate Form"}, - {{0x2f, 0x02, 0x00}, "Kamen Rider Kuuga - Amazing Mighty"}, +static const std::map list_kamen_riders = { + {0x10'01'10'10, "Kamen Rider Drive (Wind)"}, + {0x10'01'20'10, "Kamen Rider Drive (Water)"}, + {0x10'01'30'10, "Kamen Rider Drive (Fire)"}, + {0x10'01'40'10, "Kamen Rider Drive (Light)"}, + {0x10'01'50'10, "Kamen Rider Drive (Dark)"}, + {0x20'01'00'10, "Kamen Rider Drive - Type Wild"}, + {0x20'02'00'10, "Kamen Rider Drive - Type Wild Gyasha Ver"}, + {0x20'03'00'11, "Kamen Rider Drive - Type Technic"}, + {0x20'06'00'10, "Kamen Rider Drive - Type Speed Flare"}, + {0x11'01'10'10, "Kamen Rider Gaim (Wind)"}, + {0x11'01'20'10, "Kamen Rider Gaim (Water)"}, + {0x21'01'00'10, "Kamen Rider Gaim - Jimber Lemon Arms"}, + {0x21'02'00'10, "Kamen Rider Gaim - Kachidoki Arms"}, + {0x21'03'00'10, "Kamen Rider Gaim - Kiwami Arms"}, + {0x12'01'20'10, "Kamen Rider Wizard (Water)"}, + {0x12'01'30'10, "Kamen Rider Wizard (Fire)"}, + {0x22'01'00'10, "Kamen Rider Wizard - Infinity Style"}, + {0x22'02'00'10, "Kamen Rider Wizard - All Dragon"}, + {0x22'03'00'10, "Kamen Rider Wizard - Infinity Gold Dragon"}, + {0x13'01'40'10, "Kamen Rider Fourze (Light)"}, + {0x23'01'00'10, "Kamen Rider Fourze - Magnet States"}, + {0x23'02'00'10, "Kamen Rider Fourze - Cosmic States"}, + {0x23'03'00'10, "Kamen Rider Fourze - Meteor Nadeshiko Fusion States"}, + {0x14'01'20'10, "Kamen Rider OOO (Water)"}, + {0x24'01'00'10, "Kamen Rider OOO - Super Tatoba Combo"}, + {0x24'02'00'10, "Kamen Rider OOO - Putotyra Combo"}, + {0x24'04'00'10, "Kamen Rider OOO - Tajadol Combo"}, + {0x15'01'10'10, "Kamen Rider W (Double) (Wind)"}, + {0x25'01'00'10, "Kamen Rider W (Double) - Cyclone Joker Extreme"}, + {0x25'02'00'10, "Kamen Rider W (Double) - Cyclone Joker Gold Extreme"}, + {0x25'03'00'10, "Kamen Rider W (Double) - Fang Joker"}, + {0x16'01'50'10, "Kamen Rider Decade (Dark)"}, + {0x26'01'00'10, "Kamen Rider Decade - Complete Form"}, + {0x26'02'00'10, "Kamen Rider Decade - Strongest Complete Form"}, + {0x26'03'00'10, "Kamen Rider Decade - Final Form"}, + {0x17'01'50'10, "Kamen Rider Kiva (Dark)"}, + {0x27'01'00'10, "Kamen Rider Kiva - Dogabaki Form"}, + {0x27'02'00'10, "Kamen Rider Kiva - Emperor Form"}, + {0x18'01'40'10, "Kamen Rider Den-O (Light)"}, + {0x28'01'00'10, "Kamen Rider Den-O - Super Climax Form"}, + {0x28'02'00'10, "Kamen Rider Den-O - Liner Form"}, + {0x28'03'00'10, "Kamen Rider Den-O - Climax Form"}, + {0x19'01'30'10, "Kamen Rider Kabuto (Fire)"}, + {0x29'01'00'10, "Kamen Rider Kabuto - Hyper Form"}, + {0x29'02'00'10, "Kamen Rider Kabuto - Masked Form"}, + {0x1a'01'30'10, "Kamen Rider Hibiki (Fire)"}, + {0x2a'01'00'10, "Kamen Rider Hibiki - Kurenai"}, + {0x2a'02'00'10, "Kamen Rider Hibiki - Armed"}, + {0x1b'01'50'10, "Kamen Rider Blade (Dark)"}, + {0x2b'01'00'10, "Kamen Rider Blade - Joker Form"}, + {0x2b'02'00'10, "Kamen Rider Blade - King Form"}, + {0x1c'01'50'10, "Kamen Rider Faiz (Dark)"}, + {0x2c'01'00'10, "Kamen Rider Faiz - Axel Form"}, + {0x2c'02'00'10, "Kamen Rider Faiz - Blaster Form"}, + {0x1d'01'10'10, "Kamen Rider Ryuki (Wind)"}, + {0x2d'01'00'10, "Kamen Rider Ryuki - Dragreder"}, + {0x2d'02'00'10, "Kamen Rider Ryuki - Survive"}, + {0x1e'01'20'10, "Kamen Rider Agito (Water)"}, + {0x2e'01'00'10, "Kamen Rider Agito - Shining Form"}, + {0x2e'02'00'10, "Kamen Rider Agito - Burning Form"}, + {0x1f'01'40'10, "Kamen Rider Kuuga (Light)"}, + {0x2f'01'00'10, "Kamen Rider Kuuga - Ultimate Form"}, + {0x2f'02'00'10, "Kamen Rider Kuuga - Amazing Mighty"}, - {{0x31, 0x01, 0x00}, "Kamen Rider Baron"}, - {{0x31, 0x02, 0x00}, "Kamen Rider Zangetsu Shin"}, - {{0x32, 0x01, 0x00}, "Kamen Rider Beast"}, - {{0x33, 0x01, 0x00}, "Kamen Rider Meteor"}, - {{0x34, 0x01, 0x00}, "Kamen Rider Birth"}, - {{0x35, 0x01, 0x00}, "Kamen Rider Accel"}, - {{0x36, 0x01, 0x00}, "Kamen Rider Diend"}, - {{0x36, 0x02, 0x00}, "Kamen Rider Shocker Combatman"}, - {{0x39, 0x01, 0x00}, "Kamen Rider Gatack"}, - // {{ , , }, "Kamen Rider Mach"}, // 01.05 update + {0x30'01'00'11, "Kamen Rider Mach"}, + {0x31'01'00'10, "Kamen Rider Baron"}, + {0x31'02'00'10, "Kamen Rider Zangetsu Shin"}, + {0x32'01'00'10, "Kamen Rider Beast"}, + {0x33'01'00'10, "Kamen Rider Meteor"}, + {0x34'01'00'10, "Kamen Rider Birth"}, + {0x35'01'00'10, "Kamen Rider Accel"}, + {0x36'01'00'10, "Kamen Rider Diend"}, + {0x36'02'00'10, "Kamen Rider Shocker Combatman"}, + {0x39'01'00'10, "Kamen Rider Gatack"}, }; static u32 kamen_rider_crc32(const std::array& buffer) @@ -154,21 +153,18 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) { setWindowTitle(tr("Kamen Rider Creator")); setObjectName("kamen_rider_creator"); - setMinimumSize(QSize(500, 150)); + setMinimumSize(QSize(500, 100)); QVBoxLayout* vbox_panel = new QVBoxLayout(); QComboBox* combo_figlist = new QComboBox(); QStringList filterlist; - for (const auto& [entry, figure_name] : list_kamen_riders) + for (const auto& [fig_id, figure_name] : list_kamen_riders) { - const auto& [character_id, erc_type, figure_type] = entry; - const uint qvar = (character_id << 16) | (erc_type << 8) | figure_type; QString name = QString::fromStdString(figure_name); - combo_figlist->addItem(name, QVariant(qvar)); + combo_figlist->addItem(name, QVariant(fig_id)); filterlist << std::move(name); } - combo_figlist->addItem(tr("--Unknown--"), QVariant(0xFFFFFFFF)); combo_figlist->setEditable(true); combo_figlist->setInsertPolicy(QComboBox::NoInsert); combo_figlist->model()->sort(0, Qt::AscendingOrder); @@ -178,33 +174,8 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) co_compl->setCompletionMode(QCompleter::PopupCompletion); co_compl->setFilterMode(Qt::MatchContains); combo_figlist->setCompleter(co_compl); - vbox_panel->addWidget(combo_figlist); - QFrame* line = new QFrame(); - line->setFrameShape(QFrame::HLine); - line->setFrameShadow(QFrame::Sunken); - vbox_panel->addWidget(line); - - QHBoxLayout* hbox_idvar = new QHBoxLayout(); - QLabel* label_id = new QLabel(tr("Character:")); - QLabel* label_erc = new QLabel(tr("ERC:")); - QLabel* label_fig = new QLabel(tr("Figure:")); - QLineEdit* edit_id = new QLineEdit("0"); - QLineEdit* edit_erc = new QLineEdit("0"); - QLineEdit* edit_fig = new QLineEdit("0"); - QRegularExpressionValidator* rxv = new QRegularExpressionValidator(QRegularExpression("\\d*"), this); - edit_id->setValidator(rxv); - edit_erc->setValidator(rxv); - edit_fig->setValidator(rxv); - hbox_idvar->addWidget(label_id); - hbox_idvar->addWidget(edit_id); - hbox_idvar->addWidget(label_erc); - hbox_idvar->addWidget(edit_erc); - hbox_idvar->addWidget(label_fig); - hbox_idvar->addWidget(edit_fig); - vbox_panel->addLayout(hbox_idvar); - QHBoxLayout* hbox_buttons = new QHBoxLayout(); QPushButton* btn_create = new QPushButton(tr("Create"), this); QPushButton* btn_cancel = new QPushButton(tr("Cancel"), this); @@ -215,52 +186,18 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) setLayout(vbox_panel); - connect(combo_figlist, &QComboBox::currentIndexChanged, [=](int index) - { - const u32 fig_info = combo_figlist->itemData(index).toUInt(); - if (fig_info != 0xFFFFFFFF) - { - const u8 character_id = (fig_info >> 16) & 0xff; - const u8 erc_type = (fig_info >> 8) & 0xff; - const u8 figure_type = fig_info & 0xff; - - edit_id->setText(QString::number(character_id)); - edit_erc->setText(QString::number(erc_type)); - edit_fig->setText(QString::number(figure_type)); - } - }); - connect(btn_create, &QAbstractButton::clicked, this, [=, this]() { - bool ok_character = false, ok_erc = false, ok_fig = false; - const u8 character_id = edit_id->text().toUShort(&ok_character); - if (!ok_character) - { - QMessageBox::warning(this, tr("Error converting value"), tr("ID entered is invalid!"), QMessageBox::Ok); - return; - } - const u8 erc_type = edit_erc->text().toUShort(&ok_erc); - if (!ok_erc) - { - QMessageBox::warning(this, tr("Error converting value"), tr("ERC entered is invalid!"), QMessageBox::Ok); - return; - } - const u8 figure_type = edit_fig->text().toUShort(&ok_fig); - if (!ok_fig) - { - QMessageBox::warning(this, tr("Error converting value"), tr("Figure entered is invalid!"), QMessageBox::Ok); - return; - } - + const u32 fig_id = combo_figlist->itemData(combo_figlist->currentIndex()).toUInt(); QString predef_name = last_kamen_rider_path; - const auto found_fig = list_kamen_riders.find(std::make_tuple(character_id, erc_type, figure_type)); + const auto found_fig = list_kamen_riders.find(fig_id); if (found_fig != list_kamen_riders.cend()) { predef_name += QString::fromStdString(found_fig->second + ".bin"); } else { - predef_name += QString("Unknown(%1 %2 %3).bin").arg(character_id).arg(erc_type).arg(figure_type); + predef_name += QString("Unknown (%1).bin").arg(fig_id); } file_path = QFileDialog::getSaveFileName(this, tr("Create Kamen Rider File"), predef_name, tr("Kamen Rider Object (*.bin);;All Files (*)")); @@ -294,7 +231,9 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) buf[7] = 0x89; buf[8] = 0x44; buf[10] = 0xc2; - std::array figure_data = {u8(dist(mt)), 0x03, 0x00, 0x00, 0x01, 0x0e, 0x0a, 0x0a, 0x10, figure_type, erc_type, character_id}; + std::array figure_data = {static_cast(dist(mt)), 0x03, 0x00, 0x00, 0x01, 0x0e, 0x0a, 0x0a, + static_cast(fig_id & 0xff), static_cast((fig_id >> 8) & 0xff), + static_cast((fig_id >> 16) & 0xff), static_cast((fig_id >> 24) & 0xff)}; write_to_ptr>(figure_data.data(), 0xC, kamen_rider_crc32(figure_data)); memcpy(&buf[16], figure_data.data(), figure_data.size()); fig_file.write(buf.data(), buf.size()); @@ -401,7 +340,7 @@ void kamen_rider_dialog::clear_kamen_rider(u8 slot) { if (const auto& slot_infos = ::at32(figure_slots, slot)) { - const auto& [cur_slot, character_id, erc_type, figure_type] = slot_infos.value(); + const auto& [cur_slot, fig_id] = slot_infos.value(); g_ridergate.remove_figure(cur_slot); figure_slots[slot] = {}; update_edits(); @@ -448,12 +387,10 @@ void kamen_rider_dialog::load_kamen_rider_path(u8 slot, const QString& path) clear_kamen_rider(slot); - u8 character_id = data[0x1b]; - u8 erc_type = data[0x1a]; - u8 figure_type = data[0x19]; + u32 fig_id = data[0x18] | (data[0x19] << 8) | (data[0x1a] << 16) | (data[0x1b] << 24); u8 portal_slot = g_ridergate.load_figure(data, std::move(fig_file)); - figure_slots[slot] = std::tuple(portal_slot, character_id, erc_type, figure_type); + figure_slots[slot] = std::pair(portal_slot, fig_id); update_edits(); } @@ -465,15 +402,15 @@ void kamen_rider_dialog::update_edits() QString display_string; if (const auto& sd = figure_slots[i]) { - const auto& [portal_slot, character_id, erc_type, figure_type] = sd.value(); - const auto found_fig = list_kamen_riders.find(std::make_tuple(character_id, erc_type, figure_type)); + const auto& [portal_slot, fig_id] = sd.value(); + const auto found_fig = list_kamen_riders.find(fig_id); if (found_fig != list_kamen_riders.cend()) { display_string = QString::fromStdString(found_fig->second); } else { - display_string = QString(tr("Unknown (Character:%1 ERC:%2 Figure:%3)")).arg(character_id).arg(erc_type).arg(figure_type); + display_string = QString(tr("Unknown (%1)")).arg(fig_id); } } else diff --git a/rpcs3/rpcs3qt/kamen_rider_dialog.h b/rpcs3/rpcs3qt/kamen_rider_dialog.h index 3b6dc69e51..9f872d7bc2 100644 --- a/rpcs3/rpcs3qt/kamen_rider_dialog.h +++ b/rpcs3/rpcs3qt/kamen_rider_dialog.h @@ -42,7 +42,7 @@ protected: protected: std::array edit_kamen_riders{}; - static std::array>, UI_FIG_NUM> figure_slots; + static std::array>, UI_FIG_NUM> figure_slots; private: static kamen_rider_dialog* inst; From d854ff03febb59d7f37b98ae05d0ffb50d2dca93 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 13 Jan 2026 13:55:22 +0100 Subject: [PATCH 182/630] Qt: allow to disable logging to the log frame while it is hidden --- rpcs3/Emu/Io/usb_microphone.cpp | 4 +-- rpcs3/rpcs3qt/gui_settings.h | 1 + rpcs3/rpcs3qt/log_frame.cpp | 57 +++++++++++++++++++++------------ rpcs3/rpcs3qt/log_frame.h | 1 + 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/rpcs3/Emu/Io/usb_microphone.cpp b/rpcs3/Emu/Io/usb_microphone.cpp index 743fadb66a..39bf45d91d 100644 --- a/rpcs3/Emu/Io/usb_microphone.cpp +++ b/rpcs3/Emu/Io/usb_microphone.cpp @@ -599,7 +599,7 @@ void usb_device_mic::control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, case GET_MIN: { ensure(buf_size >= 2); - constexpr s16 minVol = 0xff00; + constexpr s16 minVol = -256; buf[0] = (minVol ) & 0xff; buf[1] = (minVol >> 8) & 0xff; usb_mic_log.notice("Get Min Volume: 0x%04x (%d dB)", minVol, minVol / 256); @@ -608,7 +608,7 @@ void usb_device_mic::control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, case GET_MAX: { ensure(buf_size >= 2); - constexpr s16 maxVol = 0x0100; + constexpr s16 maxVol = 256; buf[0] = (maxVol ) & 0xff; buf[1] = (maxVol >> 8) & 0xff; usb_mic_log.notice("Get Max Volume: 0x%04x (%d dB)", maxVol, maxVol / 256); diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index fbf66dceed..a3b6fb4286 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -237,6 +237,7 @@ namespace gui const gui_save l_ansi_code = gui_save(logger, "ANSI_code", true); const gui_save l_limit = gui_save(logger, "limit", 1000); const gui_save l_limit_tty = gui_save(logger, "TTY_limit", 1000); + const gui_save l_log_hide = gui_save(logger, "Log hide", false); const gui_save d_splitterState = gui_save(debugger, "splitterState", QByteArray()); diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index 2080cdabcf..6d99791799 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -39,6 +39,7 @@ struct gui_listener : logs::listener lf_queue queue; atomic_t show_prefix{false}; + atomic_t logging_enabled{true}; gui_listener() : logs::listener() @@ -55,7 +56,7 @@ struct gui_listener : logs::listener { Q_UNUSED(stamp) - if (msg <= enabled) + if (msg <= enabled && (logging_enabled || msg <= logs::level::fatal)) { packet_t p,* _new = &p; _new->sev = msg; @@ -237,7 +238,7 @@ void log_frame::CreateAndConnectActions() }; m_clear_act = new QAction(tr("Clear"), this); - connect(m_clear_act, &QAction::triggered, [this]() + connect(m_clear_act, &QAction::triggered, this, [this]() { m_old_log_text.clear(); m_log->clear(); @@ -245,14 +246,14 @@ void log_frame::CreateAndConnectActions() }); m_clear_tty_act = new QAction(tr("Clear"), this); - connect(m_clear_tty_act, &QAction::triggered, [this]() + connect(m_clear_tty_act, &QAction::triggered, this, [this]() { m_old_tty_text.clear(); m_tty->clear(); }); m_perform_goto_on_debugger = new QAction(tr("Go-To on Debugger"), this); - connect(m_perform_goto_on_debugger, &QAction::triggered, [this]() + connect(m_perform_goto_on_debugger, &QAction::triggered, this, [this]() { QPlainTextEdit* pte = (m_tabWidget->currentIndex() == 1 ? m_tty : m_log); Q_EMIT PerformGoToOnDebugger(pte->textCursor().selectedText(), true); @@ -274,7 +275,7 @@ void log_frame::CreateAndConnectActions() }); m_perform_goto_thread_on_debugger = new QAction(tr("Show Thread on Debugger"), this); - connect(m_perform_goto_thread_on_debugger, &QAction::triggered, [this]() + connect(m_perform_goto_thread_on_debugger, &QAction::triggered, this, [this]() { QPlainTextEdit* pte = (m_tabWidget->currentIndex() == 1 ? m_tty : m_log); Q_EMIT PerformGoToOnDebugger(pte->textCursor().selectedText(), false); @@ -282,7 +283,7 @@ void log_frame::CreateAndConnectActions() m_stack_act_tty = new QAction(tr("Stack Mode (TTY)"), this); m_stack_act_tty->setCheckable(true); - connect(m_stack_act_tty, &QAction::toggled, [this](bool checked) + connect(m_stack_act_tty, &QAction::toggled, this, [this](bool checked) { m_gui_settings->SetValue(gui::l_stack_tty, checked); m_stack_tty = checked; @@ -290,7 +291,7 @@ void log_frame::CreateAndConnectActions() m_ansi_act_tty = new QAction(tr("ANSI Code (TTY)"), this); m_ansi_act_tty->setCheckable(true); - connect(m_ansi_act_tty, &QAction::toggled, [this](bool checked) + connect(m_ansi_act_tty, &QAction::toggled, this, [this](bool checked) { m_gui_settings->SetValue(gui::l_ansi_code, checked); m_ansi_tty = checked; @@ -311,7 +312,7 @@ void log_frame::CreateAndConnectActions() QAction* all_channels_act = new QAction(tr("All user channels"), m_tty_channel_acts); all_channels_act->setCheckable(true); all_channels_act->setChecked(m_tty_channel == -1); - connect(all_channels_act, &QAction::triggered, [this]() + connect(all_channels_act, &QAction::triggered, this, [this]() { m_tty_channel = -1; m_tty_input->setPlaceholderText(tr("All user channels")); @@ -322,7 +323,7 @@ void log_frame::CreateAndConnectActions() QAction* act = new QAction(tr("Channel %0").arg(i), m_tty_channel_acts); act->setCheckable(true); act->setChecked(i == m_tty_channel); - connect(act, &QAction::triggered, [this, i]() + connect(act, &QAction::triggered, this, [this, i]() { m_tty_channel = i; m_tty_input->setPlaceholderText(tr("Channel %0").arg(m_tty_channel)); @@ -343,7 +344,7 @@ void log_frame::CreateAndConnectActions() m_stack_act_log = new QAction(tr("Stack Mode (Log)"), this); m_stack_act_log->setCheckable(true); - connect(m_stack_act_log, &QAction::toggled, [this](bool checked) + connect(m_stack_act_log, &QAction::toggled, this, [this](bool checked) { m_gui_settings->SetValue(gui::l_stack, checked); m_stack_log = checked; @@ -351,7 +352,7 @@ void log_frame::CreateAndConnectActions() m_stack_act_err = new QAction(tr("Stack Cell Errors"), this); m_stack_act_err->setCheckable(true); - connect(m_stack_act_err, &QAction::toggled, [this](bool checked) + connect(m_stack_act_err, &QAction::toggled, this, [this](bool checked) { m_gui_settings->SetValue(gui::l_stack_err, checked); g_log_all_errors = !checked; @@ -359,15 +360,27 @@ void log_frame::CreateAndConnectActions() m_show_prefix_act = new QAction(tr("Show Thread Prefix"), this); m_show_prefix_act->setCheckable(true); - connect(m_show_prefix_act, &QAction::toggled, [this](bool checked) + connect(m_show_prefix_act, &QAction::toggled, this, [this](bool checked) { m_gui_settings->SetValue(gui::l_prefix, checked); s_gui_listener.show_prefix = checked; }); + m_log_while_hidden_act = new QAction(tr("Print Log/TTY while hidden"), this); + m_log_while_hidden_act->setCheckable(true); + connect(m_log_while_hidden_act, &QAction::toggled, this, [this](bool checked) + { + m_gui_settings->SetValue(gui::l_log_hide, checked); + s_gui_listener.logging_enabled = checked || isVisible(); + }); + connect(this, &log_frame::visibilityChanged, this, [this](bool visible) + { + s_gui_listener.logging_enabled = m_log_while_hidden_act->isChecked() || visible; + }); + m_tty_act = new QAction(tr("Enable TTY"), this); m_tty_act->setCheckable(true); - connect(m_tty_act, &QAction::triggered, [this](bool checked) + connect(m_tty_act, &QAction::triggered, this, [this](bool checked) { m_gui_settings->SetValue(gui::l_tty, checked); }); @@ -381,7 +394,7 @@ void log_frame::CreateAndConnectActions() l_initAct(m_notice_act, logs::level::notice); l_initAct(m_trace_act, logs::level::trace); - connect(m_log, &QWidget::customContextMenuRequested, [this](const QPoint& pos) + connect(m_log, &QWidget::customContextMenuRequested, this, [this](const QPoint& pos) { QMenu* menu = m_log->createStandardContextMenu(); menu->addAction(m_clear_act); @@ -403,13 +416,14 @@ void log_frame::CreateAndConnectActions() menu->addAction(m_stack_act_log); menu->addAction(m_stack_act_err); menu->addAction(m_show_prefix_act); + menu->addAction(m_log_while_hidden_act); menu->addSeparator(); menu->addActions(m_log_level_acts->actions()); menu->exec(m_log->viewport()->mapToGlobal(pos)); }); - connect(m_tty, &QWidget::customContextMenuRequested, [this](const QPoint& pos) + connect(m_tty, &QWidget::customContextMenuRequested, this, [this](const QPoint& pos) { QMenu* menu = m_tty->createStandardContextMenu(); menu->addAction(m_clear_tty_act); @@ -432,13 +446,13 @@ void log_frame::CreateAndConnectActions() menu->exec(m_tty->viewport()->mapToGlobal(pos)); }); - connect(m_tabWidget, &QTabWidget::currentChanged, [this](int/* index*/) + connect(m_tabWidget, &QTabWidget::currentChanged, this, [this](int/* index*/) { if (m_find_dialog) m_find_dialog->close(); }); - connect(m_tty_input, &QLineEdit::returnPressed, [this]() + connect(m_tty_input, &QLineEdit::returnPressed, this, [this]() { std::string text = m_tty_input->text().toStdString(); @@ -492,6 +506,9 @@ void log_frame::LoadSettings() m_ansi_act_tty->setChecked(m_ansi_tty); m_stack_act_err->setChecked(!g_log_all_errors); + m_log_while_hidden_act->setChecked(m_gui_settings->GetValue(gui::l_log_hide).toBool()); + s_gui_listener.logging_enabled = m_log_while_hidden_act->isChecked() || isVisible(); + s_gui_listener.show_prefix = m_gui_settings->GetValue(gui::l_prefix).toBool(); m_show_prefix_act->setChecked(s_gui_listener.show_prefix); @@ -599,9 +616,9 @@ void log_frame::UpdateUI() const std::chrono::time_point log_timeout = start + 7ms; // Check TTY logs - if (u64 size = std::max(0, m_tty_file ? (g_tty_size.load() - m_tty_file.pos()) : 0)) + if (const u64 size = std::max(0, m_tty_file ? (g_tty_size.load() - m_tty_file.pos()) : 0)) { - if (m_tty_act->isChecked()) + if (m_tty_act->isChecked() && s_gui_listener.logging_enabled) { m_tty_buf.resize(std::min(size, m_tty_limited_read ? m_tty_limited_read : usz{umax})); m_tty_buf.resize(m_tty_file.read(&m_tty_buf.front(), m_tty_buf.size())); @@ -781,7 +798,7 @@ void log_frame::UpdateUI() usz first_rep_counter = m_log_counter; // Batch output of multiple lines if possible (optimization) - auto flush = [&]() + const auto flush = [&]() { if (m_log_text.isEmpty() && !is_first_rep) { diff --git a/rpcs3/rpcs3qt/log_frame.h b/rpcs3/rpcs3qt/log_frame.h index 35bd3a7ab1..7bdd304c5f 100644 --- a/rpcs3/rpcs3qt/log_frame.h +++ b/rpcs3/rpcs3qt/log_frame.h @@ -95,6 +95,7 @@ private: QAction* m_stack_act_err = nullptr; QAction* m_show_prefix_act = nullptr; + QAction* m_log_while_hidden_act = nullptr; QAction* m_tty_act = nullptr; From 2e4a187145dfc807a5c92ae7d8a5408f6da07549 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 00:36:24 +0300 Subject: [PATCH 183/630] vk: Persist debug name in the image wrapper to aid in debugging --- rpcs3/Emu/RSX/VK/vkutils/image.cpp | 2 ++ rpcs3/Emu/RSX/VK/vkutils/image.h | 1 + 2 files changed, 3 insertions(+) diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.cpp b/rpcs3/Emu/RSX/VK/vkutils/image.cpp index 02d9bf34bd..e1c1faa8da 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image.cpp @@ -304,6 +304,8 @@ namespace vk _vkSetDebugUtilsObjectNameEXT(m_device, &name_info); } + + m_debug_name = name; } image_view::image_view(VkDevice dev, VkImage image, VkImageViewType view_type, VkFormat format, VkComponentMapping mapping, VkImageSubresourceRange range) diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.h b/rpcs3/Emu/RSX/VK/vkutils/image.h index 91ebf5616e..18baf19646 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.h +++ b/rpcs3/Emu/RSX/VK/vkutils/image.h @@ -33,6 +33,7 @@ namespace vk VkImageAspectFlags m_storage_aspect = 0; rsx::format_class m_format_class = RSX_FORMAT_CLASS_UNDEFINED; + std::string m_debug_name; void validate(const vk::render_device& dev, const VkImageCreateInfo& info) const; From 11087a973c95988d56478e24dfd7abbcb7c8aed7 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 01:33:03 +0300 Subject: [PATCH 184/630] vk: Set debug names for image views - Crucial for debugging hangs and crashes as well as VVL output --- rpcs3/Emu/RSX/VK/vkutils/image.cpp | 27 +++++++++++++++++++++++++++ rpcs3/Emu/RSX/VK/vkutils/image.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.cpp b/rpcs3/Emu/RSX/VK/vkutils/image.cpp index e1c1faa8da..5e4c8ce022 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image.cpp @@ -207,6 +207,11 @@ namespace vk return m_format_class; } + std::string image::debug_name() const + { + return m_debug_name; + } + void image::push_layout(const command_buffer& cmd, VkImageLayout layout) { ensure(current_queue_family == VK_QUEUE_FAMILY_IGNORED || current_queue_family == cmd.get_queue_family()); @@ -407,6 +412,14 @@ namespace vk // Restore requested mapping info.components = mapping; #endif + + if (m_resource) + { + if (const auto name = m_resource->debug_name(); !name.empty()) + { + set_debug_name(fmt::format("%p (%p) %s", value, m_resource->value, name)); + } + } } viewable_image* viewable_image::clone() @@ -490,4 +503,18 @@ namespace vk views.clear(); } } + + void image_view::set_debug_name(std::string_view name) + { + if (g_render_device->get_debug_utils_support()) + { + VkDebugUtilsObjectNameInfoEXT name_info{}; + name_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + name_info.objectType = VK_OBJECT_TYPE_IMAGE_VIEW; + name_info.objectHandle = reinterpret_cast(value); + name_info.pObjectName = name.data(); + + _vkSetDebugUtilsObjectNameEXT(m_device, &name_info); + } + } } diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.h b/rpcs3/Emu/RSX/VK/vkutils/image.h index 18baf19646..fbe7abb5fd 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.h +++ b/rpcs3/Emu/RSX/VK/vkutils/image.h @@ -84,6 +84,7 @@ namespace vk VkSharingMode sharing_mode() const; VkImageAspectFlags aspect() const; rsx::format_class format_class() const; + std::string debug_name() const; // Pipeline management void push_layout(const command_buffer& cmd, VkImageLayout layout); @@ -128,6 +129,7 @@ namespace vk vk::image* m_resource = nullptr; void create_impl(); + void set_debug_name(std::string_view name); }; class viewable_image : public image From 11464f0793056430c0ab4e990952da719510226f Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 01:44:01 +0300 Subject: [PATCH 185/630] vk: Tighten image barriers to account for IMAGE_OP_LOAD operation when starting a renderpass --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 8 +++-- rpcs3/Emu/RSX/VK/VKPresent.cpp | 2 +- rpcs3/Emu/RSX/VK/vkutils/barriers.cpp | 14 ++++++--- rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp | 36 +++++++++++++++++++--- 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index b73b4a66a8..739253cc03 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -74,16 +74,20 @@ namespace vk // This was used in a cyclic ref before, but is missing a barrier // No need for a full stall, use a custom barrier instead VkPipelineStageFlags src_stage; - VkAccessFlags src_access; + VkAccessFlags src_access, dst_access; if (raw->aspect() == VK_IMAGE_ASPECT_COLOR_BIT) { src_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; src_access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dst_access = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; + dst_stage |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; } else { src_stage = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; src_access = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + dst_access = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; + dst_stage |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; } vk::insert_image_memory_barrier( @@ -91,7 +95,7 @@ namespace vk raw->value, raw->current_layout, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, src_stage, dst_stage, - src_access, VK_ACCESS_SHADER_READ_BIT, + src_access, dst_access, { raw->aspect(), 0, 1, 0, 1 }); raw->current_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index 3eac2821de..d474af2139 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -790,7 +790,7 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) barrier.oldLayout = target_layout; barrier.image = target_image; barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.subresourceRange = subresource_range; diff --git a/rpcs3/Emu/RSX/VK/vkutils/barriers.cpp b/rpcs3/Emu/RSX/VK/vkutils/barriers.cpp index fb1bb84e34..6a7e518749 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/barriers.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/barriers.cpp @@ -94,19 +94,25 @@ namespace vk vk::end_renderpass(cmd); } - VkAccessFlags src_access; - VkPipelineStageFlags src_stage; + VkAccessFlags src_access, dst_access; + VkPipelineStageFlags src_stage, dst_stage; if (range.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) { src_access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dst_access = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; src_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dst_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; } else { src_access = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + dst_access = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; src_stage = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + dst_stage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; } + dst_stage |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT; + VkImageMemoryBarrier barrier = {}; barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; barrier.newLayout = new_layout; @@ -116,9 +122,9 @@ namespace vk barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.subresourceRange = range; barrier.srcAccessMask = src_access; - barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + barrier.dstAccessMask = dst_access; - vkCmdPipelineBarrier(cmd, src_stage, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier); + vkCmdPipelineBarrier(cmd, src_stage, dst_stage, 0, 0, nullptr, 0, nullptr, 1, &barrier); } void insert_texture_barrier(const vk::command_buffer& cmd, vk::image* image, VkImageLayout new_layout, bool preserve_renderpass) diff --git a/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp b/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp index e8d8bc9c0d..de0345fdb4 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp @@ -58,6 +58,8 @@ namespace vk VkPipelineStageFlags src_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; VkPipelineStageFlags dst_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + const bool is_color_surface = !!(range.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT); + switch (+new_layout) { case VK_IMAGE_LAYOUT_GENERAL: @@ -89,17 +91,30 @@ namespace vk dst_stage = VK_PIPELINE_STAGE_TRANSFER_BIT; break; case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; dst_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; break; case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: - barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; dst_stage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; break; case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; + dst_stage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT; + break; case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT: barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; - dst_stage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + dst_stage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT; + if (is_color_surface) + { + barrier.dstAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dst_stage |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + } + else + { + barrier.dstAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + dst_stage |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + } break; case VK_IMAGE_LAYOUT_UNDEFINED: case VK_IMAGE_LAYOUT_PREINITIALIZED: @@ -170,12 +185,25 @@ namespace vk src_stage = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; break; case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + barrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; + src_stage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT; + break; case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT: barrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; src_stage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + if (is_color_surface) + { + barrier.srcAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + src_stage |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + } + else + { + barrier.srcAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + src_stage |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + } break; default: - break; //TODO Investigate what happens here + break; } barrier.srcAccessMask &= src_access_mask_bits; From 318385787a2b463dee1ffba2bfa179c13ae2400f Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 18:54:23 +0300 Subject: [PATCH 186/630] vk: Force strict query scopes quirk if SRM is enabled --- rpcs3/Emu/RSX/VK/VKHelpers.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.cpp b/rpcs3/Emu/RSX/VK/VKHelpers.cpp index f59878ec18..9360215797 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.cpp +++ b/rpcs3/Emu/RSX/VK/VKHelpers.cpp @@ -90,6 +90,7 @@ namespace vk g_drv_no_primitive_restart = false; g_drv_sanitize_fp_values = false; g_drv_disable_fence_reset = false; + g_drv_strict_query_scopes = !!g_cfg.video.strict_rendering_mode; g_drv_emulate_cond_render = (g_cfg.video.relaxed_zcull_sync && !g_render_device->get_conditional_render_support()); g_num_processed_frames = 0; g_num_total_frames = 0; From 9dfaca4cd85d737e6913bd1918e73d770b2b0e23 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 18:54:43 +0300 Subject: [PATCH 187/630] vk: Fix WAW hazard when preparing copy commands for texture uploads using scratch --- rpcs3/Emu/RSX/VK/VKTexture.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKTexture.cpp b/rpcs3/Emu/RSX/VK/VKTexture.cpp index a57378384a..bc6aabf2d4 100644 --- a/rpcs3/Emu/RSX/VK/VKTexture.cpp +++ b/rpcs3/Emu/RSX/VK/VKTexture.cpp @@ -1183,6 +1183,13 @@ namespace vk { ensure(scratch_buf); + // WAW hazard - complete previous work before executing any transfers + insert_buffer_memory_barrier( + cmd2, scratch_buf->value, 0, scratch_offset, + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT); + if (upload_commands.size() > 1) { auto range_ptr = buffer_copies.data(); @@ -1197,8 +1204,11 @@ namespace vk vkCmdCopyBuffer(cmd2, upload_buffer->value, scratch_buf->value, static_cast(buffer_copies.size()), buffer_copies.data()); } - insert_buffer_memory_barrier(cmd2, scratch_buf->value, 0, scratch_offset, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT); + insert_buffer_memory_barrier( + cmd2, scratch_buf->value, 0, scratch_offset, + VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT); } // Swap and deswizzle if requested From 29cb4f59bd3f75ca63575d84a278b48220ab6fe5 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 19:26:42 +0300 Subject: [PATCH 188/630] vk: Invalidate renderpass key in post-cyclic-z barrier - Post-Z renderpass split is crucial due to loss of writes. The failure to invalidate the renderpass key was an oversight. --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 21 +++++++++++++++------ rpcs3/Emu/RSX/VK/VKGSRender.h | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 739253cc03..59f9bfb40a 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -143,6 +143,17 @@ VkRenderPass VKGSRender::get_render_pass() return m_cached_renderpass; } +void VKGSRender::invalidate_render_pass() +{ + // Regenerate renderpass key for the next draw call + if (const auto key = vk::get_renderpass_key(m_fbo_images, m_current_renderpass_key); + key != m_current_renderpass_key) + { + m_current_renderpass_key = key; + m_cached_renderpass = VK_NULL_HANDLE; + } +} + void VKGSRender::update_draw_state() { m_profiler.start(); @@ -514,12 +525,7 @@ void VKGSRender::load_texture_env() if (check_for_cyclic_refs) { // Regenerate renderpass key - if (const auto key = vk::get_renderpass_key(m_fbo_images, m_current_renderpass_key); - key != m_current_renderpass_key) - { - m_current_renderpass_key = key; - m_cached_renderpass = VK_NULL_HANDLE; - } + invalidate_render_pass(); } if (backend_config.supports_asynchronous_compute) @@ -1069,6 +1075,9 @@ void VKGSRender::end() // Since we're ending the subpass, might as well restore DCC/HiZ for extra performance ds->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); ds->reset_surface_counters(); + + // Regenerate render pass key + invalidate_render_pass(); } } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index b0edaa48f6..aa62df2122 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -227,6 +227,7 @@ private: void begin_render_pass(); void close_render_pass(); VkRenderPass get_render_pass(); + void invalidate_render_pass(); void update_draw_state(); void check_present_status(); From a907cc838bc2f06e09da9b4b4c9a8d0ff01db20b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 19:27:32 +0300 Subject: [PATCH 189/630] vk: Always specify LATE_FRAGMENT_TESTS and EARLY_FRAGMENT_TESTS together when declaring barriers - The combination of access patterns can go either way, do not assume early testing to always take place. --- rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp b/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp index de0345fdb4..2e97e5ad22 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp @@ -78,6 +78,7 @@ namespace vk VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT }; break; @@ -96,7 +97,7 @@ namespace vk break; case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; - dst_stage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; + dst_stage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; break; case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; From 33d79ee2cd1c24afa2721c43da82ef6ee20e845b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 20:39:52 +0300 Subject: [PATCH 190/630] vk: Fix CPU frame misalignment bug - This one has been around for a really long time. - The frame-based structure was due to translating the original vulkan tutorial to working code. - While it is not feasible to throw the arch away, we don't need a rigid 2-frame set for acquire-submit semaphores. --- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 25 +++++++++++----------- rpcs3/Emu/RSX/VK/VKGSRender.h | 5 +++-- rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp | 15 ++++++++++++- rpcs3/Emu/RSX/VK/VKPresent.cpp | 32 ++++++++++++++++++++++------ 4 files changed, 55 insertions(+), 22 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 4a0e6c19ce..cba661a64b 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -505,9 +505,6 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar) m_occlusion_query_manager->set_control_flags(VK_QUERY_CONTROL_PRECISE_BIT, 0); } - VkSemaphoreCreateInfo semaphore_info = {}; - semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - // VRAM allocation // This first set is bound persistently, so grow notifications are enabled. m_attrib_ring_info.create(VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VK_ATTRIB_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_default, "attrib buffer", 0x400000, VK_TRUE); @@ -570,10 +567,13 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar) rsx_log.warning("Current driver may crash due to memory limitations (%uk)", m_texbuffer_view_size / 1024); } - for (auto &ctx : frame_context_storage) + m_max_async_frames = m_swapchain->get_swap_image_count(); + m_frame_context_storage.resize(m_max_async_frames); + m_current_frame = &m_frame_context_storage[0]; + + for (auto& ctx : m_frame_context_storage) { - vkCreateSemaphore((*m_device), &semaphore_info, nullptr, &ctx.present_wait_semaphore); - vkCreateSemaphore((*m_device), &semaphore_info, nullptr, &ctx.acquire_signal_semaphore); + ctx.init(*m_device); } const auto& memory_map = m_device->get_memory_mapping(); @@ -612,8 +612,6 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar) } - m_current_frame = &frame_context_storage[0]; - m_texture_cache.initialize((*m_device), m_device->get_graphics_queue(), m_texture_upload_buffer_ring_info); @@ -830,16 +828,17 @@ VKGSRender::~VKGSRender() if (m_current_frame == &m_aux_frame_context) { // Return resources back to the owner - m_current_frame = &frame_context_storage[m_current_queue_index]; + m_current_frame = &m_frame_context_storage[m_current_queue_index]; m_current_frame->grab_resources(m_aux_frame_context); } - // NOTE: aux_context uses descriptor pools borrowed from the main queues and any allocations will be automatically freed when pool is destroyed - for (auto &ctx : frame_context_storage) + // CPU frame contexts + for (auto &ctx : m_frame_context_storage) { - vkDestroySemaphore((*m_device), ctx.present_wait_semaphore, nullptr); - vkDestroySemaphore((*m_device), ctx.acquire_signal_semaphore, nullptr); + ctx.destroy(*m_device); } + m_current_frame = nullptr; + m_frame_context_storage.clear(); // Textures m_rtts.destroy(); diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index aa62df2122..faae1bb78f 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -159,8 +159,9 @@ private: u64 m_texture_parameters_dynamic_offset = 0; u64 m_stipple_array_dynamic_offset = 0; - std::array frame_context_storage; - //Temp frame context to use if the real frame queue is overburdened. Only used for storage + std::vector m_frame_context_storage; + u32 m_max_async_frames = 0u; + // Temp frame context to use if the real frame queue is overburdened. Only used for storage vk::frame_context_t m_aux_frame_context; u32 m_current_queue_index = 0; diff --git a/rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp b/rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp index 429e428a18..0a400c68d9 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp +++ b/rpcs3/Emu/RSX/VK/VKGSRenderTypes.hpp @@ -23,7 +23,6 @@ #define VK_INDEX_RING_BUFFER_SIZE_M 16 #define VK_MAX_ASYNC_CB_COUNT 512 -#define VK_MAX_ASYNC_FRAMES 2 #define FRAME_PRESENT_TIMEOUT 10000000ull // 10 seconds #define GENERAL_WAIT_TIMEOUT 2000000ull // 2 seconds @@ -186,6 +185,20 @@ namespace vk data_heap_manager::managed_heap_snapshot_t heap_snapshot; u64 last_frame_sync_time = 0; + void init(VkDevice dev) + { + VkSemaphoreCreateInfo semaphore_info = {}; + semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + vkCreateSemaphore(dev, &semaphore_info, nullptr, &present_wait_semaphore); + vkCreateSemaphore(dev, &semaphore_info, nullptr, &acquire_signal_semaphore); + } + + void destroy(VkDevice dev) + { + vkDestroySemaphore(dev, present_wait_semaphore, nullptr); + vkDestroySemaphore(dev, acquire_signal_semaphore, nullptr); + } + // Copy shareable information void grab_resources(frame_context_t& other) { diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index d474af2139..eb30f9f2d6 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -52,7 +52,7 @@ void VKGSRender::reinitialize_swapchain() m_current_command_buffer->reset(); m_current_command_buffer->begin(); - for (auto &ctx : frame_context_storage) + for (auto &ctx : m_frame_context_storage) { if (ctx.present_image == umax) continue; @@ -67,6 +67,16 @@ void VKGSRender::reinitialize_swapchain() // Drain all the queues vkDeviceWaitIdle(*m_device); + // Reset frame context storage + for (auto& ctx : m_frame_context_storage) + { + ctx.destroy(*m_device); + } + m_current_frame = nullptr; + m_max_async_frames = 0; + m_current_queue_index = 0; + m_frame_context_storage.clear(); + // Rebuild swapchain. Old swapchain destruction is handled by the init_swapchain call if (!m_swapchain->init(m_swapchain_dims.width, m_swapchain_dims.height)) { @@ -75,6 +85,16 @@ void VKGSRender::reinitialize_swapchain() return; } + // Re-initialize CPU frame contexts + m_max_async_frames = m_swapchain->get_swap_image_count(); + m_frame_context_storage.resize(m_max_async_frames); + for (auto& ctx : m_frame_context_storage) + { + ctx.init(*m_device); + } + m_current_queue_index = 0; + m_current_frame = &m_frame_context_storage[0]; + // Prepare new swapchain images for use for (u32 i = 0; i < m_swapchain->get_swap_image_count(); ++i) { @@ -158,10 +178,10 @@ void VKGSRender::advance_queued_frames() m_current_frame->tag_frame_end(); m_queued_frames.push_back(m_current_frame); - ensure(m_queued_frames.size() <= VK_MAX_ASYNC_FRAMES); + ensure(m_queued_frames.size() <= m_max_async_frames); - m_current_queue_index = (m_current_queue_index + 1) % VK_MAX_ASYNC_FRAMES; - m_current_frame = &frame_context_storage[m_current_queue_index]; + m_current_queue_index = (m_current_queue_index + 1) % m_max_async_frames; + m_current_frame = &m_frame_context_storage[m_current_queue_index]; m_current_frame->flags |= frame_context_state::dirty; vk::advance_frame_counter(); @@ -398,7 +418,7 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) if (m_current_frame == &m_aux_frame_context) { - m_current_frame = &frame_context_storage[m_current_queue_index]; + m_current_frame = &m_frame_context_storage[m_current_queue_index]; if (m_current_frame->swap_command_buffer) { // Its possible this flip request is triggered by overlays and the flip queue is in undefined state @@ -520,7 +540,7 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) ensure(m_current_frame->present_image == umax); ensure(m_current_frame->swap_command_buffer == nullptr); - u64 timeout = m_swapchain->get_swap_image_count() <= VK_MAX_ASYNC_FRAMES? 0ull: 100000000ull; + u64 timeout = m_swapchain->get_swap_image_count() <= 2? 0ull: 100000000ull; while (VkResult status = m_swapchain->acquire_next_swapchain_image(m_current_frame->acquire_signal_semaphore, timeout, &m_current_frame->present_image)) { switch (status) From 9b09fba8117dad097d43ac961a5ad13cb78c7317 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 21:00:48 +0300 Subject: [PATCH 191/630] vk: Prevent WAW hazard when the window size exceeds the output draw box --- rpcs3/Emu/RSX/VK/VKPresent.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index eb30f9f2d6..08006d8dbd 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -612,6 +612,19 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) vk::change_image_layout(*m_current_command_buffer, target_image, present_layout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, subresource_range); vkCmdClearColorImage(*m_current_command_buffer, target_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_black, 1, &subresource_range); + // Prevent WAW on transfer writes + vk::insert_image_memory_barrier( + *m_current_command_buffer, + target_image, + target_layout, + target_layout, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + subresource_range + ); + target_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; } From fb420d5989573d564c6871aa04027d9be79d838c Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 21:30:22 +0300 Subject: [PATCH 192/630] vk: Fix flood of VVL synchronization violations appearing when capturing media --- rpcs3/Emu/RSX/VK/VKPresent.cpp | 202 +++++++++++++++++---------------- 1 file changed, 103 insertions(+), 99 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index 08006d8dbd..4f4517d062 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -605,6 +605,109 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) vk::framebuffer_holder* direct_fbo = nullptr; rsx::simple_array calibration_src; + const bool has_overlay = (m_overlay_manager && m_overlay_manager->has_visible()); + const bool user_asked_for_screenshot = g_user_asked_for_screenshot.exchange(false); + const bool user_is_recording = (g_recording_mode != recording_mode::stopped && m_frame->can_consume_frame()); + const bool need_media_capture = user_asked_for_screenshot || user_is_recording; + + const auto render_overlays = [&](vk::framebuffer_holder* fbo, const areau& area) + { + if (!has_overlay) return; + + // Lock to avoid modification during run-update chain + auto ui_renderer = vk::get_overlay_pass(); + std::lock_guard lock(*m_overlay_manager); + + for (const auto& view : m_overlay_manager->get_views()) + { + ui_renderer->run(*m_current_command_buffer, area, fbo, single_target_pass, m_texture_upload_buffer_ring_info, *view.get()); + } + }; + + // WARNING: We have to do this here. We cannot touch the acquired image on the CB and then do a hard sync on it before it is submitted to the presentation engine. + // That introduces a WRITE_AFTER_PRESENT (from the previous present) when we later try to present on a different CB + if (image_to_flip && need_media_capture) + { + const usz sshot_size = buffer_height * buffer_width * 4; + + vk::buffer sshot_vkbuf(*m_device, utils::align(sshot_size, 0x100000), m_device->get_memory_mapping().host_visible_coherent, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, VK_BUFFER_USAGE_TRANSFER_DST_BIT, 0, VMM_ALLOCATION_POOL_UNDEFINED); + + VkBufferImageCopy copy_info{}; + copy_info.bufferOffset = 0; + copy_info.bufferRowLength = 0; + copy_info.bufferImageHeight = 0; + copy_info.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + copy_info.imageSubresource.baseArrayLayer = 0; + copy_info.imageSubresource.layerCount = 1; + copy_info.imageSubresource.mipLevel = 0; + copy_info.imageOffset.x = 0; + copy_info.imageOffset.y = 0; + copy_info.imageOffset.z = 0; + copy_info.imageExtent.width = buffer_width; + copy_info.imageExtent.height = buffer_height; + copy_info.imageExtent.depth = 1; + + vk::image* image_to_copy = image_to_flip; + + if (g_cfg.video.record_with_overlays && has_overlay) + { + const auto key = vk::get_renderpass_key(m_swapchain->get_surface_format()); + single_target_pass = vk::get_renderpass(*m_device, key); + ensure(single_target_pass != VK_NULL_HANDLE); + + if (!m_overlay_recording_img || + m_overlay_recording_img->type() != image_to_flip->type() || + m_overlay_recording_img->format() != image_to_flip->format() || + m_overlay_recording_img->width() != image_to_flip->width() || + m_overlay_recording_img->height() != image_to_flip->height() || + m_overlay_recording_img->layers() != image_to_flip->layers()) + { + m_overlay_recording_img = std::make_unique(*m_device, m_device->get_memory_mapping().device_local, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + image_to_flip->type(), image_to_flip->format(), image_to_flip->width(), image_to_flip->height(), 1, 1, image_to_flip->layers(), VK_SAMPLE_COUNT_1_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + 0, VMM_ALLOCATION_POOL_UNDEFINED); + } + + m_overlay_recording_img->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + image_to_flip->push_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + + const areai rect = areai(0, 0, buffer_width, buffer_height); + vk::copy_image(*m_current_command_buffer, image_to_flip, m_overlay_recording_img.get(), rect, rect, 1); + + image_to_flip->pop_layout(*m_current_command_buffer); + m_overlay_recording_img->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + + vk::framebuffer_holder* sshot_fbo = vk::get_framebuffer(*m_device, buffer_width, buffer_height, VK_FALSE, single_target_pass, { m_overlay_recording_img.get() }); + sshot_fbo->add_ref(); + render_overlays(sshot_fbo, areau(rect)); + sshot_fbo->release(); + + image_to_copy = m_overlay_recording_img.get(); + } + + image_to_copy->push_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + vk::copy_image_to_buffer(*m_current_command_buffer, image_to_copy, &sshot_vkbuf, copy_info); + image_to_copy->pop_layout(*m_current_command_buffer); + + flush_command_queue(true); + const auto src = sshot_vkbuf.map(0, sshot_size); + std::vector sshot_frame(sshot_size); + memcpy(sshot_frame.data(), src, sshot_size); + sshot_vkbuf.unmap(); + + const bool is_bgra = image_to_copy->format() == VK_FORMAT_B8G8R8A8_UNORM; + + if (user_asked_for_screenshot) + { + m_frame->take_screenshot(std::move(sshot_frame), buffer_width, buffer_height, is_bgra); + } + else + { + m_frame->present_frame(std::move(sshot_frame), buffer_width * 4, buffer_width, buffer_height, is_bgra); + } + } + if (!image_to_flip || aspect_ratio.x1 || aspect_ratio.y1) { // Clear the window background to black @@ -648,21 +751,6 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) } } - const bool has_overlay = (m_overlay_manager && m_overlay_manager->has_visible()); - const auto render_overlays = [&](vk::framebuffer_holder* fbo, const areau& area) - { - if (!has_overlay) return; - - // Lock to avoid modification during run-update chain - auto ui_renderer = vk::get_overlay_pass(); - std::lock_guard lock(*m_overlay_manager); - - for (const auto& view : m_overlay_manager->get_views()) - { - ui_renderer->run(*m_current_command_buffer, area, fbo, single_target_pass, m_texture_upload_buffer_ring_info, *view.get()); - } - }; - if (image_to_flip) { const bool use_full_rgb_range_output = g_cfg.video.full_rgb_range_output.get(); @@ -726,90 +814,6 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) m_upscaler->scale_output(*m_current_command_buffer, image_to_flip, target_image, target_layout, rgn, UPSCALE_AND_COMMIT | UPSCALE_DEFAULT_VIEW); } - - const bool user_asked_for_screenshot = g_user_asked_for_screenshot.exchange(false); - - if (user_asked_for_screenshot || (g_recording_mode != recording_mode::stopped && m_frame->can_consume_frame())) - { - const usz sshot_size = buffer_height * buffer_width * 4; - - vk::buffer sshot_vkbuf(*m_device, utils::align(sshot_size, 0x100000), m_device->get_memory_mapping().host_visible_coherent, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, VK_BUFFER_USAGE_TRANSFER_DST_BIT, 0, VMM_ALLOCATION_POOL_UNDEFINED); - - VkBufferImageCopy copy_info {}; - copy_info.bufferOffset = 0; - copy_info.bufferRowLength = 0; - copy_info.bufferImageHeight = 0; - copy_info.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - copy_info.imageSubresource.baseArrayLayer = 0; - copy_info.imageSubresource.layerCount = 1; - copy_info.imageSubresource.mipLevel = 0; - copy_info.imageOffset.x = 0; - copy_info.imageOffset.y = 0; - copy_info.imageOffset.z = 0; - copy_info.imageExtent.width = buffer_width; - copy_info.imageExtent.height = buffer_height; - copy_info.imageExtent.depth = 1; - - vk::image* image_to_copy = image_to_flip; - - if (g_cfg.video.record_with_overlays && has_overlay) - { - const auto key = vk::get_renderpass_key(m_swapchain->get_surface_format()); - single_target_pass = vk::get_renderpass(*m_device, key); - ensure(single_target_pass != VK_NULL_HANDLE); - - if (!m_overlay_recording_img || - m_overlay_recording_img->type() != image_to_flip->type() || - m_overlay_recording_img->format() != image_to_flip->format() || - m_overlay_recording_img->width() != image_to_flip->width() || - m_overlay_recording_img->height() != image_to_flip->height() || - m_overlay_recording_img->layers() != image_to_flip->layers()) - { - m_overlay_recording_img = std::make_unique(*m_device, m_device->get_memory_mapping().device_local, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - image_to_flip->type(), image_to_flip->format(), image_to_flip->width(), image_to_flip->height(), 1, 1, image_to_flip->layers(), VK_SAMPLE_COUNT_1_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, - 0, VMM_ALLOCATION_POOL_UNDEFINED); - } - - m_overlay_recording_img->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - image_to_flip->push_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); - - const areai rect = areai(0, 0, buffer_width, buffer_height); - vk::copy_image(*m_current_command_buffer, image_to_flip, m_overlay_recording_img.get(), rect, rect, 1); - - image_to_flip->pop_layout(*m_current_command_buffer); - m_overlay_recording_img->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); - - vk::framebuffer_holder* sshot_fbo = vk::get_framebuffer(*m_device, buffer_width, buffer_height, VK_FALSE, single_target_pass, { m_overlay_recording_img.get() }); - sshot_fbo->add_ref(); - render_overlays(sshot_fbo, areau(rect)); - sshot_fbo->release(); - - image_to_copy = m_overlay_recording_img.get(); - } - - image_to_copy->push_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); - vk::copy_image_to_buffer(*m_current_command_buffer, image_to_copy, &sshot_vkbuf, copy_info); - image_to_copy->pop_layout(*m_current_command_buffer); - - flush_command_queue(true); - const auto src = sshot_vkbuf.map(0, sshot_size); - std::vector sshot_frame(sshot_size); - memcpy(sshot_frame.data(), src, sshot_size); - sshot_vkbuf.unmap(); - - const bool is_bgra = image_to_copy->format() == VK_FORMAT_B8G8R8A8_UNORM; - - if (user_asked_for_screenshot) - { - m_frame->take_screenshot(std::move(sshot_frame), buffer_width, buffer_height, is_bgra); - } - else - { - m_frame->present_frame(std::move(sshot_frame), buffer_width * 4, buffer_width, buffer_height, is_bgra); - } - } } if (g_cfg.video.debug_overlay || has_overlay) From 0ee3e24b25a119ac8810c30a5065ab846419214b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 26 Jan 2026 00:23:48 +0300 Subject: [PATCH 193/630] vk: Drain the pending frame queue before resizing the swapchain --- rpcs3/Emu/RSX/VK/VKPresent.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index 4f4517d062..f9fbb114ed 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -61,6 +61,21 @@ void VKGSRender::reinitialize_swapchain() frame_context_cleanup(&ctx); } + // NOTE: frame_context_cleanup alters the queued_frames structure. + while (!m_queued_frames.empty()) + { + auto& frame = m_queued_frames.front(); + if (!frame->swap_command_buffer) + { + // Drop it + m_queued_frames.pop_front(); + continue; + } + + frame_context_cleanup(frame); + } + ensure(m_queued_frames.empty()); + // Discard the current upscaling pipeline if any m_upscaler.reset(); From 818b11fd2fa2607334f781213e26da5fbb8506b5 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 26 Jan 2026 15:55:03 +0300 Subject: [PATCH 194/630] Revert adrenalin crash workaround --- rpcs3/Emu/RSX/VK/vkutils/device.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/VK/vkutils/device.cpp b/rpcs3/Emu/RSX/VK/vkutils/device.cpp index 14752f160c..f7b7ffb19c 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/device.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/device.cpp @@ -102,7 +102,7 @@ namespace vk multidraw_support.max_batch_size = 65536; optional_features_support.barycentric_coords = !!shader_barycentric_info.fragmentShaderBarycentric; - optional_features_support.framebuffer_loops = !!fbo_loops_info.attachmentFeedbackLoopLayout && get_driver_vendor() != driver_vendor::AMD; + optional_features_support.framebuffer_loops = !!fbo_loops_info.attachmentFeedbackLoopLayout; optional_features_support.extended_device_fault = !!device_fault_info.deviceFault; features = features2.features; From 0e2584fc9f367c2d3cd3e0ce578fb81b0e74b6ce Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sun, 25 Jan 2026 07:10:50 +0100 Subject: [PATCH 195/630] sceNpBasicLimitedSendMessage --- rpcs3/Emu/Cell/Modules/sceNp.cpp | 65 ++++++++++++++++++++++++++++++-- rpcs3/Emu/Cell/PPUModule.cpp | 1 + rpcs3/Emu/Cell/PPUModule.h | 1 + 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index 2b49309a9b..ee9c308265 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -1118,10 +1118,35 @@ error_code sceNpBasicSetPresenceDetails2(vm::cptr pr return CELL_OK; } -error_code sceNpBasicSendMessage(vm::cptr to, vm::cptr data, u32 size) -{ - sceNp.warning("sceNpBasicSendMessage(to=*0x%x, data=*0x%x, size=%d)", to, data, size); +u64 sys_time_get_system_time(); +error_code acquire_time_slot(u64* time_array, usz array_size, u64 slot_duration) +{ + static shared_mutex mutex; + std::lock_guard lock(mutex); + + const u64 current_time = sys_time_get_system_time(); + + for (usz index = 0; index < array_size; index++) + { + if (time_array[index] == 0) + { + time_array[index] = current_time; + return CELL_OK; + } + + if (current_time > (time_array[index] + slot_duration)) + { + time_array[index] = current_time; + return CELL_OK; + } + } + + return SCE_NP_BASIC_ERROR_BUSY; +} + +error_code _sceNpBasicSendMessage(vm::cptr to, vm::cptr data, u32 size, bool rate_limited) +{ auto& nph = g_fxo->get>(); if (!nph.is_NP_init) @@ -1144,6 +1169,22 @@ error_code sceNpBasicSendMessage(vm::cptr to, vm::cptr data, u32 return SCE_NP_BASIC_ERROR_EXCEEDS_MAX; } + if (rate_limited) + { + struct sceNpBasicSendMessage_time_slots + { + sceNpBasicSendMessage_time_slots(sceNpBasicSendMessage_time_slots&&) = delete; + std::array data{}; + }; + + auto& time_slots = g_fxo->get(); + + if (auto error = acquire_time_slot(time_slots.data.data(), time_slots.data.size(), 60000000); error != CELL_OK) + { + return error; + } + } + if (nph.get_psn_status() != SCE_NP_MANAGER_STATUS_ONLINE) { return not_an_error(SCE_NP_BASIC_ERROR_NOT_CONNECTED); @@ -1164,6 +1205,19 @@ error_code sceNpBasicSendMessage(vm::cptr to, vm::cptr data, u32 return CELL_OK; } +error_code sceNpBasicSendMessage(vm::cptr to, vm::cptr data, u32 size) +{ + sceNp.warning("sceNpBasicSendMessage(to=*0x%x, data=*0x%x, size=%d)", to, data, size); + return _sceNpBasicSendMessage(to, data, size, false); +} + +// This function is sceNpBasicSendMessage + a rate limiter that will return SCE_NP_BASIC_ERROR_BUSY if it too many messages have been sent +error_code sceNpBasicLimited_0xEB42E2E6(vm::cptr to, vm::cptr data, u32 size) +{ + sceNp.warning("sceNpBasicLimited_0xEB42E2E6(to=*0x%x, data=*0x%x, size=%d)", to, data, size); + return _sceNpBasicSendMessage(to, data, size, true); +} + error_code sceNpBasicSendMessageGui(ppu_thread& ppu, vm::cptr msg, sys_memory_container_t containerId) { sceNp.warning("sceNpBasicSendMessageGui(msg=*0x%x, containerId=%d)", msg, containerId); @@ -7289,6 +7343,11 @@ s32 _Z32_sce_np_sysutil_cxml_prepare_docPN16sysutil_cxmlutil11FixedMemoryERN4cxm return CELL_OK; } +DECLARE(ppu_module_manager::sceNpBasicLimited) +("sceNpBasicLimited", []() { + ppu_module_manager::register_static_function<&sceNpBasicLimited_0xEB42E2E6>("sceNpBasicLimited", ppu_select_name("sceNpBasicLimited", "sceNpBasicLimited_0xEB42E2E6"), BIND_FUNC_WITH_BLR(sceNpBasicLimited_0xEB42E2E6, "sceNpBasicLimited"), 0xEB42E2E6); +}); + DECLARE(ppu_module_manager::sceNp) ("sceNp", []() { REG_FUNC(sceNp, sceNpInit); diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 65ab0fe18d..b298539519 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -314,6 +314,7 @@ static void ppu_initialize_modules(ppu_linkage_info* link, utils::serial* ar = n &ppu_module_manager::libsnd3, &ppu_module_manager::libsynth2, &ppu_module_manager::sceNp, + &ppu_module_manager::sceNpBasicLimited, &ppu_module_manager::sceNp2, &ppu_module_manager::sceNpClans, &ppu_module_manager::sceNpCommerce2, diff --git a/rpcs3/Emu/Cell/PPUModule.h b/rpcs3/Emu/Cell/PPUModule.h index fdcd736f38..6171a4faa1 100644 --- a/rpcs3/Emu/Cell/PPUModule.h +++ b/rpcs3/Emu/Cell/PPUModule.h @@ -283,6 +283,7 @@ public: static const ppu_static_module libsnd3; static const ppu_static_module libsynth2; static const ppu_static_module sceNp; + static const ppu_static_module sceNpBasicLimited; static const ppu_static_module sceNp2; static const ppu_static_module sceNpClans; static const ppu_static_module sceNpCommerce2; From 8f8032b5a8959397e2d03bef9f3a6e0bf6a3560d Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Mon, 26 Jan 2026 09:36:59 +0100 Subject: [PATCH 196/630] Implement sceNpMatching2GetSignalingOptParamLocal --- rpcs3/Emu/Cell/Modules/sceNp2.cpp | 24 + rpcs3/Emu/NP/generated/np2_structs.pb.cc | 421 ++++++++++++++- rpcs3/Emu/NP/generated/np2_structs.pb.h | 656 ++++++++++++++++++++--- rpcs3/Emu/NP/generated/np2_structs.proto | 95 +--- rpcs3/Emu/NP/np_cache.cpp | 17 + rpcs3/Emu/NP/np_cache.h | 4 + rpcs3/Emu/NP/np_handler.cpp | 5 + rpcs3/Emu/NP/np_handler.h | 1 + rpcs3/Emu/NP/np_requests.cpp | 55 +- rpcs3/Emu/NP/pb_helpers.cpp | 7 + rpcs3/Emu/NP/pb_helpers.h | 1 + rpcs3/Emu/NP/rpcn_client.cpp | 2 +- 12 files changed, 1096 insertions(+), 192 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index 820fbdf1c0..b6ad47b846 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -1335,6 +1335,30 @@ error_code sceNpMatching2GetSignalingOptParamLocal(SceNpMatching2ContextId ctxId return SCE_NP_MATCHING2_ERROR_NOT_INITIALIZED; } + if (!ctxId) + { + return SCE_NP_MATCHING2_ERROR_INVALID_CONTEXT_ID; + } + + if (!roomId) + { + return SCE_NP_MATCHING2_ERROR_INVALID_ROOM_ID; + } + + if (!check_match2_context(ctxId)) + { + return SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_FOUND; + } + + const auto [error, signaling_opt_param] = nph.local_get_signaling_opt_param(roomId); + + if (error) + { + return error; + } + + *signalingOptParam = *signaling_opt_param; + return CELL_OK; } diff --git a/rpcs3/Emu/NP/generated/np2_structs.pb.cc b/rpcs3/Emu/NP/generated/np2_structs.pb.cc index 756b12b0dc..6416723f11 100644 --- a/rpcs3/Emu/NP/generated/np2_structs.pb.cc +++ b/rpcs3/Emu/NP/generated/np2_structs.pb.cc @@ -2555,7 +2555,8 @@ inline constexpr JoinRoomResponse::Impl_::Impl_( ::_pbi::ConstantInitialized) noexcept : _cached_size_{0}, signaling_data_{}, - room_data_{nullptr} {} + room_data_{nullptr}, + opt_param_{nullptr} {} template PROTOBUF_CONSTEXPR JoinRoomResponse::JoinRoomResponse(::_pbi::ConstantInitialized) @@ -2576,6 +2577,32 @@ struct JoinRoomResponseDefaultTypeInternal { PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 JoinRoomResponseDefaultTypeInternal _JoinRoomResponse_default_instance_; + +inline constexpr CreateRoomResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + internal_{nullptr}, + opt_param_{nullptr} {} + +template +PROTOBUF_CONSTEXPR CreateRoomResponse::CreateRoomResponse(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(CreateRoomResponse_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct CreateRoomResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR CreateRoomResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~CreateRoomResponseDefaultTypeInternal() {} + union { + CreateRoomResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CreateRoomResponseDefaultTypeInternal _CreateRoomResponse_default_instance_; } // namespace np2_structs namespace np2_structs { // =================================================================== @@ -11934,6 +11961,324 @@ void CreateJoinRoomRequest::InternalSwap(CreateJoinRoomRequest* PROTOBUF_RESTRIC // =================================================================== +class CreateRoomResponse::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(CreateRoomResponse, _impl_._has_bits_); +}; + +CreateRoomResponse::CreateRoomResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, CreateRoomResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.CreateRoomResponse) +} +PROTOBUF_NDEBUG_INLINE CreateRoomResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::CreateRoomResponse& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +CreateRoomResponse::CreateRoomResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const CreateRoomResponse& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, CreateRoomResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + CreateRoomResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.internal_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.internal_) + : nullptr; + _impl_.opt_param_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.opt_param_) + : nullptr; + + // @@protoc_insertion_point(copy_constructor:np2_structs.CreateRoomResponse) +} +PROTOBUF_NDEBUG_INLINE CreateRoomResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void CreateRoomResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, internal_), + 0, + offsetof(Impl_, opt_param_) - + offsetof(Impl_, internal_) + + sizeof(Impl_::opt_param_)); +} +CreateRoomResponse::~CreateRoomResponse() { + // @@protoc_insertion_point(destructor:np2_structs.CreateRoomResponse) + SharedDtor(*this); +} +inline void CreateRoomResponse::SharedDtor(MessageLite& self) { + CreateRoomResponse& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.internal_; + delete this_._impl_.opt_param_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL CreateRoomResponse::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) CreateRoomResponse(arena); +} +constexpr auto CreateRoomResponse::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(CreateRoomResponse), + alignof(CreateRoomResponse)); +} +constexpr auto CreateRoomResponse::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<31>{ + { + &_CreateRoomResponse_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &CreateRoomResponse::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &CreateRoomResponse::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &CreateRoomResponse::ByteSizeLong, + &CreateRoomResponse::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(CreateRoomResponse, _impl_._cached_size_), + true, + }, + "np2_structs.CreateRoomResponse", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<31> CreateRoomResponse_class_data_ = + CreateRoomResponse::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +CreateRoomResponse::GetClassData() const { + return CreateRoomResponse_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<1, 2, 2, 0, 2> +CreateRoomResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(CreateRoomResponse, _impl_._has_bits_), + 0, // no _extensions_ + 2, 8, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967292, // skipmap + offsetof(decltype(_table_), field_entries), + 2, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + CreateRoomResponse_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::CreateRoomResponse>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // .np2_structs.OptParam opt_param = 2; + {::_pbi::TcParser::FastMtS1, + {18, 1, 1, + PROTOBUF_FIELD_OFFSET(CreateRoomResponse, _impl_.opt_param_)}}, + // .np2_structs.RoomDataInternal internal = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(CreateRoomResponse, _impl_.internal_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.RoomDataInternal internal = 1; + {PROTOBUF_FIELD_OFFSET(CreateRoomResponse, _impl_.internal_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.OptParam opt_param = 2; + {PROTOBUF_FIELD_OFFSET(CreateRoomResponse, _impl_.opt_param_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::RoomDataInternal>()}, + {::_pbi::TcParser::GetTable<::np2_structs::OptParam>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void CreateRoomResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.CreateRoomResponse) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.internal_ != nullptr); + _impl_.internal_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.opt_param_ != nullptr); + _impl_.opt_param_->Clear(); + } + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL CreateRoomResponse::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const CreateRoomResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL CreateRoomResponse::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const CreateRoomResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.CreateRoomResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.RoomDataInternal internal = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.internal_, this_._impl_.internal_->GetCachedSize(), target, + stream); + } + + // .np2_structs.OptParam opt_param = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 2, *this_._impl_.opt_param_, this_._impl_.opt_param_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.CreateRoomResponse) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t CreateRoomResponse::ByteSizeLong(const MessageLite& base) { + const CreateRoomResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t CreateRoomResponse::ByteSizeLong() const { + const CreateRoomResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.CreateRoomResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + // .np2_structs.RoomDataInternal internal = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.internal_); + } + // .np2_structs.OptParam opt_param = 2; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.opt_param_); + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void CreateRoomResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.CreateRoomResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.internal_ != nullptr); + if (_this->_impl_.internal_ == nullptr) { + _this->_impl_.internal_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.internal_); + } else { + _this->_impl_.internal_->MergeFrom(*from._impl_.internal_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.opt_param_ != nullptr); + if (_this->_impl_.opt_param_ == nullptr) { + _this->_impl_.opt_param_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.opt_param_); + } else { + _this->_impl_.opt_param_->MergeFrom(*from._impl_.opt_param_); + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void CreateRoomResponse::CopyFrom(const CreateRoomResponse& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.CreateRoomResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void CreateRoomResponse::InternalSwap(CreateRoomResponse* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(CreateRoomResponse, _impl_.opt_param_) + + sizeof(CreateRoomResponse::_impl_.opt_param_) + - PROTOBUF_FIELD_OFFSET(CreateRoomResponse, _impl_.internal_)>( + reinterpret_cast(&_impl_.internal_), + reinterpret_cast(&other->_impl_.internal_)); +} + +// =================================================================== + class JoinRoomRequest::_Internal { public: using HasBits = @@ -12451,6 +12796,9 @@ JoinRoomResponse::JoinRoomResponse( _impl_.room_data_ = (CheckHasBit(cached_has_bits, 0x00000002U)) ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.room_data_) : nullptr; + _impl_.opt_param_ = (CheckHasBit(cached_has_bits, 0x00000004U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.opt_param_) + : nullptr; // @@protoc_insertion_point(copy_constructor:np2_structs.JoinRoomResponse) } @@ -12462,7 +12810,12 @@ PROTOBUF_NDEBUG_INLINE JoinRoomResponse::Impl_::Impl_( inline void JoinRoomResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { new (&_impl_) Impl_(internal_visibility(), arena); - _impl_.room_data_ = {}; + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, room_data_), + 0, + offsetof(Impl_, opt_param_) - + offsetof(Impl_, room_data_) + + sizeof(Impl_::opt_param_)); } JoinRoomResponse::~JoinRoomResponse() { // @@protoc_insertion_point(destructor:np2_structs.JoinRoomResponse) @@ -12476,6 +12829,7 @@ inline void JoinRoomResponse::SharedDtor(MessageLite& self) { this_._internal_metadata_.Delete<::std::string>(); ABSL_DCHECK(this_.GetArena() == nullptr); delete this_._impl_.room_data_; + delete this_._impl_.opt_param_; this_._impl_.~Impl_(); } @@ -12531,17 +12885,17 @@ JoinRoomResponse::GetClassData() const { return JoinRoomResponse_class_data_.base(); } PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 -const ::_pbi::TcParseTable<1, 2, 2, 0, 2> +const ::_pbi::TcParseTable<2, 3, 3, 0, 2> JoinRoomResponse::_table_ = { { PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_._has_bits_), 0, // no _extensions_ - 2, 8, // max_field_number, fast_idx_mask + 3, 24, // max_field_number, fast_idx_mask offsetof(decltype(_table_), field_lookup_table), - 4294967292, // skipmap + 4294967288, // skipmap offsetof(decltype(_table_), field_entries), - 2, // num_field_entries - 2, // num_aux_entries + 3, // num_field_entries + 3, // num_aux_entries offsetof(decltype(_table_), aux_entries), JoinRoomResponse_class_data_.base(), nullptr, // post_loop_handler @@ -12550,14 +12904,19 @@ JoinRoomResponse::_table_ = { ::_pbi::TcParser::GetTable<::np2_structs::JoinRoomResponse>(), // to_prefetch #endif // PROTOBUF_PREFETCH_PARSE_TABLE }, {{ - // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; - {::_pbi::TcParser::FastMtR1, - {18, 0, 1, - PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.signaling_data_)}}, + {::_pbi::TcParser::MiniParse, {}}, // .np2_structs.RoomDataInternal room_data = 1; {::_pbi::TcParser::FastMtS1, {10, 1, 0, PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.room_data_)}}, + // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; + {::_pbi::TcParser::FastMtR1, + {18, 0, 1, + PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.signaling_data_)}}, + // .np2_structs.OptParam opt_param = 3; + {::_pbi::TcParser::FastMtS1, + {26, 2, 2, + PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.opt_param_)}}, }}, {{ 65535, 65535 }}, {{ @@ -12565,10 +12924,13 @@ JoinRoomResponse::_table_ = { {PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.room_data_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; {PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.signaling_data_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + // .np2_structs.OptParam opt_param = 3; + {PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.opt_param_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, }}, {{ {::_pbi::TcParser::GetTable<::np2_structs::RoomDataInternal>()}, {::_pbi::TcParser::GetTable<::np2_structs::Matching2SignalingInfo>()}, + {::_pbi::TcParser::GetTable<::np2_structs::OptParam>()}, }}, {{ }}, @@ -12581,7 +12943,7 @@ PROTOBUF_NOINLINE void JoinRoomResponse::Clear() { (void) cached_has_bits; cached_has_bits = _impl_._has_bits_[0]; - if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { _impl_.signaling_data_.Clear(); } @@ -12589,6 +12951,10 @@ PROTOBUF_NOINLINE void JoinRoomResponse::Clear() { ABSL_DCHECK(_impl_.room_data_ != nullptr); _impl_.room_data_->Clear(); } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(_impl_.opt_param_ != nullptr); + _impl_.opt_param_->Clear(); + } } _impl_._has_bits_.Clear(); _internal_metadata_.Clear<::std::string>(); @@ -12633,6 +12999,13 @@ PROTOBUF_NOINLINE void JoinRoomResponse::Clear() { } } + // .np2_structs.OptParam opt_param = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.opt_param_, this_._impl_.opt_param_->GetCachedSize(), target, + stream); + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { target = stream->WriteRaw( this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), @@ -12658,7 +13031,7 @@ PROTOBUF_NOINLINE void JoinRoomResponse::Clear() { ::_pbi::Prefetch5LinesFrom7Lines(&this_); cached_has_bits = this_._impl_._has_bits_[0]; - if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { total_size += 1UL * this_._internal_signaling_data_size(); @@ -12671,6 +13044,11 @@ PROTOBUF_NOINLINE void JoinRoomResponse::Clear() { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.room_data_); } + // .np2_structs.OptParam opt_param = 3; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.opt_param_); + } } if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); @@ -12694,7 +13072,7 @@ void JoinRoomResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, (void)cached_has_bits; cached_has_bits = from._impl_._has_bits_[0]; - if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { _this->_internal_mutable_signaling_data()->InternalMergeFromWithArena( ::google::protobuf::MessageLite::internal_visibility(), arena, @@ -12708,6 +13086,14 @@ void JoinRoomResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, _this->_impl_.room_data_->MergeFrom(*from._impl_.room_data_); } } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + ABSL_DCHECK(from._impl_.opt_param_ != nullptr); + if (_this->_impl_.opt_param_ == nullptr) { + _this->_impl_.opt_param_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.opt_param_); + } else { + _this->_impl_.opt_param_->MergeFrom(*from._impl_.opt_param_); + } + } } _this->_impl_._has_bits_[0] |= cached_has_bits; _this->_internal_metadata_.MergeFrom<::std::string>( @@ -12727,7 +13113,12 @@ void JoinRoomResponse::InternalSwap(JoinRoomResponse* PROTOBUF_RESTRICT PROTOBUF _internal_metadata_.InternalSwap(&other->_internal_metadata_); swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); _impl_.signaling_data_.InternalSwap(&other->_impl_.signaling_data_); - swap(_impl_.room_data_, other->_impl_.room_data_); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.opt_param_) + + sizeof(JoinRoomResponse::_impl_.opt_param_) + - PROTOBUF_FIELD_OFFSET(JoinRoomResponse, _impl_.room_data_)>( + reinterpret_cast(&_impl_.room_data_), + reinterpret_cast(&other->_impl_.room_data_)); } // =================================================================== diff --git a/rpcs3/Emu/NP/generated/np2_structs.pb.h b/rpcs3/Emu/NP/generated/np2_structs.pb.h index f662c0a1a0..0e035973fd 100644 --- a/rpcs3/Emu/NP/generated/np2_structs.pb.h +++ b/rpcs3/Emu/NP/generated/np2_structs.pb.h @@ -71,6 +71,10 @@ class CreateRoomGUIRequest; struct CreateRoomGUIRequestDefaultTypeInternal; extern CreateRoomGUIRequestDefaultTypeInternal _CreateRoomGUIRequest_default_instance_; extern const ::google::protobuf::internal::ClassDataLite<33> CreateRoomGUIRequest_class_data_; +class CreateRoomResponse; +struct CreateRoomResponseDefaultTypeInternal; +extern CreateRoomResponseDefaultTypeInternal _CreateRoomResponse_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<31> CreateRoomResponse_class_data_; class GUIUserInfo; struct GUIUserInfoDefaultTypeInternal; extern GUIUserInfoDefaultTypeInternal _GUIUserInfo_default_instance_; @@ -1031,7 +1035,7 @@ class TusVariable final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusVariable_default_instance_); } - static constexpr int kIndexInFileMessages = 56; + static constexpr int kIndexInFileMessages = 57; friend void swap(TusVariable& a, TusVariable& b) { a.Swap(&b); } inline void Swap(TusVariable* PROTOBUF_NONNULL other) { if (other == this) return; @@ -1279,7 +1283,7 @@ class TusUser final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusUser_default_instance_); } - static constexpr int kIndexInFileMessages = 55; + static constexpr int kIndexInFileMessages = 56; friend void swap(TusUser& a, TusUser& b) { a.Swap(&b); } inline void Swap(TusUser* PROTOBUF_NONNULL other) { if (other == this) return; @@ -1474,7 +1478,7 @@ class TusGetFriendsVariableRequest final : public ::google::protobuf::MessageLit return *reinterpret_cast( &_TusGetFriendsVariableRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 61; + static constexpr int kIndexInFileMessages = 62; friend void swap(TusGetFriendsVariableRequest& a, TusGetFriendsVariableRequest& b) { a.Swap(&b); } inline void Swap(TusGetFriendsVariableRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -1688,7 +1692,7 @@ class TusGetFriendsDataStatusRequest final : public ::google::protobuf::MessageL return *reinterpret_cast( &_TusGetFriendsDataStatusRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 72; + static constexpr int kIndexInFileMessages = 73; friend void swap(TusGetFriendsDataStatusRequest& a, TusGetFriendsDataStatusRequest& b) { a.Swap(&b); } inline void Swap(TusGetFriendsDataStatusRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -1902,7 +1906,7 @@ class TusDataStatus final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusDataStatus_default_instance_); } - static constexpr int kIndexInFileMessages = 66; + static constexpr int kIndexInFileMessages = 67; friend void swap(TusDataStatus& a, TusDataStatus& b) { a.Swap(&b); } inline void Swap(TusDataStatus* PROTOBUF_NONNULL other) { if (other == this) return; @@ -2143,7 +2147,7 @@ class SetRoomSearchFlagGUI final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_SetRoomSearchFlagGUI_default_instance_); } - static constexpr int kIndexInFileMessages = 84; + static constexpr int kIndexInFileMessages = 85; friend void swap(SetRoomSearchFlagGUI& a, SetRoomSearchFlagGUI& b) { a.Swap(&b); } inline void Swap(SetRoomSearchFlagGUI* PROTOBUF_NONNULL other) { if (other == this) return; @@ -2338,7 +2342,7 @@ class SetPresenceRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_SetPresenceRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 74; + static constexpr int kIndexInFileMessages = 75; friend void swap(SetPresenceRequest& a, SetPresenceRequest& b) { a.Swap(&b); } inline void Swap(SetPresenceRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -2572,7 +2576,7 @@ class SendMessageRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_SendMessageRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 43; + static constexpr int kIndexInFileMessages = 44; friend void swap(SendMessageRequest& a, SendMessageRequest& b) { a.Swap(&b); } inline void Swap(SendMessageRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -2779,7 +2783,7 @@ class ScoreRankData final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_ScoreRankData_default_instance_); } - static constexpr int kIndexInFileMessages = 50; + static constexpr int kIndexInFileMessages = 51; friend void swap(ScoreRankData& a, ScoreRankData& b) { a.Swap(&b); } inline void Swap(ScoreRankData* PROTOBUF_NONNULL other) { if (other == this) return; @@ -3039,7 +3043,7 @@ class ScoreNpIdPcId final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_ScoreNpIdPcId_default_instance_); } - static constexpr int kIndexInFileMessages = 47; + static constexpr int kIndexInFileMessages = 48; friend void swap(ScoreNpIdPcId& a, ScoreNpIdPcId& b) { a.Swap(&b); } inline void Swap(ScoreNpIdPcId* PROTOBUF_NONNULL other) { if (other == this) return; @@ -3234,7 +3238,7 @@ class ScoreInfo final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_ScoreInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 51; + static constexpr int kIndexInFileMessages = 52; friend void swap(ScoreInfo& a, ScoreInfo& b) { a.Swap(&b); } inline void Swap(ScoreInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -3417,7 +3421,7 @@ class RecordScoreRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_RecordScoreRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 45; + static constexpr int kIndexInFileMessages = 46; friend void swap(RecordScoreRequest& a, RecordScoreRequest& b) { a.Swap(&b); } inline void Swap(RecordScoreRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -3653,7 +3657,7 @@ class RecordScoreGameDataRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_RecordScoreGameDataRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 53; + static constexpr int kIndexInFileMessages = 54; friend void swap(RecordScoreGameDataRequest& a, RecordScoreGameDataRequest& b) { a.Swap(&b); } inline void Swap(RecordScoreGameDataRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -4050,7 +4054,7 @@ class MatchingSearchCondition final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_MatchingSearchCondition_default_instance_); } - static constexpr int kIndexInFileMessages = 75; + static constexpr int kIndexInFileMessages = 76; friend void swap(MatchingSearchCondition& a, MatchingSearchCondition& b) { a.Swap(&b); } inline void Swap(MatchingSearchCondition* PROTOBUF_NONNULL other) { if (other == this) return; @@ -4264,7 +4268,7 @@ class MatchingGuiRoomId final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_MatchingGuiRoomId_default_instance_); } - static constexpr int kIndexInFileMessages = 83; + static constexpr int kIndexInFileMessages = 84; friend void swap(MatchingGuiRoomId& a, MatchingGuiRoomId& b) { a.Swap(&b); } inline void Swap(MatchingGuiRoomId* PROTOBUF_NONNULL other) { if (other == this) return; @@ -4447,7 +4451,7 @@ class MatchingAttr final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_MatchingAttr_default_instance_); } - static constexpr int kIndexInFileMessages = 76; + static constexpr int kIndexInFileMessages = 77; friend void swap(MatchingAttr& a, MatchingAttr& b) { a.Swap(&b); } inline void Swap(MatchingAttr* PROTOBUF_NONNULL other) { if (other == this) return; @@ -4873,7 +4877,7 @@ class GetScoreRangeRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_GetScoreRangeRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 46; + static constexpr int kIndexInFileMessages = 47; friend void swap(GetScoreRangeRequest& a, GetScoreRangeRequest& b) { a.Swap(&b); } inline void Swap(GetScoreRangeRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -5099,7 +5103,7 @@ class GetScoreGameDataRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_GetScoreGameDataRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 54; + static constexpr int kIndexInFileMessages = 55; friend void swap(GetScoreGameDataRequest& a, GetScoreGameDataRequest& b) { a.Swap(&b); } inline void Swap(GetScoreGameDataRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -5306,7 +5310,7 @@ class GetScoreFriendsRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_GetScoreFriendsRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 49; + static constexpr int kIndexInFileMessages = 50; friend void swap(GetScoreFriendsRequest& a, GetScoreFriendsRequest& b) { a.Swap(&b); } inline void Swap(GetScoreFriendsRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -5532,7 +5536,7 @@ class BoardInfo final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_BoardInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 44; + static constexpr int kIndexInFileMessages = 45; friend void swap(BoardInfo& a, BoardInfo& b) { a.Swap(&b); } inline void Swap(BoardInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -5758,7 +5762,7 @@ class TusVarResponse final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusVarResponse_default_instance_); } - static constexpr int kIndexInFileMessages = 57; + static constexpr int kIndexInFileMessages = 58; friend void swap(TusVarResponse& a, TusVarResponse& b) { a.Swap(&b); } inline void Swap(TusVarResponse* PROTOBUF_NONNULL other) { if (other == this) return; @@ -5943,7 +5947,7 @@ class TusTryAndSetVariableRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusTryAndSetVariableRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 63; + static constexpr int kIndexInFileMessages = 64; friend void swap(TusTryAndSetVariableRequest& a, TusTryAndSetVariableRequest& b) { a.Swap(&b); } inline void Swap(TusTryAndSetVariableRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -6221,7 +6225,7 @@ class TusSetMultiSlotVariableRequest final : public ::google::protobuf::MessageL return *reinterpret_cast( &_TusSetMultiSlotVariableRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 58; + static constexpr int kIndexInFileMessages = 59; friend void swap(TusSetMultiSlotVariableRequest& a, TusSetMultiSlotVariableRequest& b) { a.Swap(&b); } inline void Swap(TusSetMultiSlotVariableRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -6446,7 +6450,7 @@ class TusSetDataRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusSetDataRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 65; + static constexpr int kIndexInFileMessages = 66; friend void swap(TusSetDataRequest& a, TusSetDataRequest& b) { a.Swap(&b); } inline void Swap(TusSetDataRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -6713,7 +6717,7 @@ class TusGetMultiUserVariableRequest final : public ::google::protobuf::MessageL return *reinterpret_cast( &_TusGetMultiUserVariableRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 60; + static constexpr int kIndexInFileMessages = 61; friend void swap(TusGetMultiUserVariableRequest& a, TusGetMultiUserVariableRequest& b) { a.Swap(&b); } inline void Swap(TusGetMultiUserVariableRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -6910,7 +6914,7 @@ class TusGetMultiUserDataStatusRequest final : public ::google::protobuf::Messag return *reinterpret_cast( &_TusGetMultiUserDataStatusRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 71; + static constexpr int kIndexInFileMessages = 72; friend void swap(TusGetMultiUserDataStatusRequest& a, TusGetMultiUserDataStatusRequest& b) { a.Swap(&b); } inline void Swap(TusGetMultiUserDataStatusRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -7107,7 +7111,7 @@ class TusGetMultiSlotVariableRequest final : public ::google::protobuf::MessageL return *reinterpret_cast( &_TusGetMultiSlotVariableRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 59; + static constexpr int kIndexInFileMessages = 60; friend void swap(TusGetMultiSlotVariableRequest& a, TusGetMultiSlotVariableRequest& b) { a.Swap(&b); } inline void Swap(TusGetMultiSlotVariableRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -7311,7 +7315,7 @@ class TusGetMultiSlotDataStatusRequest final : public ::google::protobuf::Messag return *reinterpret_cast( &_TusGetMultiSlotDataStatusRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 70; + static constexpr int kIndexInFileMessages = 71; friend void swap(TusGetMultiSlotDataStatusRequest& a, TusGetMultiSlotDataStatusRequest& b) { a.Swap(&b); } inline void Swap(TusGetMultiSlotDataStatusRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -7515,7 +7519,7 @@ class TusGetDataRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusGetDataRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 69; + static constexpr int kIndexInFileMessages = 70; friend void swap(TusGetDataRequest& a, TusGetDataRequest& b) { a.Swap(&b); } inline void Swap(TusGetDataRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -7710,7 +7714,7 @@ class TusDeleteMultiSlotVariableRequest final : public ::google::protobuf::Messa return *reinterpret_cast( &_TusDeleteMultiSlotVariableRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 64; + static constexpr int kIndexInFileMessages = 65; friend void swap(TusDeleteMultiSlotVariableRequest& a, TusDeleteMultiSlotVariableRequest& b) { a.Swap(&b); } inline void Swap(TusDeleteMultiSlotVariableRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -7914,7 +7918,7 @@ class TusDeleteMultiSlotDataRequest final : public ::google::protobuf::MessageLi return *reinterpret_cast( &_TusDeleteMultiSlotDataRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 73; + static constexpr int kIndexInFileMessages = 74; friend void swap(TusDeleteMultiSlotDataRequest& a, TusDeleteMultiSlotDataRequest& b) { a.Swap(&b); } inline void Swap(TusDeleteMultiSlotDataRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -8118,7 +8122,7 @@ class TusDataStatusResponse final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusDataStatusResponse_default_instance_); } - static constexpr int kIndexInFileMessages = 68; + static constexpr int kIndexInFileMessages = 69; friend void swap(TusDataStatusResponse& a, TusDataStatusResponse& b) { a.Swap(&b); } inline void Swap(TusDataStatusResponse* PROTOBUF_NONNULL other) { if (other == this) return; @@ -8303,7 +8307,7 @@ class TusData final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusData_default_instance_); } - static constexpr int kIndexInFileMessages = 67; + static constexpr int kIndexInFileMessages = 68; friend void swap(TusData& a, TusData& b) { a.Swap(&b); } inline void Swap(TusData* PROTOBUF_NONNULL other) { if (other == this) return; @@ -8503,7 +8507,7 @@ class TusAddAndGetVariableRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_TusAddAndGetVariableRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 62; + static constexpr int kIndexInFileMessages = 63; friend void swap(TusAddAndGetVariableRequest& a, TusAddAndGetVariableRequest& b) { a.Swap(&b); } inline void Swap(TusAddAndGetVariableRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -8948,7 +8952,7 @@ class SendRoomMessageRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_SendRoomMessageRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 40; + static constexpr int kIndexInFileMessages = 41; friend void swap(SendRoomMessageRequest& a, SendRoomMessageRequest& b) { a.Swap(&b); } inline void Swap(SendRoomMessageRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -9196,7 +9200,7 @@ class SearchJoinRoomGUIRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_SearchJoinRoomGUIRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 86; + static constexpr int kIndexInFileMessages = 87; friend void swap(SearchJoinRoomGUIRequest& a, SearchJoinRoomGUIRequest& b) { a.Swap(&b); } inline void Swap(SearchJoinRoomGUIRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -9400,7 +9404,7 @@ class RoomUpdateInfo final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_RoomUpdateInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 36; + static constexpr int kIndexInFileMessages = 37; friend void swap(RoomUpdateInfo& a, RoomUpdateInfo& b) { a.Swap(&b); } inline void Swap(RoomUpdateInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -9612,7 +9616,7 @@ class RoomMessageInfo final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_RoomMessageInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 41; + static constexpr int kIndexInFileMessages = 42; friend void swap(RoomMessageInfo& a, RoomMessageInfo& b) { a.Swap(&b); } inline void Swap(RoomMessageInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -10291,7 +10295,7 @@ class QuickMatchGUIRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_QuickMatchGUIRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 85; + static constexpr int kIndexInFileMessages = 86; friend void swap(QuickMatchGUIRequest& a, QuickMatchGUIRequest& b) { a.Swap(&b); } inline void Swap(QuickMatchGUIRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -10705,7 +10709,7 @@ class MessageDetails final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_MessageDetails_default_instance_); } - static constexpr int kIndexInFileMessages = 42; + static constexpr int kIndexInFileMessages = 43; friend void swap(MessageDetails& a, MessageDetails& b) { a.Swap(&b); } inline void Swap(MessageDetails* PROTOBUF_NONNULL other) { if (other == this) return; @@ -10997,7 +11001,7 @@ class MatchingRoom final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_MatchingRoom_default_instance_); } - static constexpr int kIndexInFileMessages = 81; + static constexpr int kIndexInFileMessages = 82; friend void swap(MatchingRoom& a, MatchingRoom& b) { a.Swap(&b); } inline void Swap(MatchingRoom* PROTOBUF_NONNULL other) { if (other == this) return; @@ -11199,7 +11203,7 @@ class LeaveRoomRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_LeaveRoomRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 25; + static constexpr int kIndexInFileMessages = 26; friend void swap(LeaveRoomRequest& a, LeaveRoomRequest& b) { a.Swap(&b); } inline void Swap(LeaveRoomRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -11589,7 +11593,7 @@ class GetScoreResponse final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_GetScoreResponse_default_instance_); } - static constexpr int kIndexInFileMessages = 52; + static constexpr int kIndexInFileMessages = 53; friend void swap(GetScoreResponse& a, GetScoreResponse& b) { a.Swap(&b); } inline void Swap(GetScoreResponse* PROTOBUF_NONNULL other) { if (other == this) return; @@ -11841,7 +11845,7 @@ class GetScoreNpIdRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_GetScoreNpIdRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 48; + static constexpr int kIndexInFileMessages = 49; friend void swap(GetScoreNpIdRequest& a, GetScoreNpIdRequest& b) { a.Swap(&b); } inline void Swap(GetScoreNpIdRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -12062,7 +12066,7 @@ class GetRoomMemberDataInternalRequest final : public ::google::protobuf::Messag return *reinterpret_cast( &_GetRoomMemberDataInternalRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 30; + static constexpr int kIndexInFileMessages = 31; friend void swap(GetRoomMemberDataInternalRequest& a, GetRoomMemberDataInternalRequest& b) { a.Swap(&b); } inline void Swap(GetRoomMemberDataInternalRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -12276,7 +12280,7 @@ class GetRoomListGUIRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_GetRoomListGUIRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 80; + static constexpr int kIndexInFileMessages = 81; friend void swap(GetRoomListGUIRequest& a, GetRoomListGUIRequest& b) { a.Swap(&b); } inline void Swap(GetRoomListGUIRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -12504,7 +12508,7 @@ class GetRoomDataInternalRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_GetRoomDataInternalRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 33; + static constexpr int kIndexInFileMessages = 34; friend void swap(GetRoomDataInternalRequest& a, GetRoomDataInternalRequest& b) { a.Swap(&b); } inline void Swap(GetRoomDataInternalRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -12701,7 +12705,7 @@ class GetRoomDataExternalListRequest final : public ::google::protobuf::MessageL return *reinterpret_cast( &_GetRoomDataExternalListRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 26; + static constexpr int kIndexInFileMessages = 27; friend void swap(GetRoomDataExternalListRequest& a, GetRoomDataExternalListRequest& b) { a.Swap(&b); } inline void Swap(GetRoomDataExternalListRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -12907,7 +12911,7 @@ class GetPingInfoResponse final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_GetPingInfoResponse_default_instance_); } - static constexpr int kIndexInFileMessages = 39; + static constexpr int kIndexInFileMessages = 40; friend void swap(GetPingInfoResponse& a, GetPingInfoResponse& b) { a.Swap(&b); } inline void Swap(GetPingInfoResponse* PROTOBUF_NONNULL other) { if (other == this) return; @@ -13126,7 +13130,7 @@ class GUIUserInfo final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_GUIUserInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 78; + static constexpr int kIndexInFileMessages = 79; friend void swap(GUIUserInfo& a, GUIUserInfo& b) { a.Swap(&b); } inline void Swap(GUIUserInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -13321,7 +13325,7 @@ class CreateRoomGUIRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_CreateRoomGUIRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 77; + static constexpr int kIndexInFileMessages = 78; friend void swap(CreateRoomGUIRequest& a, CreateRoomGUIRequest& b) { a.Swap(&b); } inline void Swap(CreateRoomGUIRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -13754,7 +13758,7 @@ class SetUserInfo final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_SetUserInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 32; + static constexpr int kIndexInFileMessages = 33; friend void swap(SetUserInfo& a, SetUserInfo& b) { a.Swap(&b); } inline void Swap(SetUserInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -13956,7 +13960,7 @@ class SetRoomMemberDataInternalRequest final : public ::google::protobuf::Messag return *reinterpret_cast( &_SetRoomMemberDataInternalRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 31; + static constexpr int kIndexInFileMessages = 32; friend void swap(SetRoomMemberDataInternalRequest& a, SetRoomMemberDataInternalRequest& b) { a.Swap(&b); } inline void Swap(SetRoomMemberDataInternalRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -14187,7 +14191,7 @@ class SetRoomDataInternalRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_SetRoomDataInternalRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 29; + static constexpr int kIndexInFileMessages = 30; friend void swap(SetRoomDataInternalRequest& a, SetRoomDataInternalRequest& b) { a.Swap(&b); } inline void Swap(SetRoomDataInternalRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -14467,7 +14471,7 @@ class SetRoomDataExternalRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_SetRoomDataExternalRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 28; + static constexpr int kIndexInFileMessages = 29; friend void swap(SetRoomDataExternalRequest& a, SetRoomDataExternalRequest& b) { a.Swap(&b); } inline void Swap(SetRoomDataExternalRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -15535,7 +15539,7 @@ class MatchingRoomStatus final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_MatchingRoomStatus_default_instance_); } - static constexpr int kIndexInFileMessages = 79; + static constexpr int kIndexInFileMessages = 80; friend void swap(MatchingRoomStatus& a, MatchingRoomStatus& b) { a.Swap(&b); } inline void Swap(MatchingRoomStatus* PROTOBUF_NONNULL other) { if (other == this) return; @@ -15771,7 +15775,7 @@ class MatchingRoomList final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_MatchingRoomList_default_instance_); } - static constexpr int kIndexInFileMessages = 82; + static constexpr int kIndexInFileMessages = 83; friend void swap(MatchingRoomList& a, MatchingRoomList& b) { a.Swap(&b); } inline void Swap(MatchingRoomList* PROTOBUF_NONNULL other) { if (other == this) return; @@ -16180,7 +16184,7 @@ class JoinRoomRequest final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_JoinRoomRequest_default_instance_); } - static constexpr int kIndexInFileMessages = 23; + static constexpr int kIndexInFileMessages = 24; friend void swap(JoinRoomRequest& a, JoinRoomRequest& b) { a.Swap(&b); } inline void Swap(JoinRoomRequest* PROTOBUF_NONNULL other) { if (other == this) return; @@ -18318,7 +18322,7 @@ class MatchingSearchJoinRoomInfo final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_MatchingSearchJoinRoomInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 87; + static constexpr int kIndexInFileMessages = 88; friend void swap(MatchingSearchJoinRoomInfo& a, MatchingSearchJoinRoomInfo& b) { a.Swap(&b); } inline void Swap(MatchingSearchJoinRoomInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -18520,7 +18524,7 @@ class GetRoomDataExternalListResponse final : public ::google::protobuf::Message return *reinterpret_cast( &_GetRoomDataExternalListResponse_default_instance_); } - static constexpr int kIndexInFileMessages = 27; + static constexpr int kIndexInFileMessages = 28; friend void swap(GetRoomDataExternalListResponse& a, GetRoomDataExternalListResponse& b) { a.Swap(&b); } inline void Swap(GetRoomDataExternalListResponse* PROTOBUF_NONNULL other) { if (other == this) return; @@ -18705,7 +18709,7 @@ class RoomMemberUpdateInfo final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_RoomMemberUpdateInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 34; + static constexpr int kIndexInFileMessages = 35; friend void swap(RoomMemberUpdateInfo& a, RoomMemberUpdateInfo& b) { a.Swap(&b); } inline void Swap(RoomMemberUpdateInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -18922,7 +18926,7 @@ class RoomMemberDataInternalUpdateInfo final : public ::google::protobuf::Messag return *reinterpret_cast( &_RoomMemberDataInternalUpdateInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 38; + static constexpr int kIndexInFileMessages = 39; friend void swap(RoomMemberDataInternalUpdateInfo& a, RoomMemberDataInternalUpdateInfo& b) { a.Swap(&b); } inline void Swap(RoomMemberDataInternalUpdateInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -19482,7 +19486,7 @@ class RoomDataInternalUpdateInfo final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_RoomDataInternalUpdateInfo_default_instance_); } - static constexpr int kIndexInFileMessages = 37; + static constexpr int kIndexInFileMessages = 38; friend void swap(RoomDataInternalUpdateInfo& a, RoomDataInternalUpdateInfo& b) { a.Swap(&b); } inline void Swap(RoomDataInternalUpdateInfo* PROTOBUF_NONNULL other) { if (other == this) return; @@ -19725,7 +19729,7 @@ class NotificationUserJoinedRoom final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_NotificationUserJoinedRoom_default_instance_); } - static constexpr int kIndexInFileMessages = 35; + static constexpr int kIndexInFileMessages = 36; friend void swap(NotificationUserJoinedRoom& a, NotificationUserJoinedRoom& b) { a.Swap(&b); } inline void Swap(NotificationUserJoinedRoom* PROTOBUF_NONNULL other) { if (other == this) return; @@ -19937,7 +19941,7 @@ class JoinRoomResponse final : public ::google::protobuf::MessageLite return *reinterpret_cast( &_JoinRoomResponse_default_instance_); } - static constexpr int kIndexInFileMessages = 24; + static constexpr int kIndexInFileMessages = 25; friend void swap(JoinRoomResponse& a, JoinRoomResponse& b) { a.Swap(&b); } inline void Swap(JoinRoomResponse* PROTOBUF_NONNULL other) { if (other == this) return; @@ -20023,6 +20027,7 @@ class JoinRoomResponse final : public ::google::protobuf::MessageLite enum : int { kSignalingDataFieldNumber = 2, kRoomDataFieldNumber = 1, + kOptParamFieldNumber = 3, }; // repeated .np2_structs.Matching2SignalingInfo signaling_data = 2; int signaling_data_size() const; @@ -20055,13 +20060,28 @@ class JoinRoomResponse final : public ::google::protobuf::MessageLite const ::np2_structs::RoomDataInternal& _internal_room_data() const; ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL _internal_mutable_room_data(); + public: + // .np2_structs.OptParam opt_param = 3; + bool has_opt_param() const; + void clear_opt_param() ; + const ::np2_structs::OptParam& opt_param() const; + [[nodiscard]] ::np2_structs::OptParam* PROTOBUF_NULLABLE release_opt_param(); + ::np2_structs::OptParam* PROTOBUF_NONNULL mutable_opt_param(); + void set_allocated_opt_param(::np2_structs::OptParam* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_opt_param(::np2_structs::OptParam* PROTOBUF_NULLABLE value); + ::np2_structs::OptParam* PROTOBUF_NULLABLE unsafe_arena_release_opt_param(); + + private: + const ::np2_structs::OptParam& _internal_opt_param() const; + ::np2_structs::OptParam* PROTOBUF_NONNULL _internal_mutable_opt_param(); + public: // @@protoc_insertion_point(class_scope:np2_structs.JoinRoomResponse) private: class _Internal; friend class ::google::protobuf::internal::TcParser; - static const ::google::protobuf::internal::TcParseTable<1, 2, - 2, 0, + static const ::google::protobuf::internal::TcParseTable<2, 3, + 3, 0, 2> _table_; @@ -20084,6 +20104,7 @@ class JoinRoomResponse final : public ::google::protobuf::MessageLite ::google::protobuf::internal::CachedSize _cached_size_; ::google::protobuf::RepeatedPtrField< ::np2_structs::Matching2SignalingInfo > signaling_data_; ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE room_data_; + ::np2_structs::OptParam* PROTOBUF_NULLABLE opt_param_; PROTOBUF_TSAN_DECLARE_MEMBER }; union { Impl_ _impl_; }; @@ -20091,6 +20112,206 @@ class JoinRoomResponse final : public ::google::protobuf::MessageLite }; extern const ::google::protobuf::internal::ClassDataLite<29> JoinRoomResponse_class_data_; +// ------------------------------------------------------------------- + +class CreateRoomResponse final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.CreateRoomResponse) */ { + public: + inline CreateRoomResponse() : CreateRoomResponse(nullptr) {} + ~CreateRoomResponse() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(CreateRoomResponse* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(CreateRoomResponse)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR CreateRoomResponse(::google::protobuf::internal::ConstantInitialized); + + inline CreateRoomResponse(const CreateRoomResponse& from) : CreateRoomResponse(nullptr, from) {} + inline CreateRoomResponse(CreateRoomResponse&& from) noexcept + : CreateRoomResponse(nullptr, ::std::move(from)) {} + inline CreateRoomResponse& operator=(const CreateRoomResponse& from) { + CopyFrom(from); + return *this; + } + inline CreateRoomResponse& operator=(CreateRoomResponse&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const CreateRoomResponse& default_instance() { + return *reinterpret_cast( + &_CreateRoomResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = 23; + friend void swap(CreateRoomResponse& a, CreateRoomResponse& b) { a.Swap(&b); } + inline void Swap(CreateRoomResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(CreateRoomResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + CreateRoomResponse* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const CreateRoomResponse& from); + void MergeFrom(const CreateRoomResponse& from) { CreateRoomResponse::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(CreateRoomResponse* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.CreateRoomResponse"; } + + explicit CreateRoomResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + CreateRoomResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const CreateRoomResponse& from); + CreateRoomResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, CreateRoomResponse&& from) noexcept + : CreateRoomResponse(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kInternalFieldNumber = 1, + kOptParamFieldNumber = 2, + }; + // .np2_structs.RoomDataInternal internal = 1; + bool has_internal() const; + void clear_internal() ; + const ::np2_structs::RoomDataInternal& internal() const; + [[nodiscard]] ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE release_internal(); + ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL mutable_internal(); + void set_allocated_internal(::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_internal(::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value); + ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE unsafe_arena_release_internal(); + + private: + const ::np2_structs::RoomDataInternal& _internal_internal() const; + ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL _internal_mutable_internal(); + + public: + // .np2_structs.OptParam opt_param = 2; + bool has_opt_param() const; + void clear_opt_param() ; + const ::np2_structs::OptParam& opt_param() const; + [[nodiscard]] ::np2_structs::OptParam* PROTOBUF_NULLABLE release_opt_param(); + ::np2_structs::OptParam* PROTOBUF_NONNULL mutable_opt_param(); + void set_allocated_opt_param(::np2_structs::OptParam* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_opt_param(::np2_structs::OptParam* PROTOBUF_NULLABLE value); + ::np2_structs::OptParam* PROTOBUF_NULLABLE unsafe_arena_release_opt_param(); + + private: + const ::np2_structs::OptParam& _internal_opt_param() const; + ::np2_structs::OptParam* PROTOBUF_NONNULL _internal_mutable_opt_param(); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.CreateRoomResponse) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<1, 2, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const CreateRoomResponse& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE internal_; + ::np2_structs::OptParam* PROTOBUF_NULLABLE opt_param_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<31> CreateRoomResponse_class_data_; // =================================================================== @@ -26431,6 +26652,208 @@ inline void CreateJoinRoomRequest::set_allocated_sigoptparam(::np2_structs::OptP // ------------------------------------------------------------------- +// CreateRoomResponse + +// .np2_structs.RoomDataInternal internal = 1; +inline bool CreateRoomResponse::has_internal() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.internal_ != nullptr); + return value; +} +inline void CreateRoomResponse::clear_internal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.internal_ != nullptr) _impl_.internal_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::RoomDataInternal& CreateRoomResponse::_internal_internal() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::RoomDataInternal* p = _impl_.internal_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_RoomDataInternal_default_instance_); +} +inline const ::np2_structs::RoomDataInternal& CreateRoomResponse::internal() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateRoomResponse.internal) + return _internal_internal(); +} +inline void CreateRoomResponse::unsafe_arena_set_allocated_internal( + ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.internal_); + } + _impl_.internal_ = reinterpret_cast<::np2_structs::RoomDataInternal*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.CreateRoomResponse.internal) +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE CreateRoomResponse::release_internal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::RoomDataInternal* released = _impl_.internal_; + _impl_.internal_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE CreateRoomResponse::unsafe_arena_release_internal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.CreateRoomResponse.internal) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::RoomDataInternal* temp = _impl_.internal_; + _impl_.internal_ = nullptr; + return temp; +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL CreateRoomResponse::_internal_mutable_internal() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.internal_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::RoomDataInternal>(GetArena()); + _impl_.internal_ = reinterpret_cast<::np2_structs::RoomDataInternal*>(p); + } + return _impl_.internal_; +} +inline ::np2_structs::RoomDataInternal* PROTOBUF_NONNULL CreateRoomResponse::mutable_internal() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::RoomDataInternal* _msg = _internal_mutable_internal(); + // @@protoc_insertion_point(field_mutable:np2_structs.CreateRoomResponse.internal) + return _msg; +} +inline void CreateRoomResponse::set_allocated_internal(::np2_structs::RoomDataInternal* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.internal_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.internal_ = reinterpret_cast<::np2_structs::RoomDataInternal*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.CreateRoomResponse.internal) +} + +// .np2_structs.OptParam opt_param = 2; +inline bool CreateRoomResponse::has_opt_param() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.opt_param_ != nullptr); + return value; +} +inline void CreateRoomResponse::clear_opt_param() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.opt_param_ != nullptr) _impl_.opt_param_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::OptParam& CreateRoomResponse::_internal_opt_param() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::OptParam* p = _impl_.opt_param_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_OptParam_default_instance_); +} +inline const ::np2_structs::OptParam& CreateRoomResponse::opt_param() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.CreateRoomResponse.opt_param) + return _internal_opt_param(); +} +inline void CreateRoomResponse::unsafe_arena_set_allocated_opt_param( + ::np2_structs::OptParam* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.opt_param_); + } + _impl_.opt_param_ = reinterpret_cast<::np2_structs::OptParam*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.CreateRoomResponse.opt_param) +} +inline ::np2_structs::OptParam* PROTOBUF_NULLABLE CreateRoomResponse::release_opt_param() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::OptParam* released = _impl_.opt_param_; + _impl_.opt_param_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::OptParam* PROTOBUF_NULLABLE CreateRoomResponse::unsafe_arena_release_opt_param() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.CreateRoomResponse.opt_param) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::OptParam* temp = _impl_.opt_param_; + _impl_.opt_param_ = nullptr; + return temp; +} +inline ::np2_structs::OptParam* PROTOBUF_NONNULL CreateRoomResponse::_internal_mutable_opt_param() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.opt_param_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::OptParam>(GetArena()); + _impl_.opt_param_ = reinterpret_cast<::np2_structs::OptParam*>(p); + } + return _impl_.opt_param_; +} +inline ::np2_structs::OptParam* PROTOBUF_NONNULL CreateRoomResponse::mutable_opt_param() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::OptParam* _msg = _internal_mutable_opt_param(); + // @@protoc_insertion_point(field_mutable:np2_structs.CreateRoomResponse.opt_param) + return _msg; +} +inline void CreateRoomResponse::set_allocated_opt_param(::np2_structs::OptParam* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.opt_param_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.opt_param_ = reinterpret_cast<::np2_structs::OptParam*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.CreateRoomResponse.opt_param) +} + +// ------------------------------------------------------------------- + // JoinRoomRequest // uint64 roomId = 1; @@ -27001,6 +27424,105 @@ JoinRoomResponse::_internal_mutable_signaling_data() { return &_impl_.signaling_data_; } +// .np2_structs.OptParam opt_param = 3; +inline bool JoinRoomResponse::has_opt_param() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000004U); + PROTOBUF_ASSUME(!value || _impl_.opt_param_ != nullptr); + return value; +} +inline void JoinRoomResponse::clear_opt_param() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.opt_param_ != nullptr) _impl_.opt_param_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline const ::np2_structs::OptParam& JoinRoomResponse::_internal_opt_param() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::OptParam* p = _impl_.opt_param_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_OptParam_default_instance_); +} +inline const ::np2_structs::OptParam& JoinRoomResponse::opt_param() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.JoinRoomResponse.opt_param) + return _internal_opt_param(); +} +inline void JoinRoomResponse::unsafe_arena_set_allocated_opt_param( + ::np2_structs::OptParam* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.opt_param_); + } + _impl_.opt_param_ = reinterpret_cast<::np2_structs::OptParam*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.JoinRoomResponse.opt_param) +} +inline ::np2_structs::OptParam* PROTOBUF_NULLABLE JoinRoomResponse::release_opt_param() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::OptParam* released = _impl_.opt_param_; + _impl_.opt_param_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::OptParam* PROTOBUF_NULLABLE JoinRoomResponse::unsafe_arena_release_opt_param() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.JoinRoomResponse.opt_param) + + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::OptParam* temp = _impl_.opt_param_; + _impl_.opt_param_ = nullptr; + return temp; +} +inline ::np2_structs::OptParam* PROTOBUF_NONNULL JoinRoomResponse::_internal_mutable_opt_param() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.opt_param_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::OptParam>(GetArena()); + _impl_.opt_param_ = reinterpret_cast<::np2_structs::OptParam*>(p); + } + return _impl_.opt_param_; +} +inline ::np2_structs::OptParam* PROTOBUF_NONNULL JoinRoomResponse::mutable_opt_param() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + ::np2_structs::OptParam* _msg = _internal_mutable_opt_param(); + // @@protoc_insertion_point(field_mutable:np2_structs.JoinRoomResponse.opt_param) + return _msg; +} +inline void JoinRoomResponse::set_allocated_opt_param(::np2_structs::OptParam* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.opt_param_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000004U); + } + + _impl_.opt_param_ = reinterpret_cast<::np2_structs::OptParam*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.JoinRoomResponse.opt_param) +} + // ------------------------------------------------------------------- // LeaveRoomRequest diff --git a/rpcs3/Emu/NP/generated/np2_structs.proto b/rpcs3/Emu/NP/generated/np2_structs.proto index 34413476e6..46628781fb 100644 --- a/rpcs3/Emu/NP/generated/np2_structs.proto +++ b/rpcs3/Emu/NP/generated/np2_structs.proto @@ -1,4 +1,3 @@ - // Protocol Buffers definition for np2_structs syntax = "proto3"; @@ -16,71 +15,61 @@ message uint16 { uint32 value = 1; } -// SignalingAddr + message SignalingAddr { bytes ip = 1; uint16 port = 2; } -// MatchingSignalingInfo message MatchingSignalingInfo { string npid = 1; SignalingAddr addr = 2; } -// Matching2SignalingInfo message Matching2SignalingInfo { uint16 member_id = 1; SignalingAddr addr = 2; } -// BinAttr message BinAttr { uint16 id = 1; bytes data = 2; } -// IntAttr message IntAttr { uint16 id = 1; uint32 num = 2; } -// RoomMemberBinAttrInternal message RoomMemberBinAttrInternal { uint64 updateDate = 1; BinAttr data = 2; } -// BinAttrInternal message BinAttrInternal { uint64 updateDate = 1; uint16 updateMemberId = 2; BinAttr data = 3; } -// OptParam message OptParam { uint8 type = 1; uint8 flag = 2; uint16 hubMemberId = 3; } -// GroupConfig message GroupConfig { uint32 slotNum = 1; bytes label = 2; bool withPassword = 3; } -// UserInfo message UserInfo { string npId = 1; string onlineName = 2; string avatarUrl = 3; } -// RoomMemberDataInternal message RoomMemberDataInternal { UserInfo userInfo = 1; uint64 joinDate = 2; @@ -92,7 +81,6 @@ message RoomMemberDataInternal { repeated RoomMemberBinAttrInternal roomMemberBinAttrInternal = 8; } -// RoomGroup message RoomGroup { uint8 groupId = 1; bool withPassword = 2; @@ -101,7 +89,6 @@ message RoomGroup { uint32 curGroupMemberNum = 5; } -// RoomDataInternal message RoomDataInternal { uint16 serverId = 1; uint32 worldId = 2; @@ -116,7 +103,6 @@ message RoomDataInternal { repeated BinAttrInternal roomBinAttrInternal = 11; } -// RoomDataExternal message RoomDataExternal { uint16 serverId = 1; uint32 worldId = 2; @@ -137,31 +123,26 @@ message RoomDataExternal { repeated BinAttr roomBinAttrExternal = 17; } -// IntSearchFilter message IntSearchFilter { uint8 searchOperator = 1; IntAttr attr = 2; } -// BinSearchFilter message BinSearchFilter { uint8 searchOperator = 1; BinAttr attr = 2; } -// PresenceOptionData message PresenceOptionData { bytes data = 1; uint32 len = 2; } -// RoomGroupPasswordConfig message RoomGroupPasswordConfig { uint8 groupId = 1; bool withPassword = 2; } -// SearchRoomRequest message SearchRoomRequest { int32 option = 1; uint32 worldId = 2; @@ -175,14 +156,12 @@ message SearchRoomRequest { repeated uint16 attrId = 10; } -// SearchRoomResponse message SearchRoomResponse { uint32 startIndex = 1; uint32 total = 2; repeated RoomDataExternal rooms = 3; } -// CreateJoinRoomRequest message CreateJoinRoomRequest { uint32 worldId = 1; uint64 lobbyId = 2; @@ -203,7 +182,12 @@ message CreateJoinRoomRequest { OptParam sigOptParam = 17; } -// JoinRoomRequest +// Reply on creating a room +message CreateRoomResponse { + RoomDataInternal internal = 1; + OptParam opt_param = 2; +} + message JoinRoomRequest { uint64 roomId = 1; bytes roomPassword = 2; @@ -213,30 +197,26 @@ message JoinRoomRequest { uint8 teamId = 6; } -// JoinRoomResponse message JoinRoomResponse { RoomDataInternal room_data = 1; repeated Matching2SignalingInfo signaling_data = 2; + OptParam opt_param = 3; } -// LeaveRoomRequest message LeaveRoomRequest { uint64 roomId = 1; PresenceOptionData optData = 2; } -// GetRoomDataExternalListRequest message GetRoomDataExternalListRequest { repeated uint64 roomIds = 1; repeated uint16 attrIds = 2; } -// GetRoomDataExternalListResponse message GetRoomDataExternalListResponse { repeated RoomDataExternal rooms = 1; } -// SetRoomDataExternalRequest message SetRoomDataExternalRequest { uint64 roomId = 1; repeated IntAttr roomSearchableIntAttrExternal = 2; @@ -244,7 +224,6 @@ message SetRoomDataExternalRequest { repeated BinAttr roomBinAttrExternal = 4; } -// SetRoomDataInternalRequest message SetRoomDataInternalRequest { uint64 roomId = 1; uint32 flagFilter = 2; @@ -255,14 +234,12 @@ message SetRoomDataInternalRequest { repeated uint16 ownerPrivilegeRank = 7; } -// GetRoomMemberDataInternalRequest message GetRoomMemberDataInternalRequest { uint64 roomId = 1; uint16 memberId = 2; repeated uint16 attrId = 3; } -// SetRoomMemberDataInternalRequest message SetRoomMemberDataInternalRequest { uint64 roomId = 1; uint16 memberId = 2; @@ -270,40 +247,34 @@ message SetRoomMemberDataInternalRequest { repeated BinAttr roomMemberBinAttrInternal = 4; } -// SetUserInfo message SetUserInfo { uint16 serverId = 1; repeated BinAttr userBinAttr = 2; } -// GetRoomDataInternalRequest message GetRoomDataInternalRequest { uint64 roomId = 1; repeated uint16 attrId = 2; } -// RoomMemberUpdateInfo message RoomMemberUpdateInfo { RoomMemberDataInternal roomMemberDataInternal = 1; uint8 eventCause = 2; PresenceOptionData optData = 3; } -// NotificationUserJoinedRoom message NotificationUserJoinedRoom { uint64 room_id = 1; RoomMemberUpdateInfo update_info = 2; SignalingAddr signaling = 3; } -// RoomUpdateInfo message RoomUpdateInfo { uint8 eventCause = 1; int32 errorCode = 2; PresenceOptionData optData = 3; } -// RoomDataInternalUpdateInfo message RoomDataInternalUpdateInfo { RoomDataInternal newRoomDataInternal = 1; uint32 prevFlagAttr = 2; @@ -312,7 +283,6 @@ message RoomDataInternalUpdateInfo { repeated uint16 newRoomBinAttrInternal = 5; } -// RoomMemberDataInternalUpdateInfo message RoomMemberDataInternalUpdateInfo { RoomMemberDataInternal newRoomMemberDataInternal = 1; uint32 prevFlagAttr = 2; @@ -320,7 +290,6 @@ message RoomMemberDataInternalUpdateInfo { repeated uint16 newRoomMemberBinAttrInternal = 4; } -// GetPingInfoResponse message GetPingInfoResponse { uint16 serverId = 1; uint32 worldId = 2; @@ -328,7 +297,6 @@ message GetPingInfoResponse { uint32 rtt = 4; } -// SendRoomMessageRequest message SendRoomMessageRequest { uint64 roomId = 1; uint8 castType = 2; @@ -337,7 +305,6 @@ message SendRoomMessageRequest { uint8 option = 5; } -// RoomMessageInfo message RoomMessageInfo { bool filtered = 1; uint8 castType = 2; @@ -346,7 +313,6 @@ message RoomMessageInfo { bytes msg = 5; } -// MessageDetails message MessageDetails { string communicationId = 1; uint64 msgId = 2; @@ -358,13 +324,11 @@ message MessageDetails { bytes data = 8; } -// SendMessageRequest message SendMessageRequest { bytes message = 1; repeated string npids = 2; } -// BoardInfo message BoardInfo { uint32 rankLimit = 1; uint32 updateMode = 2; @@ -373,7 +337,6 @@ message BoardInfo { uint32 uploadSizeLimit = 5; } -// RecordScoreRequest message RecordScoreRequest { uint32 boardId = 1; int32 pcId = 2; @@ -382,7 +345,6 @@ message RecordScoreRequest { bytes data = 5; } -// GetScoreRangeRequest message GetScoreRangeRequest { uint32 boardId = 1; uint32 startRank = 2; @@ -391,13 +353,11 @@ message GetScoreRangeRequest { bool withGameInfo = 5; } -// ScoreNpIdPcId message ScoreNpIdPcId { string npid = 1; int32 pcId = 2; } -// GetScoreNpIdRequest message GetScoreNpIdRequest { uint32 boardId = 1; repeated ScoreNpIdPcId npids = 2; @@ -405,7 +365,6 @@ message GetScoreNpIdRequest { bool withGameInfo = 4; } -// GetScoreFriendsRequest message GetScoreFriendsRequest { uint32 boardId = 1; bool include_self = 2; @@ -414,7 +373,6 @@ message GetScoreFriendsRequest { bool withGameInfo = 5; } -// ScoreRankData message ScoreRankData { string npId = 1; string onlineName = 2; @@ -425,12 +383,10 @@ message ScoreRankData { uint64 recordDate = 7; } -// ScoreInfo message ScoreInfo { bytes data = 1; } -// GetScoreResponse message GetScoreResponse { repeated ScoreRankData rankArray = 1; repeated string commentArray = 2; @@ -439,27 +395,23 @@ message GetScoreResponse { uint32 totalRecord = 5; } -// RecordScoreGameDataRequest message RecordScoreGameDataRequest { uint32 boardId = 1; int32 pcId = 2; int64 score = 3; } -// GetScoreGameDataRequest message GetScoreGameDataRequest { uint32 boardId = 1; string npId = 2; int32 pcId = 3; } -// TusUser message TusUser { bool vuser = 1; string npid = 2; } -// TusVariable message TusVariable { string ownerId = 1; bool hasData = 2; @@ -469,31 +421,26 @@ message TusVariable { int64 oldVariable = 6; } -// TusVarResponse message TusVarResponse { repeated TusVariable vars = 1; } -// TusSetMultiSlotVariableRequest message TusSetMultiSlotVariableRequest { TusUser user = 1; repeated int32 slotIdArray = 2; repeated int64 variableArray = 3; } -// TusGetMultiSlotVariableRequest message TusGetMultiSlotVariableRequest { TusUser user = 1; repeated int32 slotIdArray = 2; } -// TusGetMultiUserVariableRequest message TusGetMultiUserVariableRequest { repeated TusUser users = 1; int32 slotId = 2; } -// TusGetFriendsVariableRequest message TusGetFriendsVariableRequest { int32 slotId = 1; bool includeSelf = 2; @@ -501,7 +448,6 @@ message TusGetFriendsVariableRequest { uint32 arrayNum = 4; } -// TusAddAndGetVariableRequest message TusAddAndGetVariableRequest { TusUser user = 1; int32 slotId = 2; @@ -510,7 +456,6 @@ message TusAddAndGetVariableRequest { string isLastChangedAuthorId = 5; } -// TusTryAndSetVariableRequest message TusTryAndSetVariableRequest { TusUser user = 1; int32 slotId = 2; @@ -521,13 +466,11 @@ message TusTryAndSetVariableRequest { repeated int64 compareValue = 7; } -// TusDeleteMultiSlotVariableRequest message TusDeleteMultiSlotVariableRequest { TusUser user = 1; repeated int32 slotIdArray = 2; } -// TusSetDataRequest message TusSetDataRequest { TusUser user = 1; int32 slotId = 2; @@ -537,7 +480,6 @@ message TusSetDataRequest { string isLastChangedAuthorId = 6; } -// TusDataStatus message TusDataStatus { string ownerId = 1; bool hasData = 2; @@ -546,36 +488,30 @@ message TusDataStatus { bytes info = 5; } -// TusData message TusData { TusDataStatus status = 1; bytes data = 2; } -// TusDataStatusResponse message TusDataStatusResponse { repeated TusDataStatus status = 1; } -// TusGetDataRequest message TusGetDataRequest { TusUser user = 1; int32 slotId = 2; } -// TusGetMultiSlotDataStatusRequest message TusGetMultiSlotDataStatusRequest { TusUser user = 1; repeated int32 slotIdArray = 2; } -// TusGetMultiUserDataStatusRequest message TusGetMultiUserDataStatusRequest { repeated TusUser users = 1; int32 slotId = 2; } -// TusGetFriendsDataStatusRequest message TusGetFriendsDataStatusRequest { int32 slotId = 1; bool includeSelf = 2; @@ -583,13 +519,11 @@ message TusGetFriendsDataStatusRequest { uint32 arrayNum = 4; } -// TusDeleteMultiSlotDataRequest message TusDeleteMultiSlotDataRequest { TusUser user = 1; repeated int32 slotIdArray = 2; } -// SetPresenceRequest message SetPresenceRequest { string title = 1; string status = 2; @@ -597,7 +531,6 @@ message SetPresenceRequest { bytes data = 4; } -// MatchingSearchCondition message MatchingSearchCondition { uint32 attr_type = 1; uint32 attr_id = 2; @@ -605,7 +538,6 @@ message MatchingSearchCondition { uint32 comp_value = 4; } -// MatchingAttr message MatchingAttr { uint32 attr_type = 1; uint32 attr_id = 2; @@ -613,7 +545,6 @@ message MatchingAttr { bytes data = 4; } -// CreateRoomGUIRequest message CreateRoomGUIRequest { uint32 total_slots = 1; uint32 private_slots = 2; @@ -622,13 +553,11 @@ message CreateRoomGUIRequest { repeated MatchingAttr game_attrs = 5; } -// GUIUserInfo message GUIUserInfo { UserInfo info = 1; bool owner = 2; } -// MatchingRoomStatus message MatchingRoomStatus { bytes id = 1; repeated GUIUserInfo members = 2; @@ -636,7 +565,6 @@ message MatchingRoomStatus { bytes opt = 4; } -// GetRoomListGUIRequest message GetRoomListGUIRequest { uint32 range_start = 1; uint32 range_max = 2; @@ -644,43 +572,36 @@ message GetRoomListGUIRequest { repeated MatchingAttr attrs = 4; } -// MatchingRoom message MatchingRoom { bytes id = 1; repeated MatchingAttr attr = 2; } -// MatchingRoomList message MatchingRoomList { uint32 start = 1; uint32 total = 2; repeated MatchingRoom rooms = 3; } -// MatchingGuiRoomId message MatchingGuiRoomId { bytes id = 1; } -// SetRoomSearchFlagGUI message SetRoomSearchFlagGUI { bytes roomid = 1; bool stealth = 2; } -// QuickMatchGUIRequest message QuickMatchGUIRequest { repeated MatchingSearchCondition conds = 1; uint32 available_num = 2; } -// SearchJoinRoomGUIRequest message SearchJoinRoomGUIRequest { repeated MatchingSearchCondition conds = 1; repeated MatchingAttr attrs = 2; } -// MatchingSearchJoinRoomInfo message MatchingSearchJoinRoomInfo { MatchingRoomStatus room = 1; repeated MatchingAttr attr = 2; diff --git a/rpcs3/Emu/NP/np_cache.cpp b/rpcs3/Emu/NP/np_cache.cpp index fc90a641a5..04223da545 100644 --- a/rpcs3/Emu/NP/np_cache.cpp +++ b/rpcs3/Emu/NP/np_cache.cpp @@ -120,6 +120,11 @@ namespace np rooms[room_id].password = password; } + void cache_manager::update_opt_param(SceNpMatching2RoomId room_id, const SceNpMatching2SignalingOptParam* sce_opt_param) + { + rooms[room_id].opt_param = *sce_opt_param; + } + std::pair> cache_manager::get_slots(SceNpMatching2RoomId room_id) { std::lock_guard lock(mutex); @@ -223,6 +228,18 @@ namespace np return {CELL_OK, rooms[room_id].password}; } + std::pair> cache_manager::get_opt_param(SceNpMatching2RoomId room_id) + { + std::lock_guard lock(mutex); + + if (!rooms.contains(room_id)) + { + return {SCE_NP_MATCHING2_ERROR_ROOM_NOT_FOUND, {}}; + } + + return {CELL_OK, rooms[room_id].opt_param}; + } + error_code cache_manager::get_member_and_attrs(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data, bool include_onlinename, bool include_avatarurl) { std::lock_guard lock(mutex); diff --git a/rpcs3/Emu/NP/np_cache.h b/rpcs3/Emu/NP/np_cache.h index 9e1b496ea5..8870f169a8 100644 --- a/rpcs3/Emu/NP/np_cache.h +++ b/rpcs3/Emu/NP/np_cache.h @@ -58,6 +58,8 @@ namespace np std::map groups; std::map members; + SceNpMatching2SignalingOptParam opt_param{}; + bool owner = false; }; @@ -70,10 +72,12 @@ namespace np bool add_member(SceNpMatching2RoomId room_id, const SceNpMatching2RoomMemberDataInternal* sce_roommemberdata); bool del_member(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id); void update_password(SceNpMatching2RoomId room_id, const std::optional& password); + void update_opt_param(SceNpMatching2RoomId room_id, const SceNpMatching2SignalingOptParam* sce_opt_param); std::pair> get_slots(SceNpMatching2RoomId room_id); std::pair> get_memberids(u64 room_id, s32 sort_method); std::pair> get_password(SceNpMatching2RoomId room_id); + std::pair> get_opt_param(SceNpMatching2RoomId room_id); error_code get_member_and_attrs(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data, bool include_onlinename, bool include_avatarurl); std::pair> get_npid(u64 room_id, u16 member_id); std::optional get_memberid(u64 room_id, const SceNpId& npid); diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index f76788287b..c55c16afec 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1672,6 +1672,11 @@ namespace np return np_cache.get_memberids(room_id, sort_method); } + std::pair> np_handler::local_get_signaling_opt_param(SceNpMatching2RoomId room_id) + { + return np_cache.get_opt_param(room_id); + } + error_code np_handler::local_get_room_member_data(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data, u32 ctx_id) { auto [include_onlinename, include_avatarurl] = get_match2_context_options(ctx_id); diff --git a/rpcs3/Emu/NP/np_handler.h b/rpcs3/Emu/NP/np_handler.h index d3c1213cc6..a5f8014538 100644 --- a/rpcs3/Emu/NP/np_handler.h +++ b/rpcs3/Emu/NP/np_handler.h @@ -235,6 +235,7 @@ namespace np std::pair> local_get_room_slots(SceNpMatching2RoomId room_id); std::pair> local_get_room_password(SceNpMatching2RoomId room_id); std::pair> local_get_room_memberids(SceNpMatching2RoomId room_id, s32 sort_method); + std::pair> local_get_signaling_opt_param(SceNpMatching2RoomId room_id); error_code local_get_room_member_data(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data, u32 ctx_id); // Local GUI functions diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index bcc97a2b25..0ee7d1d0fc 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -200,8 +200,11 @@ namespace np return; } - const auto resp = reply.get_protobuf(); + const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to CreateRoom command"); + ensure(resp->has_internal()); + + const auto& resp_internal = resp->internal(); const u32 event_key = get_event_key(); auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); @@ -209,13 +212,19 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_CreateJoinRoom, sizeof(SceNpMatching2CreateJoinRoomResponse)); auto* room_resp = reinterpret_cast(edata.data()); auto* room_info = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), room_resp->roomDataInternal); - RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, *resp, room_info, npid, include_onlinename, include_avatarurl); + RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp_internal, room_info, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); + const auto resp_opt_param = resp->opt_param(); + SceNpMatching2SignalingOptParam opt_param{}; + OptParam_to_SceNpMatching2SignalingOptParam(resp_opt_param, &opt_param); + np_cache.insert_room(room_info); - np_cache.update_password(room_resp->roomDataInternal->roomId, cached_cj_password); + np_cache.update_password(room_info->roomId, cached_cj_password); + np_cache.update_opt_param(room_info->roomId, &opt_param); extra_nps::print_SceNpMatching2CreateJoinRoomResponse(room_resp); + extra_nps::print_SceNpMatching2SignalingOptParam(&opt_param); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); } @@ -275,36 +284,38 @@ namespace np RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp->room_data(), room_info, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); + const u64 room_id = resp->room_data().roomid(); + + const auto resp_opt_param = resp->opt_param(); + SceNpMatching2SignalingOptParam opt_param{}; + OptParam_to_SceNpMatching2SignalingOptParam(resp_opt_param, &opt_param); np_cache.insert_room(room_info); + np_cache.update_opt_param(room_id, &opt_param); extra_nps::print_SceNpMatching2RoomDataInternal(room_info); + extra_nps::print_SceNpMatching2SignalingOptParam(&opt_param); // We initiate signaling if necessary - if (resp->signaling_data_size() > 0) + for (int i = 0; i < resp->signaling_data_size(); i++) { - const u64 room_id = resp->room_data().roomid(); + const auto& signaling_info = resp->signaling_data(i); + ensure(signaling_info.has_addr()); - for (int i = 0; i < resp->signaling_data_size(); i++) - { - const auto& signaling_info = resp->signaling_data(i); - ensure(signaling_info.has_addr()); + const u32 addr_p2p = register_ip(signaling_info.addr().ip()); + const u16 port_p2p = signaling_info.addr().port().value(); - const u32 addr_p2p = register_ip(signaling_info.addr().ip()); - const u16 port_p2p = signaling_info.addr().port().value(); + const u16 member_id = signaling_info.member_id().value(); + const auto [npid_res, npid_p2p] = np_cache.get_npid(room_id, member_id); - const u16 member_id = signaling_info.member_id().value(); - const auto [npid_res, npid_p2p] = np_cache.get_npid(room_id, member_id); + if (npid_res != CELL_OK) + continue; - if (npid_res != CELL_OK) - continue; + rpcn_log.notice("JoinRoomResult told to connect to member(%d=%s) of room(%d): %s:%d", member_id, reinterpret_cast(npid_p2p->handle.data), room_id, ip_to_string(addr_p2p), port_p2p); - rpcn_log.notice("JoinRoomResult told to connect to member(%d=%s) of room(%d): %s:%d", member_id, reinterpret_cast(npid_p2p->handle.data), room_id, ip_to_string(addr_p2p), port_p2p); - - // Attempt Signaling - auto& sigh = g_fxo->get>(); - const u32 conn_id = sigh.init_sig2(*npid_p2p, room_id, member_id); - sigh.start_sig(conn_id, addr_p2p, port_p2p); - } + // Attempt Signaling + auto& sigh = g_fxo->get>(); + const u32 conn_id = sigh.init_sig2(*npid_p2p, room_id, member_id); + sigh.start_sig(conn_id, addr_p2p, port_p2p); } cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); diff --git a/rpcs3/Emu/NP/pb_helpers.cpp b/rpcs3/Emu/NP/pb_helpers.cpp index c00eed8496..e82fc2ec0a 100644 --- a/rpcs3/Emu/NP/pb_helpers.cpp +++ b/rpcs3/Emu/NP/pb_helpers.cpp @@ -632,4 +632,11 @@ namespace np MatchingAttr_to_SceNpMatchingAttr(edata, resp.attr(), room_info->attr); } + void OptParam_to_SceNpMatching2SignalingOptParam(const np2_structs::OptParam& resp, SceNpMatching2SignalingOptParam* opt_param) + { + opt_param->type = resp.type().value(); + opt_param->flag = resp.flag().value(); + opt_param->hubMemberId = resp.hubmemberid().value(); + } + } // namespace np diff --git a/rpcs3/Emu/NP/pb_helpers.h b/rpcs3/Emu/NP/pb_helpers.h index a11c092f9c..c7482d7bc4 100644 --- a/rpcs3/Emu/NP/pb_helpers.h +++ b/rpcs3/Emu/NP/pb_helpers.h @@ -32,4 +32,5 @@ namespace np void MatchingRoomList_to_SceNpMatchingRoomList(event_data& edata, const np2_structs::MatchingRoomList& resp, SceNpMatchingRoomList* room_list); void MatchingSearchJoinRoomInfo_to_SceNpMatchingSearchJoinRoomInfo(event_data& edata, const np2_structs::MatchingSearchJoinRoomInfo& resp, SceNpMatchingSearchJoinRoomInfo* room_info); void MatchingAttr_to_SceNpMatchingAttr(event_data& edata, const google::protobuf::RepeatedPtrField& attr_list, vm::bptr& first_attr); + void OptParam_to_SceNpMatching2SignalingOptParam(const np2_structs::OptParam& resp, SceNpMatching2SignalingOptParam* opt_param); } // namespace np diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 2b58310f1c..a87fff8244 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -256,7 +256,7 @@ namespace rpcn rpcn_log.notice("online: %s, pr_com_id: %s, pr_title: %s, pr_status: %s, pr_comment: %s, pr_data: %s", online ? "true" : "false", pr_com_id.data, pr_title, pr_status, pr_comment, fmt::buf_to_hexstring(pr_data.data(), pr_data.size())); } - constexpr u32 RPCN_PROTOCOL_VERSION = 29; + constexpr u32 RPCN_PROTOCOL_VERSION = 30; constexpr usz RPCN_HEADER_SIZE = 15; const char* error_to_explanation(rpcn::ErrorType error) From cafc2aa9d01e2b89927bfb71f7d144da1167b500 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Mon, 26 Jan 2026 10:37:59 +0100 Subject: [PATCH 197/630] Implement sceNpMatching2GetMemoryInfo --- rpcs3/Emu/Cell/Modules/sceNp2.cpp | 12 ++++++++++-- rpcs3/Emu/NP/np_allocator.h | 12 ++++++++++++ rpcs3/Emu/NP/np_handler.cpp | 12 ++++++++++++ rpcs3/Emu/NP/np_handler.h | 1 + 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index b6ad47b846..0c8f97fc2f 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -616,9 +616,9 @@ error_code sceNpMatching2CreateServerContext( return CELL_OK; } -error_code sceNpMatching2GetMemoryInfo(vm::ptr memInfo) // TODO +error_code sceNpMatching2GetMemoryInfo(vm::ptr memInfo) { - sceNp2.todo("sceNpMatching2GetMemoryInfo(memInfo=*0x%x)", memInfo); + sceNp2.warning("sceNpMatching2GetMemoryInfo(memInfo=*0x%x)", memInfo); auto& nph = g_fxo->get>(); @@ -627,6 +627,14 @@ error_code sceNpMatching2GetMemoryInfo(vm::ptr memInfo return SCE_NP_MATCHING2_ERROR_NOT_INITIALIZED; } + if (!memInfo) + { + return SCE_NP_MATCHING2_ERROR_INVALID_ARGUMENT; + } + + SceNpMatching2MemoryInfo mem_info = nph.get_memory_info(); + *memInfo = mem_info; + return CELL_OK; } diff --git a/rpcs3/Emu/NP/np_allocator.h b/rpcs3/Emu/NP/np_allocator.h index ee8017cb72..76445a4274 100644 --- a/rpcs3/Emu/NP/np_allocator.h +++ b/rpcs3/Emu/NP/np_allocator.h @@ -39,6 +39,11 @@ namespace np m_allocs.clear(); } + std::tuple get_stats() const + { + return {m_size, m_size - m_avail, m_max_usage}; + } + u32 allocate(u32 size) { std::lock_guard lock(m_mutex); @@ -82,6 +87,12 @@ namespace np m_allocs.emplace(last_free, alloc_size); m_avail -= alloc_size; + const u32 usage = m_size - m_avail; + if (usage > m_max_usage) + { + m_max_usage = usage; + } + memset((static_cast(m_pool.get_ptr())) + last_free, 0, alloc_size); np_mem_allocator.trace("Allocation off:%d size:%d psize:%d, pavail:%d", last_free, alloc_size, m_size, m_avail); @@ -121,6 +132,7 @@ namespace np vm::ptr m_pool{}; u32 m_size = 0; u32 m_avail = 0; + u32 m_max_usage = 0; std::map m_allocs{}; // offset/size }; } // namespace np diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index c55c16afec..777301abbb 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1764,4 +1764,16 @@ namespace np } } + SceNpMatching2MemoryInfo np_handler::get_memory_info() const + { + auto [m_size, m_usage, m_max_usage] = np_memory.get_stats(); + + SceNpMatching2MemoryInfo mem_info{}; + mem_info.totalMemSize = m_size; + mem_info.curMemUsage = m_usage; + mem_info.maxMemUsage = m_max_usage; + + return mem_info; + } + } // namespace np diff --git a/rpcs3/Emu/NP/np_handler.h b/rpcs3/Emu/NP/np_handler.h index a5f8014538..51d510b854 100644 --- a/rpcs3/Emu/NP/np_handler.h +++ b/rpcs3/Emu/NP/np_handler.h @@ -262,6 +262,7 @@ namespace np u32 add_players_to_history(const SceNpId* npids, const char* description, u32 count); u32 get_players_history_count(u32 options); bool get_player_history_entry(u32 options, u32 index, SceNpId* npid); + SceNpMatching2MemoryInfo get_memory_info() const; error_code abort_request(u32 req_id); // For signaling From b0b0ed7634fa544978a5f2f111905b3a90e68bae Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Mon, 26 Jan 2026 10:44:59 +0100 Subject: [PATCH 198/630] Implement sceNpMatching2GetCbQueueInfo --- rpcs3/Emu/Cell/Modules/sceNp2.cpp | 13 ++++++++++++- rpcs3/Emu/Cell/Modules/sceNpUtil.cpp | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index 0c8f97fc2f..98f2bf3883 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -1064,7 +1064,7 @@ error_code sceNpMatching2GetRoomMemberDataInternalLocal(SceNpMatching2ContextId error_code sceNpMatching2GetCbQueueInfo(SceNpMatching2ContextId ctxId, vm::ptr queueInfo) { - sceNp2.todo("sceNpMatching2GetCbQueueInfo(ctxId=%d, queueInfo=*0x%x)", ctxId, queueInfo); + sceNp2.warning("sceNpMatching2GetCbQueueInfo(ctxId=%d, queueInfo=*0x%x)", ctxId, queueInfo); auto& nph = g_fxo->get>(); @@ -1073,6 +1073,17 @@ error_code sceNpMatching2GetCbQueueInfo(SceNpMatching2ContextId ctxId, vm::ptrrequestCbQueueLen = 255; + queueInfo->sessionEventCbQueueLen = 255; + queueInfo->sessionMsgCbQueueLen = 255; + return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/sceNpUtil.cpp b/rpcs3/Emu/Cell/Modules/sceNpUtil.cpp index b8f1341d85..e2f0df9620 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpUtil.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpUtil.cpp @@ -65,7 +65,7 @@ struct sce_np_util_manager error_code sceNpUtilBandwidthTestInitStart([[maybe_unused]] ppu_thread& ppu, u32 prio, u32 stack) { - sceNpUtil.todo("sceNpUtilBandwidthTestInitStart(prio=%d, stack=%d)", prio, stack); + sceNpUtil.warning("sceNpUtilBandwidthTestInitStart(prio=%d, stack=%d)", prio, stack); auto& util_manager = g_fxo->get(); std::lock_guard lock(util_manager.mtx); From b7311bd6dbea76af058b05849c69406f2a7d744e Mon Sep 17 00:00:00 2001 From: Ani Date: Thu, 29 Jan 2026 04:27:30 +0100 Subject: [PATCH 199/630] hle: Register missing functions --- rpcs3/Emu/Cell/Modules/cellFont.cpp | 7 ++++++ rpcs3/Emu/Cell/Modules/cellFs.cpp | 14 ++++++++++++ rpcs3/Emu/Cell/Modules/cellSaveData.cpp | 14 +++++++++++- rpcs3/Emu/Cell/Modules/cellSpurs.cpp | 8 +++++++ rpcs3/Emu/Cell/Modules/cellSysmodule.cpp | 28 ++++++++++++++++++++++++ rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp | 6 +++++ 6 files changed, 76 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/cellFont.cpp b/rpcs3/Emu/Cell/Modules/cellFont.cpp index c960375c0c..348a2869fc 100644 --- a/rpcs3/Emu/Cell/Modules/cellFont.cpp +++ b/rpcs3/Emu/Cell/Modules/cellFont.cpp @@ -2228,6 +2228,12 @@ error_code cellFontStatic() return CELL_OK; } +error_code cellFontsetUSleep() +{ + cellFont.todo("cellFontsetUSleep()"); + return CELL_OK; +} + DECLARE(ppu_module_manager::cellFont)("cellFont", []() { @@ -2315,4 +2321,5 @@ DECLARE(ppu_module_manager::cellFont)("cellFont", []() REG_FUNC(cellFont, cellFontGraphicsGetLineRGBA); REG_FUNC(cellFont, cellFontControl); REG_FUNC(cellFont, cellFontStatic); + REG_FUNC(cellFont, cellFontsetUSleep); }); diff --git a/rpcs3/Emu/Cell/Modules/cellFs.cpp b/rpcs3/Emu/Cell/Modules/cellFs.cpp index bff73f530b..1aa83390ae 100644 --- a/rpcs3/Emu/Cell/Modules/cellFs.cpp +++ b/rpcs3/Emu/Cell/Modules/cellFs.cpp @@ -1034,6 +1034,18 @@ s32 cellFsUnregisterL10nCallbacks() return CELL_OK; } +s32 cellFsGetDirent() +{ + cellFs.todo("cellFsGetDirent()"); + return CELL_OK; +} + +s32 cellFsGetDirentCount() +{ + cellFs.todo("cellFsGetDirentCount()"); + return CELL_OK; +} + DECLARE(ppu_module_manager::cellFs)("sys_fs", []() { REG_FUNC(sys_fs, cellFsAccess); @@ -1065,6 +1077,8 @@ DECLARE(ppu_module_manager::cellFs)("sys_fs", []() REG_FUNC(sys_fs, cellFsGetBlockSize); REG_FUNC(sys_fs, cellFsGetBlockSize2); REG_FUNC(sys_fs, cellFsGetDirectoryEntries); + REG_FUNC(sys_fs, cellFsGetDirent); + REG_FUNC(sys_fs, cellFsGetDirentCount); REG_FUNC(sys_fs, cellFsGetFreeSize); REG_FUNC(sys_fs, cellFsGetPath); REG_FUNC(sys_fs, cellFsLink); diff --git a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp index bb99a1f6d6..a4d160fdcb 100644 --- a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp @@ -2514,6 +2514,18 @@ error_code cellSaveDataUserFixedDelete(ppu_thread& ppu, u32 userId, PSetList set return savedata_op(ppu, SAVEDATA_OP_FIXED_DELETE, 0, vm::null, 1, setList, setBuf, vm::null, funcFixed, vm::null, vm::null, container, 6, userdata, userId, funcDone); } +error_code cellSaveDataGetEnableOverlay() +{ + cellSaveData.todo("cellSaveDataGetEnableOverlay()"); + + // auto& manager = g_fxo->get(); + // manager.enable_overlay; + + // TODO + + return CELL_OK; +} + void cellSaveDataEnableOverlay(s32 enable) { cellSaveData.notice("cellSaveDataEnableOverlay(enable=%d)", enable); @@ -2521,7 +2533,6 @@ void cellSaveDataEnableOverlay(s32 enable) manager.enable_overlay = enable != 0; } - // Functions (Extensions) error_code cellSaveDataListDelete(ppu_thread& ppu, PSetList setList, PSetBuf setBuf, PFuncList funcList, PFuncDone funcDone, u32 container, vm::ptr userdata) { @@ -2678,6 +2689,7 @@ void cellSysutil_SaveData_init() REG_VAR(cellSysutil, g_savedata_context).flag(MFF_HIDDEN); // libsysutil functions: + REG_FUNC(cellSysutil, cellSaveDataGetEnableOverlay); REG_FUNC(cellSysutil, cellSaveDataEnableOverlay); REG_FUNC(cellSysutil, cellSaveDataDelete2); diff --git a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp index c5defbd048..7caee24849 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp @@ -1438,6 +1438,13 @@ s32 cellSpursInitializeWithAttribute2(ppu_thread& ppu, vm::ptr spurs, attr->swlIsPreem); } +// Initialise SPURS +s32 cellSpursInitializeForSpuSharing() +{ + cellSpurs.todo("cellSpursInitializeForSpuSharing()"); + return CELL_OK; +} + /// Initialise SPURS attribute s32 _cellSpursAttributeInitialize(vm::ptr attr, u32 revision, u32 sdkVersion, u32 nSpus, s32 spuPriority, s32 ppuPriority, b8 exitIfNoWork) { @@ -5390,6 +5397,7 @@ DECLARE(ppu_module_manager::cellSpurs)("cellSpurs", [](ppu_static_module* _this) REG_FUNC(cellSpurs, cellSpursInitialize); REG_FUNC(cellSpurs, cellSpursInitializeWithAttribute); REG_FUNC(cellSpurs, cellSpursInitializeWithAttribute2); + REG_FUNC(cellSpurs, cellSpursInitializeForSpuSharing); REG_FUNC(cellSpurs, cellSpursFinalize); REG_FUNC(cellSpurs, _cellSpursAttributeInitialize); REG_FUNC(cellSpurs, cellSpursAttributeSetMemoryContainerForSpuThread); diff --git a/rpcs3/Emu/Cell/Modules/cellSysmodule.cpp b/rpcs3/Emu/Cell/Modules/cellSysmodule.cpp index 5548a1bbb4..41eae6bb82 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysmodule.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSysmodule.cpp @@ -406,6 +406,30 @@ error_code cellSysmoduleIsLoadedEx() return CELL_OK; } +error_code cellSysmoduleLoadModuleFile() +{ + UNIMPLEMENTED_FUNC(cellSysmodule); + return CELL_OK; +} + +error_code cellSysmoduleUnloadModuleFile() +{ + UNIMPLEMENTED_FUNC(cellSysmodule); + return CELL_OK; +} + +error_code cellSysmoduleSetDebugmode() +{ + UNIMPLEMENTED_FUNC(cellSysmodule); + return CELL_OK; +} + +error_code cellSysmoduleSetInternalmode() +{ + UNIMPLEMENTED_FUNC(cellSysmodule); + return CELL_OK; +} + DECLARE(ppu_module_manager::cellSysmodule)("cellSysmodule", []() { REG_FUNC(cellSysmodule, cellSysmoduleInitialize); @@ -421,4 +445,8 @@ DECLARE(ppu_module_manager::cellSysmodule)("cellSysmodule", []() REG_FUNC(cellSysmodule, cellSysmoduleUnloadModuleEx); REG_FUNC(cellSysmodule, cellSysmoduleLoadModuleEx); REG_FUNC(cellSysmodule, cellSysmoduleIsLoadedEx); + REG_FUNC(cellSysmodule, cellSysmoduleLoadModuleFile); + REG_FUNC(cellSysmodule, cellSysmoduleUnloadModuleFile); + REG_FUNC(cellSysmodule, cellSysmoduleSetDebugmode); + REG_FUNC(cellSysmodule, cellSysmoduleSetInternalmode); }); diff --git a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp index 3407778d64..803d174549 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp @@ -1529,6 +1529,11 @@ error_code sceNpTrophyGetTrophyIcon(u32 context, u32 handle, s32 trophyId, vm::p return CELL_OK; } +error_code sceNpTrophyNetworkSync() +{ + UNIMPLEMENTED_FUNC(sceNpTrophy); + return CELL_OK; +} DECLARE(ppu_module_manager::sceNpTrophy)("sceNpTrophy", []() { @@ -1553,4 +1558,5 @@ DECLARE(ppu_module_manager::sceNpTrophy)("sceNpTrophy", []() REG_FUNC(sceNpTrophy, sceNpTrophyGetTrophyDetails); REG_FUNC(sceNpTrophy, sceNpTrophyGetTrophyInfo); REG_FUNC(sceNpTrophy, sceNpTrophyGetGameIcon); + REG_FUNC(sceNpTrophy, sceNpTrophyNetworkSync); }); From 086ab3cb37dc8e993ad72480047bd0739cd832d5 Mon Sep 17 00:00:00 2001 From: Tuna Celik <24642056+freakmaxi@users.noreply.github.com> Date: Thu, 29 Jan 2026 22:25:56 +0100 Subject: [PATCH 200/630] Fix for an emulation shutdown hang --- rpcs3/Emu/System.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 0fa9300cc2..b204cc38b9 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -3393,7 +3393,7 @@ void Emulator::Kill(bool allow_autoexit, bool savestate, savestate_stage* save_s bool is_being_held_longer = false; - for (int i = 0; !*join_ended && thread_ctrl::state() != thread_state::aborting;) + for (int i = 0; !*join_ended && thread_ctrl::state() != thread_state::aborting; i++) { if (g_watchdog_hold_ctr) { From 97feb4eed48787b0e985483164fcff69d08b3179 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Thu, 29 Jan 2026 00:37:04 +0100 Subject: [PATCH 201/630] Add Message logging --- Utilities/StrUtil.h | 2 +- rpcs3/Emu/NP/np_handler.cpp | 5 +++++ rpcs3/Emu/NP/rpcn_client.cpp | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Utilities/StrUtil.h b/Utilities/StrUtil.h index b5df886164..d274cc074d 100644 --- a/Utilities/StrUtil.h +++ b/Utilities/StrUtil.h @@ -188,7 +188,7 @@ namespace fmt result.append(separator); } - return result.append(source.back()); + return result.append(*end); } template diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index 777301abbb..9dc02f983c 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1085,6 +1085,11 @@ namespace np void np_handler::send_message(const message_data& msg_data, const std::set& npids) { + const std::string npids_string = fmt::format("\"%s\"", fmt::merge(npids, "\",\"")); + + rpcn_log.notice("Sending message to %s:", npids_string); + msg_data.print(); + get_rpcn()->send_message(msg_data, npids); } diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index a87fff8244..61ad839555 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -3122,6 +3122,7 @@ namespace rpcn if (sdata.is_error()) { + rpcn_log.error("Error parsing MessageReceived notification"); return; } @@ -3143,6 +3144,9 @@ namespace rpcn strcpy_trunc(mdata.commId.data, pb_mdata->communicationid()); mdata.data.assign(pb_mdata->data().begin(), pb_mdata->data().end()); + rpcn_log.notice("Received message from %s:", sender); + mdata.print(); + // Save the message and call callbacks { std::lock_guard lock(mutex_messages); From 4df51025e5a268aed439f7dea1fe0d3b4debf8a4 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Thu, 29 Jan 2026 05:05:06 +0100 Subject: [PATCH 202/630] Improve Message ComId handling --- rpcs3/Emu/Cell/Modules/sceNp2.cpp | 2 +- rpcs3/Emu/NP/np_helpers.cpp | 26 ++++++++++++++++++++------ rpcs3/Emu/NP/np_helpers.h | 2 +- rpcs3/Emu/NP/rpcn_client.cpp | 9 +++++---- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index 98f2bf3883..fddc514bcc 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -1345,7 +1345,7 @@ error_code sceNpMatching2CreateContext( error_code sceNpMatching2GetSignalingOptParamLocal(SceNpMatching2ContextId ctxId, SceNpMatching2RoomId roomId, vm::ptr signalingOptParam) { - sceNp2.todo("sceNpMatching2GetSignalingOptParamLocal(ctxId=%d, roomId=%d, signalingOptParam=*0x%x)", ctxId, roomId, signalingOptParam); + sceNp2.warning("sceNpMatching2GetSignalingOptParamLocal(ctxId=%d, roomId=%d, signalingOptParam=*0x%x)", ctxId, roomId, signalingOptParam); auto& nph = g_fxo->get>(); diff --git a/rpcs3/Emu/NP/np_helpers.cpp b/rpcs3/Emu/NP/np_helpers.cpp index b6e49b97b2..839b33b614 100644 --- a/rpcs3/Emu/NP/np_helpers.cpp +++ b/rpcs3/Emu/NP/np_helpers.cpp @@ -8,6 +8,8 @@ #include #endif +LOG_CHANNEL(rpcn_log, "rpcn"); + namespace np { std::string ip_to_string(u32 ip_addr) @@ -34,6 +36,24 @@ namespace np return fmt::format("%s_%02d", com_id_data, communicationId.num); } + std::optional string_to_communication_id(std::string_view str) + { + SceNpCommunicationId id{}; + + const auto split_id = fmt::split_sv(str, {"_"}); + + if (split_id.size() != 2 || split_id[0].length() != 9 || split_id[1].length() != 2 || !std::isdigit(split_id[1][0]) || !std::isdigit(split_id[1][1])) + { + rpcn_log.error("Tried to parse an invalid communication_id!"); + return std::nullopt; + } + + strcpy_trunc(id.data, split_id); + id.num = std::stoi(std::string(split_id[1])); + + return id; + } + void strings_to_userinfo(std::string_view npid, std::string_view online_name, std::string_view avatar_url, SceNpUserInfo& user_info) { memset(&user_info, 0, sizeof(user_info)); @@ -81,12 +101,6 @@ namespace np strcpy_trunc(avatar_url.data, str); } - void string_to_communication_id(std::string_view str, SceNpCommunicationId& comm_id) - { - memset(&comm_id, 0, sizeof(comm_id)); - strcpy_trunc(comm_id.data, str); - } - bool is_valid_npid(const SceNpId& npid) { if (!std::all_of(npid.handle.data, npid.handle.data + 16, [](char c) { return std::isalnum(c) || c == '-' || c == '_' || c == 0; } ) diff --git a/rpcs3/Emu/NP/np_helpers.h b/rpcs3/Emu/NP/np_helpers.h index 054e45388d..c33b4ca001 100644 --- a/rpcs3/Emu/NP/np_helpers.h +++ b/rpcs3/Emu/NP/np_helpers.h @@ -10,11 +10,11 @@ namespace np std::string ether_to_string(std::array& ether); bool validate_communication_id(const SceNpCommunicationId& com_id); std::string communication_id_to_string(const SceNpCommunicationId& communicationId); + std::optional string_to_communication_id(std::string_view str); void string_to_npid(std::string_view str, SceNpId& npid); void string_to_online_name(std::string_view str, SceNpOnlineName& online_name); void string_to_avatar_url(std::string_view str, SceNpAvatarUrl& avatar_url); - void string_to_communication_id(std::string_view str, SceNpCommunicationId& comm_id); void strings_to_userinfo(std::string_view npid, std::string_view online_name, std::string_view avatar_url, SceNpUserInfo& user_info); template diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 61ad839555..cce4fa397b 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -2171,7 +2171,7 @@ namespace rpcn bool rpcn_client::send_message(const message_data& msg_data, const std::set& npids) { np2_structs::MessageDetails pb_message; - pb_message.set_communicationid(static_cast(msg_data.commId.data)); + pb_message.set_communicationid(np::communication_id_to_string(msg_data.commId)); pb_message.set_msgid(msg_data.msgId); pb_message.mutable_maintype()->set_value(msg_data.mainType); pb_message.mutable_subtype()->set_value(msg_data.subType); @@ -3126,8 +3126,9 @@ namespace rpcn return; } - if (pb_mdata->communicationid().empty() || pb_mdata->communicationid().size() > 9 || - pb_mdata->subject().empty() || pb_mdata->body().empty()) + const auto communication_id = np::string_to_communication_id(pb_mdata->communicationid()); + + if (!communication_id) { rpcn_log.warning("Discarded invalid message!"); return; @@ -3141,7 +3142,7 @@ namespace rpcn .subject = pb_mdata->subject(), .body = pb_mdata->body()}; - strcpy_trunc(mdata.commId.data, pb_mdata->communicationid()); + mdata.commId = *communication_id; mdata.data.assign(pb_mdata->data().begin(), pb_mdata->data().end()); rpcn_log.notice("Received message from %s:", sender); From 3e0cfc651d9e2363248dcc013fc15ed71328ec9a Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Thu, 29 Jan 2026 05:37:51 +0100 Subject: [PATCH 203/630] Fix sceNpBasicLimited_0xEB42E2E6 --- rpcs3/Emu/Cell/Modules/sceNp.cpp | 1 + rpcs3/Emu/NP/np_handler.cpp | 4 +--- rpcs3/Emu/NP/np_helpers.cpp | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index ee9c308265..2a2075f0ca 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -1173,6 +1173,7 @@ error_code _sceNpBasicSendMessage(vm::cptr to, vm::cptr data, u32 { struct sceNpBasicSendMessage_time_slots { + sceNpBasicSendMessage_time_slots() = default; sceNpBasicSendMessage_time_slots(sceNpBasicSendMessage_time_slots&&) = delete; std::array data{}; }; diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index 9dc02f983c..bc65f545b3 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1085,9 +1085,7 @@ namespace np void np_handler::send_message(const message_data& msg_data, const std::set& npids) { - const std::string npids_string = fmt::format("\"%s\"", fmt::merge(npids, "\",\"")); - - rpcn_log.notice("Sending message to %s:", npids_string); + rpcn_log.notice("Sending message to \"%s\":", fmt::merge(npids, "\",\"")); msg_data.print(); get_rpcn()->send_message(msg_data, npids); diff --git a/rpcs3/Emu/NP/np_helpers.cpp b/rpcs3/Emu/NP/np_helpers.cpp index 839b33b614..79f61ca627 100644 --- a/rpcs3/Emu/NP/np_helpers.cpp +++ b/rpcs3/Emu/NP/np_helpers.cpp @@ -48,7 +48,7 @@ namespace np return std::nullopt; } - strcpy_trunc(id.data, split_id); + strcpy_trunc(id.data, split_id[0]); id.num = std::stoi(std::string(split_id[1])); return id; From db3d9cd2179ac0c1080b997f277d9c114e82bc76 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 30 Jan 2026 10:28:49 +0100 Subject: [PATCH 204/630] Implement sceNpMatching2GetRoomMemberDataExternalList --- rpcs3/Emu/Cell/Modules/sceNp2.cpp | 9 +- rpcs3/Emu/NP/generated/np2_structs.pb.cc | 681 ++++++++++++++++++++++ rpcs3/Emu/NP/generated/np2_structs.pb.h | 692 +++++++++++++++++++++++ rpcs3/Emu/NP/generated/np2_structs.proto | 11 + rpcs3/Emu/NP/np_handler.cpp | 1 + rpcs3/Emu/NP/np_handler.h | 2 + rpcs3/Emu/NP/np_requests.cpp | 44 ++ rpcs3/Emu/NP/np_structs_extra.cpp | 24 + rpcs3/Emu/NP/np_structs_extra.h | 2 + rpcs3/Emu/NP/pb_helpers.cpp | 31 +- rpcs3/Emu/NP/pb_helpers.h | 2 + rpcs3/Emu/NP/rpcn_client.cpp | 11 + rpcs3/Emu/NP/rpcn_client.h | 1 + rpcs3/Emu/NP/rpcn_types.h | 1 + 14 files changed, 1506 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index fddc514bcc..c9816b60f5 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -798,7 +798,7 @@ error_code sceNpMatching2JoinLobby( error_code sceNpMatching2GetRoomMemberDataExternalList(SceNpMatching2ContextId ctxId, vm::cptr reqParam, vm::cptr optParam, vm::ptr assignedReqId) { - sceNp2.todo("sceNpMatching2GetRoomMemberDataExternalList(ctxId=%d, reqParam=*0x%x, optParam=*0x%x, assignedReqId=*0x%x)", ctxId, reqParam, optParam, assignedReqId); + sceNp2.warning("sceNpMatching2GetRoomMemberDataExternalList(ctxId=%d, reqParam=*0x%x, optParam=*0x%x, assignedReqId=*0x%x)", ctxId, reqParam, optParam, assignedReqId); auto& nph = g_fxo->get>(); if (auto res = generic_match2_error_check(nph, ctxId, reqParam); res != CELL_OK) @@ -806,6 +806,13 @@ error_code sceNpMatching2GetRoomMemberDataExternalList(SceNpMatching2ContextId c return res; } + const u32 request_id = nph.get_room_member_data_external_list(ctxId, optParam, reqParam.get_ptr()); + + if (assignedReqId) + { + *assignedReqId = request_id; + } + return CELL_OK; } diff --git a/rpcs3/Emu/NP/generated/np2_structs.pb.cc b/rpcs3/Emu/NP/generated/np2_structs.pb.cc index 6416723f11..2a4c4f6241 100644 --- a/rpcs3/Emu/NP/generated/np2_structs.pb.cc +++ b/rpcs3/Emu/NP/generated/np2_structs.pb.cc @@ -1299,6 +1299,33 @@ struct RoomMessageInfoDefaultTypeInternal { PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomMessageInfoDefaultTypeInternal _RoomMessageInfo_default_instance_; +inline constexpr RoomMemberDataExternal::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + userinfo_{nullptr}, + role_{nullptr}, + joindate_{::uint64_t{0u}} {} + +template +PROTOBUF_CONSTEXPR RoomMemberDataExternal::RoomMemberDataExternal(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(RoomMemberDataExternal_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct RoomMemberDataExternalDefaultTypeInternal { + PROTOBUF_CONSTEXPR RoomMemberDataExternalDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~RoomMemberDataExternalDefaultTypeInternal() {} + union { + RoomMemberDataExternal _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 RoomMemberDataExternalDefaultTypeInternal _RoomMemberDataExternal_default_instance_; + inline constexpr RoomGroupPasswordConfig::Impl_::Impl_( ::_pbi::ConstantInitialized) noexcept : _cached_size_{0}, @@ -2161,6 +2188,31 @@ struct IntSearchFilterDefaultTypeInternal { PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 IntSearchFilterDefaultTypeInternal _IntSearchFilter_default_instance_; +inline constexpr GetRoomMemberDataExternalListResponse::Impl_::Impl_( + ::_pbi::ConstantInitialized) noexcept + : _cached_size_{0}, + members_{} {} + +template +PROTOBUF_CONSTEXPR GetRoomMemberDataExternalListResponse::GetRoomMemberDataExternalListResponse(::_pbi::ConstantInitialized) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(GetRoomMemberDataExternalListResponse_class_data_.base()), +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(), +#endif // PROTOBUF_CUSTOM_VTABLE + _impl_(::_pbi::ConstantInitialized()) { +} +struct GetRoomMemberDataExternalListResponseDefaultTypeInternal { + PROTOBUF_CONSTEXPR GetRoomMemberDataExternalListResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~GetRoomMemberDataExternalListResponseDefaultTypeInternal() {} + union { + GetRoomMemberDataExternalListResponse _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GetRoomMemberDataExternalListResponseDefaultTypeInternal _GetRoomMemberDataExternalListResponse_default_instance_; + inline constexpr CreateJoinRoomRequest::Impl_::Impl_( ::_pbi::ConstantInitialized) noexcept : _cached_size_{0}, @@ -36071,6 +36123,635 @@ void MatchingSearchJoinRoomInfo::InternalSwap(MatchingSearchJoinRoomInfo* PROTOB swap(_impl_.room_, other->_impl_.room_); } +// =================================================================== + +class RoomMemberDataExternal::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_._has_bits_); +}; + +RoomMemberDataExternal::RoomMemberDataExternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberDataExternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.RoomMemberDataExternal) +} +PROTOBUF_NDEBUG_INLINE RoomMemberDataExternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::RoomMemberDataExternal& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0} {} + +RoomMemberDataExternal::RoomMemberDataExternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const RoomMemberDataExternal& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, RoomMemberDataExternal_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + RoomMemberDataExternal* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + ::uint32_t cached_has_bits = _impl_._has_bits_[0]; + _impl_.userinfo_ = (CheckHasBit(cached_has_bits, 0x00000001U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.userinfo_) + : nullptr; + _impl_.role_ = (CheckHasBit(cached_has_bits, 0x00000002U)) + ? ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.role_) + : nullptr; + _impl_.joindate_ = from._impl_.joindate_; + + // @@protoc_insertion_point(copy_constructor:np2_structs.RoomMemberDataExternal) +} +PROTOBUF_NDEBUG_INLINE RoomMemberDataExternal::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0} {} + +inline void RoomMemberDataExternal::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); + ::memset(reinterpret_cast(&_impl_) + + offsetof(Impl_, userinfo_), + 0, + offsetof(Impl_, joindate_) - + offsetof(Impl_, userinfo_) + + sizeof(Impl_::joindate_)); +} +RoomMemberDataExternal::~RoomMemberDataExternal() { + // @@protoc_insertion_point(destructor:np2_structs.RoomMemberDataExternal) + SharedDtor(*this); +} +inline void RoomMemberDataExternal::SharedDtor(MessageLite& self) { + RoomMemberDataExternal& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + delete this_._impl_.userinfo_; + delete this_._impl_.role_; + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL RoomMemberDataExternal::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) RoomMemberDataExternal(arena); +} +constexpr auto RoomMemberDataExternal::InternalNewImpl_() { + return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(RoomMemberDataExternal), + alignof(RoomMemberDataExternal)); +} +constexpr auto RoomMemberDataExternal::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<35>{ + { + &_RoomMemberDataExternal_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &RoomMemberDataExternal::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &RoomMemberDataExternal::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &RoomMemberDataExternal::ByteSizeLong, + &RoomMemberDataExternal::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_._cached_size_), + true, + }, + "np2_structs.RoomMemberDataExternal", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<35> RoomMemberDataExternal_class_data_ = + RoomMemberDataExternal::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +RoomMemberDataExternal::GetClassData() const { + return RoomMemberDataExternal_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<2, 3, 2, 0, 2> +RoomMemberDataExternal::_table_ = { + { + PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_._has_bits_), + 0, // no _extensions_ + 3, 24, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967288, // skipmap + offsetof(decltype(_table_), field_entries), + 3, // num_field_entries + 2, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + RoomMemberDataExternal_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::RoomMemberDataExternal>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + {::_pbi::TcParser::MiniParse, {}}, + // .np2_structs.UserInfo userInfo = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_.userinfo_)}}, + // uint64 joinDate = 2; + {::_pbi::TcParser::FastV64S1, + {16, 2, 0, + PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_.joindate_)}}, + // .np2_structs.uint8 role = 3; + {::_pbi::TcParser::FastMtS1, + {26, 1, 1, + PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_.role_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .np2_structs.UserInfo userInfo = 1; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_.userinfo_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + // uint64 joinDate = 2; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_.joindate_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)}, + // .np2_structs.uint8 role = 3; + {PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_.role_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::UserInfo>()}, + {::_pbi::TcParser::GetTable<::np2_structs::uint8>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void RoomMemberDataExternal::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.RoomMemberDataExternal) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(_impl_.userinfo_ != nullptr); + _impl_.userinfo_->Clear(); + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(_impl_.role_ != nullptr); + _impl_.role_->Clear(); + } + } + _impl_.joindate_ = ::uint64_t{0u}; + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL RoomMemberDataExternal::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const RoomMemberDataExternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL RoomMemberDataExternal::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const RoomMemberDataExternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.RoomMemberDataExternal) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // .np2_structs.UserInfo userInfo = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, *this_._impl_.userinfo_, this_._impl_.userinfo_->GetCachedSize(), target, + stream); + } + + // uint64 joinDate = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_joindate() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteUInt64ToArray( + 2, this_._internal_joindate(), target); + } + } + + // .np2_structs.uint8 role = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 3, *this_._impl_.role_, this_._impl_.role_->GetCachedSize(), target, + stream); + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.RoomMemberDataExternal) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t RoomMemberDataExternal::ByteSizeLong(const MessageLite& base) { + const RoomMemberDataExternal& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t RoomMemberDataExternal::ByteSizeLong() const { + const RoomMemberDataExternal& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.RoomMemberDataExternal) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + cached_has_bits = this_._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + // .np2_structs.UserInfo userInfo = 1; + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.userinfo_); + } + // .np2_structs.uint8 role = 3; + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.role_); + } + // uint64 joinDate = 2; + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (this_._internal_joindate() != 0) { + total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne( + this_._internal_joindate()); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void RoomMemberDataExternal::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.RoomMemberDataExternal) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) { + if (CheckHasBit(cached_has_bits, 0x00000001U)) { + ABSL_DCHECK(from._impl_.userinfo_ != nullptr); + if (_this->_impl_.userinfo_ == nullptr) { + _this->_impl_.userinfo_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.userinfo_); + } else { + _this->_impl_.userinfo_->MergeFrom(*from._impl_.userinfo_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000002U)) { + ABSL_DCHECK(from._impl_.role_ != nullptr); + if (_this->_impl_.role_ == nullptr) { + _this->_impl_.role_ = ::google::protobuf::MessageLite::CopyConstruct(arena, *from._impl_.role_); + } else { + _this->_impl_.role_->MergeFrom(*from._impl_.role_); + } + } + if (CheckHasBit(cached_has_bits, 0x00000004U)) { + if (from._internal_joindate() != 0) { + _this->_impl_.joindate_ = from._impl_.joindate_; + } + } + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void RoomMemberDataExternal::CopyFrom(const RoomMemberDataExternal& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.RoomMemberDataExternal) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void RoomMemberDataExternal::InternalSwap(RoomMemberDataExternal* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + ::google::protobuf::internal::memswap< + PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_.joindate_) + + sizeof(RoomMemberDataExternal::_impl_.joindate_) + - PROTOBUF_FIELD_OFFSET(RoomMemberDataExternal, _impl_.userinfo_)>( + reinterpret_cast(&_impl_.userinfo_), + reinterpret_cast(&other->_impl_.userinfo_)); +} + +// =================================================================== + +class GetRoomMemberDataExternalListResponse::_Internal { + public: + using HasBits = + decltype(::std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(GetRoomMemberDataExternalListResponse, _impl_._has_bits_); +}; + +GetRoomMemberDataExternalListResponse::GetRoomMemberDataExternalListResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomMemberDataExternalListResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:np2_structs.GetRoomMemberDataExternalListResponse) +} +PROTOBUF_NDEBUG_INLINE GetRoomMemberDataExternalListResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + [[maybe_unused]] const ::np2_structs::GetRoomMemberDataExternalListResponse& from_msg) + : _has_bits_{from._has_bits_}, + _cached_size_{0}, + members_{visibility, arena, from.members_} {} + +GetRoomMemberDataExternalListResponse::GetRoomMemberDataExternalListResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, + const GetRoomMemberDataExternalListResponse& from) +#if defined(PROTOBUF_CUSTOM_VTABLE) + : ::google::protobuf::MessageLite(arena, GetRoomMemberDataExternalListResponse_class_data_.base()) { +#else // PROTOBUF_CUSTOM_VTABLE + : ::google::protobuf::MessageLite(arena) { +#endif // PROTOBUF_CUSTOM_VTABLE + GetRoomMemberDataExternalListResponse* const _this = this; + (void)_this; + _internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); + new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); + + // @@protoc_insertion_point(copy_constructor:np2_structs.GetRoomMemberDataExternalListResponse) +} +PROTOBUF_NDEBUG_INLINE GetRoomMemberDataExternalListResponse::Impl_::Impl_( + [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility, + [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) + : _cached_size_{0}, + members_{visibility, arena} {} + +inline void GetRoomMemberDataExternalListResponse::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { + new (&_impl_) Impl_(internal_visibility(), arena); +} +GetRoomMemberDataExternalListResponse::~GetRoomMemberDataExternalListResponse() { + // @@protoc_insertion_point(destructor:np2_structs.GetRoomMemberDataExternalListResponse) + SharedDtor(*this); +} +inline void GetRoomMemberDataExternalListResponse::SharedDtor(MessageLite& self) { + GetRoomMemberDataExternalListResponse& this_ = static_cast(self); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + this_._internal_metadata_.Delete<::std::string>(); + ABSL_DCHECK(this_.GetArena() == nullptr); + this_._impl_.~Impl_(); +} + +inline void* PROTOBUF_NONNULL GetRoomMemberDataExternalListResponse::PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { + return ::new (mem) GetRoomMemberDataExternalListResponse(arena); +} +constexpr auto GetRoomMemberDataExternalListResponse::InternalNewImpl_() { + constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({ + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataExternalListResponse, _impl_.members_) + + decltype(GetRoomMemberDataExternalListResponse::_impl_.members_):: + InternalGetArenaOffset( + ::google::protobuf::MessageLite::internal_visibility()), + }); + if (arena_bits.has_value()) { + return ::google::protobuf::internal::MessageCreator::ZeroInit( + sizeof(GetRoomMemberDataExternalListResponse), alignof(GetRoomMemberDataExternalListResponse), *arena_bits); + } else { + return ::google::protobuf::internal::MessageCreator(&GetRoomMemberDataExternalListResponse::PlacementNew_, + sizeof(GetRoomMemberDataExternalListResponse), + alignof(GetRoomMemberDataExternalListResponse)); + } +} +constexpr auto GetRoomMemberDataExternalListResponse::InternalGenerateClassData_() { + return ::google::protobuf::internal::ClassDataLite<50>{ + { + &_GetRoomMemberDataExternalListResponse_default_instance_._instance, + &_table_.header, + nullptr, // OnDemandRegisterArenaDtor + nullptr, // IsInitialized + &GetRoomMemberDataExternalListResponse::MergeImpl, + ::google::protobuf::MessageLite::GetNewImpl(), +#if defined(PROTOBUF_CUSTOM_VTABLE) + &GetRoomMemberDataExternalListResponse::SharedDtor, + ::google::protobuf::MessageLite::GetClearImpl(), &GetRoomMemberDataExternalListResponse::ByteSizeLong, + &GetRoomMemberDataExternalListResponse::_InternalSerialize, +#endif // PROTOBUF_CUSTOM_VTABLE + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataExternalListResponse, _impl_._cached_size_), + true, + }, + "np2_structs.GetRoomMemberDataExternalListResponse", + }; +} + +PROTOBUF_CONSTINIT +PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::google::protobuf::internal::ClassDataLite<50> GetRoomMemberDataExternalListResponse_class_data_ = + GetRoomMemberDataExternalListResponse::InternalGenerateClassData_(); + +PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL +GetRoomMemberDataExternalListResponse::GetClassData() const { + return GetRoomMemberDataExternalListResponse_class_data_.base(); +} +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 1, 0, 2> +GetRoomMemberDataExternalListResponse::_table_ = { + { + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataExternalListResponse, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + GetRoomMemberDataExternalListResponse_class_data_.base(), + nullptr, // post_loop_handler + ::_pbi::TcParser::GenericFallbackLite, // fallback + #ifdef PROTOBUF_PREFETCH_PARSE_TABLE + ::_pbi::TcParser::GetTable<::np2_structs::GetRoomMemberDataExternalListResponse>(), // to_prefetch + #endif // PROTOBUF_PREFETCH_PARSE_TABLE + }, {{ + // repeated .np2_structs.RoomMemberDataExternal members = 1; + {::_pbi::TcParser::FastMtR1, + {10, 0, 0, + PROTOBUF_FIELD_OFFSET(GetRoomMemberDataExternalListResponse, _impl_.members_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // repeated .np2_structs.RoomMemberDataExternal members = 1; + {PROTOBUF_FIELD_OFFSET(GetRoomMemberDataExternalListResponse, _impl_.members_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, + {{ + {::_pbi::TcParser::GetTable<::np2_structs::RoomMemberDataExternal>()}, + }}, + {{ + }}, +}; +PROTOBUF_NOINLINE void GetRoomMemberDataExternalListResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:np2_structs.GetRoomMemberDataExternalListResponse) + ::google::protobuf::internal::TSanWrite(&_impl_); + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _impl_.members_.Clear(); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::std::string>(); +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::uint8_t* PROTOBUF_NONNULL GetRoomMemberDataExternalListResponse::_InternalSerialize( + const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { + const GetRoomMemberDataExternalListResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::uint8_t* PROTOBUF_NONNULL GetRoomMemberDataExternalListResponse::_InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + const GetRoomMemberDataExternalListResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + this_.CheckHasBitConsistency(); + } + // @@protoc_insertion_point(serialize_to_array_start:np2_structs.GetRoomMemberDataExternalListResponse) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = this_._impl_._has_bits_[0]; + // repeated .np2_structs.RoomMemberDataExternal members = 1; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + for (unsigned i = 0, n = static_cast( + this_._internal_members_size()); + i < n; i++) { + const auto& repfield = this_._internal_members().Get(i); + target = + ::google::protobuf::internal::WireFormatLite::InternalWriteMessage( + 1, repfield, repfield.GetCachedSize(), + target, stream); + } + } + + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + target = stream->WriteRaw( + this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).data(), + static_cast(this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size()), target); + } + // @@protoc_insertion_point(serialize_to_array_end:np2_structs.GetRoomMemberDataExternalListResponse) + return target; +} + +#if defined(PROTOBUF_CUSTOM_VTABLE) +::size_t GetRoomMemberDataExternalListResponse::ByteSizeLong(const MessageLite& base) { + const GetRoomMemberDataExternalListResponse& this_ = static_cast(base); +#else // PROTOBUF_CUSTOM_VTABLE +::size_t GetRoomMemberDataExternalListResponse::ByteSizeLong() const { + const GetRoomMemberDataExternalListResponse& this_ = *this; +#endif // PROTOBUF_CUSTOM_VTABLE + // @@protoc_insertion_point(message_byte_size_start:np2_structs.GetRoomMemberDataExternalListResponse) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void)cached_has_bits; + + ::_pbi::Prefetch5LinesFrom7Lines(&this_); + { + // repeated .np2_structs.RoomMemberDataExternal members = 1; + cached_has_bits = this_._impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + total_size += 1UL * this_._internal_members_size(); + for (const auto& msg : this_._internal_members()) { + total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg); + } + } + } + if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { + total_size += this_._internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString).size(); + } + this_._impl_._cached_size_.Set(::_pbi::ToCachedSize(total_size)); + return total_size; +} + +void GetRoomMemberDataExternalListResponse::MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg) { + auto* const _this = + static_cast(&to_msg); + auto& from = static_cast(from_msg); + if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) { + from.CheckHasBitConsistency(); + } + ::google::protobuf::Arena* arena = _this->GetArena(); + // @@protoc_insertion_point(class_specific_merge_from_start:np2_structs.GetRoomMemberDataExternalListResponse) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = from._impl_._has_bits_[0]; + if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) { + _this->_internal_mutable_members()->InternalMergeFromWithArena( + ::google::protobuf::MessageLite::internal_visibility(), arena, + from._internal_members()); + } + _this->_impl_._has_bits_[0] |= cached_has_bits; + _this->_internal_metadata_.MergeFrom<::std::string>( + from._internal_metadata_); +} + +void GetRoomMemberDataExternalListResponse::CopyFrom(const GetRoomMemberDataExternalListResponse& from) { + // @@protoc_insertion_point(class_specific_copy_from_start:np2_structs.GetRoomMemberDataExternalListResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + + +void GetRoomMemberDataExternalListResponse::InternalSwap(GetRoomMemberDataExternalListResponse* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { + using ::std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + _impl_.members_.InternalSwap(&other->_impl_.members_); +} + // @@protoc_insertion_point(namespace_scope) } // namespace np2_structs namespace google { diff --git a/rpcs3/Emu/NP/generated/np2_structs.pb.h b/rpcs3/Emu/NP/generated/np2_structs.pb.h index 0e035973fd..4e435b3b07 100644 --- a/rpcs3/Emu/NP/generated/np2_structs.pb.h +++ b/rpcs3/Emu/NP/generated/np2_structs.pb.h @@ -99,6 +99,10 @@ class GetRoomListGUIRequest; struct GetRoomListGUIRequestDefaultTypeInternal; extern GetRoomListGUIRequestDefaultTypeInternal _GetRoomListGUIRequest_default_instance_; extern const ::google::protobuf::internal::ClassDataLite<34> GetRoomListGUIRequest_class_data_; +class GetRoomMemberDataExternalListResponse; +struct GetRoomMemberDataExternalListResponseDefaultTypeInternal; +extern GetRoomMemberDataExternalListResponseDefaultTypeInternal _GetRoomMemberDataExternalListResponse_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<50> GetRoomMemberDataExternalListResponse_class_data_; class GetRoomMemberDataInternalRequest; struct GetRoomMemberDataInternalRequestDefaultTypeInternal; extern GetRoomMemberDataInternalRequestDefaultTypeInternal _GetRoomMemberDataInternalRequest_default_instance_; @@ -235,6 +239,10 @@ class RoomMemberBinAttrInternal; struct RoomMemberBinAttrInternalDefaultTypeInternal; extern RoomMemberBinAttrInternalDefaultTypeInternal _RoomMemberBinAttrInternal_default_instance_; extern const ::google::protobuf::internal::ClassDataLite<38> RoomMemberBinAttrInternal_class_data_; +class RoomMemberDataExternal; +struct RoomMemberDataExternalDefaultTypeInternal; +extern RoomMemberDataExternalDefaultTypeInternal _RoomMemberDataExternal_default_instance_; +extern const ::google::protobuf::internal::ClassDataLite<35> RoomMemberDataExternal_class_data_; class RoomMemberDataInternal; struct RoomMemberDataInternalDefaultTypeInternal; extern RoomMemberDataInternalDefaultTypeInternal _RoomMemberDataInternal_default_instance_; @@ -9818,6 +9826,218 @@ class RoomMessageInfo final : public ::google::protobuf::MessageLite extern const ::google::protobuf::internal::ClassDataLite<28> RoomMessageInfo_class_data_; // ------------------------------------------------------------------- +class RoomMemberDataExternal final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.RoomMemberDataExternal) */ { + public: + inline RoomMemberDataExternal() : RoomMemberDataExternal(nullptr) {} + ~RoomMemberDataExternal() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(RoomMemberDataExternal* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(RoomMemberDataExternal)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR RoomMemberDataExternal(::google::protobuf::internal::ConstantInitialized); + + inline RoomMemberDataExternal(const RoomMemberDataExternal& from) : RoomMemberDataExternal(nullptr, from) {} + inline RoomMemberDataExternal(RoomMemberDataExternal&& from) noexcept + : RoomMemberDataExternal(nullptr, ::std::move(from)) {} + inline RoomMemberDataExternal& operator=(const RoomMemberDataExternal& from) { + CopyFrom(from); + return *this; + } + inline RoomMemberDataExternal& operator=(RoomMemberDataExternal&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const RoomMemberDataExternal& default_instance() { + return *reinterpret_cast( + &_RoomMemberDataExternal_default_instance_); + } + static constexpr int kIndexInFileMessages = 89; + friend void swap(RoomMemberDataExternal& a, RoomMemberDataExternal& b) { a.Swap(&b); } + inline void Swap(RoomMemberDataExternal* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(RoomMemberDataExternal* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + RoomMemberDataExternal* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const RoomMemberDataExternal& from); + void MergeFrom(const RoomMemberDataExternal& from) { RoomMemberDataExternal::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(RoomMemberDataExternal* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.RoomMemberDataExternal"; } + + explicit RoomMemberDataExternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + RoomMemberDataExternal(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const RoomMemberDataExternal& from); + RoomMemberDataExternal( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, RoomMemberDataExternal&& from) noexcept + : RoomMemberDataExternal(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kUserInfoFieldNumber = 1, + kRoleFieldNumber = 3, + kJoinDateFieldNumber = 2, + }; + // .np2_structs.UserInfo userInfo = 1; + bool has_userinfo() const; + void clear_userinfo() ; + const ::np2_structs::UserInfo& userinfo() const; + [[nodiscard]] ::np2_structs::UserInfo* PROTOBUF_NULLABLE release_userinfo(); + ::np2_structs::UserInfo* PROTOBUF_NONNULL mutable_userinfo(); + void set_allocated_userinfo(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_userinfo(::np2_structs::UserInfo* PROTOBUF_NULLABLE value); + ::np2_structs::UserInfo* PROTOBUF_NULLABLE unsafe_arena_release_userinfo(); + + private: + const ::np2_structs::UserInfo& _internal_userinfo() const; + ::np2_structs::UserInfo* PROTOBUF_NONNULL _internal_mutable_userinfo(); + + public: + // .np2_structs.uint8 role = 3; + bool has_role() const; + void clear_role() ; + const ::np2_structs::uint8& role() const; + [[nodiscard]] ::np2_structs::uint8* PROTOBUF_NULLABLE release_role(); + ::np2_structs::uint8* PROTOBUF_NONNULL mutable_role(); + void set_allocated_role(::np2_structs::uint8* PROTOBUF_NULLABLE value); + void unsafe_arena_set_allocated_role(::np2_structs::uint8* PROTOBUF_NULLABLE value); + ::np2_structs::uint8* PROTOBUF_NULLABLE unsafe_arena_release_role(); + + private: + const ::np2_structs::uint8& _internal_role() const; + ::np2_structs::uint8* PROTOBUF_NONNULL _internal_mutable_role(); + + public: + // uint64 joinDate = 2; + void clear_joindate() ; + ::uint64_t joindate() const; + void set_joindate(::uint64_t value); + + private: + ::uint64_t _internal_joindate() const; + void _internal_set_joindate(::uint64_t value); + + public: + // @@protoc_insertion_point(class_scope:np2_structs.RoomMemberDataExternal) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<2, 3, + 2, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const RoomMemberDataExternal& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::np2_structs::UserInfo* PROTOBUF_NULLABLE userinfo_; + ::np2_structs::uint8* PROTOBUF_NULLABLE role_; + ::uint64_t joindate_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<35> RoomMemberDataExternal_class_data_; +// ------------------------------------------------------------------- + class RoomGroupPasswordConfig final : public ::google::protobuf::MessageLite /* @@protoc_insertion_point(class_definition:np2_structs.RoomGroupPasswordConfig) */ { public: @@ -16603,6 +16823,191 @@ class IntSearchFilter final : public ::google::protobuf::MessageLite extern const ::google::protobuf::internal::ClassDataLite<28> IntSearchFilter_class_data_; // ------------------------------------------------------------------- +class GetRoomMemberDataExternalListResponse final : public ::google::protobuf::MessageLite +/* @@protoc_insertion_point(class_definition:np2_structs.GetRoomMemberDataExternalListResponse) */ { + public: + inline GetRoomMemberDataExternalListResponse() : GetRoomMemberDataExternalListResponse(nullptr) {} + ~GetRoomMemberDataExternalListResponse() PROTOBUF_FINAL; + +#if defined(PROTOBUF_CUSTOM_VTABLE) + void operator delete(GetRoomMemberDataExternalListResponse* PROTOBUF_NONNULL msg, ::std::destroying_delete_t) { + SharedDtor(*msg); + ::google::protobuf::internal::SizedDelete(msg, sizeof(GetRoomMemberDataExternalListResponse)); + } +#endif + + template + explicit PROTOBUF_CONSTEXPR GetRoomMemberDataExternalListResponse(::google::protobuf::internal::ConstantInitialized); + + inline GetRoomMemberDataExternalListResponse(const GetRoomMemberDataExternalListResponse& from) : GetRoomMemberDataExternalListResponse(nullptr, from) {} + inline GetRoomMemberDataExternalListResponse(GetRoomMemberDataExternalListResponse&& from) noexcept + : GetRoomMemberDataExternalListResponse(nullptr, ::std::move(from)) {} + inline GetRoomMemberDataExternalListResponse& operator=(const GetRoomMemberDataExternalListResponse& from) { + CopyFrom(from); + return *this; + } + inline GetRoomMemberDataExternalListResponse& operator=(GetRoomMemberDataExternalListResponse&& from) noexcept { + if (this == &from) return *this; + if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::std::string& unknown_fields() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.unknown_fields<::std::string>(::google::protobuf::internal::GetEmptyString); + } + inline ::std::string* PROTOBUF_NONNULL mutable_unknown_fields() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return _internal_metadata_.mutable_unknown_fields<::std::string>(); + } + + static const GetRoomMemberDataExternalListResponse& default_instance() { + return *reinterpret_cast( + &_GetRoomMemberDataExternalListResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = 90; + friend void swap(GetRoomMemberDataExternalListResponse& a, GetRoomMemberDataExternalListResponse& b) { a.Swap(&b); } + inline void Swap(GetRoomMemberDataExternalListResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(GetRoomMemberDataExternalListResponse* PROTOBUF_NONNULL other) { + if (other == this) return; + ABSL_DCHECK(GetArena() == other->GetArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + GetRoomMemberDataExternalListResponse* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { + return ::google::protobuf::MessageLite::DefaultConstruct(arena); + } + void CopyFrom(const GetRoomMemberDataExternalListResponse& from); + void MergeFrom(const GetRoomMemberDataExternalListResponse& from) { GetRoomMemberDataExternalListResponse::MergeImpl(*this, from); } + + private: + static void MergeImpl(::google::protobuf::MessageLite& to_msg, + const ::google::protobuf::MessageLite& from_msg); + + public: + bool IsInitialized() const { + return true; + } + ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; + #if defined(PROTOBUF_CUSTOM_VTABLE) + private: + static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); + static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); + + public: + ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { + return _InternalSerialize(*this, target, stream); + } + #else // PROTOBUF_CUSTOM_VTABLE + ::size_t ByteSizeLong() const final; + ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( + ::uint8_t* PROTOBUF_NONNULL target, + ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; + #endif // PROTOBUF_CUSTOM_VTABLE + int GetCachedSize() const { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static void SharedDtor(MessageLite& self); + void InternalSwap(GetRoomMemberDataExternalListResponse* PROTOBUF_NONNULL other); + private: + template + friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); + static ::absl::string_view FullMessageName() { return "np2_structs.GetRoomMemberDataExternalListResponse"; } + + explicit GetRoomMemberDataExternalListResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + GetRoomMemberDataExternalListResponse(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const GetRoomMemberDataExternalListResponse& from); + GetRoomMemberDataExternalListResponse( + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, GetRoomMemberDataExternalListResponse&& from) noexcept + : GetRoomMemberDataExternalListResponse(arena) { + *this = ::std::move(from); + } + const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; + static void* PROTOBUF_NONNULL PlacementNew_( + const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + static constexpr auto InternalNewImpl_(); + + public: + static constexpr auto InternalGenerateClassData_(); + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + enum : int { + kMembersFieldNumber = 1, + }; + // repeated .np2_structs.RoomMemberDataExternal members = 1; + int members_size() const; + private: + int _internal_members_size() const; + + public: + void clear_members() ; + ::np2_structs::RoomMemberDataExternal* PROTOBUF_NONNULL mutable_members(int index); + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataExternal>* PROTOBUF_NONNULL mutable_members(); + + private: + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataExternal>& _internal_members() const; + ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataExternal>* PROTOBUF_NONNULL _internal_mutable_members(); + public: + const ::np2_structs::RoomMemberDataExternal& members(int index) const; + ::np2_structs::RoomMemberDataExternal* PROTOBUF_NONNULL add_members(); + const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataExternal>& members() const; + // @@protoc_insertion_point(class_scope:np2_structs.GetRoomMemberDataExternalListResponse) + private: + class _Internal; + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<0, 1, + 1, 0, + 2> + _table_; + + friend class ::google::protobuf::MessageLite; + friend class ::google::protobuf::Arena; + template + friend class ::google::protobuf::Arena::InternalHelper; + using InternalArenaConstructable_ = void; + using DestructorSkippable_ = void; + struct Impl_ { + inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); + inline explicit Impl_( + ::google::protobuf::internal::InternalVisibility visibility, + ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, + const GetRoomMemberDataExternalListResponse& from_msg); + ::google::protobuf::internal::HasBits<1> _has_bits_; + ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::RepeatedPtrField< ::np2_structs::RoomMemberDataExternal > members_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_np2_5fstructs_2eproto; +}; + +extern const ::google::protobuf::internal::ClassDataLite<50> GetRoomMemberDataExternalListResponse_class_data_; +// ------------------------------------------------------------------- + class CreateJoinRoomRequest final : public ::google::protobuf::MessageLite /* @@protoc_insertion_point(class_definition:np2_structs.CreateJoinRoomRequest) */ { public: @@ -38603,6 +39008,293 @@ MatchingSearchJoinRoomInfo::_internal_mutable_attr() { return &_impl_.attr_; } +// ------------------------------------------------------------------- + +// RoomMemberDataExternal + +// .np2_structs.UserInfo userInfo = 1; +inline bool RoomMemberDataExternal::has_userinfo() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000001U); + PROTOBUF_ASSUME(!value || _impl_.userinfo_ != nullptr); + return value; +} +inline void RoomMemberDataExternal::clear_userinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.userinfo_ != nullptr) _impl_.userinfo_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000001U); +} +inline const ::np2_structs::UserInfo& RoomMemberDataExternal::_internal_userinfo() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::UserInfo* p = _impl_.userinfo_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_UserInfo_default_instance_); +} +inline const ::np2_structs::UserInfo& RoomMemberDataExternal::userinfo() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataExternal.userInfo) + return _internal_userinfo(); +} +inline void RoomMemberDataExternal::unsafe_arena_set_allocated_userinfo( + ::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.userinfo_); + } + _impl_.userinfo_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberDataExternal.userInfo) +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE RoomMemberDataExternal::release_userinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::UserInfo* released = _impl_.userinfo_; + _impl_.userinfo_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::UserInfo* PROTOBUF_NULLABLE RoomMemberDataExternal::unsafe_arena_release_userinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberDataExternal.userInfo) + + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::UserInfo* temp = _impl_.userinfo_; + _impl_.userinfo_ = nullptr; + return temp; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL RoomMemberDataExternal::_internal_mutable_userinfo() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.userinfo_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::UserInfo>(GetArena()); + _impl_.userinfo_ = reinterpret_cast<::np2_structs::UserInfo*>(p); + } + return _impl_.userinfo_; +} +inline ::np2_structs::UserInfo* PROTOBUF_NONNULL RoomMemberDataExternal::mutable_userinfo() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + ::np2_structs::UserInfo* _msg = _internal_mutable_userinfo(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataExternal.userInfo) + return _msg; +} +inline void RoomMemberDataExternal::set_allocated_userinfo(::np2_structs::UserInfo* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.userinfo_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000001U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000001U); + } + + _impl_.userinfo_ = reinterpret_cast<::np2_structs::UserInfo*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberDataExternal.userInfo) +} + +// uint64 joinDate = 2; +inline void RoomMemberDataExternal::clear_joindate() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.joindate_ = ::uint64_t{0u}; + ClearHasBit(_impl_._has_bits_[0], + 0x00000004U); +} +inline ::uint64_t RoomMemberDataExternal::joindate() const { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataExternal.joinDate) + return _internal_joindate(); +} +inline void RoomMemberDataExternal::set_joindate(::uint64_t value) { + _internal_set_joindate(value); + SetHasBit(_impl_._has_bits_[0], 0x00000004U); + // @@protoc_insertion_point(field_set:np2_structs.RoomMemberDataExternal.joinDate) +} +inline ::uint64_t RoomMemberDataExternal::_internal_joindate() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.joindate_; +} +inline void RoomMemberDataExternal::_internal_set_joindate(::uint64_t value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.joindate_ = value; +} + +// .np2_structs.uint8 role = 3; +inline bool RoomMemberDataExternal::has_role() const { + bool value = CheckHasBit(_impl_._has_bits_[0], 0x00000002U); + PROTOBUF_ASSUME(!value || _impl_.role_ != nullptr); + return value; +} +inline void RoomMemberDataExternal::clear_role() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.role_ != nullptr) _impl_.role_->Clear(); + ClearHasBit(_impl_._has_bits_[0], + 0x00000002U); +} +inline const ::np2_structs::uint8& RoomMemberDataExternal::_internal_role() const { + ::google::protobuf::internal::TSanRead(&_impl_); + const ::np2_structs::uint8* p = _impl_.role_; + return p != nullptr ? *p : reinterpret_cast(::np2_structs::_uint8_default_instance_); +} +inline const ::np2_structs::uint8& RoomMemberDataExternal::role() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.RoomMemberDataExternal.role) + return _internal_role(); +} +inline void RoomMemberDataExternal::unsafe_arena_set_allocated_role( + ::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (GetArena() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.role_); + } + _impl_.role_ = reinterpret_cast<::np2_structs::uint8*>(value); + if (value != nullptr) { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:np2_structs.RoomMemberDataExternal.role) +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberDataExternal::release_role() { + ::google::protobuf::internal::TSanWrite(&_impl_); + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* released = _impl_.role_; + _impl_.role_ = nullptr; + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } + } + return released; +} +inline ::np2_structs::uint8* PROTOBUF_NULLABLE RoomMemberDataExternal::unsafe_arena_release_role() { + ::google::protobuf::internal::TSanWrite(&_impl_); + // @@protoc_insertion_point(field_release:np2_structs.RoomMemberDataExternal.role) + + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* temp = _impl_.role_; + _impl_.role_ = nullptr; + return temp; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberDataExternal::_internal_mutable_role() { + ::google::protobuf::internal::TSanWrite(&_impl_); + if (_impl_.role_ == nullptr) { + auto* p = ::google::protobuf::MessageLite::DefaultConstruct<::np2_structs::uint8>(GetArena()); + _impl_.role_ = reinterpret_cast<::np2_structs::uint8*>(p); + } + return _impl_.role_; +} +inline ::np2_structs::uint8* PROTOBUF_NONNULL RoomMemberDataExternal::mutable_role() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + ::np2_structs::uint8* _msg = _internal_mutable_role(); + // @@protoc_insertion_point(field_mutable:np2_structs.RoomMemberDataExternal.role) + return _msg; +} +inline void RoomMemberDataExternal::set_allocated_role(::np2_structs::uint8* PROTOBUF_NULLABLE value) { + ::google::protobuf::Arena* message_arena = GetArena(); + ::google::protobuf::internal::TSanWrite(&_impl_); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.role_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = value->GetArena(); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + SetHasBit(_impl_._has_bits_[0], 0x00000002U); + } else { + ClearHasBit(_impl_._has_bits_[0], 0x00000002U); + } + + _impl_.role_ = reinterpret_cast<::np2_structs::uint8*>(value); + // @@protoc_insertion_point(field_set_allocated:np2_structs.RoomMemberDataExternal.role) +} + +// ------------------------------------------------------------------- + +// GetRoomMemberDataExternalListResponse + +// repeated .np2_structs.RoomMemberDataExternal members = 1; +inline int GetRoomMemberDataExternalListResponse::_internal_members_size() const { + return _internal_members().size(); +} +inline int GetRoomMemberDataExternalListResponse::members_size() const { + return _internal_members_size(); +} +inline void GetRoomMemberDataExternalListResponse::clear_members() { + ::google::protobuf::internal::TSanWrite(&_impl_); + _impl_.members_.Clear(); + ClearHasBitForRepeated(_impl_._has_bits_[0], + 0x00000001U); +} +inline ::np2_structs::RoomMemberDataExternal* PROTOBUF_NONNULL GetRoomMemberDataExternalListResponse::mutable_members(int index) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_mutable:np2_structs.GetRoomMemberDataExternalListResponse.members) + return _internal_mutable_members()->Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataExternal>* PROTOBUF_NONNULL GetRoomMemberDataExternalListResponse::mutable_members() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_mutable_list:np2_structs.GetRoomMemberDataExternalListResponse.members) + ::google::protobuf::internal::TSanWrite(&_impl_); + return _internal_mutable_members(); +} +inline const ::np2_structs::RoomMemberDataExternal& GetRoomMemberDataExternalListResponse::members(int index) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_get:np2_structs.GetRoomMemberDataExternalListResponse.members) + return _internal_members().Get(index); +} +inline ::np2_structs::RoomMemberDataExternal* PROTOBUF_NONNULL GetRoomMemberDataExternalListResponse::add_members() + ABSL_ATTRIBUTE_LIFETIME_BOUND { + ::google::protobuf::internal::TSanWrite(&_impl_); + ::np2_structs::RoomMemberDataExternal* _add = + _internal_mutable_members()->InternalAddWithArena( + ::google::protobuf::MessageLite::internal_visibility(), GetArena()); + SetHasBitForRepeated(_impl_._has_bits_[0], 0x00000001U); + // @@protoc_insertion_point(field_add:np2_structs.GetRoomMemberDataExternalListResponse.members) + return _add; +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataExternal>& GetRoomMemberDataExternalListResponse::members() const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // @@protoc_insertion_point(field_list:np2_structs.GetRoomMemberDataExternalListResponse.members) + return _internal_members(); +} +inline const ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataExternal>& +GetRoomMemberDataExternalListResponse::_internal_members() const { + ::google::protobuf::internal::TSanRead(&_impl_); + return _impl_.members_; +} +inline ::google::protobuf::RepeatedPtrField<::np2_structs::RoomMemberDataExternal>* PROTOBUF_NONNULL +GetRoomMemberDataExternalListResponse::_internal_mutable_members() { + ::google::protobuf::internal::TSanRead(&_impl_); + return &_impl_.members_; +} + #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ diff --git a/rpcs3/Emu/NP/generated/np2_structs.proto b/rpcs3/Emu/NP/generated/np2_structs.proto index 46628781fb..fcb5c7304e 100644 --- a/rpcs3/Emu/NP/generated/np2_structs.proto +++ b/rpcs3/Emu/NP/generated/np2_structs.proto @@ -606,3 +606,14 @@ message MatchingSearchJoinRoomInfo { MatchingRoomStatus room = 1; repeated MatchingAttr attr = 2; } + +message RoomMemberDataExternal { + UserInfo userInfo = 1; + uint64 joinDate = 2; + uint8 role = 3; +} + +message GetRoomMemberDataExternalListResponse +{ + repeated RoomMemberDataExternal members = 1; +} diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index bc65f545b3..c4db3350c0 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1127,6 +1127,7 @@ namespace np case rpcn::CommandType::LeaveRoom: reply_leave_room(req_id, error, reply_data); break; case rpcn::CommandType::SearchRoom: reply_search_room(req_id, error, reply_data); break; case rpcn::CommandType::GetRoomDataExternalList: reply_get_roomdata_external_list(req_id, error, reply_data); break; + case rpcn::CommandType::GetRoomMemberDataExternalList: reply_get_room_member_data_external_list(req_id, error, reply_data); break; case rpcn::CommandType::SetRoomDataExternal: reply_set_roomdata_external(req_id, error); break; case rpcn::CommandType::GetRoomDataInternal: reply_get_roomdata_internal(req_id, error, reply_data); break; case rpcn::CommandType::SetRoomDataInternal: reply_set_roomdata_internal(req_id, error); break; diff --git a/rpcs3/Emu/NP/np_handler.h b/rpcs3/Emu/NP/np_handler.h index 51d510b854..9c02007a9c 100644 --- a/rpcs3/Emu/NP/np_handler.h +++ b/rpcs3/Emu/NP/np_handler.h @@ -177,6 +177,7 @@ namespace np u32 leave_room(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2LeaveRoomRequest* req); u32 search_room(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SearchRoomRequest* req); u32 get_roomdata_external_list(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetRoomDataExternalListRequest* req); + u32 get_room_member_data_external_list(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetRoomMemberDataExternalListRequest* req); u32 set_roomdata_external(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SetRoomDataExternalRequest* req); u32 get_roomdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetRoomDataInternalRequest* req); u32 set_roomdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SetRoomDataInternalRequest* req); @@ -323,6 +324,7 @@ namespace np void reply_leave_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply); void reply_search_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply); void reply_get_roomdata_external_list(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_get_room_member_data_external_list(u32 req_id, rpcn::ErrorType error, vec_stream& reply); void reply_set_roomdata_external(u32 req_id, rpcn::ErrorType error); void reply_get_roomdata_internal(u32 req_id, rpcn::ErrorType error, vec_stream& reply); void reply_set_roomdata_internal(u32 req_id, rpcn::ErrorType error); diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index 0ee7d1d0fc..20199889dc 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -445,6 +445,50 @@ namespace np cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); } + u32 np_handler::get_room_member_data_external_list(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetRoomMemberDataExternalListRequest* req) + { + const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetRoomDataExternalList, true); + + if (!get_rpcn()->get_room_member_data_external_list(req_id, get_match2_context(ctx_id)->communicationId, req->roomId)) + { + rpcn_log.error("Disconnecting from RPCN!"); + is_psn_active = false; + } + + return req_id; + } + + void np_handler::reply_get_room_member_data_external_list(u32 req_id, rpcn::ErrorType error, vec_stream& reply) + { + auto cb_info_opt = take_pending_request(req_id); + + if (!cb_info_opt) + return; + + ensure(error == rpcn::ErrorType::NoError, "Unexpected error in GetRoomMemberDataExternalList reply"); + + if (error == rpcn::ErrorType::RoomMissing) + { + cb_info_opt->queue_callback(req_id, 0, SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM, 0); + return; + } + + const auto resp = reply.get_protobuf(); + ensure(!reply.is_error(), "Malformed reply to GetRoomMemberDataExternalList command"); + + const u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); + + auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetRoomMemberDataExternalList, sizeof(SceNpMatching2GetRoomMemberDataExternalListResponse)); + auto* sce_get_room_member_ext_resp = reinterpret_cast(edata.data()); + GetRoomMemberDataExternalListResponse_to_SceNpMatching2GetRoomMemberDataExternalListResponse(edata, *resp, sce_get_room_member_ext_resp, include_onlinename, include_avatarurl); + np_memory.shrink_allocation(edata.addr(), edata.size()); + + extra_nps::print_SceNpMatching2GetRoomMemberDataExternalListResponse(sce_get_room_member_ext_resp); + + cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); + } + u32 np_handler::set_roomdata_external(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SetRoomDataExternalRequest* req) { const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SetRoomDataExternal, false); diff --git a/rpcs3/Emu/NP/np_structs_extra.cpp b/rpcs3/Emu/NP/np_structs_extra.cpp index 52f394ff2e..58770c450f 100644 --- a/rpcs3/Emu/NP/np_structs_extra.cpp +++ b/rpcs3/Emu/NP/np_structs_extra.cpp @@ -195,6 +195,15 @@ namespace extra_nps } } + void print_SceNpMatching2RoomMemberDataExternal(const SceNpMatching2RoomMemberDataExternal* member) + { + sceNp2.warning("SceNpMatching2RoomMemberDataExternal:"); + sceNp2.warning("next: *0x%x", member->next); + print_SceNpUserInfo2(&member->userInfo); + sceNp2.warning("joinDate: %lld", member->joinDate.tick); + sceNp2.warning("role: %d", member->role); + } + void print_SceNpMatching2RoomMemberDataInternal(const SceNpMatching2RoomMemberDataInternal* member) { sceNp2.warning("SceNpMatching2RoomMemberDataInternal:"); @@ -397,6 +406,21 @@ namespace extra_nps } } + void print_SceNpMatching2GetRoomMemberDataExternalListResponse(const SceNpMatching2GetRoomMemberDataExternalListResponse* resp) + { + sceNp2.warning("SceNpMatching2GetRoomMemberDataExternalListResponse:"); + sceNp2.warning("roomMemberDataExternalNum: %d", resp->roomMemberDataExternalNum); + + vm::bptr cur_member = resp->roomMemberDataExternal; + + for (u32 i = 0; i < resp->roomMemberDataExternalNum && cur_member; i++) + { + sceNp2.warning("roomMemberDataExternal[%d]:", i); + print_SceNpMatching2RoomMemberDataExternal(cur_member.get_ptr()); + cur_member = cur_member->next; + } + } + void print_SceNpMatching2GetLobbyInfoListRequest(const SceNpMatching2GetLobbyInfoListRequest* resp) { sceNp2.warning("SceNpMatching2GetLobbyInfoListRequest:"); diff --git a/rpcs3/Emu/NP/np_structs_extra.h b/rpcs3/Emu/NP/np_structs_extra.h index 1c722a0cf2..45f4cffc4a 100644 --- a/rpcs3/Emu/NP/np_structs_extra.h +++ b/rpcs3/Emu/NP/np_structs_extra.h @@ -11,6 +11,7 @@ namespace extra_nps void print_SceNpMatching2RangeFilter(const SceNpMatching2RangeFilter* filt); void print_SceNpMatching2RoomDataInternal(const SceNpMatching2RoomDataInternal* room); void print_SceNpMatching2RoomDataExternal(const SceNpMatching2RoomDataExternal* room); + void print_SceNpMatching2RoomMemberDataExternal(const SceNpMatching2RoomMemberDataExternal* room); void print_SceNpMatching2RoomMemberDataInternal(const SceNpMatching2RoomMemberDataInternal* member); void print_SceNpMatching2CreateJoinRoomRequest(const SceNpMatching2CreateJoinRoomRequest* req); @@ -24,6 +25,7 @@ namespace extra_nps void print_SceNpMatching2SetRoomMemberDataInternalRequest(const SceNpMatching2SetRoomMemberDataInternalRequest* req); void print_SceNpMatching2GetRoomDataExternalListRequest(const SceNpMatching2GetRoomDataExternalListRequest* req); void print_SceNpMatching2GetRoomDataExternalListResponse(const SceNpMatching2GetRoomDataExternalListResponse* resp); + void print_SceNpMatching2GetRoomMemberDataExternalListResponse(const SceNpMatching2GetRoomMemberDataExternalListResponse* resp); void print_SceNpMatching2GetLobbyInfoListRequest(const SceNpMatching2GetLobbyInfoListRequest* resp); diff --git a/rpcs3/Emu/NP/pb_helpers.cpp b/rpcs3/Emu/NP/pb_helpers.cpp index e82fc2ec0a..41b0ca4579 100644 --- a/rpcs3/Emu/NP/pb_helpers.cpp +++ b/rpcs3/Emu/NP/pb_helpers.cpp @@ -171,6 +171,15 @@ namespace np } } + void RoomMemberDataExternal_to_SceNpMatching2RoomMemberDataExternal(event_data& edata, const np2_structs::RoomMemberDataExternal& member, SceNpMatching2RoomMemberDataExternal* member_info, bool include_onlinename, bool include_avatarurl) + { + ensure(member.has_userinfo()); + + UserInfo_to_SceNpUserInfo2(edata, member.userinfo(), &member_info->userInfo, include_onlinename, include_avatarurl); + member_info->joinDate.tick = member.joindate(); + member_info->role = member.role().value(); + } + void SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(event_data& edata, const np2_structs::SearchRoomResponse& resp, SceNpMatching2SearchRoomResponse* search_resp) { search_resp->range.size = resp.rooms_size(); @@ -181,8 +190,7 @@ namespace np for (int i = 0; i < resp.rooms_size(); i++) { const auto& pb_room = resp.rooms(i); - SceNpMatching2RoomDataExternal* cur_room; - cur_room = edata.allocate(sizeof(SceNpMatching2RoomDataExternal), (i > 0) ? prev_room->next : search_resp->roomDataExternal); + SceNpMatching2RoomDataExternal* cur_room = edata.allocate(sizeof(SceNpMatching2RoomDataExternal), (i > 0) ? prev_room->next : search_resp->roomDataExternal); RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, pb_room, cur_room, true, true); prev_room = cur_room; } @@ -196,15 +204,28 @@ namespace np for (int i = 0; i < resp.rooms_size(); i++) { const auto& pb_room = resp.rooms(i); - SceNpMatching2RoomDataExternal* cur_room; - - cur_room = edata.allocate(sizeof(SceNpMatching2RoomDataExternal), (i > 0) ? prev_room->next : get_resp->roomDataExternal); + SceNpMatching2RoomDataExternal* cur_room = edata.allocate(sizeof(SceNpMatching2RoomDataExternal), (i > 0) ? prev_room->next : get_resp->roomDataExternal); RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, pb_room, cur_room, include_onlinename, include_avatarurl); prev_room = cur_room; } } + void GetRoomMemberDataExternalListResponse_to_SceNpMatching2GetRoomMemberDataExternalListResponse(event_data& edata, const np2_structs::GetRoomMemberDataExternalListResponse& resp, SceNpMatching2GetRoomMemberDataExternalListResponse* get_resp, bool include_onlinename, bool include_avatarurl) + { + get_resp->roomMemberDataExternalNum = resp.members_size(); + + SceNpMatching2RoomMemberDataExternal* prev_member = nullptr; + for (int i = 0; i < resp.members_size(); i++) + { + const auto& pb_member = resp.members(i); + SceNpMatching2RoomMemberDataExternal* cur_member = edata.allocate(sizeof(SceNpMatching2RoomMemberDataExternal), (i > 0) ? prev_member->next : get_resp->roomMemberDataExternal); + + RoomMemberDataExternal_to_SceNpMatching2RoomMemberDataExternal(edata, pb_member, cur_member, include_onlinename, include_avatarurl); + prev_member = cur_member; + } + } + u16 RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const np2_structs::RoomDataInternal& resp, SceNpMatching2RoomDataInternal* room_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl) { u16 member_id = 0; diff --git a/rpcs3/Emu/NP/pb_helpers.h b/rpcs3/Emu/NP/pb_helpers.h index c7482d7bc4..dc869210e7 100644 --- a/rpcs3/Emu/NP/pb_helpers.h +++ b/rpcs3/Emu/NP/pb_helpers.h @@ -16,8 +16,10 @@ namespace np void UserInfo_to_SceNpUserInfo(const np2_structs::UserInfo& user, SceNpUserInfo* user_info); void UserInfo_to_SceNpUserInfo2(event_data& edata, const np2_structs::UserInfo& user, SceNpUserInfo2* user_info, bool include_onlinename, bool include_avatarurl); void RoomDataExternal_to_SceNpMatching2RoomDataExternal(event_data& edata, const np2_structs::RoomDataExternal& room, SceNpMatching2RoomDataExternal* room_info, bool include_onlinename, bool include_avatarurl); + void RoomMemberDataExternal_to_SceNpMatching2RoomMemberDataExternal(event_data& edata, const np2_structs::RoomMemberDataExternal& member, SceNpMatching2RoomMemberDataExternal* member_info, bool include_onlinename, bool include_avatarurl); void SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(event_data& edata, const np2_structs::SearchRoomResponse& resp, SceNpMatching2SearchRoomResponse* search_resp); void GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(event_data& edata, const np2_structs::GetRoomDataExternalListResponse& resp, SceNpMatching2GetRoomDataExternalListResponse* get_resp, bool include_onlinename, bool include_avatarurl); + void GetRoomMemberDataExternalListResponse_to_SceNpMatching2GetRoomMemberDataExternalListResponse(event_data& edata, const np2_structs::GetRoomMemberDataExternalListResponse& resp, SceNpMatching2GetRoomMemberDataExternalListResponse* get_resp, bool include_onlinename, bool include_avatarurl); u16 RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const np2_structs::RoomDataInternal& resp, SceNpMatching2RoomDataInternal* room_resp, const SceNpId& npid, bool include_onlinename, bool include_avatarurl); void RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(event_data& edata, const np2_structs::RoomMemberDataInternal& member_data, const SceNpMatching2RoomDataInternal* room_info, SceNpMatching2RoomMemberDataInternal* sce_member_data, bool include_onlinename, bool include_avatarurl); void RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(event_data& edata, const np2_structs::RoomMemberUpdateInfo& resp, SceNpMatching2RoomMemberUpdateInfo* room_info, bool include_onlinename, bool include_avatarurl); diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index cce4fa397b..c1126b8698 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -117,6 +117,7 @@ void fmt_class_string::format(std::string& out, u64 arg) case rpcn::CommandType::LeaveRoom: return "LeaveRoom"; case rpcn::CommandType::SearchRoom: return "SearchRoom"; case rpcn::CommandType::GetRoomDataExternalList: return "GetRoomDataExternalList"; + case rpcn::CommandType::GetRoomMemberDataExternalList: return "GetRoomMemberDataExternalList"; case rpcn::CommandType::SetRoomDataExternal: return "SetRoomDataExternal"; case rpcn::CommandType::GetRoomDataInternal: return "GetRoomDataInternal"; case rpcn::CommandType::SetRoomDataInternal: return "SetRoomDataInternal"; @@ -1915,6 +1916,16 @@ namespace rpcn return forge_request_with_com_id(serialized, communication_id, CommandType::GetRoomDataExternalList, req_id); } + bool rpcn_client::get_room_member_data_external_list(u32 req_id, const SceNpCommunicationId& communication_id, u64 room_id) + { + std::vector data(COMMUNICATION_ID_SIZE + sizeof(u64)); + + rpcn_client::write_communication_id(communication_id, data); + write_to_ptr>(data, COMMUNICATION_ID_SIZE, room_id); + + return forge_send(CommandType::GetRoomMemberDataExternalList, req_id, data); + } + bool rpcn_client::set_roomdata_external(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SetRoomDataExternalRequest* req) { np2_structs::SetRoomDataExternalRequest pb_req; diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index e3c3f47ba9..035dc9cf3c 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -329,6 +329,7 @@ namespace rpcn bool leave_room(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2LeaveRoomRequest* req); bool search_room(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SearchRoomRequest* req); bool get_roomdata_external_list(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2GetRoomDataExternalListRequest* req); + bool get_room_member_data_external_list(u32 req_id, const SceNpCommunicationId& communication_id, u64 room_id); bool set_roomdata_external(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SetRoomDataExternalRequest* req); bool get_roomdata_internal(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2GetRoomDataInternalRequest* req); bool set_roomdata_internal(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SetRoomDataInternalRequest* req); diff --git a/rpcs3/Emu/NP/rpcn_types.h b/rpcs3/Emu/NP/rpcn_types.h index 15fba827d5..28500462e6 100644 --- a/rpcs3/Emu/NP/rpcn_types.h +++ b/rpcs3/Emu/NP/rpcn_types.h @@ -68,6 +68,7 @@ namespace rpcn GetRoomInfoGUI, QuickMatchGUI, SearchJoinRoomGUI, + GetRoomMemberDataExternalList, }; enum class NotificationType : u16 From 96cf5c4e63a798ca8e83fcc070cb6e15f2918b0e Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 31 Jan 2026 03:51:45 +0100 Subject: [PATCH 205/630] Fix generic_async_transaction_context thread handling --- rpcs3/Emu/NP/np_contexts.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/NP/np_contexts.cpp b/rpcs3/Emu/NP/np_contexts.cpp index 8bcfd5f01c..46d773d127 100644 --- a/rpcs3/Emu/NP/np_contexts.cpp +++ b/rpcs3/Emu/NP/np_contexts.cpp @@ -17,7 +17,12 @@ generic_async_transaction_context::generic_async_transaction_context(const SceNp generic_async_transaction_context::~generic_async_transaction_context() { if (thread.joinable()) - thread.join(); + { + if (std::this_thread::get_id() == thread.get_id()) + thread.detach(); + else + thread.join(); + } } std::optional generic_async_transaction_context::get_transaction_status() From 1c08439907753a86ee1628f07d5fcbe86bfdda2f Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 31 Jan 2026 06:26:24 +0100 Subject: [PATCH 206/630] Force disable RPCN IPv6 support for now --- rpcs3/Emu/NP/rpcn_config.h | 2 +- rpcs3/rpcs3qt/rpcn_settings_dialog.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/NP/rpcn_config.h b/rpcs3/Emu/NP/rpcn_config.h index 0a8c7c9cc5..3ea6b707b1 100644 --- a/rpcs3/Emu/NP/rpcn_config.h +++ b/rpcs3/Emu/NP/rpcn_config.h @@ -10,7 +10,7 @@ struct cfg_rpcn : cfg::node cfg::string password{this, "Password", ""}; cfg::string token{this, "Token", ""}; cfg::string hosts{this, "Hosts", "Official RPCN Server|np.rpcs3.net"}; - cfg::_bool ipv6_support{this, "IPv6 support", true}; + cfg::_bool ipv6_support{this, "Experimental IPv6 support", false}; void load(); void save() const; diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp index 24aa0767aa..53097f29fc 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp @@ -185,8 +185,8 @@ rpcn_account_dialog::rpcn_account_dialog(QWidget* parent) QPushButton* btn_test = new QPushButton(tr("Test Account")); QLabel* label_npid = new QLabel(); - QCheckBox* checkbox_disable_ipv6 = new QCheckBox(tr("Disable IPv6")); - checkbox_disable_ipv6->setCheckState(g_cfg_rpcn.get_ipv6_support() ? Qt::Unchecked : Qt::Checked); + // QCheckBox* checkbox_disable_ipv6 = new QCheckBox(tr("Enable IPv6(Experimental)")); + // checkbox_disable_ipv6->setCheckState(g_cfg_rpcn.get_ipv6_support() ? Qt::Checked : Qt::Unchecked); const auto update_npid_label = [label_npid]() { @@ -206,7 +206,7 @@ rpcn_account_dialog::rpcn_account_dialog(QWidget* parent) grp_buttons->setLayout(vbox_buttons); vbox_global->addWidget(grp_buttons); - vbox_global->addWidget(checkbox_disable_ipv6); + // vbox_global->addWidget(checkbox_disable_ipv6); setLayout(vbox_global); @@ -359,11 +359,11 @@ rpcn_account_dialog::rpcn_account_dialog(QWidget* parent) QMessageBox::information(this, tr("RPCN Account Valid!"), tr("Your account is valid!"), QMessageBox::Ok); }); - connect(checkbox_disable_ipv6, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state) - { - g_cfg_rpcn.set_ipv6_support(state == Qt::Unchecked); - g_cfg_rpcn.save(); - }); + // connect(checkbox_disable_ipv6, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state) + // { + // g_cfg_rpcn.set_ipv6_support(state == Qt::Checked); + // g_cfg_rpcn.save(); + // }); } void rpcn_account_dialog::refresh_combobox() From 588cf69dad726a4485af945ba0507193c526ccf7 Mon Sep 17 00:00:00 2001 From: Windsurf7 <70599421+Windsurf7@users.noreply.github.com> Date: Mon, 2 Feb 2026 11:21:02 +0300 Subject: [PATCH 207/630] Add mouse-based gyro emulation (#18113) This change adds a hardcoded mouse-based motion sensor emulation feature, inspired by how Cemu handles mouse-driven gyro input. While the game window is focused, holding the right mouse button enables gyro emulation: - Mouse X movement feeds Motion X - Mouse Y movement feeds Motion Z - Mouse Wheel feeds Motion Y The axis mapping and behavior were tested with the "Spark Runner" minigame in _Sly Cooper: Thieves in Time_ and _Bentley's Hackpack_. In accordance with this minigame, a top-down view motion control scheme relies on the X/Z axes. While the right mouse button is being held, mouse deltas are captured via the Qt native event filter and accumulated in the frontend, then consumed by the pad thread. On right mouse button release, motion values are reset to the neutral center to avoid residual drift. This input path is intentionally independent of pad configuration and works even when a keyboard-only profile is selected. This implementation thus resolves issue #13883 by allowing motion-only gameplay without requiring a physical motion-capable controller. --- rpcs3/Input/mouse_gyro_handler.cpp | 146 ++++++++++++++++++++++++++++ rpcs3/Input/mouse_gyro_handler.h | 33 +++++++ rpcs3/Input/pad_thread.cpp | 7 ++ rpcs3/Input/pad_thread.h | 5 + rpcs3/rpcs3.vcxproj | 2 + rpcs3/rpcs3.vcxproj.filters | 6 ++ rpcs3/rpcs3qt/CMakeLists.txt | 1 + rpcs3/rpcs3qt/gs_frame.cpp | 20 ++++ rpcs3/rpcs3qt/shortcut_settings.cpp | 2 + rpcs3/rpcs3qt/shortcut_settings.h | 1 + 10 files changed, 223 insertions(+) create mode 100644 rpcs3/Input/mouse_gyro_handler.cpp create mode 100644 rpcs3/Input/mouse_gyro_handler.h diff --git a/rpcs3/Input/mouse_gyro_handler.cpp b/rpcs3/Input/mouse_gyro_handler.cpp new file mode 100644 index 0000000000..6f1c7cd637 --- /dev/null +++ b/rpcs3/Input/mouse_gyro_handler.cpp @@ -0,0 +1,146 @@ +#include "mouse_gyro_handler.h" + +#include +#include +#include +#include + +#include + +void mouse_gyro_handler::clear() +{ + active = false; + reset = false; + gyro_x = DEFAULT_MOTION_X; + gyro_y = DEFAULT_MOTION_Y; + gyro_z = DEFAULT_MOTION_Z; +} + +bool mouse_gyro_handler::toggle_enabled() +{ + enabled = !enabled; + clear(); + return enabled; +} + +void mouse_gyro_handler::set_gyro_active() +{ + active = true; +} + +void mouse_gyro_handler::set_gyro_reset() +{ + active = false; + reset = true; +} + +void mouse_gyro_handler::set_gyro_xz(s32 off_x, s32 off_y) +{ + if (!active) + return; + + gyro_x = static_cast(std::clamp(off_x, 0, DEFAULT_MOTION_X * 2 - 1)); + gyro_z = static_cast(std::clamp(off_y, 0, DEFAULT_MOTION_Z * 2 - 1)); +} + +void mouse_gyro_handler::set_gyro_y(s32 steps) +{ + if (!active) + return; + + gyro_y = static_cast(std::clamp(gyro_y + steps, 0, DEFAULT_MOTION_Y * 2 - 1)); +} + +void mouse_gyro_handler::handle_event(QEvent* ev, const QWindow& win) +{ + if (!enabled) + return; + + // Mouse-based motion input. + // Captures mouse events while the game window is focused. + // Updates motion sensor values via mouse position and mouse wheel while RMB is held. + // Intentionally independent of chosen pad configuration. + switch (ev->type()) + { + case QEvent::MouseButtonPress: + { + auto* e = static_cast(ev); + if (e->button() == Qt::RightButton) + { + // Enable mouse-driven gyro emulation while RMB is held. + set_gyro_active(); + } + break; + } + case QEvent::MouseButtonRelease: + { + auto* e = static_cast(ev); + if (e->button() == Qt::RightButton) + { + // Disable gyro emulation and request a one-shot motion reset. + set_gyro_reset(); + } + break; + } + case QEvent::MouseMove: + { + auto* e = static_cast(ev); + + // Track cursor offset from window center. + const QPoint center(win.width() / 2, win.height() / 2); + const QPoint cur = e->position().toPoint(); + + const s32 off_x = cur.x() - center.x() + DEFAULT_MOTION_X; + const s32 off_y = cur.y() - center.y() + DEFAULT_MOTION_Z; + + // Determine motion from relative mouse position while gyro emulation is active. + set_gyro_xz(off_x, off_y); + + break; + } + case QEvent::Wheel: + { + auto* e = static_cast(ev); + + // Track mouse wheel steps. + const s32 steps = e->angleDelta().y() / 120; + + // Accumulate mouse wheel steps while gyro emulation is active. + set_gyro_y(steps); + + break; + } + default: + { + break; + } + } +} + +void mouse_gyro_handler::apply_gyro(const std::shared_ptr& pad) +{ + if (!enabled) + return; + + if (!pad || !pad->is_connected()) + return; + + // Inject mouse-based motion sensor values into pad sensors for gyro emulation. + // The Qt frontend maps cursor offset and wheel input to absolute motion values while RMB is held. + if (reset) + { + // RMB released → reset motion + pad->m_sensors[0].m_value = DEFAULT_MOTION_X; + pad->m_sensors[1].m_value = DEFAULT_MOTION_Y; + pad->m_sensors[2].m_value = DEFAULT_MOTION_Z; + clear(); + } + else + { + // RMB held → accumulate motion + // Axes have been chosen as tested in Sly 4 minigames. Top-down view motion uses X/Z axes. + pad->m_sensors[0].m_value = gyro_x; // Mouse X → Motion X + pad->m_sensors[1].m_value = gyro_y; // Mouse Wheel → Motion Y + pad->m_sensors[2].m_value = gyro_z; // Mouse Y → Motion Z + } +} diff --git a/rpcs3/Input/mouse_gyro_handler.h b/rpcs3/Input/mouse_gyro_handler.h new file mode 100644 index 0000000000..97a745d919 --- /dev/null +++ b/rpcs3/Input/mouse_gyro_handler.h @@ -0,0 +1,33 @@ +#pragma once + +#include "util/types.hpp" +#include "util/atomic.hpp" +#include "Emu/Io/pad_types.h" + +class QEvent; +class QWindow; + +// Mouse-based motion sensor emulation state. +class mouse_gyro_handler +{ +private: + atomic_t enabled = false; // Whether mouse-based gyro emulation mode has been enabled by using the associated hotkey + + atomic_t active = false; // Whether right mouse button is currently held (gyro active) + atomic_t reset = false; // One-shot reset request on right mouse button release + atomic_t gyro_x = DEFAULT_MOTION_X; // Accumulated from mouse X position relative to center + atomic_t gyro_y = DEFAULT_MOTION_Y; // Accumulated from mouse wheel delta + atomic_t gyro_z = DEFAULT_MOTION_Z; // Accumulated from mouse Y position relative to center + + void set_gyro_active(); + void set_gyro_reset(); + void set_gyro_xz(s32 off_x, s32 off_y); + void set_gyro_y(s32 steps); + +public: + void clear(); + bool toggle_enabled(); + + void handle_event(QEvent* ev, const QWindow& win); + void apply_gyro(const std::shared_ptr& pad); +}; diff --git a/rpcs3/Input/pad_thread.cpp b/rpcs3/Input/pad_thread.cpp index afc5a73fce..40887ae5fb 100644 --- a/rpcs3/Input/pad_thread.cpp +++ b/rpcs3/Input/pad_thread.cpp @@ -81,6 +81,9 @@ void pad_thread::Init() { std::lock_guard lock(pad::g_pad_mutex); + // Reset mouse-based gyro state + m_mouse_gyro.clear(); + // Cache old settings if possible std::array pad_settings; for (u32 i = 0; i < CELL_PAD_MAX_PORT_NUM; i++) // max 7 pads @@ -606,6 +609,10 @@ void pad_thread::operator()() if (Emu.IsRunning()) { update_pad_states(); + + // Apply mouse-based gyro emulation. + // Intentionally bound to Player 1 only. + m_mouse_gyro.apply_gyro(m_pads[0]); } m_info.now_connect = connected_devices + num_ldd_pad; diff --git a/rpcs3/Input/pad_thread.h b/rpcs3/Input/pad_thread.h index 7b0e0b79fb..20f53e9034 100644 --- a/rpcs3/Input/pad_thread.h +++ b/rpcs3/Input/pad_thread.h @@ -5,6 +5,7 @@ #include "Emu/Io/pad_types.h" #include "Emu/Io/pad_config.h" #include "Emu/Io/pad_config_types.h" +#include "Input/mouse_gyro_handler.h" #include "Utilities/mutex.h" #include @@ -41,6 +42,8 @@ public: static auto constexpr thread_name = "Pad Thread"sv; + mouse_gyro_handler& get_mouse_gyro() { return m_mouse_gyro; } + protected: void Init(); void InitLddPad(u32 handle, const u32* port_status); @@ -67,6 +70,8 @@ private: bool m_resume_emulation_flag = false; bool m_ps_button_pressed = false; atomic_t m_home_menu_open = false; + + mouse_gyro_handler m_mouse_gyro; }; namespace pad diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 5fbf0491e9..9749f60fcd 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -194,6 +194,7 @@ + @@ -1079,6 +1080,7 @@ $(QTDIR)\bin\moc.exe;%(FullPath) $(QTDIR)\bin\moc.exe;%(FullPath) + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 100a9b1d8f..a011ddf62e 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1272,6 +1272,9 @@ Generated Files\Release + + Io + @@ -1511,6 +1514,9 @@ Io\camera + + Io + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index a8fc4c5886..b59d6f7a11 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -157,6 +157,7 @@ add_library(rpcs3_ui STATIC ../Input/hid_pad_handler.cpp ../Input/keyboard_pad_handler.cpp ../Input/mm_joystick_handler.cpp + ../Input/mouse_gyro_handler.cpp ../Input/pad_thread.cpp ../Input/product_info.cpp ../Input/ps_move_calibration.cpp diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index db66ce68a4..6557168cce 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -19,6 +19,7 @@ #include "Emu/RSX/Overlays/overlay_message.h" #include "Emu/Io/interception.h" #include "Emu/Io/recording_config.h" +#include "Input/pad_thread.h" #include #include @@ -402,6 +403,15 @@ void gs_frame::handle_shortcut(gui::shortcuts::shortcut shortcut_key, const QKey audio::change_volume(-5); break; } + case gui::shortcuts::shortcut::gw_toggle_mouse_gyro: + { + if (auto* pad_thr = pad::get_pad_thread(true)) + { + const bool mouse_gyro_enabled = pad_thr->get_mouse_gyro().toggle_enabled(); + gui_log.notice("Mouse-based gyro emulation %s", mouse_gyro_enabled ? "enabled" : "disabled"); + } + break; + } default: { break; @@ -1216,6 +1226,16 @@ bool gs_frame::event(QEvent* ev) // This will make the cursor visible again if it was hidden by the mouse idle timeout handle_cursor(visibility(), false, false, true); } + + // Handle events for mouse-based gyro emulation. + if (Emu.IsRunning()) + { + if (auto* pad_thr = pad::get_pad_thread(true)) + { + pad_thr->get_mouse_gyro().handle_event(ev, *this); + } + } + return QWindow::event(ev); } diff --git a/rpcs3/rpcs3qt/shortcut_settings.cpp b/rpcs3/rpcs3qt/shortcut_settings.cpp index 039f493dae..64feb94777 100644 --- a/rpcs3/rpcs3qt/shortcut_settings.cpp +++ b/rpcs3/rpcs3qt/shortcut_settings.cpp @@ -37,6 +37,7 @@ void fmt_class_string::format(std::string& out, u64 arg) case shortcut::gw_mute_unmute: return "gw_mute_unmute"; case shortcut::gw_volume_up: return "gw_volume_up"; case shortcut::gw_volume_down: return "gw_volume_down"; + case shortcut::gw_toggle_mouse_gyro: return "gw_toggle_mouse_gyro"; case shortcut::count: return "count"; } @@ -88,6 +89,7 @@ shortcut_settings::shortcut_settings() { shortcut::gw_mute_unmute, shortcut_info{ "gw_mute_unmute", tr("Mute/Unmute Audio"), "Ctrl+Shift+M", shortcut_handler_id::game_window, false } }, { shortcut::gw_volume_up, shortcut_info{ "gw_volume_up", tr("Volume Up"), "Ctrl+Shift++", shortcut_handler_id::game_window, true } }, { shortcut::gw_volume_down, shortcut_info{ "gw_volume_down", tr("Volume Down"), "Ctrl+Shift+-", shortcut_handler_id::game_window, true } }, + { shortcut::gw_toggle_mouse_gyro, shortcut_info{ "gw_toggle_mouse_gyro", tr("Toggle Mouse-based Gyro"), "Ctrl+G", shortcut_handler_id::game_window, false } }, }) { } diff --git a/rpcs3/rpcs3qt/shortcut_settings.h b/rpcs3/rpcs3qt/shortcut_settings.h index db6458accb..be14ee1e30 100644 --- a/rpcs3/rpcs3qt/shortcut_settings.h +++ b/rpcs3/rpcs3qt/shortcut_settings.h @@ -46,6 +46,7 @@ namespace gui gw_mute_unmute, gw_volume_up, gw_volume_down, + gw_toggle_mouse_gyro, count }; From ad90f8b44bdf29ce55c6a9b9ad855bde8ce66752 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 1 Feb 2026 20:20:20 +0300 Subject: [PATCH 208/630] rsx: Conservative MM flush during CPU handling of nv3089_image_in --- rpcs3/Emu/RSX/NV47/HW/nv3089.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp b/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp index 111611d887..6ac502b462 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv3089.cpp @@ -4,6 +4,7 @@ #include "Emu/RSX/RSXThread.h" #include "Emu/RSX/Core/RSXReservationLock.hpp" #include "Emu/RSX/Common/tiled_dma_copy.hpp" +#include "Emu/RSX/Host/MM.h" #include "context_accessors.define.h" @@ -581,9 +582,11 @@ namespace rsx const u16 out_h = REGS(ctx)->blit_engine_output_height(); // Lock here. RSX cannot execute any locking operations from this point, including ZCULL read barriers + const u32 read_length = src.pitch * src.height; + const u32 write_length = dst.pitch * dst.clip_height; auto res = ::rsx::reservation_lock( - dst.rsx_address, dst.pitch * dst.clip_height, - src.rsx_address, src.pitch * src.height); + dst.rsx_address, write_length, + src.rsx_address, read_length); if (!g_cfg.video.force_cpu_blit_processing && (dst.dma == CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER || src.dma == CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER) && @@ -593,6 +596,14 @@ namespace rsx return; } + // Conservative MM flush + rsx::simple_array flush_mm_ranges = + { + utils::address_range64::start_length(reinterpret_cast(dst.pixels), write_length), + utils::address_range64::start_length(reinterpret_cast(src.pixels), read_length) + }; + rsx::mm_flush(flush_mm_ranges); + std::vector mirror_tmp; bool src_is_temp = false; @@ -619,7 +630,7 @@ namespace rsx const bool interpolate = in_inter == blit_engine::transfer_interpolator::foh; auto real_dst = dst.pixels; - const auto tiled_region = RSX(ctx)->get_tiled_memory_region(utils::address_range32::start_length(dst.rsx_address, dst.pitch * dst.clip_height)); + const auto tiled_region = RSX(ctx)->get_tiled_memory_region(utils::address_range32::start_length(dst.rsx_address, write_length)); std::vector tmp; if (tiled_region) From 55aae4dd4067a21adf0ad18c183b15989c12b215 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 2 Feb 2026 20:10:25 +0300 Subject: [PATCH 209/630] vk: Fix NVIDIA crash when resizing the game window quickly --- rpcs3/Emu/RSX/VK/VKGSRender.h | 2 +- rpcs3/Emu/RSX/VK/VKPresent.cpp | 31 +++++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index faae1bb78f..0c93741fcb 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -221,7 +221,7 @@ private: void frame_context_cleanup(vk::frame_context_t *ctx); void advance_queued_frames(); void present(vk::frame_context_t *ctx); - void reinitialize_swapchain(); + bool reinitialize_swapchain(); vk::viewable_image* get_present_source(vk::present_surface_info* info, const rsx::avconf& avconfig); diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index f9fbb114ed..5761a99120 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -33,7 +33,7 @@ namespace } } -void VKGSRender::reinitialize_swapchain() +bool VKGSRender::reinitialize_swapchain() { m_swapchain_dims.width = m_frame->client_width(); m_swapchain_dims.height = m_frame->client_height(); @@ -44,7 +44,7 @@ void VKGSRender::reinitialize_swapchain() if (m_swapchain_dims.width == 0 || m_swapchain_dims.height == 0) { swapchain_unavailable = true; - return; + return false; } // NOTE: This operation will create a hard sync point @@ -97,7 +97,7 @@ void VKGSRender::reinitialize_swapchain() { rsx_log.warning("Swapchain initialization failed. Request ignored [%dx%d]", m_swapchain_dims.width, m_swapchain_dims.height); swapchain_unavailable = true; - return; + return false; } // Re-initialize CPU frame contexts @@ -135,6 +135,7 @@ void VKGSRender::reinitialize_swapchain() swapchain_unavailable = false; should_reinitialize_swapchain = false; + return true; } void VKGSRender::present(vk::frame_context_t *ctx) @@ -426,11 +427,32 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) if (swapchain_unavailable || should_reinitialize_swapchain) { - reinitialize_swapchain(); + // Reinitializing the swapchain is a failable operation. However, not all failures are fatal (e.g minimized window). + // In the worst case, we can have the driver refuse to create the swapchain while we already deleted the previous one. + // In such scenarios, we have to retry a few times before giving up as we cannot proceed without a swapchain. + for (int i = 0; i < 10; ++i) + { + if (reinitialize_swapchain() || m_current_frame) + { + // If m_current_frame exists, then the initialization failure is non-fatal. Proceed as usual. + break; + } + + if (Emu.IsStopped()) + { + m_frame->flip(m_context); + rsx::thread::flip(info); + return; + } + + std::this_thread::sleep_for(100ms); + } } m_profiler.start(); + ensure(m_current_frame, "Invalid swapchain setup. Resizing the game window failed."); + if (m_current_frame == &m_aux_frame_context) { m_current_frame = &m_frame_context_storage[m_current_queue_index]; @@ -582,6 +604,7 @@ void VKGSRender::flip(const rsx::display_flip_info_t& info) rsx_log.warning("vkAcquireNextImageKHR failed with VK_ERROR_OUT_OF_DATE_KHR. Flip request ignored until surface is recreated."); swapchain_unavailable = true; reinitialize_swapchain(); + ensure(m_current_frame, "Could not reinitialize swapchain after VK_ERROR_OUT_OF_DATE_KHR signal!"); continue; default: vk::die_with_error(status); From 8ba48932d3b809feb1caad17790d07bebf6ae225 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 2 Feb 2026 09:38:44 +0100 Subject: [PATCH 210/630] Qt: try to fix update downloader --- rpcs3/rpcs3qt/downloader.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rpcs3/rpcs3qt/downloader.cpp b/rpcs3/rpcs3qt/downloader.cpp index dd861da73e..ae97dc8f77 100644 --- a/rpcs3/rpcs3qt/downloader.cpp +++ b/rpcs3/rpcs3qt/downloader.cpp @@ -99,7 +99,7 @@ void downloader::start(const std::string& url, bool follow_location, bool show_p // The downloader's signals are expected to be disconnected and customized before start is called. // Therefore we need to (re)connect its signal(s) here and not in the constructor. - connect(this, &downloader::signal_buffer_update, this, &downloader::handle_buffer_update); + connect(this, &downloader::signal_buffer_update, this, &downloader::handle_buffer_update, static_cast(Qt::QueuedConnection | Qt::UniqueConnection)); if (show_progress_dialog) { @@ -169,7 +169,7 @@ usz downloader::update_buffer(char* data, usz size) const auto old_size = m_curl_buf.size(); const auto new_size = old_size + size; m_curl_buf.resize(static_cast(new_size)); - memcpy(m_curl_buf.data() + old_size, data, size); + std::memcpy(m_curl_buf.data() + old_size, data, size); int max = 0; @@ -197,6 +197,5 @@ void downloader::handle_buffer_update(int size, int max) const { m_progress_dialog->SetRange(0, max > 0 ? max : m_progress_dialog->maximum()); m_progress_dialog->SetValue(size); - QApplication::processEvents(); } } From f1e679d9819dc1be5b097d068ef5e62d7f97a2ba Mon Sep 17 00:00:00 2001 From: trautamaki <13891897+trautamaki@users.noreply.github.com> Date: Tue, 3 Feb 2026 09:00:48 +0200 Subject: [PATCH 211/630] Switch from FFmpeg av_opt_set_* to swr_alloc_set_opts2 (#18138) ffmpeg 7 doesn't allow to set in_channel_count and out_channel_count anymore --- rpcs3/util/media_utils.cpp | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/rpcs3/util/media_utils.cpp b/rpcs3/util/media_utils.cpp index 571eaa74fd..284f6eb758 100644 --- a/rpcs3/util/media_utils.cpp +++ b/rpcs3/util/media_utils.cpp @@ -575,34 +575,28 @@ namespace utils return; } - // Prepare resampler - av.swr = swr_alloc(); - if (!av.swr) - { - media_log.error("audio_decoder: Failed to allocate resampler for stream #%u in file '%s'", stream_index, path); - has_error = true; - return; - } - const int dst_channels = 2; const AVChannelLayout dst_channel_layout = AV_CHANNEL_LAYOUT_STEREO; const AVSampleFormat dst_format = AV_SAMPLE_FMT_FLT; - int set_err = 0; - if ((set_err = av_opt_set_int(av.swr, "in_channel_count", stream->codecpar->ch_layout.nb_channels, 0)) || - (set_err = av_opt_set_int(av.swr, "out_channel_count", dst_channels, 0)) || - (set_err = av_opt_set_chlayout(av.swr, "in_channel_layout", &stream->codecpar->ch_layout, 0)) || - (set_err = av_opt_set_chlayout(av.swr, "out_channel_layout", &dst_channel_layout, 0)) || - (set_err = av_opt_set_int(av.swr, "in_sample_rate", stream->codecpar->sample_rate, 0)) || - (set_err = av_opt_set_int(av.swr, "out_sample_rate", sample_rate, 0)) || - (set_err = av_opt_set_sample_fmt(av.swr, "in_sample_fmt", static_cast(stream->codecpar->format), 0)) || - (set_err = av_opt_set_sample_fmt(av.swr, "out_sample_fmt", dst_format, 0))) + const int set_err = swr_alloc_set_opts2(&av.swr, &dst_channel_layout, dst_format, + sample_rate, &stream->codecpar->ch_layout, + static_cast(stream->codecpar->format), + stream->codecpar->sample_rate, 0, nullptr); + if (set_err < 0) { media_log.error("audio_decoder: Failed to set resampler options: Error: %d='%s'", set_err, av_error_to_string(set_err)); has_error = true; return; } + if (!av.swr) + { + media_log.error("audio_decoder: Failed to allocate resampler for stream #%u in file '%s'", stream_index, path); + has_error = true; + return; + } + if (int err = swr_init(av.swr); err < 0 || !swr_is_initialized(av.swr)) { media_log.error("audio_decoder: Resampler has not been properly initialized: %d='%s'", err, av_error_to_string(err)); From 622fe1ce478025adaede0d01fdf019af7af3ab5d Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 3 Feb 2026 07:26:09 +0100 Subject: [PATCH 212/630] Qt: don't filter log if the input dialog was canceled --- rpcs3/rpcs3qt/log_viewer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/log_viewer.cpp b/rpcs3/rpcs3qt/log_viewer.cpp index 3a566937a7..753f8cc0f5 100644 --- a/rpcs3/rpcs3qt/log_viewer.cpp +++ b/rpcs3/rpcs3qt/log_viewer.cpp @@ -187,7 +187,10 @@ void log_viewer::show_context_menu(const QPoint& pos) connect(filter, &QAction::triggered, this, [this]() { - m_filter_term = QInputDialog::getText(this, tr("Filter log"), tr("Enter text"), QLineEdit::EchoMode::Normal, m_filter_term); + bool ok = false; + QString filter_term = QInputDialog::getText(this, tr("Filter log"), tr("Enter text"), QLineEdit::EchoMode::Normal, m_filter_term, &ok); + if (!ok) return; + m_filter_term = std::move(filter_term); filter_log(); }); From 3eb8fdaef4582d29f02c02e443506b25398063fe Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 3 Feb 2026 07:38:01 +0100 Subject: [PATCH 213/630] Qt: simplify log level filtering in log viewer --- rpcs3/rpcs3qt/log_viewer.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/rpcs3/rpcs3qt/log_viewer.cpp b/rpcs3/rpcs3qt/log_viewer.cpp index 753f8cc0f5..8934ef0a7b 100644 --- a/rpcs3/rpcs3qt/log_viewer.cpp +++ b/rpcs3/rpcs3qt/log_viewer.cpp @@ -325,22 +325,17 @@ void log_viewer::filter_log() const auto add_line = [this, &result, &excluded_log_levels, ×tamp_regexp, &thread_regexp](QString& line) { - bool exclude_line = false; - - for (const QString& log_level_prefix : excluded_log_levels) + if (!line.isEmpty()) { - if (line.startsWith(log_level_prefix)) + for (QStringView log_level_prefix : excluded_log_levels) { - exclude_line = true; - break; + if (line.startsWith(log_level_prefix)) + { + return; + } } } - if (exclude_line) - { - return; - } - if (m_filter_term.isEmpty() || line.contains(m_filter_term)) { if (line.isEmpty()) From 294050986f58baa71fdc15a05559120a40b3a22a Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 3 Feb 2026 08:24:42 +0100 Subject: [PATCH 214/630] Qt: allow to exclude strings in log viewer --- rpcs3/rpcs3qt/log_viewer.cpp | 96 ++++++++++++++++++++++++++---------- rpcs3/rpcs3qt/log_viewer.h | 3 ++ 2 files changed, 72 insertions(+), 27 deletions(-) diff --git a/rpcs3/rpcs3qt/log_viewer.cpp b/rpcs3/rpcs3qt/log_viewer.cpp index 8934ef0a7b..b69c07901e 100644 --- a/rpcs3/rpcs3qt/log_viewer.cpp +++ b/rpcs3/rpcs3qt/log_viewer.cpp @@ -28,7 +28,8 @@ LOG_CHANNEL(gui_log, "GUI"); log_viewer::log_viewer(std::shared_ptr gui_settings) : m_gui_settings(std::move(gui_settings)) { - setWindowTitle(tr("Log Viewer")); + update_title(); + setObjectName("log_viewer"); setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_StyledBackground); @@ -59,15 +60,33 @@ log_viewer::log_viewer(std::shared_ptr gui_settings) connect(m_log_text, &QWidget::customContextMenuRequested, this, &log_viewer::show_context_menu); } +void log_viewer::update_title() +{ + QString suffix; + + if (!m_filter_term.isEmpty()) + { + suffix = tr(" | Filter '%0'").arg(m_filter_term); + } + + if (!m_exclude_term.isEmpty()) + { + suffix += tr(" | Exclude '%0'").arg(m_exclude_term); + } + + setWindowTitle(tr("Log Viewer%0").arg(suffix)); +} + void log_viewer::show_context_menu(const QPoint& pos) { QMenu menu; - QAction* clear = new QAction(tr("&Clear")); - QAction* copy = new QAction(tr("&Copy")); - QAction* open = new QAction(tr("&Open log file")); - QAction* save = new QAction(tr("&Save filtered log")); - QAction* filter = new QAction(tr("&Filter log")); - QAction* config = new QAction(tr("&Check config")); + QAction* clear = new QAction(tr("&Clear")); + QAction* copy = new QAction(tr("&Copy")); + QAction* open = new QAction(tr("&Open log file")); + QAction* save = new QAction(tr("&Save filtered log")); + QAction* filter = new QAction(tr("&Filter log%0").arg(m_filter_term.isEmpty() ? "" : QString(" (%0)").arg(m_filter_term))); + QAction* exclude = new QAction(tr("&Exclude%0").arg(m_exclude_term.isEmpty() ? "" : QString(" (%0)").arg(m_exclude_term))); + QAction* config = new QAction(tr("&Check config")); QAction* timestamps = new QAction(tr("&Show Timestamps")); timestamps->setCheckable(true); @@ -91,7 +110,7 @@ void log_viewer::show_context_menu(const QPoint& pos) QAction* trace_act = new QAction(tr("Trace"), log_level_acts); log_level_acts->setExclusive(false); - auto init_action = [this](QAction* act, logs::level logLevel) + const auto init_action = [this](QAction* act, logs::level logLevel) { act->setCheckable(true); act->setChecked(m_log_levels.test(static_cast(logLevel))); @@ -120,6 +139,7 @@ void log_viewer::show_context_menu(const QPoint& pos) menu.addAction(open); menu.addAction(config); menu.addAction(filter); + menu.addAction(exclude); menu.addAction(save); menu.addSeparator(); menu.addAction(timestamps); @@ -191,6 +211,18 @@ void log_viewer::show_context_menu(const QPoint& pos) QString filter_term = QInputDialog::getText(this, tr("Filter log"), tr("Enter text"), QLineEdit::EchoMode::Normal, m_filter_term, &ok); if (!ok) return; m_filter_term = std::move(filter_term); + update_title(); + filter_log(); + }); + + connect(exclude, &QAction::triggered, this, [this]() + { + bool ok = false; + QString exclude_term = QInputDialog::getText(this, tr("Exclude"), tr("Enter text (comma separated)"), QLineEdit::EchoMode::Normal, m_exclude_term, &ok); + if (!ok) return; + m_exclude_term = std::move(exclude_term); + m_exclude_terms = m_exclude_term.split(',', Qt::SkipEmptyParts); + update_title(); filter_log(); }); @@ -312,7 +344,7 @@ void log_viewer::filter_log() if (!m_log_levels.test(static_cast(logs::level::notice))) excluded_log_levels.push_back("·! "); if (!m_log_levels.test(static_cast(logs::level::trace))) excluded_log_levels.push_back("·T "); - if (m_filter_term.isEmpty() && excluded_log_levels.empty() && m_show_timestamps && m_show_threads && !m_last_actions_only) + if (m_filter_term.isEmpty() && m_exclude_terms.isEmpty() && excluded_log_levels.empty() && m_show_timestamps && m_show_threads && !m_last_actions_only) { set_text_and_keep_position(m_full_log); return; @@ -334,30 +366,40 @@ void log_viewer::filter_log() return; } } + + for (QStringView term : m_exclude_terms) + { + if (line.contains(term)) + { + return; + } + } } - if (m_filter_term.isEmpty() || line.contains(m_filter_term)) + if (!m_filter_term.isEmpty() && !line.contains(m_filter_term)) { - if (line.isEmpty()) - { - result += "\n"; - return; - } + return; + } - if (!m_show_timestamps) - { - line.remove(timestamp_regexp); - } + if (line.isEmpty()) + { + result += "\n"; + return; + } - if (!m_show_threads) - { - line.remove(thread_regexp); - } + if (!m_show_timestamps) + { + line.remove(timestamp_regexp); + } - if (!line.isEmpty()) - { - result += line + "\n"; - } + if (!m_show_threads) + { + line.remove(thread_regexp); + } + + if (!line.isEmpty()) + { + result += line + "\n"; } }; diff --git a/rpcs3/rpcs3qt/log_viewer.h b/rpcs3/rpcs3qt/log_viewer.h index 85ece2688b..d6ba2ff2a4 100644 --- a/rpcs3/rpcs3qt/log_viewer.h +++ b/rpcs3/rpcs3qt/log_viewer.h @@ -23,6 +23,7 @@ private Q_SLOTS: void show_context_menu(const QPoint& pos); private: + void update_title(); void set_text_and_keep_position(const QString& text); void filter_log(); bool is_valid_file(const QMimeData& md, bool save = false); @@ -30,6 +31,8 @@ private: std::shared_ptr m_gui_settings; QString m_path_last; QString m_filter_term; + QString m_exclude_term; + QStringList m_exclude_terms; QString m_full_log; QPlainTextEdit* m_log_text; LogHighlighter* m_log_highlighter; From 98aaafe4a4ba7f0b28686bbe91141123ccef0f46 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 19 Jan 2026 08:28:08 +0100 Subject: [PATCH 215/630] Update libpng to 1.6.54 --- 3rdparty/libpng/libpng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libpng/libpng b/3rdparty/libpng/libpng index 4e3f57d50f..02f2b4f469 160000 --- a/3rdparty/libpng/libpng +++ b/3rdparty/libpng/libpng @@ -1 +1 @@ -Subproject commit 4e3f57d50f552841550a36eabbb3fbcecacb7750 +Subproject commit 02f2b4f4699f0ef9111a6534f093b53732df4452 From 7a6b34cac398c415d6efb728c2789ad998319019 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 3 Feb 2026 08:47:55 +0100 Subject: [PATCH 216/630] Update Qt to 6.10.2 --- .github/workflows/rpcs3.yml | 6 +++--- BUILDING.md | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 1cd5bfbfd8..90ee8555ad 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -134,7 +134,7 @@ jobs: runs-on: macos-14 env: CCACHE_DIR: /tmp/ccache_dir - QT_VER: '6.10.1' + QT_VER: '6.10.2' QT_VER_MAIN: '6' LLVM_COMPILER_VER: '21' RELEASE_MESSAGE: ../GitHubReleaseMessage.txt @@ -213,9 +213,9 @@ jobs: env: COMPILER: msvc QT_VER_MAIN: '6' - QT_VER: '6.10.1' + QT_VER: '6.10.2' QT_VER_MSVC: 'msvc2022' - QT_DATE: '202511161843' + QT_DATE: '202601261212' LLVM_VER: '19.1.7' VULKAN_VER: '1.3.268.0' VULKAN_SDK_SHA: '8459ef49bd06b697115ddd3d97c9aec729e849cd775f5be70897718a9b3b9db5' diff --git a/BUILDING.md b/BUILDING.md index 26295d0a16..b31b3fee4e 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -20,26 +20,26 @@ The following tools are required to build RPCS3 on Windows 10 or later: with standalone **CMake** tool. - [Python 3.6+](https://www.python.org/downloads/) (add to PATH) -- [Qt 6.10.1](https://www.qt.io/download-qt-installer) In case you can't download from the official installer, you can use [Another Qt installer](https://github.com/miurahr/aqtinstall) (In that case you will need to manually add the "qtmultimedia" module when installing Qt) +- [Qt 6.10.2](https://www.qt.io/download-qt-installer) In case you can't download from the official installer, you can use [Another Qt installer](https://github.com/miurahr/aqtinstall) (In that case you will need to manually add the "qtmultimedia" module when installing Qt) - [Vulkan SDK 1.3.268.0](https://vulkan.lunarg.com/sdk/home) (see "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/windows/getting_started.html)) for now future SDKs don't work. You need precisely 1.3.268.0. The `sln` solution available only on **Visual Studio** is the preferred building solution. It easily allows to build the **RPCS3** application in `Release` and `Debug` mode. In order to build **RPCS3** with the `sln` solution (with **Visual Studio**), **Qt** libs need to be detected. To detect the libs: -- add and set the `QTDIR` environment variable, e.g. `\6.10.1\msvc2022_64\` +- add and set the `QTDIR` environment variable, e.g. `\6.10.2\msvc2022_64\` - or use the [Visual Studio Qt Plugin](https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools2022) **NOTE:** If you have issues with the **Visual Studio Qt Plugin**, you may want to uninstall it and install the [Legacy Qt Plugin](https://marketplace.visualstudio.com/items?itemName=TheQtCompany.LEGACYQtVisualStudioTools2022) instead. In order to build **RPCS3** with the `CMake` solution (with both **Visual Studio** and standalone **CMake** tool): -- add and set the `Qt6_ROOT` environment variable to the **Qt** libs path, e.g. `\6.10.1\msvc2022_64\` +- add and set the `Qt6_ROOT` environment variable to the **Qt** libs path, e.g. `\6.10.2\msvc2022_64\` ### Linux These are the essentials tools to build RPCS3 on Linux. Some of them can be installed through your favorite package manager: - Clang 17+ or GCC 13+ - [CMake 3.28.0+](https://www.cmake.org/download/) -- [Qt 6.10.1](https://www.qt.io/download-qt-installer) +- [Qt 6.10.2](https://www.qt.io/download-qt-installer) - [Vulkan SDK 1.3.268.0](https://vulkan.lunarg.com/sdk/home) (See "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/linux/getting_started.html)) for now future SDKs don't work. You need precisely 1.3.268.0. - [SDL3](https://github.com/libsdl-org/SDL/releases) (for the FAudio backend) @@ -123,7 +123,7 @@ Start **Visual Studio**, click on `Open a project or solution` and select the `r ##### Configuring the Qt Plugin (if used) 1) go to `Extensions->Qt VS Tools->Qt Versions` -2) add the path to your Qt installation with compiler e.g. `\6.10.1\msvc2022_64`, version will fill in automatically +2) add the path to your Qt installation with compiler e.g. `\6.10.2\msvc2022_64`, version will fill in automatically 3) go to `Extensions->Qt VS Tools->Options->Legacy Project Format`. (Only available in the **Legacy Qt Plugin**) 4) set `Build: Run pre-build setup` to `true`. (Only available in the **Legacy Qt Plugin**) From 43b2ce65773d2edc00a4499b40607cbdc7e70c81 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 3 Feb 2026 09:37:39 +0100 Subject: [PATCH 217/630] MouseHandler: minor cleanup --- rpcs3/Emu/Io/MouseHandler.cpp | 6 +++--- rpcs3/Emu/Io/MouseHandler.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Io/MouseHandler.cpp b/rpcs3/Emu/Io/MouseHandler.cpp index 9fd37463cd..7c4edcb449 100644 --- a/rpcs3/Emu/Io/MouseHandler.cpp +++ b/rpcs3/Emu/Io/MouseHandler.cpp @@ -33,12 +33,12 @@ void MouseHandlerBase::save(utils::serial& ar) bool MouseHandlerBase::is_time_for_update(double elapsed_time_ms) { - steady_clock::time_point now = steady_clock::now(); - const double elapsed_ms = (now - last_update).count() / 1'000'000.; + const steady_clock::time_point now = steady_clock::now(); + const double elapsed_ms = (now - m_last_update).count() / 1'000'000.; if (elapsed_ms > elapsed_time_ms) { - last_update = now; + m_last_update = now; return true; } return false; diff --git a/rpcs3/Emu/Io/MouseHandler.h b/rpcs3/Emu/Io/MouseHandler.h index 6a77f44d0e..4b31a6a60d 100644 --- a/rpcs3/Emu/Io/MouseHandler.h +++ b/rpcs3/Emu/Io/MouseHandler.h @@ -128,7 +128,7 @@ class MouseHandlerBase protected: MouseInfo m_info{}; std::vector m_mice; - steady_clock::time_point last_update{}; + steady_clock::time_point m_last_update{}; bool is_time_for_update(double elapsed_time_ms = 10.0); // 4-10 ms, let's use 10 for now From ebf9374ccdfe9bc1d8a9535d6b3c5335e03e9ac6 Mon Sep 17 00:00:00 2001 From: silviolet Date: Tue, 3 Feb 2026 19:27:17 -0500 Subject: [PATCH 218/630] Fixed typos in rpcs3/System.cpp - changed string containing a typo buyes -> bytes - capitalized ps2/ps3 to PS2/PS3 --- rpcs3/Emu/System.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index b204cc38b9..717e4ab59a 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -252,7 +252,7 @@ void init_fxo_for_exec(utils::serial* ar, bool full = false) // Reserved area if (!load_and_check_reserved(*ar, advance)) { - sys_log.error("Potential failure to load savestate: padding buyes are not 0. %s", *ar); + sys_log.error("Potential failure to load savestate: padding bytes are not 0. %s", *ar); } } } @@ -310,7 +310,7 @@ static void fixup_settings(const psf::registry* _psf) if (g_cfg.net.net_active == np_internet_status::disabled && g_cfg.net.psn_status != np_psn_status::disabled) { - sys_log.warning("Net status was set to disconnected so psn status was disabled"); + sys_log.warning("Net status was set to disconnected so PSN status was disabled."); g_cfg.net.psn_status.set(np_psn_status::disabled); } } @@ -4642,7 +4642,7 @@ game_boot_result Emulator::InsertDisc(const std::string& path) else { // TODO: find out where other discs are mounted - sys_log.todo("Mounting non-ps2/ps3 disc in dev_bdvd. Is this correct? (path='%s')", disc_root); + sys_log.todo("Mounting non-PS2/PS3 disc in dev_bdvd. Is this correct? (path='%s')", disc_root); ensure(vfs::mount("/dev_bdvd", disc_root)); } From 93fd33a19aa6f9b0c3e6ff34c13af824c2e226ff Mon Sep 17 00:00:00 2001 From: Malcolm Date: Fri, 6 Feb 2026 02:22:27 +0000 Subject: [PATCH 219/630] ARM: Use ISB instead of yield in place of x86 pause ISB isn't an exact match for pause, but it does slow down execution at least a litle. Unfortunately, yield does nothing on machines without SMT (99% of aarch64 machines) --- rpcs3/util/asm.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/util/asm.hpp b/rpcs3/util/asm.hpp index 56aa955652..0aea4c10c2 100644 --- a/rpcs3/util/asm.hpp +++ b/rpcs3/util/asm.hpp @@ -175,7 +175,7 @@ namespace utils inline void pause() { #if defined(ARCH_ARM64) - __asm__ volatile("yield"); + __asm__ volatile("isb" ::: "memory"); #elif defined(ARCH_X64) _mm_pause(); #else From 93dbdead24e1474a94c59fffc1f6cfb25abe488b Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 6 Feb 2026 06:52:00 +0100 Subject: [PATCH 220/630] Improve add friend logging/dialogs --- rpcs3/Emu/NP/rpcn_client.cpp | 17 ++++---- rpcs3/Emu/NP/rpcn_client.h | 2 +- rpcs3/rpcs3qt/rpcn_settings_dialog.cpp | 54 +++++++++++++++++++------- rpcs3/rpcs3qt/rpcn_settings_dialog.h | 1 + 4 files changed, 50 insertions(+), 24 deletions(-) diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index c1126b8698..d7bb274c66 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -1467,7 +1467,7 @@ namespace rpcn return error; } - bool rpcn_client::add_friend(const std::string& friend_username) + std::optional rpcn_client::add_friend(const std::string& friend_username) { std::vector data; std::copy(friend_username.begin(), friend_username.end(), std::back_inserter(data)); @@ -1478,19 +1478,18 @@ namespace rpcn std::vector packet_data; if (!forge_send_reply(CommandType::AddFriend, req_id, data, packet_data)) { - return false; + return std::nullopt; } vec_stream reply(packet_data); - auto error = static_cast(reply.get()); + const auto error = static_cast(reply.get()); - if (error != rpcn::ErrorType::NoError) - { - return false; - } + if (error == ErrorType::NoError) + rpcn_log.success("add_friend(\"%s\") succeeded", friend_username); + else + rpcn_log.error("add_friend(\"%s\") failed with error: %s", error); - rpcn_log.success("You have successfully added \"%s\" as a friend", friend_username); - return true; + return error; } bool rpcn_client::remove_friend(const std::string& friend_username) diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index 035dc9cf3c..56ba17d04d 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -293,7 +293,7 @@ namespace rpcn ErrorType send_reset_token(std::string_view npid, std::string_view email); ErrorType reset_password(std::string_view npid, std::string_view token, std::string_view password); ErrorType delete_account(); - bool add_friend(const std::string& friend_username); + std::optional add_friend(const std::string& friend_username); bool remove_friend(const std::string& friend_username); u32 get_num_friends(); diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp index 53097f29fc..6de6007b31 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp @@ -1262,13 +1262,10 @@ rpcn_friends_dialog::rpcn_friends_dialog(QWidget* parent) connect(accept_request_action, &QAction::triggered, this, [this, str_sel_friend]() { - if (!m_rpcn->add_friend(str_sel_friend)) - { - QMessageBox::critical(this, tr("Error adding a friend!"), tr("An error occurred while trying to add a friend!"), QMessageBox::Ok); - } - else + if (add_friend_with_error_dialog(str_sel_friend)) { QMessageBox::information(this, tr("Friend added!"), tr("You've successfully added a friend!"), QMessageBox::Ok); + return; } }); @@ -1304,11 +1301,8 @@ rpcn_friends_dialog::rpcn_friends_dialog(QWidget* parent) connect(send_friend_request_action, &QAction::triggered, this, [this, str_sel_friend]() { - if (!m_rpcn->add_friend(str_sel_friend)) - { - QMessageBox::critical(this, tr("Error sending a friend request!"), tr("An error occurred while trying to send a friend request!"), QMessageBox::Ok); + if (!add_friend_with_error_dialog(str_sel_friend)) return; - } QString qstr_friend = QString::fromStdString(str_sel_friend); add_update_list(m_lst_requests, qstr_friend, m_icon_request_sent, QVariant(false)); @@ -1341,11 +1335,7 @@ rpcn_friends_dialog::rpcn_friends_dialog(QWidget* parent) QMessageBox::critical(this, tr("Error validating username!"), tr("The username you entered is invalid!"), QMessageBox::Ok); } - if (!m_rpcn->add_friend(str_friend_username)) - { - QMessageBox::critical(this, tr("Error adding friend!"), tr("An error occurred while adding a friend!"), QMessageBox::Ok); - } - else + if (add_friend_with_error_dialog(str_friend_username)) { add_update_list(m_lst_requests, QString::fromStdString(str_friend_username), m_icon_request_sent, QVariant(false)); QMessageBox::information(this, tr("Friend added!"), tr("Friend was successfully added!"), QMessageBox::Ok); @@ -1360,6 +1350,42 @@ rpcn_friends_dialog::~rpcn_friends_dialog() m_rpcn->remove_friend_cb(friend_callback, this); } +bool rpcn_friends_dialog::add_friend_with_error_dialog(const std::string& friend_username) +{ + QString err_msg; + const auto opt_error = m_rpcn->add_friend(friend_username); + + if (opt_error.has_value()) + { + const auto error = opt_error.value(); + + if (error != rpcn::ErrorType::NoError) + { + switch (error) + { + case rpcn::ErrorType::NotFound: err_msg = tr("The specified username does not exist."); break; + case rpcn::ErrorType::InvalidInput: err_msg = tr("You cannot add yourself as a friend."); break; + case rpcn::ErrorType::Blocked: err_msg = tr("You or the other user have the other blocked."); break; + case rpcn::ErrorType::AlreadyFriend: err_msg = tr("You are already friends with this user."); break; + case rpcn::ErrorType::DbFail: err_msg = tr("A database error occurred. Please try again later."); break; + default: err_msg = tr("An unexpected error occurred."); break; + } + } + } + else + { + err_msg = tr("Failed to send the friend request."); + } + + if (!err_msg.isEmpty()) + { + QMessageBox::critical(this, tr("Friend Request Failed"), err_msg, QMessageBox::Ok); + return false; + } + + return true; +} + bool rpcn_friends_dialog::is_ok() const { return m_rpcn_ok; diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.h b/rpcs3/rpcs3qt/rpcn_settings_dialog.h index 89d8253220..c28828e410 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.h +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.h @@ -121,6 +121,7 @@ public: private: void add_update_list(QListWidget* list, const QString& name, const QIcon& icon, const QVariant& data); void remove_list(QListWidget* list, const QString& name); + bool add_friend_with_error_dialog(const std::string& friend_username); private Q_SLOTS: void add_update_friend(const QString& name, bool status); From aeaa62a28c36f352d5c2bf6bb4e1cadc4600ff00 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 8 Feb 2026 14:35:28 +0300 Subject: [PATCH 221/630] rsx/sync: Do not allow short-circuiting behavior when releasing GCM labels via host queue --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 4 ++-- rpcs3/Emu/RSX/GL/GLGSRender.h | 2 +- rpcs3/Emu/RSX/NV47/HW/nv406e.cpp | 4 ++-- rpcs3/Emu/RSX/NV47/HW/nv4097.cpp | 10 +++++----- rpcs3/Emu/RSX/NV47/HW/nv47_sync.hpp | 4 ++-- rpcs3/Emu/RSX/RSXThread.h | 2 +- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 11 ++++------- rpcs3/Emu/RSX/VK/VKGSRender.h | 2 +- 8 files changed, 18 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index acf258cc56..ebff202303 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1351,7 +1351,7 @@ void GLGSRender::notify_tile_unbound(u32 tile) } } -bool GLGSRender::release_GCM_label(u32 address, u32 args) +bool GLGSRender::release_GCM_label(u32 type, u32 address, u32 args) { if (!backend_config.supports_host_gpu_labels) { @@ -1360,7 +1360,7 @@ bool GLGSRender::release_GCM_label(u32 address, u32 args) auto host_ctx = ensure(m_host_dma_ctrl->host_ctx()); - if (host_ctx->texture_loads_completed()) + if (type == NV4097_TEXTURE_READ_SEMAPHORE_RELEASE && host_ctx->texture_loads_completed()) { // We're about to poll waiting for GPU state, ensure the context is still valid. gl::check_state(); diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index 5627216055..a05eb0bf3d 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -206,7 +206,7 @@ public: void discard_occlusion_query(rsx::reports::occlusion_query_info* query) override; // DMA - bool release_GCM_label(u32 address, u32 data) override; + bool release_GCM_label(u32 type, u32 address, u32 data) override; void enqueue_host_context_write(u32 offset, u32 size, const void* data); void on_guest_texture_read(); diff --git a/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp b/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp index cbb04d140a..4307cc8289 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp @@ -86,7 +86,7 @@ namespace rsx RSX(ctx)->performance_counters.idle_time += (get_system_time() - start); } - void semaphore_release(context* ctx, u32 /*reg*/, u32 arg) + void semaphore_release(context* ctx, u32 reg, u32 arg) { const u32 offset = REGS(ctx)->semaphore_offset_406e(); @@ -122,7 +122,7 @@ namespace rsx arg = 1; } - util::write_gcm_label(ctx, addr, arg); + util::write_gcm_label(ctx, reg, addr, arg); } } } diff --git a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp index 929925bcb1..17ee040f8c 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp @@ -690,7 +690,7 @@ namespace rsx }); } - void texture_read_semaphore_release(context* ctx, u32 /*reg*/, u32 arg) + void texture_read_semaphore_release(context* ctx, u32 reg, u32 arg) { // Pipeline barrier seems to be equivalent to a SHADER_READ stage barrier. // Ideally the GPU only needs to have cached all textures declared up to this point before writing the label. @@ -715,15 +715,15 @@ namespace rsx if (g_cfg.video.strict_rendering_mode) [[ unlikely ]] { - util::write_gcm_label(ctx, addr, arg); + util::write_gcm_label(ctx, reg, addr, arg); } else { - util::write_gcm_label(ctx, addr, arg); + util::write_gcm_label(ctx, reg, addr, arg); } } - void back_end_write_semaphore_release(context* ctx, u32 /*reg*/, u32 arg) + void back_end_write_semaphore_release(context* ctx, u32 reg, u32 arg) { // Full pipeline barrier. GPU must flush pipeline before writing the label @@ -744,7 +744,7 @@ namespace rsx } const u32 val = (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff); - util::write_gcm_label(ctx, addr, val); + util::write_gcm_label(ctx, reg, addr, val); } void sync(context* ctx, u32, u32) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv47_sync.hpp b/rpcs3/Emu/RSX/NV47/HW/nv47_sync.hpp index 9f39f84c00..fe2522c31c 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv47_sync.hpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv47_sync.hpp @@ -13,13 +13,13 @@ namespace rsx namespace util { template - static void write_gcm_label(context* ctx, u32 address, u32 data) + static void write_gcm_label(context* ctx, u32 type, u32 address, u32 data) { const bool is_flip_sema = (address == (RSX(ctx)->label_addr + 0x10) || address == (RSX(ctx)->device_addr + 0x30)); if (!is_flip_sema) { // First, queue the GPU work. If it flushes the queue for us, the following routines will be faster. - const bool handled = RSX(ctx)->get_backend_config().supports_host_gpu_labels && RSX(ctx)->release_GCM_label(address, data); + const bool handled = RSX(ctx)->get_backend_config().supports_host_gpu_labels && RSX(ctx)->release_GCM_label(type, address, data); if (vm::_ref(address) == data) { diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 4f965dee80..4b2de0acc4 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -380,7 +380,7 @@ namespace rsx flags32_t read_barrier(u32 memory_address, u32 memory_range, bool unconditional); virtual void write_barrier(u32 /*memory_address*/, u32 /*memory_range*/) {} virtual void sync_hint(FIFO::interrupt_hint hint, reports::sync_hint_payload_t payload); - virtual bool release_GCM_label(u32 /*address*/, u32 /*value*/) { return false; } + virtual bool release_GCM_label(u32 /*type*/, u32 /*address*/, u32 /*value*/) { return false; } protected: diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index cba661a64b..8d90f9a09f 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1541,7 +1541,7 @@ std::pair VKGSRender::map_host_object_data( return { m_host_dma_ctrl->host_ctx(), m_host_object_data->value }; } -bool VKGSRender::release_GCM_label(u32 address, u32 args) +bool VKGSRender::release_GCM_label(u32 type, u32 address, u32 args) { if (!backend_config.supports_host_gpu_labels) { @@ -1550,7 +1550,7 @@ bool VKGSRender::release_GCM_label(u32 address, u32 args) auto host_ctx = ensure(m_host_dma_ctrl->host_ctx()); - if (host_ctx->texture_loads_completed()) + if (type == NV4097_TEXTURE_READ_SEMAPHORE_RELEASE && host_ctx->texture_loads_completed()) { // All texture loads already seen by the host GPU // Wait for all previously submitted labels to be flushed @@ -1572,13 +1572,10 @@ bool VKGSRender::release_GCM_label(u32 address, u32 args) const auto release_event_id = host_ctx->on_label_acquire(); + vk::insert_global_memory_barrier(*m_current_command_buffer); + if (host_ctx->has_unflushed_texture_loads()) { - if (vk::is_renderpass_open(*m_current_command_buffer)) - { - vk::end_renderpass(*m_current_command_buffer); - } - vkCmdUpdateBuffer(*m_current_command_buffer, mapping.second->value, mapping.first, 4, &write_data); flush_command_queue(); } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index 0c93741fcb..f9feedc35a 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -254,7 +254,7 @@ public: // Sync void write_barrier(u32 address, u32 range) override; void sync_hint(rsx::FIFO::interrupt_hint hint, rsx::reports::sync_hint_payload_t payload) override; - bool release_GCM_label(u32 address, u32 data) override; + bool release_GCM_label(u32 type, u32 address, u32 data) override; void begin_occlusion_query(rsx::reports::occlusion_query_info* query) override; void end_occlusion_query(rsx::reports::occlusion_query_info* query) override; From 3bb21db71b4c6f73d6777ec4e7b1a2c3c3cdbe57 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Mon, 9 Feb 2026 05:23:27 +0100 Subject: [PATCH 222/630] Guard async transactions against spurious wakeups --- rpcs3/Emu/NP/np_contexts.cpp | 2 +- rpcs3/Emu/NP/np_requests.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/NP/np_contexts.cpp b/rpcs3/Emu/NP/np_contexts.cpp index 46d773d127..f43d02c362 100644 --- a/rpcs3/Emu/NP/np_contexts.cpp +++ b/rpcs3/Emu/NP/np_contexts.cpp @@ -46,7 +46,7 @@ error_code generic_async_transaction_context::wait_for_completion() return *result; } - completion_cond.wait(lock); + completion_cond.wait(lock, [this] { return result.has_value(); }); return *result; } diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index 20199889dc..3f21f24cd3 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -951,13 +951,16 @@ namespace np { thread_base::set_name("NP Trans Worker"); - auto res = trans_ctx->wake_cond.wait_for(lock, std::chrono::microseconds(trans_ctx->timeout)); + bool has_value = trans_ctx->wake_cond.wait_for(lock, std::chrono::microseconds(trans_ctx->timeout), [&] + { + return trans_ctx->result.has_value(); + }); { std::lock_guard lock_threads(this->mutex_async_transactions); this->async_transactions.erase(req_id); } - if (res == std::cv_status::timeout) + if (!has_value) { trans_ctx->result = SCE_NP_COMMUNITY_ERROR_TIMEOUT; return; From 6a07c3f46d195212e64b2630fbb68e8aa1ffa515 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 9 Feb 2026 19:46:57 +0100 Subject: [PATCH 223/630] input: fix input guard button offsets for closing native overlays L2, R1 and all hat buttons were incorrectly enforcing the pad interception after closing a native dialog. --- rpcs3/Input/pad_thread.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/rpcs3/Input/pad_thread.cpp b/rpcs3/Input/pad_thread.cpp index 40887ae5fb..55652bc229 100644 --- a/rpcs3/Input/pad_thread.cpp +++ b/rpcs3/Input/pad_thread.cpp @@ -631,15 +631,18 @@ void pad_thread::operator()() if (!pad->is_connected()) continue; - for (const auto& button : pad->m_buttons) + for (const Button& button : pad->m_buttons) { if (button.m_pressed && ( - button.m_outKeyCode == CELL_PAD_CTRL_CROSS || - button.m_outKeyCode == CELL_PAD_CTRL_CIRCLE || - button.m_outKeyCode == CELL_PAD_CTRL_TRIANGLE || - button.m_outKeyCode == CELL_PAD_CTRL_SQUARE || - button.m_outKeyCode == CELL_PAD_CTRL_START || - button.m_outKeyCode == CELL_PAD_CTRL_SELECT)) + (button.m_offset == CELL_PAD_BTN_OFFSET_DIGITAL1 && ( + button.m_outKeyCode == CELL_PAD_CTRL_START || + button.m_outKeyCode == CELL_PAD_CTRL_SELECT)) || + (button.m_offset == CELL_PAD_BTN_OFFSET_DIGITAL2 && ( + button.m_outKeyCode == CELL_PAD_CTRL_CROSS || + button.m_outKeyCode == CELL_PAD_CTRL_CIRCLE || + button.m_outKeyCode == CELL_PAD_CTRL_TRIANGLE || + button.m_outKeyCode == CELL_PAD_CTRL_SQUARE)) + )) { any_button_pressed = true; break; @@ -676,7 +679,7 @@ void pad_thread::operator()() break; } - for (const auto& button : pad->m_buttons) + for (const Button& button : pad->m_buttons) { if (button.m_offset == CELL_PAD_BTN_OFFSET_DIGITAL1 && button.m_outKeyCode == CELL_PAD_CTRL_PS && button.m_pressed) { @@ -735,7 +738,7 @@ void pad_thread::operator()() if (!pad->is_connected()) continue; - for (const auto& button : pad->m_buttons) + for (const Button& button : pad->m_buttons) { if (button.m_offset == CELL_PAD_BTN_OFFSET_DIGITAL1 && button.m_outKeyCode == CELL_PAD_CTRL_START && button.m_pressed) { From 4c234dc74443139f227374e3471da0ca2fe7904e Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 8 Feb 2026 18:04:10 +0100 Subject: [PATCH 224/630] Qt: Fix duplicate ansi highlighter creation It is created in the slot when the action is toggled in LoadSettings --- rpcs3/rpcs3qt/log_frame.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index 6d99791799..0e1b0fb129 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -163,11 +163,6 @@ log_frame::log_frame(std::shared_ptr _gui_settings, QWidget* paren CreateAndConnectActions(); LoadSettings(); - if (m_ansi_tty) - { - m_tty_ansi_highlighter = new AnsiHighlighter(m_tty->document()); - } - m_timer = new QTimer(this); connect(m_timer, &QTimer::timeout, this, &log_frame::UpdateUI); } From 8f066541a3c3d8f0d830872f42419be3a4cbf1c3 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 8 Feb 2026 18:31:31 +0100 Subject: [PATCH 225/630] Qt: adjust ansi colors based on background color --- rpcs3/rpcs3qt/log_frame.cpp | 10 +++- rpcs3/rpcs3qt/qt_utils.cpp | 30 +++++++++- rpcs3/rpcs3qt/qt_utils.h | 11 ++-- rpcs3/rpcs3qt/syntax_highlighter.cpp | 86 ++++++++++++++++------------ rpcs3/rpcs3qt/syntax_highlighter.h | 9 ++- 5 files changed, 100 insertions(+), 46 deletions(-) diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index 0e1b0fb129..cf570eea7a 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -220,7 +220,7 @@ void log_frame::CreateAndConnectActions() // I, for one, welcome our lambda overlord // It's either this or a signal mapper // Then, probably making a list of these actions so that it's easier to iterate to generate the mapper. - auto l_initAct = [this](QAction* act, logs::level logLevel) + const auto l_initAct = [this](QAction* act, logs::level logLevel) { act->setCheckable(true); @@ -293,7 +293,7 @@ void log_frame::CreateAndConnectActions() if (m_ansi_tty && !m_tty_ansi_highlighter) { - m_tty_ansi_highlighter = new AnsiHighlighter(m_tty->document()); + m_tty_ansi_highlighter = new AnsiHighlighter(m_tty); } else if (!m_ansi_tty && m_tty_ansi_highlighter) { @@ -602,6 +602,12 @@ void log_frame::RepaintTextColors() html.replace(old_style, new_style); m_log->document()->setHtml(html); + + if (m_tty_ansi_highlighter) + { + m_tty_ansi_highlighter->update_colors(m_tty); + m_tty_ansi_highlighter->rehighlight(); + } } void log_frame::UpdateUI() diff --git a/rpcs3/rpcs3qt/qt_utils.cpp b/rpcs3/rpcs3qt/qt_utils.cpp index a957dba11c..73dbaa87b6 100644 --- a/rpcs3/rpcs3qt/qt_utils.cpp +++ b/rpcs3/rpcs3qt/qt_utils.cpp @@ -173,21 +173,45 @@ namespace gui } return res; } - - QColor get_foreground_color() + + QColor get_foreground_color(QWidget* widget) { + if (widget) + { + widget->ensurePolished(); + return widget->palette().color(QPalette::ColorRole::WindowText); + } + QLabel dummy_color; dummy_color.ensurePolished(); return dummy_color.palette().color(QPalette::ColorRole::WindowText); } - QColor get_background_color() + QColor get_background_color(QWidget* widget) { + if (widget) + { + widget->ensurePolished(); + return widget->palette().color(QPalette::ColorRole::Window); + } + QLabel dummy_color; dummy_color.ensurePolished(); return dummy_color.palette().color(QPalette::ColorRole::Window); } + QColor adjust_color_for_background(const QColor& fg, const QColor& bg) + { + const int diff = fg.lightness() - bg.lightness(); + + if (std::abs(diff) >= 40) + { + return fg; + } + + return (bg.lightness() < 128) ? fg.lighter(180) : fg.darker(180); + } + QColor get_label_color(const QString& object_name, const QColor& fallback_light, const QColor& fallback_dark, QPalette::ColorRole color_role) { if (!gui::custom_stylesheet_active || !gui::stylesheet.contains(object_name)) diff --git a/rpcs3/rpcs3qt/qt_utils.h b/rpcs3/rpcs3qt/qt_utils.h index c08c5665a7..98e0eb8cd6 100644 --- a/rpcs3/rpcs3qt/qt_utils.h +++ b/rpcs3/rpcs3qt/qt_utils.h @@ -68,11 +68,14 @@ namespace gui // Returns a list of all base names of files in dir whose complete file names contain one of the given name_filters QStringList get_dir_entries(const QDir& dir, const QStringList& name_filters, bool full_path = false); - // Returns the foreground color of QLabel with respect to the current light/dark mode. - QColor get_foreground_color(); + // Returns the foreground color of QLabel or the given widget with respect to the current light/dark mode. + QColor get_foreground_color(QWidget* widget = nullptr); - // Returns the background color of QLabel with respect to the current light/dark mode. - QColor get_background_color(); + // Returns the background color of QLabel or the given widget with respect to the current light/dark mode. + QColor get_background_color(QWidget* widget = nullptr); + + // Returns an adjusted color with better contrast, depending on the background. + QColor adjust_color_for_background(const QColor& fg, const QColor& bg); // Returns the color specified by its color_role for the QLabels with object_name QColor get_label_color(const QString& object_name, const QColor& fallback_light, const QColor& fallback_dark, QPalette::ColorRole color_role = QPalette::WindowText); diff --git a/rpcs3/rpcs3qt/syntax_highlighter.cpp b/rpcs3/rpcs3qt/syntax_highlighter.cpp index 2fd43033d5..a15e36c3a4 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.cpp +++ b/rpcs3/rpcs3qt/syntax_highlighter.cpp @@ -184,12 +184,37 @@ GlslHighlighter::GlslHighlighter(QTextDocument* parent) : Highlighter(parent) commentEndExpression = QRegularExpression("\\*/"); } -AnsiHighlighter::AnsiHighlighter(QTextDocument* parent) : Highlighter(parent) +AnsiHighlighter::AnsiHighlighter(QPlainTextEdit* text_edit) + : Highlighter(text_edit ? text_edit->document() : nullptr) { - m_escape_format.setForeground(Qt::darkGray); - m_escape_format.setFontItalic(true); + update_colors(text_edit); +} - m_foreground_color = gui::utils::get_foreground_color(); +void AnsiHighlighter::update_colors(QPlainTextEdit* text_edit) +{ + m_foreground_color = gui::utils::get_foreground_color(text_edit); + m_background_color = gui::utils::get_background_color(text_edit); + + m_foreground_colors[30] = gui::utils::adjust_color_for_background(Qt::black, m_background_color); + m_foreground_colors[31] = gui::utils::adjust_color_for_background(Qt::red, m_background_color); + m_foreground_colors[32] = gui::utils::adjust_color_for_background(Qt::darkGreen, m_background_color); + m_foreground_colors[33] = gui::utils::adjust_color_for_background(Qt::darkYellow, m_background_color); + m_foreground_colors[34] = gui::utils::adjust_color_for_background(Qt::darkBlue, m_background_color); + m_foreground_colors[35] = gui::utils::adjust_color_for_background(Qt::darkMagenta, m_background_color); + m_foreground_colors[36] = gui::utils::adjust_color_for_background(Qt::darkCyan, m_background_color); + m_foreground_colors[37] = gui::utils::adjust_color_for_background(Qt::lightGray, m_background_color); + m_foreground_colors[39] = m_foreground_color; + m_foreground_colors[90] = gui::utils::adjust_color_for_background(Qt::darkGray, m_background_color); + m_foreground_colors[91] = gui::utils::adjust_color_for_background(Qt::red, m_background_color); + m_foreground_colors[92] = gui::utils::adjust_color_for_background(Qt::green, m_background_color); + m_foreground_colors[93] = gui::utils::adjust_color_for_background(Qt::yellow, m_background_color); + m_foreground_colors[94] = gui::utils::adjust_color_for_background(Qt::blue, m_background_color); + m_foreground_colors[95] = gui::utils::adjust_color_for_background(Qt::magenta, m_background_color); + m_foreground_colors[96] = gui::utils::adjust_color_for_background(Qt::cyan, m_background_color); + m_foreground_colors[97] = gui::utils::adjust_color_for_background(Qt::white, m_background_color); + + m_escape_format.setForeground(gui::utils::adjust_color_for_background(Qt::darkGray, m_background_color)); + m_escape_format.setFontItalic(true); } void AnsiHighlighter::highlightBlock(const QString& text) @@ -235,39 +260,26 @@ void AnsiHighlighter::highlightBlock(const QString& text) if (!ok) continue; switch (code) { - case 0: - current_format = QTextCharFormat(); - current_format.setForeground(m_foreground_color); - break; - case 1: - current_format.setFontWeight(QFont::Bold); - break; - case 3: - current_format.setFontItalic(true); - break; - case 4: - current_format.setFontUnderline(true); - break; - case 30: current_format.setForeground(Qt::black); break; - case 31: current_format.setForeground(Qt::red); break; - case 32: current_format.setForeground(Qt::darkGreen); break; - case 33: current_format.setForeground(Qt::darkYellow); break; - case 34: current_format.setForeground(Qt::darkBlue); break; - case 35: current_format.setForeground(Qt::darkMagenta); break; - case 36: current_format.setForeground(Qt::darkCyan); break; - case 37: current_format.setForeground(Qt::lightGray); break; - case 39: current_format.setForeground(m_foreground_color); break; - case 90: current_format.setForeground(Qt::darkGray); break; - case 91: current_format.setForeground(Qt::red); break; - case 92: current_format.setForeground(Qt::green); break; - case 93: current_format.setForeground(Qt::yellow); break; - case 94: current_format.setForeground(Qt::blue); break; - case 95: current_format.setForeground(Qt::magenta); break; - case 96: current_format.setForeground(Qt::cyan); break; - case 97: current_format.setForeground(Qt::white); break; + case 0: + current_format = QTextCharFormat(); + current_format.setForeground(m_foreground_color); + break; + case 1: + current_format.setFontWeight(QFont::Bold); + break; + case 3: + current_format.setFontItalic(true); + break; + case 4: + current_format.setFontUnderline(true); + break; + default: // Background and extended colors not yet handled - default: - break; + if (const auto it = m_foreground_colors.find(code); it != m_foreground_colors.cend()) + { + current_format.setForeground(it->second); + } + break; } } } @@ -278,5 +290,7 @@ void AnsiHighlighter::highlightBlock(const QString& text) // Apply remaining format if (pos < text.length()) + { setFormat(pos, text.length() - pos, current_format); + } } diff --git a/rpcs3/rpcs3qt/syntax_highlighter.h b/rpcs3/rpcs3qt/syntax_highlighter.h index 3854059dd7..d94d600dd6 100644 --- a/rpcs3/rpcs3qt/syntax_highlighter.h +++ b/rpcs3/rpcs3qt/syntax_highlighter.h @@ -3,6 +3,9 @@ #include #include #include +#include + +#include // Inspired by https://doc.qt.io/qt-5/qtwidgets-richtext-syntaxhighlighter-example.html @@ -59,7 +62,9 @@ class AnsiHighlighter : public Highlighter Q_OBJECT public: - explicit AnsiHighlighter(QTextDocument* parent = nullptr); + explicit AnsiHighlighter(QPlainTextEdit* text_edit); + + void update_colors(QPlainTextEdit* text_edit); protected: const QRegularExpression ansi_re = QRegularExpression("\x1b\\[[0-9;]*m"); @@ -67,6 +72,8 @@ protected: QTextCharFormat m_escape_format; QColor m_foreground_color; + QColor m_background_color; + std::map m_foreground_colors; void highlightBlock(const QString& text) override; }; From b2469039afce9cafb979dd6191bc87ec627d7888 Mon Sep 17 00:00:00 2001 From: Malcolm Date: Sun, 1 Feb 2026 03:00:09 +0000 Subject: [PATCH 226/630] ARM64: Detect some arm features and let LLVM know if they are or aren't present via attributes - On x86, LLVM has robust detection for the CPU name. If a CPU like skylake has AVX disabled, it will fall back to something without AVX (nehalem) - On ARM, detection is not as robust. For instance, on my snapdragon 8 gen 2, it assumes that we have SVE support, as the cortex-x3 supports SVE. - If an ARM cpu is paired with other cpus from another generation which doesn't support the same instructions as the cortex-x3, or if the cortex-x3 just has SVE disabled for no apparant reason (in the case of the snapdragon 8 gen 2) - We need to actually detect that ourselves. - Beyond SVE also detect support for some instructions that might be useful SPU LLVM when optimized with intrinsics. --- Utilities/JITLLVM.cpp | 25 +++++++++ rpcs3/util/sysinfo.cpp | 114 ++++++++++++++++++++++++++++++++++++++++- rpcs3/util/sysinfo.hpp | 10 ++++ 3 files changed, 148 insertions(+), 1 deletion(-) diff --git a/Utilities/JITLLVM.cpp b/Utilities/JITLLVM.cpp index 166ee7cec2..34e1572185 100644 --- a/Utilities/JITLLVM.cpp +++ b/Utilities/JITLLVM.cpp @@ -688,6 +688,30 @@ jit_compiler::jit_compiler(const std::unordered_map& _link, co mem = std::make_unique(std::move(symbols_cement)); } + std::vector attributes; + +#if defined(ARCH_ARM64) + if (utils::has_sha3()) + attributes.push_back("+sha3"); + else + attributes.push_back("-sha3"); + + if (utils::has_dotprod()) + attributes.push_back("+dotprod"); + else + attributes.push_back("-dotprod"); + + if (utils::has_sve()) + attributes.push_back("+sve"); + else + attributes.push_back("-sve"); + + if (utils::has_sve2()) + attributes.push_back("+sve2"); + else + attributes.push_back("-sve2"); +#endif + { m_engine.reset(llvm::EngineBuilder(std::move(null_mod)) .setErrorStr(&result) @@ -699,6 +723,7 @@ jit_compiler::jit_compiler(const std::unordered_map& _link, co //.setCodeModel(llvm::CodeModel::Large) #endif .setRelocationModel(llvm::Reloc::Model::PIC_) + .setMAttrs(attributes) .setMCPU(m_cpu) .create()); } diff --git a/rpcs3/util/sysinfo.cpp b/rpcs3/util/sysinfo.cpp index 94563e8d10..e1e8ab8404 100755 --- a/rpcs3/util/sysinfo.cpp +++ b/rpcs3/util/sysinfo.cpp @@ -16,9 +16,15 @@ #else #include #include -#ifndef __APPLE__ +#ifdef __APPLE__ +#include +#else #include #include +#if defined(ARCH_ARM64) && defined(__linux__) +#include +#include +#endif #endif #endif @@ -444,6 +450,100 @@ u32 utils::get_rep_movsb_threshold() return g_value; } +#ifdef ARCH_ARM64 + +bool utils::has_neon() +{ + static const bool g_value = []() -> bool + { +#if defined(__linux__) + return (getauxval(AT_HWCAP) & HWCAP_ASIMD) != 0; +#elif defined(__APPLE__) + int val = 0; + size_t len = sizeof(val); + sysctlbyname("hw.optional.AdvSIMD", &val, &len, nullptr, 0); + return val != 0; +#elif defined(_WIN32) + return IsProcessorFeaturePresent(PF_ARM_VFP_32_REGISTERS_AVAILABLE) != 0; +#endif + }(); + return g_value; +} + +bool utils::has_sha3() +{ + static const bool g_value = []() -> bool + { +#if defined(__linux__) + return (getauxval(AT_HWCAP) & HWCAP_SHA3) != 0; +#elif defined(__APPLE__) + int val = 0; + size_t len = sizeof(val); + sysctlbyname("hw.optional.arm.FEAT_SHA3", &val, &len, nullptr, 0); + return val != 0; +#elif defined(_WIN32) + return IsProcessorFeaturePresent(PF_ARM_SHA3_INSTRUCTIONS_AVAILABLE) != 0; +#endif + }(); + return g_value; +} + +bool utils::has_dotprod() +{ + static const bool g_value = []() -> bool + { +#if defined(__linux__) + return (getauxval(AT_HWCAP) & HWCAP_ASIMDDP) != 0; +#elif defined(__APPLE__) + int val = 0; + size_t len = sizeof(val); + sysctlbyname("hw.optional.arm.FEAT_DotProd", &val, &len, nullptr, 0); + return val != 0; +#elif defined(_WIN32) + return IsProcessorFeaturePresent(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE) != 0; +#endif + }(); + return g_value; +} + +bool utils::has_sve() +{ + static const bool g_value = []() -> bool + { +#if defined(__linux__) + return (getauxval(AT_HWCAP) & HWCAP_SVE) != 0; +#elif defined(__APPLE__) + int val = 0; + size_t len = sizeof(val); + sysctlbyname("hw.optional.arm.FEAT_SVE", &val, &len, nullptr, 0); + return val != 0; +#elif defined(_WIN32) + return IsProcessorFeaturePresent(PF_ARM_SVE_INSTRUCTIONS_AVAILABLE) != 0; +#endif + }(); + return g_value; +} + +bool utils::has_sve2() +{ + static const bool g_value = []() -> bool + { +#if defined(__linux__) + return (getauxval(AT_HWCAP2) & HWCAP2_SVE2) != 0; +#elif defined(__APPLE__) + int val = 0; + size_t len = sizeof(val); + sysctlbyname("hw.optional.arm.FEAT_SVE2", &val, &len, nullptr, 0); + return val != 0; +#elif defined(_WIN32) + return IsProcessorFeaturePresent(PF_ARM_SVE2_INSTRUCTIONS_AVAILABLE) != 0; +#endif + }(); + return g_value; +} + +#endif + std::string utils::get_cpu_brand() { #if defined(ARCH_X64) @@ -496,6 +596,17 @@ std::string utils::get_system_info() { fmt::append(result, " | TSC: Disabled"); } +#ifdef ARCH_ARM64 + + if (has_neon()) + { + result += " | Neon"; + } + else + { + fmt::throw_exception("Neon support not present"); + } +#else if (has_avx()) { @@ -562,6 +673,7 @@ std::string utils::get_system_info() { result += " | TSX disabled via microcode"; } +#endif return result; } diff --git a/rpcs3/util/sysinfo.hpp b/rpcs3/util/sysinfo.hpp index fd7e810f67..d9bd0c6660 100755 --- a/rpcs3/util/sysinfo.hpp +++ b/rpcs3/util/sysinfo.hpp @@ -54,7 +54,17 @@ namespace utils bool has_appropriate_um_wait(); bool has_um_wait(); +#ifdef ARCH_ARM64 + bool has_neon(); + bool has_sha3(); + + bool has_dotprod(); + + bool has_sve(); + + bool has_sve2(); +#endif std::string get_cpu_brand(); std::string get_system_info(); From 7cfe96a1d121e12fbdfe42befe9af5bbd561be99 Mon Sep 17 00:00:00 2001 From: Ani Date: Wed, 11 Feb 2026 09:30:45 +0100 Subject: [PATCH 227/630] macOS: Check for hw.optional.neon as fallback --- rpcs3/util/sysinfo.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rpcs3/util/sysinfo.cpp b/rpcs3/util/sysinfo.cpp index e1e8ab8404..8abe584a94 100755 --- a/rpcs3/util/sysinfo.cpp +++ b/rpcs3/util/sysinfo.cpp @@ -462,7 +462,10 @@ bool utils::has_neon() int val = 0; size_t len = sizeof(val); sysctlbyname("hw.optional.AdvSIMD", &val, &len, nullptr, 0); - return val != 0; + int val_legacy = 0; + size_t len_legacy = sizeof(val_legacy); + sysctlbyname("hw.optional.neon", &val_legacy, &len_legacy, nullptr, 0); + return val != 0 || val_legacy != 0; #elif defined(_WIN32) return IsProcessorFeaturePresent(PF_ARM_VFP_32_REGISTERS_AVAILABLE) != 0; #endif From 236dc966894cb80aaaabd5ed2cc9055942411eae Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 14 Feb 2026 11:57:12 +0100 Subject: [PATCH 228/630] Microphone fixes --- rpcs3/Emu/Cell/Modules/cellMic.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellMic.h | 2 +- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellMic.cpp b/rpcs3/Emu/Cell/Modules/cellMic.cpp index 0724b48927..0c58d2ec7e 100644 --- a/rpcs3/Emu/Cell/Modules/cellMic.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMic.cpp @@ -634,7 +634,7 @@ u32 microphone_device::capture_audio() if (ALCenum err = alcGetError(micdevice.device); err != ALC_NO_ERROR) { cellMic.error("Error getting number of captured samples of device '%s' (error=%s)", micdevice.name, fmt::alc_error{micdevice.device, err}); - return CELL_MICIN_ERROR_FATAL; + return 0; } num_samples = std::min(num_samples, samples_in); diff --git a/rpcs3/Emu/Cell/Modules/cellMic.h b/rpcs3/Emu/Cell/Modules/cellMic.h index 88a2f4d937..a07cec23a8 100644 --- a/rpcs3/Emu/Cell/Modules/cellMic.h +++ b/rpcs3/Emu/Cell/Modules/cellMic.h @@ -238,7 +238,7 @@ public: if (over_size > Size) { m_tail += (over_size - Size); - if (m_tail > Size) + if (m_tail >= Size) m_tail -= Size; m_used = Size; diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index 64f27227d3..e1c3caf9d7 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -556,6 +556,8 @@ usb_handler_thread::usb_handler_thread() switch (g_cfg.audio.microphone_type) { + case microphone_handler::null: + break; case microphone_handler::standard: usb_devices.push_back(std::make_shared(0, get_new_location(), MicType::Logitech)); break; From 7f2dec46cade6340aeda9503ba70c4da266818b0 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 14 Feb 2026 14:16:37 +0100 Subject: [PATCH 229/630] Ignore gcc strict aliasing warnings on __sync_lock_test_and_set --- rpcs3/util/atomic.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rpcs3/util/atomic.hpp b/rpcs3/util/atomic.hpp index 4503eaac61..f77aad7825 100644 --- a/rpcs3/util/atomic.hpp +++ b/rpcs3/util/atomic.hpp @@ -1011,7 +1011,12 @@ struct atomic_storage : atomic_storage static inline T exchange(T& dest, T value) { __atomic_thread_fence(__ATOMIC_ACQ_REL); + // GCC has recently started thinking using this instrinsic is breaking strict aliasing rules + // TODO: remove if this ever get fixed in GCC + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstrict-aliasing" return std::bit_cast(__sync_lock_test_and_set(reinterpret_cast(&dest), std::bit_cast(value))); + #pragma GCC diagnostic pop } static inline void store(T& dest, T value) From 9f928247218337313af5b1c2354dc77c49111399 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 14 Feb 2026 14:53:01 +0100 Subject: [PATCH 230/630] Fix glsl_invalid_program not fitting within 3 bits --- rpcs3/Emu/RSX/Program/GLSLTypes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLTypes.h b/rpcs3/Emu/RSX/Program/GLSLTypes.h index 5b1b61396e..8f7cb6fa03 100644 --- a/rpcs3/Emu/RSX/Program/GLSLTypes.h +++ b/rpcs3/Emu/RSX/Program/GLSLTypes.h @@ -9,7 +9,7 @@ namespace glsl glsl_compute_program = 2, // Meta - glsl_invalid_program = 0xff + glsl_invalid_program = 7 }; enum glsl_rules : unsigned char From c6f5abe59fc6bfeb52638887cb849142801a0177 Mon Sep 17 00:00:00 2001 From: Zion Nimchuk Date: Sat, 14 Feb 2026 15:24:17 -0800 Subject: [PATCH 231/630] Update docker and ccache --- .ci/setup-llvm.sh | 2 +- .ci/setup-windows.sh | 2 +- .github/workflows/llvm.yml | 2 +- .github/workflows/rpcs3.yml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.ci/setup-llvm.sh b/.ci/setup-llvm.sh index d296d2a3e4..5d06222f04 100644 --- a/.ci/setup-llvm.sh +++ b/.ci/setup-llvm.sh @@ -1,7 +1,7 @@ #!/bin/sh -ex # Resource/dependency URLs -CCACHE_URL="https://github.com/ccache/ccache/releases/download/v4.11.2/ccache-4.11.2-windows-x86_64.zip" +CCACHE_URL="https://github.com/ccache/ccache/releases/download/v4.12.3/ccache-4.12.3-windows-x86_64.zip" DEP_URLS=" \ $CCACHE_URL" diff --git a/.ci/setup-windows.sh b/.ci/setup-windows.sh index aade55fc95..cee6d624de 100755 --- a/.ci/setup-windows.sh +++ b/.ci/setup-windows.sh @@ -17,7 +17,7 @@ QT_SVG_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qtsvg${QT_SUFFIX}" QT_TRANSLATIONS_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qttranslations${QT_SUFFIX}" LLVMLIBS_URL="https://github.com/RPCS3/llvm-mirror/releases/download/custom-build-win-${LLVM_VER}/llvmlibs_mt.7z" VULKAN_SDK_URL="https://www.dropbox.com/scl/fi/sjjh0fc4ld281pjbl2xzu/VulkanSDK-${VULKAN_VER}-Installer.exe?rlkey=f6wzc0lvms5vwkt2z3qabfv9d&dl=1" -CCACHE_URL="https://github.com/ccache/ccache/releases/download/v4.11.2/ccache-4.11.2-windows-x86_64.zip" +CCACHE_URL="https://github.com/ccache/ccache/releases/download/v4.12.3/ccache-4.12.3-windows-x86_64.zip" DEP_URLS=" \ $QT_BASE_URL \ diff --git a/.github/workflows/llvm.yml b/.github/workflows/llvm.yml index e3e3e76c50..3ed584437a 100644 --- a/.github/workflows/llvm.yml +++ b/.github/workflows/llvm.yml @@ -20,7 +20,7 @@ jobs: runs-on: windows-2025 env: COMPILER: msvc - CCACHE_SHA: '1f39f3ad5aae3fe915e99ad1302633bc8f6718e58fa7c0de2b0ba7e080f0f08c' + CCACHE_SHA: '859141059ac950e1e8cd042c66f842f26b9e3a62a1669a69fe6ba180cb58bbdf' CCACHE_BIN_DIR: 'C:\ccache_bin' CCACHE_DIR: 'C:\ccache' CCACHE_INODECACHE: 'true' diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 90ee8555ad..0132095f41 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -30,23 +30,23 @@ jobs: matrix: include: - os: ubuntu-24.04 - docker_img: "rpcs3/rpcs3-ci-jammy:1.7" + docker_img: "rpcs3/rpcs3-ci-jammy:1.8" build_sh: "/rpcs3/.ci/build-linux.sh" compiler: clang UPLOAD_COMMIT_HASH: d812f1254a1157c80fd402f94446310560f54e5f UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux" - os: ubuntu-24.04 - docker_img: "rpcs3/rpcs3-ci-jammy:1.7" + docker_img: "rpcs3/rpcs3-ci-jammy:1.8" build_sh: "/rpcs3/.ci/build-linux.sh" compiler: gcc - os: ubuntu-24.04-arm - docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.7" + docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.8" build_sh: "/rpcs3/.ci/build-linux-aarch64.sh" compiler: clang UPLOAD_COMMIT_HASH: a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1 UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux-arm64" - os: ubuntu-24.04-arm - docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.7" + docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.8" build_sh: "/rpcs3/.ci/build-linux-aarch64.sh" compiler: gcc name: RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} @@ -219,7 +219,7 @@ jobs: LLVM_VER: '19.1.7' VULKAN_VER: '1.3.268.0' VULKAN_SDK_SHA: '8459ef49bd06b697115ddd3d97c9aec729e849cd775f5be70897718a9b3b9db5' - CCACHE_SHA: '1f39f3ad5aae3fe915e99ad1302633bc8f6718e58fa7c0de2b0ba7e080f0f08c' + CCACHE_SHA: '859141059ac950e1e8cd042c66f842f26b9e3a62a1669a69fe6ba180cb58bbdf' CCACHE_BIN_DIR: 'C:\ccache_bin' CCACHE_DIR: 'C:\ccache' CCACHE_INODECACHE: 'true' From 06798ef7292352b0f2cd4bf3e4d86d7f0dbe3bfc Mon Sep 17 00:00:00 2001 From: Marin Baron Date: Sat, 14 Feb 2026 09:05:38 +0100 Subject: [PATCH 232/630] [Build] Remove quotes protoc --- 3rdparty/protobuf/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3rdparty/protobuf/CMakeLists.txt b/3rdparty/protobuf/CMakeLists.txt index 274e6110af..f8e6bed59b 100644 --- a/3rdparty/protobuf/CMakeLists.txt +++ b/3rdparty/protobuf/CMakeLists.txt @@ -2,8 +2,8 @@ add_library(3rdparty_protobuf INTERFACE) if (USE_SYSTEM_PROTOBUF) pkg_check_modules(PROTOBUF REQUIRED IMPORTED_TARGET protobuf>=33.0.0) target_link_libraries(3rdparty_protobuf INTERFACE PkgConfig::PROTOBUF) - set(PROTOBUF_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../rpcs3/Emu/NP/generated/") - execute_process(COMMAND protoc --cpp_out="${PROTOBUF_DIR}" --proto_path="${PROTOBUF_DIR}" np2_structs.proto RESULT_VARIABLE PROTOBUF_CMD_ERROR) + set(PROTOBUF_DIR "${CMAKE_SOURCE_DIR}/rpcs3/Emu/NP/generated") + execute_process(COMMAND protoc --cpp_out=${PROTOBUF_DIR} --proto_path=${PROTOBUF_DIR} np2_structs.proto RESULT_VARIABLE PROTOBUF_CMD_ERROR) if(PROTOBUF_CMD_ERROR AND NOT PROTOBUF_CMD_ERROR EQUAL 0) message(FATAL_ERROR "protoc failed to regenerate protobuf files.") endif() From 97bbc2d41957e028c0a0b212b2d0fd331ebd7dc7 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 14 Feb 2026 18:03:00 +0100 Subject: [PATCH 233/630] Update yaml-cpp to 0.9.0 --- 3rdparty/yaml-cpp/yaml-cpp | 2 +- 3rdparty/yaml-cpp/yaml-cpp.vcxproj | 1 + 3rdparty/yaml-cpp/yaml-cpp.vcxproj.filters | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/3rdparty/yaml-cpp/yaml-cpp b/3rdparty/yaml-cpp/yaml-cpp index 456c68f452..05c44fcd18 160000 --- a/3rdparty/yaml-cpp/yaml-cpp +++ b/3rdparty/yaml-cpp/yaml-cpp @@ -1 +1 @@ -Subproject commit 456c68f452da09d8ca84b375faa2b1397713eaba +Subproject commit 05c44fcd18074836e21e1eda9fc02b3a4a1529b5 diff --git a/3rdparty/yaml-cpp/yaml-cpp.vcxproj b/3rdparty/yaml-cpp/yaml-cpp.vcxproj index b1b732727c..4d10c90d7e 100644 --- a/3rdparty/yaml-cpp/yaml-cpp.vcxproj +++ b/3rdparty/yaml-cpp/yaml-cpp.vcxproj @@ -76,6 +76,7 @@ + diff --git a/3rdparty/yaml-cpp/yaml-cpp.vcxproj.filters b/3rdparty/yaml-cpp/yaml-cpp.vcxproj.filters index 60c75fa23e..f4b553ad72 100644 --- a/3rdparty/yaml-cpp/yaml-cpp.vcxproj.filters +++ b/3rdparty/yaml-cpp/yaml-cpp.vcxproj.filters @@ -94,5 +94,8 @@ Source Files + + Source Files + \ No newline at end of file From 365b2939f60a60d87050e3d852d77a2f3ff05819 Mon Sep 17 00:00:00 2001 From: Paul Plant Date: Tue, 3 Feb 2026 18:59:26 -0800 Subject: [PATCH 234/630] Updated Fedora build dependencies list --- BUILDING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILDING.md b/BUILDING.md index b31b3fee4e..597621e810 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -95,7 +95,7 @@ sudo apt-get install cmake #### Fedora - sudo dnf install alsa-lib-devel cmake ninja-build glew glew-devel libatomic libevdev-devel libudev-devel openal-devel qt6-qtbase-devel qt6-qtbase-private-devel vulkan-devel pipewire-jack-audio-connection-kit-devel qt6-qtmultimedia-devel qt6-qtsvg-devel llvm-devel + sudo dnf install alsa-lib-devel cmake ninja-build glew glew-devel libatomic libevdev-devel libudev-devel openal-soft-devel qt6-qtbase-devel qt6-qtbase-private-devel vulkan-devel pipewire-jack-audio-connection-kit-devel qt6-qtmultimedia-devel qt6-qtsvg-devel llvm-devel libcurl-devel #### OpenSUSE From 9290422feaa14cb50a867521f0f1fd88ca78b234 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 15 Feb 2026 09:25:39 +0100 Subject: [PATCH 235/630] Update 7zip to 26.00 --- 3rdparty/7zip/7zip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/7zip/7zip b/3rdparty/7zip/7zip index 5e96a82794..839151eaaa 160000 --- a/3rdparty/7zip/7zip +++ b/3rdparty/7zip/7zip @@ -1 +1 @@ -Subproject commit 5e96a8279489832924056b1fa82f29d5837c9469 +Subproject commit 839151eaaad24771892afaae6bac690e31e58384 From 66c7dd1381c2e09aa3d63362da5ce438c9a91247 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 15 Feb 2026 09:26:11 +0100 Subject: [PATCH 236/630] Update FAudio to 26.02 --- 3rdparty/FAudio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/FAudio b/3rdparty/FAudio index 633bdb772a..e67d761ead 160000 --- a/3rdparty/FAudio +++ b/3rdparty/FAudio @@ -1 +1 @@ -Subproject commit 633bdb772a593104414b4b103ec752567d57c3c1 +Subproject commit e67d761ead486de3e69fa11705456bf94df734ca From 8dfd7e126e3506dbd7cc0b50d4e8a01e47d16ff0 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 15 Feb 2026 09:27:11 +0100 Subject: [PATCH 237/630] Update glext to 2026.01.26 --- 3rdparty/GL/glext.h | 125 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 2 deletions(-) diff --git a/3rdparty/GL/glext.h b/3rdparty/GL/glext.h index 276a962a96..16c26be10f 100644 --- a/3rdparty/GL/glext.h +++ b/3rdparty/GL/glext.h @@ -6,7 +6,7 @@ extern "C" { #endif /* -** Copyright 2013-2020 The Khronos Group Inc. +** Copyright 2013-2026 The Khronos Group Inc. ** SPDX-License-Identifier: MIT ** ** This header is generated from the Khronos OpenGL / OpenGL ES XML @@ -32,7 +32,7 @@ extern "C" { #define GLAPI extern #endif -#define GL_GLEXT_VERSION 20250203 +#define GL_GLEXT_VERSION 20260126 #include @@ -7358,6 +7358,47 @@ GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const voi #endif #endif /* GL_EXT_fog_coord */ +#ifndef GL_EXT_fragment_shading_rate +#define GL_EXT_fragment_shading_rate 1 +#define GL_SHADING_RATE_1X1_PIXELS_EXT 0x96A6 +#define GL_SHADING_RATE_1X2_PIXELS_EXT 0x96A7 +#define GL_SHADING_RATE_2X1_PIXELS_EXT 0x96A8 +#define GL_SHADING_RATE_2X2_PIXELS_EXT 0x96A9 +#define GL_SHADING_RATE_1X4_PIXELS_EXT 0x96AA +#define GL_SHADING_RATE_4X1_PIXELS_EXT 0x96AB +#define GL_SHADING_RATE_4X2_PIXELS_EXT 0x96AC +#define GL_SHADING_RATE_2X4_PIXELS_EXT 0x96AD +#define GL_SHADING_RATE_4X4_PIXELS_EXT 0x96AE +#define GL_SHADING_RATE_EXT 0x96D0 +#define GL_SHADING_RATE_ATTACHMENT_EXT 0x96D1 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_EXT 0x96D2 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_EXT 0x96D3 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_EXT 0x96D4 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_EXT 0x96D5 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_EXT 0x96D6 +#define GL_MIN_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_WIDTH_EXT 0x96D7 +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_WIDTH_EXT 0x96D8 +#define GL_MIN_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_HEIGHT_EXT 0x96D9 +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_HEIGHT_EXT 0x96DA +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_ASPECT_RATIO_EXT 0x96DB +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_LAYERS_EXT 0x96DC +#define GL_FRAGMENT_SHADING_RATE_WITH_SHADER_DEPTH_STENCIL_WRITES_SUPPORTED_EXT 0x96DD +#define GL_FRAGMENT_SHADING_RATE_WITH_SAMPLE_MASK_SUPPORTED_EXT 0x96DE +#define GL_FRAGMENT_SHADING_RATE_ATTACHMENT_WITH_DEFAULT_FRAMEBUFFER_SUPPORTED_EXT 0x96DF +#define GL_FRAGMENT_SHADING_RATE_NON_TRIVIAL_COMBINERS_SUPPORTED_EXT 0x8F6F +#define GL_FRAGMENT_SHADING_RATE_PRIMITIVE_RATE_WITH_MULTI_VIEWPORT_SUPPORTED_EXT 0x9780 +typedef void (APIENTRYP PFNGLGETFRAGMENTSHADINGRATESEXTPROC) (GLsizei samples, GLsizei maxCount, GLsizei *count, GLenum *shadingRates); +typedef void (APIENTRYP PFNGLSHADINGRATEEXTPROC) (GLenum rate); +typedef void (APIENTRYP PFNGLSHADINGRATECOMBINEROPSEXTPROC) (GLenum combinerOp0, GLenum combinerOp1); +typedef void (APIENTRYP PFNGLFRAMEBUFFERSHADINGRATEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint baseLayer, GLsizei numLayers, GLsizei texelWidth, GLsizei texelHeight); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetFragmentShadingRatesEXT (GLsizei samples, GLsizei maxCount, GLsizei *count, GLenum *shadingRates); +GLAPI void APIENTRY glShadingRateEXT (GLenum rate); +GLAPI void APIENTRY glShadingRateCombinerOpsEXT (GLenum combinerOp0, GLenum combinerOp1); +GLAPI void APIENTRY glFramebufferShadingRateEXT (GLenum target, GLenum attachment, GLuint texture, GLint baseLayer, GLsizei numLayers, GLsizei texelWidth, GLsizei texelHeight); +#endif +#endif /* GL_EXT_fragment_shading_rate */ + #ifndef GL_EXT_framebuffer_blit #define GL_EXT_framebuffer_blit 1 #define GL_READ_FRAMEBUFFER_EXT 0x8CA8 @@ -7816,6 +7857,86 @@ GLAPI void APIENTRY glImportMemoryWin32NameEXT (GLuint memory, GLuint64 size, GL #endif #endif /* GL_EXT_memory_object_win32 */ +#ifndef GL_EXT_mesh_shader +#define GL_EXT_mesh_shader 1 +#define GL_MESH_SHADER_EXT 0x9559 +#define GL_TASK_SHADER_EXT 0x955A +#define GL_MAX_MESH_UNIFORM_BLOCKS_EXT 0x8E60 +#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_EXT 0x8E61 +#define GL_MAX_MESH_IMAGE_UNIFORMS_EXT 0x8E62 +#define GL_MAX_MESH_UNIFORM_COMPONENTS_EXT 0x8E63 +#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_EXT 0x8E64 +#define GL_MAX_MESH_ATOMIC_COUNTERS_EXT 0x8E65 +#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_EXT 0x8E66 +#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_EXT 0x8E67 +#define GL_MAX_TASK_UNIFORM_BLOCKS_EXT 0x8E68 +#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_EXT 0x8E69 +#define GL_MAX_TASK_IMAGE_UNIFORMS_EXT 0x8E6A +#define GL_MAX_TASK_UNIFORM_COMPONENTS_EXT 0x8E6B +#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_EXT 0x8E6C +#define GL_MAX_TASK_ATOMIC_COUNTERS_EXT 0x8E6D +#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_EXT 0x8E6E +#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_EXT 0x8E6F +#define GL_MAX_TASK_WORK_GROUP_TOTAL_COUNT_EXT 0x9740 +#define GL_MAX_MESH_WORK_GROUP_TOTAL_COUNT_EXT 0x9741 +#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_EXT 0x9757 +#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_EXT 0x9759 +#define GL_MAX_TASK_PAYLOAD_SIZE_EXT 0x9742 +#define GL_MAX_TASK_SHARED_MEMORY_SIZE_EXT 0x9743 +#define GL_MAX_MESH_SHARED_MEMORY_SIZE_EXT 0x9744 +#define GL_MAX_TASK_PAYLOAD_AND_SHARED_MEMORY_SIZE_EXT 0x9745 +#define GL_MAX_MESH_PAYLOAD_AND_SHARED_MEMORY_SIZE_EXT 0x9746 +#define GL_MAX_MESH_OUTPUT_MEMORY_SIZE_EXT 0x9747 +#define GL_MAX_MESH_PAYLOAD_AND_OUTPUT_MEMORY_SIZE_EXT 0x9748 +#define GL_MAX_MESH_OUTPUT_VERTICES_EXT 0x9538 +#define GL_MAX_MESH_OUTPUT_PRIMITIVES_EXT 0x9756 +#define GL_MAX_MESH_OUTPUT_COMPONENTS_EXT 0x9749 +#define GL_MAX_MESH_OUTPUT_LAYERS_EXT 0x974A +#define GL_MAX_MESH_MULTIVIEW_VIEW_COUNT_EXT 0x9557 +#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_EXT 0x92DF +#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_EXT 0x9543 +#define GL_MAX_PREFERRED_TASK_WORK_GROUP_INVOCATIONS_EXT 0x974B +#define GL_MAX_PREFERRED_MESH_WORK_GROUP_INVOCATIONS_EXT 0x974C +#define GL_MESH_PREFERS_LOCAL_INVOCATION_VERTEX_OUTPUT_EXT 0x974D +#define GL_MESH_PREFERS_LOCAL_INVOCATION_PRIMITIVE_OUTPUT_EXT 0x974E +#define GL_MESH_PREFERS_COMPACT_VERTEX_OUTPUT_EXT 0x974F +#define GL_MESH_PREFERS_COMPACT_PRIMITIVE_OUTPUT_EXT 0x9750 +#define GL_MAX_TASK_WORK_GROUP_COUNT_EXT 0x9751 +#define GL_MAX_MESH_WORK_GROUP_COUNT_EXT 0x9752 +#define GL_MAX_MESH_WORK_GROUP_SIZE_EXT 0x9758 +#define GL_MAX_TASK_WORK_GROUP_SIZE_EXT 0x975A +#define GL_MESH_WORK_GROUP_SIZE_EXT 0x953E +#define GL_TASK_WORK_GROUP_SIZE_EXT 0x953F +#define GL_MESH_VERTICES_OUT_EXT 0x9579 +#define GL_MESH_PRIMITIVES_OUT_EXT 0x957A +#define GL_MESH_OUTPUT_TYPE_EXT 0x957B +#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_EXT 0x959C +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_EXT 0x959D +#define GL_REFERENCED_BY_MESH_SHADER_EXT 0x95A0 +#define GL_REFERENCED_BY_TASK_SHADER_EXT 0x95A1 +#define GL_TASK_SHADER_INVOCATIONS_EXT 0x9753 +#define GL_MESH_SHADER_INVOCATIONS_EXT 0x9754 +#define GL_MESH_PRIMITIVES_GENERATED_EXT 0x9755 +#define GL_MESH_SHADER_BIT_EXT 0x00000040 +#define GL_TASK_SHADER_BIT_EXT 0x00000080 +#define GL_MESH_SUBROUTINE_EXT 0x957C +#define GL_TASK_SUBROUTINE_EXT 0x957D +#define GL_MESH_SUBROUTINE_UNIFORM_EXT 0x957E +#define GL_TASK_SUBROUTINE_UNIFORM_EXT 0x957F +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_EXT 0x959E +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_EXT 0x959F +typedef void (APIENTRYP PFNGLDRAWMESHTASKSEXTPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRYP PFNGLDRAWMESHTASKSINDIRECTEXTPROC) (GLintptr indirect); +typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTEXTPROC) (GLintptr indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTEXTPROC) (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshTasksEXT (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +GLAPI void APIENTRY glDrawMeshTasksIndirectEXT (GLintptr indirect); +GLAPI void APIENTRY glMultiDrawMeshTasksIndirectEXT (GLintptr indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawMeshTasksIndirectCountEXT (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_EXT_mesh_shader */ + #ifndef GL_EXT_misc_attribute #define GL_EXT_misc_attribute 1 #endif /* GL_EXT_misc_attribute */ From 1e63088b3e0ee3c2f9a863d1f233ce80149c2aa4 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 15 Feb 2026 09:31:07 +0100 Subject: [PATCH 238/630] Update cubeb to 2026-01-22 --- 3rdparty/cubeb/cubeb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/cubeb/cubeb b/3rdparty/cubeb/cubeb index e495bee4cd..484857522c 160000 --- a/3rdparty/cubeb/cubeb +++ b/3rdparty/cubeb/cubeb @@ -1 +1 @@ -Subproject commit e495bee4cd630c9f99907a764e16edba37a4b564 +Subproject commit 484857522c73318c06f18ba0a3e17525fa98c608 From dd490fc7255fc657b8612fa31c9f45af2d50cf84 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 15 Feb 2026 09:33:20 +0100 Subject: [PATCH 239/630] Update libpng to 1.6.55 --- 3rdparty/libpng/libpng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libpng/libpng b/3rdparty/libpng/libpng index 02f2b4f469..c3e304954a 160000 --- a/3rdparty/libpng/libpng +++ b/3rdparty/libpng/libpng @@ -1 +1 @@ -Subproject commit 02f2b4f4699f0ef9111a6534f093b53732df4452 +Subproject commit c3e304954a9cfd154bc0dfbfea2b01cd61d6546d From 3df370a7e62cec29a7516b24d826006ec2e6558e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Feb 2026 01:41:57 +0300 Subject: [PATCH 240/630] rsx: Value remapping can only happen to a texel lane once per sample - Avoids double operation if for example BX2 and SNORM/SEXT are active concurrently --- .../RSXProg/RSXFragmentTextureOps.glsl | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index f0457f0034..b95105e410 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -210,25 +210,29 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) uvec4 mask; vec4 convert; - uint op_mask = control_bits & uint(SIGN_EXPAND_MASK); - if (op_mask != 0u) - { - // Expand to signed normalized by decompressing the signal - mask = uvec4(op_mask) & uvec4(EXPAND_R_MASK, EXPAND_G_MASK, EXPAND_B_MASK, EXPAND_A_MASK); - convert = (rgba * 2.f - 1.f); - rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); - } + uint op_mask = control_bits & uint(SEXT_MASK); + uint ch_mask = 0xFu; - op_mask = control_bits & uint(SEXT_MASK); if (op_mask != 0u) { // Sign-extend the input signal mask = uvec4(op_mask) & uvec4(SEXT_R_MASK, SEXT_G_MASK, SEXT_B_MASK, SEXT_A_MASK); convert = _sext_unorm8x4(rgba); rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); + ch_mask &= ~(op_mask >> SEXT_R_BIT); } - op_mask = control_bits & uint(GAMMA_CTRL_MASK); + op_mask = control_bits & uint(SIGN_EXPAND_MASK) & (ch_mask << EXPAND_R_BIT); + if (op_mask != 0u) + { + // Expand to signed normalized by decompressing the signal + mask = uvec4(op_mask) & uvec4(EXPAND_R_MASK, EXPAND_G_MASK, EXPAND_B_MASK, EXPAND_A_MASK); + convert = (rgba * 2.f - 1.f); + rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); + ch_mask &= ~(op_mask >> EXPAND_R_BIT); + } + + op_mask = control_bits & uint(GAMMA_CTRL_MASK) & (ch_mask << GAMMA_R_BIT); if (op_mask != 0u) { // Gamma correction From 6b272ed5636410dec1c42310bc7cdceb62b8d17d Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Feb 2026 01:42:47 +0300 Subject: [PATCH 241/630] rsx: Re-work value remapping capabilities to match real hardware - Drop heurestics and use what real hardware is doing instead --- rpcs3/Emu/RSX/Common/TextureUtils.cpp | 41 +++++++++++++++++++++++---- rpcs3/Emu/RSX/Common/TextureUtils.h | 18 +++++++++++- rpcs3/Emu/RSX/RSXThread.cpp | 28 ++++++++++++++---- 3 files changed, 75 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.cpp b/rpcs3/Emu/RSX/Common/TextureUtils.cpp index 96f87111ff..5fda3c6131 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.cpp +++ b/rpcs3/Emu/RSX/Common/TextureUtils.cpp @@ -1200,27 +1200,56 @@ namespace rsx fmt::throw_exception("Unknown format 0x%x", texture_format); } - bool is_int8_remapped_format(u32 format) + rsx::flags32_t get_format_features(u32 texture_format) { - switch (format) + switch (texture_format) { + case CELL_GCM_TEXTURE_B8: + case CELL_GCM_TEXTURE_A1R5G5B5: + case CELL_GCM_TEXTURE_A4R4G4B4: + case CELL_GCM_TEXTURE_R5G6B5: + case CELL_GCM_TEXTURE_A8R8G8B8: + case CELL_GCM_TEXTURE_COMPRESSED_DXT1: + case CELL_GCM_TEXTURE_COMPRESSED_DXT23: + case CELL_GCM_TEXTURE_COMPRESSED_DXT45: + case CELL_GCM_TEXTURE_G8B8: + case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8: + case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8: + case CELL_GCM_TEXTURE_R6G5B5: + case CELL_GCM_TEXTURE_R5G5B5A1: + case CELL_GCM_TEXTURE_D1R5G5B5: + case CELL_GCM_TEXTURE_D8R8G8B8: + // Base texture formats - everything is supported + return RSX_FORMAT_FEATURE_SIGNED_COMPONENTS | RSX_FORMAT_FEATURE_GAMMA_CORRECTION | RSX_FORMAT_FEATURE_BIASED_NORMALIZATION; + case CELL_GCM_TEXTURE_DEPTH24_D8: case CELL_GCM_TEXTURE_DEPTH24_D8_FLOAT: case CELL_GCM_TEXTURE_DEPTH16: case CELL_GCM_TEXTURE_DEPTH16_FLOAT: + // Depth textures will hang the hardware if BX2 or GAMMA is active. ARGB8_SIGNED has no impact. + return 0; + case CELL_GCM_TEXTURE_X16: case CELL_GCM_TEXTURE_Y16_X16: + // X16 | Y16 - GAMMA causes hangs. ARGB8_SIGNED is ignored. UNSIGNED_REMAP=BIASED works. + return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION; + case CELL_GCM_TEXTURE_COMPRESSED_HILO8: + // GAMMA causes GPU hangs. ARGB8_SIGNED is ignored. UNSIGNED_REMAP=BIASED works. + return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION; + case CELL_GCM_TEXTURE_COMPRESSED_HILO_S8: + // GAMMA causes hangs. Other flags ignored. + return 0; + case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT: case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT: case CELL_GCM_TEXTURE_X32_FLOAT: case CELL_GCM_TEXTURE_Y16_X16_FLOAT: - // NOTE: Special data formats (XY, HILO, DEPTH) are not RGB formats - return false; - default: - return true; + // Floating point textures. Nothing works. + return 0; } + fmt::throw_exception("Unknown format 0x%x", texture_format); } /** diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.h b/rpcs3/Emu/RSX/Common/TextureUtils.h index cc40305721..3928e22874 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.h +++ b/rpcs3/Emu/RSX/Common/TextureUtils.h @@ -9,6 +9,8 @@ namespace rsx { + using flags32_t = u32; + enum texture_upload_context : u32 { shader_read = 1, @@ -125,6 +127,15 @@ namespace rsx using namespace format_class_; + enum format_features : u8 + { + RSX_FORMAT_FEATURE_SIGNED_COMPONENTS = (1 << 0), + RSX_FORMAT_FEATURE_BIASED_NORMALIZATION = (1 << 1), + RSX_FORMAT_FEATURE_GAMMA_CORRECTION = (1 << 2), + }; + + using enum format_features; + // Sampled image descriptor class sampled_image_descriptor_base { @@ -257,7 +268,12 @@ namespace rsx u8 get_format_sample_count(rsx::surface_antialiasing antialias); u32 get_max_depth_value(rsx::surface_depth_format2 format); bool is_depth_stencil_format(rsx::surface_depth_format2 format); - bool is_int8_remapped_format(u32 format); // Returns true if the format is treated as INT8 by the RSX remapper. + + /** + * Format feature support. There is not simple format to determine what is supported here, results are from hw tests + * Returns a bitmask of supported features. + */ + rsx::flags32_t get_format_features(u32 texture_format); /** * Returns number of texel rows encoded in one pitch-length line of bytes diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 44e8d8fb3f..447e32db9b 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2321,17 +2321,35 @@ namespace rsx } } - if (rsx::is_int8_remapped_format(format)) + if (const auto format_features = rsx::get_format_features(format); format_features != 0) { // Special operations applied to 8-bit formats such as gamma correction and sign conversion // NOTE: The unsigned_remap=bias flag being set flags the texture as being compressed normal (2n-1 / BX2) (UE3) // NOTE: The ARGB8_signed flag means to reinterpret the raw bytes as signed. This is different than unsigned_remap=bias which does range decompression. // This is a separate method of setting the format to signed mode without doing so per-channel - // Precedence = SNORM > GAMMA > UNSIGNED_REMAP (See Resistance 3 for GAMMA/BX2 relationship, UE3 for BX2 effect) + // Precedence = SNORM > GAMMA > UNSIGNED_REMAP/BX2 + // Games using mixed flags: (See Resistance 3 for GAMMA/BX2 relationship, UE3 for BX2 effect) + u32 argb8_signed = 0; + u32 unsigned_remap = 0; + u32 gamma = 0; + + if (format_features & RSX_FORMAT_FEATURE_SIGNED_COMPONENTS) + { + argb8_signed = tex.argb_signed(); + } + + if (format_features & RSX_FORMAT_FEATURE_GAMMA_CORRECTION) + { + gamma = tex.gamma() & ~(argb8_signed); + } + + if (format_features & RSX_FORMAT_FEATURE_BIASED_NORMALIZATION) + { + // The renormalization flag applies to all channels + unsigned_remap = (tex.unsigned_remap() == CELL_GCM_TEXTURE_UNSIGNED_REMAP_NORMAL) ? 0u : 0xF; + unsigned_remap &= ~(argb8_signed | gamma); + } - const u32 argb8_signed = tex.argb_signed(); // _SNROM - const u32 gamma = tex.gamma() & ~argb8_signed; // _SRGB - const u32 unsigned_remap = (tex.unsigned_remap() == CELL_GCM_TEXTURE_UNSIGNED_REMAP_NORMAL)? 0u : (~(gamma | argb8_signed) & 0xF); // _BX2 u32 argb8_convert = gamma; // The options are mutually exclusive From e29832fa0062a10cfa9fbb6e3ed8f9cbb78dc10e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Feb 2026 01:56:26 +0300 Subject: [PATCH 242/630] fixup [first commit] --- .../RSXProg/RSXFragmentTextureOps.glsl | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index b95105e410..2f03cb7730 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -219,26 +219,26 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) mask = uvec4(op_mask) & uvec4(SEXT_R_MASK, SEXT_G_MASK, SEXT_B_MASK, SEXT_A_MASK); convert = _sext_unorm8x4(rgba); rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); - ch_mask &= ~(op_mask >> SEXT_R_BIT); + ch_mask &= ~(op_mask >> SEXT_A_BIT); } - op_mask = control_bits & uint(SIGN_EXPAND_MASK) & (ch_mask << EXPAND_R_BIT); + op_mask = control_bits & uint(GAMMA_CTRL_MASK) & (ch_mask << GAMMA_A_BIT); + if (op_mask != 0u) + { + // Gamma correction + mask = uvec4(op_mask) & uvec4(GAMMA_R_MASK, GAMMA_G_MASK, GAMMA_B_MASK, GAMMA_A_MASK); + convert = srgb_to_linear(rgba); + rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); + ch_mask &= ~(op_mask >> GAMMA_A_BIT); + } + + op_mask = control_bits & uint(SIGN_EXPAND_MASK) & (ch_mask << EXPAND_A_BIT); if (op_mask != 0u) { // Expand to signed normalized by decompressing the signal mask = uvec4(op_mask) & uvec4(EXPAND_R_MASK, EXPAND_G_MASK, EXPAND_B_MASK, EXPAND_A_MASK); convert = (rgba * 2.f - 1.f); rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); - ch_mask &= ~(op_mask >> EXPAND_R_BIT); - } - - op_mask = control_bits & uint(GAMMA_CTRL_MASK) & (ch_mask << GAMMA_R_BIT); - if (op_mask != 0u) - { - // Gamma correction - mask = uvec4(op_mask) & uvec4(GAMMA_R_MASK, GAMMA_G_MASK, GAMMA_B_MASK, GAMMA_A_MASK); - convert = srgb_to_linear(rgba); - return _select(rgba, convert, notEqual(mask, uvec4(0))); } return rgba; From d3cd3e96501c6f9b7ceba8c39b81faf46eb38af0 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Feb 2026 01:58:48 +0300 Subject: [PATCH 243/630] rsx: Remove value remapping shuffle --- rpcs3/Emu/RSX/RSXThread.cpp | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 447e32db9b..86edb7be9d 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2357,36 +2357,9 @@ namespace rsx ensure((argb8_signed & unsigned_remap) == 0); ensure((gamma & unsigned_remap) == 0); - // Helper function to apply a per-channel mask based on an input mask - const auto apply_sign_convert_mask = [&](u32 mask, u32 bit_offset) - { - // TODO: Use actual remap mask to account for 0 and 1 overrides in default mapping - // TODO: Replace this clusterfuck of texture control with matrix transformation - const auto remap_ctrl = (tex.remap() >> 8) & 0xAA; - if (remap_ctrl == 0xAA) - { - argb8_convert |= (mask & 0xFu) << bit_offset; - return; - } - - if ((remap_ctrl & 0x03) == 0x02) argb8_convert |= (mask & 0x1u) << bit_offset; - if ((remap_ctrl & 0x0C) == 0x08) argb8_convert |= (mask & 0x2u) << bit_offset; - if ((remap_ctrl & 0x30) == 0x20) argb8_convert |= (mask & 0x4u) << bit_offset; - if ((remap_ctrl & 0xC0) == 0x80) argb8_convert |= (mask & 0x8u) << bit_offset; - }; - - if (argb8_signed) - { - // Apply integer sign extension from uint8 to sint8 and renormalize - apply_sign_convert_mask(argb8_signed, texture_control_bits::SEXT_OFFSET); - } - - if (unsigned_remap) - { - // Apply sign expansion, compressed normal-map style (2n - 1) - apply_sign_convert_mask(unsigned_remap, texture_control_bits::EXPAND_OFFSET); - } - + // NOTE: Hardware tests show that remapping bypasses the channel swizzles completely + argb8_convert |= (argb8_signed << texture_control_bits::SEXT_OFFSET); + argb8_convert |= (unsigned_remap << texture_control_bits::EXPAND_OFFSET); texture_control |= argb8_convert; } From 765e72dcb76c235e0d17c6dbb989f1d03b4c2254 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Feb 2026 02:58:51 +0300 Subject: [PATCH 244/630] rsx: Use 'format features' to drive BX2 texture sample remapping on the GPU - Fixes problems with BX2 kicking in when it shouldn't --- .../RSX/Program/FragmentProgramDecompiler.cpp | 2 +- rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 6 ++++- rpcs3/Emu/RSX/Program/GLSLCommon.h | 6 ++++- .../RSXProg/RSXFragmentTextureOps.glsl | 25 ++++++++++++++++--- rpcs3/Emu/RSX/RSXThread.cpp | 2 ++ 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index ef2029c652..c00cef47e6 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -1192,7 +1192,7 @@ bool FragmentProgramDecompiler::handle_tex_srb(u32 opcode) if (dst.exp_tex) { properties.has_exp_tex_op = true; - AddCode("_enable_texture_expand();"); + AddCode("_enable_texture_expand($_i);"); } // Shadow proj diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index 1421b179fc..8f7cc46e66 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -360,7 +360,11 @@ namespace glsl { "FILTERED_MAG_BIT", rsx::texture_control_bits::FILTERED_MAG }, { "FILTERED_MIN_BIT", rsx::texture_control_bits::FILTERED_MIN }, { "INT_COORDS_BIT ", rsx::texture_control_bits::UNNORMALIZED_COORDS }, - { "CLAMP_COORDS_BIT", rsx::texture_control_bits::CLAMP_TEXCOORDS_BIT } + { "CLAMP_COORDS_BIT", rsx::texture_control_bits::CLAMP_TEXCOORDS_BIT }, + + { "FORMAT_FEATURE_SIGNED_BIT", rsx::texture_control_bits::FF_SIGNED_BIT }, + { "FORMAT_FEATURE_GAMMA_BIT", rsx::texture_control_bits::FF_GAMMA_BIT }, + { "FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT", rsx::texture_control_bits::FF_BIASED_RENORM_BIT } }); if (props.require_texture_expand) diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.h b/rpcs3/Emu/RSX/Program/GLSLCommon.h index 942374436e..b417947002 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.h +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.h @@ -37,12 +37,16 @@ namespace rsx WRAP_S, WRAP_T, WRAP_R, + FF_SIGNED_BIT, + FF_BIASED_RENORM_BIT, + FF_GAMMA_BIT, GAMMA_CTRL_MASK = (1 << GAMMA_R) | (1 << GAMMA_G) | (1 << GAMMA_B) | (1 << GAMMA_A), EXPAND_MASK = (1 << EXPAND_R) | (1 << EXPAND_G) | (1 << EXPAND_B) | (1 << EXPAND_A), EXPAND_OFFSET = EXPAND_A, SEXT_MASK = (1 << SEXT_R) | (1 << SEXT_G) | (1 << SEXT_B) | (1 << SEXT_A), - SEXT_OFFSET = SEXT_A + SEXT_OFFSET = SEXT_A, + FORMAT_FEATURES_OFFSET = FF_SIGNED_BIT, }; enum ROP_control_bits : u32 diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index 2f03cb7730..7e8e88533c 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -20,13 +20,30 @@ R"( #define SEXT_MASK (SEXT_R_MASK | SEXT_G_MASK | SEXT_B_MASK | SEXT_A_MASK) #define FILTERED_MASK (FILTERED_MAG_BIT | FILTERED_MIN_BIT) +#define FORMAT_FEATURE_SIGNED (1 << FORMAT_FEATURE_SIGNED_BIT) +#define FORMAT_FEATURE_GAMMA (1 << FORMAT_FEATURE_GAMMA_BIT) +#define FORMAT_FEATURE_BIASED_RENORMALIZATION (1 << FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT) +#define FORMAT_FEATURE_MASK (FORMAT_FEATURE_SIGNED | FORMAT_FEATURE_GAMMA | FORMAT_FEATURE_BIASED_RENORMALIZATION) + #ifdef _ENABLE_TEXTURE_EXPAND + // NOTE: BX2 expansion overrides GAMMA correction uint _texture_flag_override = 0; - #define _enable_texture_expand() _texture_flag_override = SIGN_EXPAND_MASK - #define _disable_texture_expand() _texture_flag_override = 0 - #define TEX_FLAGS(index) (TEX_PARAM(index).flags | _texture_flag_override) + uint _texture_flag_erase = 0; + #define _enable_texture_expand(index) \ + do { \ + if (_test_bit(TEX_PARAM(index).flags, FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT)) { \ + _texture_flag_override = SIGN_EXPAND_MASK; \ + _texture_flag_erase = GAMMA_CTRL_MASK; \ + } \ + } while (false) + #define _disable_texture_expand() \ + do { \ + _texture_flag_override = 0; \ + _texture_flag_erase = 0; \ + } while (false) + #define TEX_FLAGS(index) ((TEX_PARAM(index).flags & ~(FORMAT_FEATURE_MASK | _texture_flag_erase)) | _texture_flag_override) #else - #define TEX_FLAGS(index) TEX_PARAM(index).flags + #define TEX_FLAGS(index) (TEX_PARAM(index).flags & ~FORMAT_FEATURE_MASK) #endif #define TEX_NAME(index) tex##index diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 86edb7be9d..984f64afcd 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2361,6 +2361,8 @@ namespace rsx argb8_convert |= (argb8_signed << texture_control_bits::SEXT_OFFSET); argb8_convert |= (unsigned_remap << texture_control_bits::EXPAND_OFFSET); texture_control |= argb8_convert; + + texture_control |= format_features << texture_control_bits::FORMAT_FEATURES_OFFSET; } current_fragment_program.texture_params[i].control = texture_control; From 3f321c61f379baec2e416ac5abdae973b665d78c Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Feb 2026 03:11:47 +0300 Subject: [PATCH 245/630] rsx: Fix remapping behavior for depth textures (sampled as depth) --- rpcs3/Emu/RSX/Common/TextureUtils.cpp | 3 ++- rpcs3/Emu/RSX/RSXThread.cpp | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.cpp b/rpcs3/Emu/RSX/Common/TextureUtils.cpp index 5fda3c6131..ddfbb99b9b 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.cpp +++ b/rpcs3/Emu/RSX/Common/TextureUtils.cpp @@ -1227,7 +1227,8 @@ namespace rsx case CELL_GCM_TEXTURE_DEPTH16: case CELL_GCM_TEXTURE_DEPTH16_FLOAT: // Depth textures will hang the hardware if BX2 or GAMMA is active. ARGB8_SIGNED has no impact. - return 0; + // UNSIGNED_REMAP=BIASED works on all formats including the float variants. + return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION; case CELL_GCM_TEXTURE_X16: case CELL_GCM_TEXTURE_Y16_X16: diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 984f64afcd..0d9955b4d4 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2323,7 +2323,6 @@ namespace rsx if (const auto format_features = rsx::get_format_features(format); format_features != 0) { - // Special operations applied to 8-bit formats such as gamma correction and sign conversion // NOTE: The unsigned_remap=bias flag being set flags the texture as being compressed normal (2n-1 / BX2) (UE3) // NOTE: The ARGB8_signed flag means to reinterpret the raw bytes as signed. This is different than unsigned_remap=bias which does range decompression. // This is a separate method of setting the format to signed mode without doing so per-channel From 2f5a66581fc8570b9a770ac5ddf5752fc2b1d3d2 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 12 Feb 2026 01:23:13 +0300 Subject: [PATCH 246/630] rsx/fp: Fix biased renormalization without BX2 flag - With biased renorm, a value of 0 gives a value slightly less than -1 - Biased renormalization does not have a "clamped" mode unlike sext --- .../GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index 7e8e88533c..cb89f718bf 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -29,17 +29,20 @@ R"( // NOTE: BX2 expansion overrides GAMMA correction uint _texture_flag_override = 0; uint _texture_flag_erase = 0; + bool _texture_bx2_active = false; #define _enable_texture_expand(index) \ do { \ if (_test_bit(TEX_PARAM(index).flags, FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT)) { \ _texture_flag_override = SIGN_EXPAND_MASK; \ _texture_flag_erase = GAMMA_CTRL_MASK; \ + _texture_bx2_active = true; \ } \ } while (false) #define _disable_texture_expand() \ do { \ _texture_flag_override = 0; \ _texture_flag_erase = 0; \ + _texture_bx2_active = false; \ } while (false) #define TEX_FLAGS(index) ((TEX_PARAM(index).flags & ~(FORMAT_FEATURE_MASK | _texture_flag_erase)) | _texture_flag_override) #else @@ -200,7 +203,7 @@ vec4 _sext_unorm8x4(const in vec4 x) vec4 _process_texel(in vec4 rgba, const in uint control_bits) { - if (control_bits == 0) + if ((control_bits & ~FORMAT_FEATURE_MASK) == 0u) { return rgba; } @@ -254,7 +257,12 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) { // Expand to signed normalized by decompressing the signal mask = uvec4(op_mask) & uvec4(EXPAND_R_MASK, EXPAND_G_MASK, EXPAND_B_MASK, EXPAND_A_MASK); - convert = (rgba * 2.f - 1.f); +#ifdef _ENABLE_TEXTURE_EXPAND + if (_texture_bx2_active) + convert = (rgba * 2.f - 1.f); + else +#endif + convert = (floor(fma(rgba, vec4(255.f), vec4(0.5f))) - 128.f) / 127.f; rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); } From 49029c9b9810ef4118773c1ab108c86a867154a9 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 12 Feb 2026 02:22:34 +0300 Subject: [PATCH 247/630] rsx: Handle 16-bit format remapping --- rpcs3/Emu/RSX/Common/TextureUtils.cpp | 6 ++-- rpcs3/Emu/RSX/Common/TextureUtils.h | 1 + rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 35 ++++++++++--------- rpcs3/Emu/RSX/Program/GLSLCommon.h | 1 + .../RSXProg/RSXFragmentTextureOps.glsl | 34 +++++++++++++----- 5 files changed, 49 insertions(+), 28 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.cpp b/rpcs3/Emu/RSX/Common/TextureUtils.cpp index ddfbb99b9b..7fe0431baf 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.cpp +++ b/rpcs3/Emu/RSX/Common/TextureUtils.cpp @@ -1231,9 +1231,11 @@ namespace rsx return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION; case CELL_GCM_TEXTURE_X16: + // X16 - GAMMA causes hangs. ARGB8_SIGNED is ignored. UNSIGNED_REMAP=BIASED works. + return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION | RSX_FORMAT_FEATURE_16BIT_CHANNELS; case CELL_GCM_TEXTURE_Y16_X16: - // X16 | Y16 - GAMMA causes hangs. ARGB8_SIGNED is ignored. UNSIGNED_REMAP=BIASED works. - return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION; + // X16 | Y16 - GAMMA causes hangs. ARGB8_SIGNED works. UNSIGNED_REMAP=BIASED also works. + return RSX_FORMAT_FEATURE_SIGNED_COMPONENTS | RSX_FORMAT_FEATURE_BIASED_NORMALIZATION | RSX_FORMAT_FEATURE_16BIT_CHANNELS; case CELL_GCM_TEXTURE_COMPRESSED_HILO8: // GAMMA causes GPU hangs. ARGB8_SIGNED is ignored. UNSIGNED_REMAP=BIASED works. diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.h b/rpcs3/Emu/RSX/Common/TextureUtils.h index 3928e22874..65f4ef5c6f 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.h +++ b/rpcs3/Emu/RSX/Common/TextureUtils.h @@ -132,6 +132,7 @@ namespace rsx RSX_FORMAT_FEATURE_SIGNED_COMPONENTS = (1 << 0), RSX_FORMAT_FEATURE_BIASED_NORMALIZATION = (1 << 1), RSX_FORMAT_FEATURE_GAMMA_CORRECTION = (1 << 2), + RSX_FORMAT_FEATURE_16BIT_CHANNELS = (1 << 3), // Complements RSX_FORMAT_FEATURE_SIGNED_COMPONENTS }; using enum format_features; diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index 8f7cc46e66..ebf73e935a 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -337,21 +337,21 @@ namespace glsl // Declare special texture control flags program_common::define_glsl_constants(OS, { - { "GAMMA_R_BIT " , rsx::texture_control_bits::GAMMA_R }, - { "GAMMA_G_BIT " , rsx::texture_control_bits::GAMMA_G }, - { "GAMMA_B_BIT " , rsx::texture_control_bits::GAMMA_B }, - { "GAMMA_A_BIT " , rsx::texture_control_bits::GAMMA_A }, - { "EXPAND_R_BIT" , rsx::texture_control_bits::EXPAND_R }, - { "EXPAND_G_BIT" , rsx::texture_control_bits::EXPAND_G }, - { "EXPAND_B_BIT" , rsx::texture_control_bits::EXPAND_B }, - { "EXPAND_A_BIT" , rsx::texture_control_bits::EXPAND_A }, - { "SEXT_R_BIT" , rsx::texture_control_bits::SEXT_R }, - { "SEXT_G_BIT" , rsx::texture_control_bits::SEXT_G }, - { "SEXT_B_BIT" , rsx::texture_control_bits::SEXT_B }, - { "SEXT_A_BIT" , rsx::texture_control_bits::SEXT_A }, - { "WRAP_S_BIT", rsx::texture_control_bits::WRAP_S }, - { "WRAP_T_BIT", rsx::texture_control_bits::WRAP_T }, - { "WRAP_R_BIT", rsx::texture_control_bits::WRAP_R }, + { "GAMMA_R_BIT ", rsx::texture_control_bits::GAMMA_R }, + { "GAMMA_G_BIT ", rsx::texture_control_bits::GAMMA_G }, + { "GAMMA_B_BIT ", rsx::texture_control_bits::GAMMA_B }, + { "GAMMA_A_BIT ", rsx::texture_control_bits::GAMMA_A }, + { "EXPAND_R_BIT", rsx::texture_control_bits::EXPAND_R }, + { "EXPAND_G_BIT", rsx::texture_control_bits::EXPAND_G }, + { "EXPAND_B_BIT", rsx::texture_control_bits::EXPAND_B }, + { "EXPAND_A_BIT", rsx::texture_control_bits::EXPAND_A }, + { "SEXT_R_BIT", rsx::texture_control_bits::SEXT_R }, + { "SEXT_G_BIT", rsx::texture_control_bits::SEXT_G }, + { "SEXT_B_BIT", rsx::texture_control_bits::SEXT_B }, + { "SEXT_A_BIT", rsx::texture_control_bits::SEXT_A }, + { "WRAP_S_BIT", rsx::texture_control_bits::WRAP_S }, + { "WRAP_T_BIT", rsx::texture_control_bits::WRAP_T }, + { "WRAP_R_BIT", rsx::texture_control_bits::WRAP_R }, { "ALPHAKILL ", rsx::texture_control_bits::ALPHAKILL }, { "RENORMALIZE ", rsx::texture_control_bits::RENORMALIZE }, @@ -363,8 +363,9 @@ namespace glsl { "CLAMP_COORDS_BIT", rsx::texture_control_bits::CLAMP_TEXCOORDS_BIT }, { "FORMAT_FEATURE_SIGNED_BIT", rsx::texture_control_bits::FF_SIGNED_BIT }, - { "FORMAT_FEATURE_GAMMA_BIT", rsx::texture_control_bits::FF_GAMMA_BIT }, - { "FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT", rsx::texture_control_bits::FF_BIASED_RENORM_BIT } + { "FORMAT_FEATURE_GAMMA_BIT", rsx::texture_control_bits::FF_GAMMA_BIT }, + { "FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT", rsx::texture_control_bits::FF_BIASED_RENORM_BIT }, + { "FORMAT_FEATURE_16BIT_CHANNELS_BIT", rsx::texture_control_bits::FF_16BIT_CHANNELS_BIT } }); if (props.require_texture_expand) diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.h b/rpcs3/Emu/RSX/Program/GLSLCommon.h index b417947002..ae22464f12 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.h +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.h @@ -40,6 +40,7 @@ namespace rsx FF_SIGNED_BIT, FF_BIASED_RENORM_BIT, FF_GAMMA_BIT, + FF_16BIT_CHANNELS_BIT, GAMMA_CTRL_MASK = (1 << GAMMA_R) | (1 << GAMMA_G) | (1 << GAMMA_B) | (1 << GAMMA_A), EXPAND_MASK = (1 << EXPAND_R) | (1 << EXPAND_G) | (1 << EXPAND_B) | (1 << EXPAND_A), diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index cb89f718bf..a59e8ae3a1 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -23,7 +23,8 @@ R"( #define FORMAT_FEATURE_SIGNED (1 << FORMAT_FEATURE_SIGNED_BIT) #define FORMAT_FEATURE_GAMMA (1 << FORMAT_FEATURE_GAMMA_BIT) #define FORMAT_FEATURE_BIASED_RENORMALIZATION (1 << FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT) -#define FORMAT_FEATURE_MASK (FORMAT_FEATURE_SIGNED | FORMAT_FEATURE_GAMMA | FORMAT_FEATURE_BIASED_RENORMALIZATION) +#define FORMAT_FEATURE_16BIT_CHANNELS (1 << FORMAT_FEATURE_16BIT_CHANNELS_BIT) +#define FORMAT_FEATURE_MASK (FORMAT_FEATURE_SIGNED | FORMAT_FEATURE_GAMMA | FORMAT_FEATURE_BIASED_RENORMALIZATION | FORMAT_FEATURE_16BIT_CHANNELS) #ifdef _ENABLE_TEXTURE_EXPAND // NOTE: BX2 expansion overrides GAMMA correction @@ -44,9 +45,9 @@ R"( _texture_flag_erase = 0; \ _texture_bx2_active = false; \ } while (false) - #define TEX_FLAGS(index) ((TEX_PARAM(index).flags & ~(FORMAT_FEATURE_MASK | _texture_flag_erase)) | _texture_flag_override) + #define TEX_FLAGS(index) ((TEX_PARAM(index).flags & ~(_texture_flag_erase)) | _texture_flag_override) #else - #define TEX_FLAGS(index) (TEX_PARAM(index).flags & ~FORMAT_FEATURE_MASK) + #define TEX_FLAGS(index) (TEX_PARAM(index).flags) #endif #define TEX_NAME(index) tex##index @@ -195,10 +196,19 @@ vec4 _texcoord_xform_shadow(const in vec4 coord4, const in sampler_info params) vec4 _sext_unorm8x4(const in vec4 x) { // TODO: Handle clamped sign-extension - const vec4 bits = floor(fma(x, vec4(255.f), vec4(0.5f))); - const bvec4 sign_check = lessThan(bits, vec4(128.f)); - const vec4 ret = _select(bits - 256.f, bits, sign_check); - return ret / 127.f; + const uint shift = 32 - 8; // sext 8-bit value into 32-bit container + const uvec4 ubits = uvec4(floor(fma(x, vec4(255.f), vec4(0.5f)))); + const ivec4 ibits = ivec4(ubits << shift); + return (ibits >> shift) / 127.f; +} + +vec4 _sext_unorm16x4(const in vec4 x) +{ + // TODO: Handle clamped sign-extension + const uint shift = 32 - 16; // sext 16-bit value into 32-bit container + const uvec4 ubits = uvec4(floor(fma(x, vec4(65535.f), vec4(0.5f)))); + const ivec4 ibits = ivec4(ubits << shift); + return (ibits >> shift) / 32767.f; } vec4 _process_texel(in vec4 rgba, const in uint control_bits) @@ -237,7 +247,10 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) { // Sign-extend the input signal mask = uvec4(op_mask) & uvec4(SEXT_R_MASK, SEXT_G_MASK, SEXT_B_MASK, SEXT_A_MASK); - convert = _sext_unorm8x4(rgba); + if (_test_bit(control_bits, FORMAT_FEATURE_16BIT_CHANNELS_BIT)) + convert = _sext_unorm16x4(rgba); + else + convert = _sext_unorm8x4(rgba); rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); ch_mask &= ~(op_mask >> SEXT_A_BIT); } @@ -262,7 +275,10 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) convert = (rgba * 2.f - 1.f); else #endif - convert = (floor(fma(rgba, vec4(255.f), vec4(0.5f))) - 128.f) / 127.f; + if (_test_bit(control_bits, FORMAT_FEATURE_16BIT_CHANNELS_BIT)) + convert = (floor(fma(rgba, vec4(65535.f), vec4(0.5f))) - 32768.f) / 32767.f; + else + convert = (floor(fma(rgba, vec4(255.f), vec4(0.5f))) - 128.f) / 127.f; rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); } From ed3d2a096c5545d9a99ab47582eaec899dbbf8f3 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 15 Feb 2026 10:15:46 +0100 Subject: [PATCH 248/630] audio: Default buffering to 34ms --- rpcs3/Emu/system_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 518e6eeb6e..aaa889ce1f 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -248,7 +248,7 @@ struct cfg_root : cfg::node cfg::string audio_device{ this, "Audio Device", "@@@default@@@", true }; cfg::_int<0, 200> volume{ this, "Master Volume", 100, true }; cfg::_bool enable_buffering{ this, "Enable Buffering", true, true }; - cfg::_int <4, 250> desired_buffer_duration{ this, "Desired Audio Buffer Duration", 100, true }; + cfg::_int <4, 250> desired_buffer_duration{ this, "Desired Audio Buffer Duration", 34, true }; cfg::_bool enable_time_stretching{ this, "Enable Time Stretching", false, true }; cfg::_bool disable_sampling_skip{ this, "Disable Sampling Skip", false, true }; cfg::_int<0, 100> time_stretching_threshold{ this, "Time Stretching Threshold", 75, true }; From 27fe5c66042e819a18efbd48e4dbf0c1575a2521 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 15 Feb 2026 16:46:32 +0300 Subject: [PATCH 249/630] rsx: Fix input-side vs output-side remapping flags - Sign bit and biased renorm apply on input, Gamma on output --- rpcs3/Emu/RSX/RSXThread.cpp | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 0d9955b4d4..b7c1d2ca77 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2332,19 +2332,47 @@ namespace rsx u32 unsigned_remap = 0; u32 gamma = 0; + auto remap_channel_bits = [](const rsx::texture_channel_remap_t& remap, u32 bits) -> u32 + { + if (!bits || remap.encoded == RSX_TEXTURE_REMAP_IDENTITY) [[ likely ]] + { + return bits; + } + + u32 result = 0; + for (u8 channel = 0; channel < 4; ++channel) + { + switch (remap.control_map[channel]) + { + case CELL_GCM_TEXTURE_REMAP_REMAP: + if (bits & (1u << remap.channel_map[channel])) + { + result |= (1u << channel); + } + break; + default: + break; + } + } + return result; + }; + + const auto texture_remap = tex.decoded_remap(); if (format_features & RSX_FORMAT_FEATURE_SIGNED_COMPONENTS) { - argb8_signed = tex.argb_signed(); + // Tests show this is applied pre-readout. It's just a property of the incoming bytes and is therefore subject to remap. + argb8_signed = remap_channel_bits(texture_remap, tex.argb_signed()); } if (format_features & RSX_FORMAT_FEATURE_GAMMA_CORRECTION) { + // Tests show this is applied post-readout. It's a property of the final value stored in the register and is not remapped. It overwrites even constant channels (REMAP_ZERO | REMAP_ONE) gamma = tex.gamma() & ~(argb8_signed); } if (format_features & RSX_FORMAT_FEATURE_BIASED_NORMALIZATION) { - // The renormalization flag applies to all channels + // The renormalization flag applies to all channels. It is weaker than the other flags. unsigned_remap = (tex.unsigned_remap() == CELL_GCM_TEXTURE_UNSIGNED_REMAP_NORMAL) ? 0u : 0xF; unsigned_remap &= ~(argb8_signed | gamma); } From 8a1b3237497c02e055c3b18ba3be4245e1a0e4d5 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 15 Feb 2026 17:34:00 +0300 Subject: [PATCH 250/630] rsx/fp: Rework FP prepass analyzer to capture more information about bx2 expansion --- rpcs3/Emu/RSX/Program/ProgramStateCache.cpp | 84 ++++++++++----------- rpcs3/Emu/RSX/Program/ProgramStateCache.h | 1 + rpcs3/Emu/RSX/Program/RSXFragmentProgram.h | 8 ++ 3 files changed, 48 insertions(+), 45 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp index 45b2da4af6..15546afd7e 100644 --- a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp +++ b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "ProgramStateCache.h" +#include "FragmentProgramDecompiler.h" #include "Emu/system_config.h" #include "Emu/RSX/Core/RSXDriverState.h" #include "util/sysinfo.hpp" @@ -637,58 +638,51 @@ fragment_program_utils::fragment_program_metadata fragment_program_utils::analys while (true) { const auto inst = v128::loadu(instBuffer, index); + const auto d0 = OPDEST::from_be32(inst._u32[0]); + const auto opcode = static_cast(d0.opcode); - // Check for opcode high bit which indicates a branch instructions (opcode 0x40...0x45) - if (inst._u32[2] & (1 << 23)) + switch (opcode) { + case RSX_FP_OPCODE_TEX: + case RSX_FP_OPCODE_TEXBEM: + case RSX_FP_OPCODE_TXP: + case RSX_FP_OPCODE_TXPBEM: + case RSX_FP_OPCODE_TXD: + case RSX_FP_OPCODE_TXB: + case RSX_FP_OPCODE_TXL: + result.referenced_textures_mask |= (1 << d0.tex_num); + result.has_tex_bx2_conv |= !!d0.exp_tex; + break; + case RSX_FP_OPCODE_PK4: + case RSX_FP_OPCODE_UP4: + case RSX_FP_OPCODE_PK2: + case RSX_FP_OPCODE_UP2: + case RSX_FP_OPCODE_PKB: + case RSX_FP_OPCODE_UPB: + case RSX_FP_OPCODE_PK16: + case RSX_FP_OPCODE_UP16: + case RSX_FP_OPCODE_PKG: + case RSX_FP_OPCODE_UPG: + result.has_pack_instructions = true; + break; + case RSX_FP_OPCODE_BRK: + case RSX_FP_OPCODE_CAL: + case RSX_FP_OPCODE_IFE: + case RSX_FP_OPCODE_LOOP: + case RSX_FP_OPCODE_REP: + case RSX_FP_OPCODE_RET: // NOTE: Jump instructions are not yet proved to work outside of loops and if/else blocks // Otherwise we would need to follow the execution chain result.has_branch_instructions = true; + break; } - else - { - const u32 opcode = (inst._u32[0] >> 16) & 0x3F; - if (opcode) - { - switch (opcode) - { - case RSX_FP_OPCODE_TEX: - case RSX_FP_OPCODE_TEXBEM: - case RSX_FP_OPCODE_TXP: - case RSX_FP_OPCODE_TXPBEM: - case RSX_FP_OPCODE_TXD: - case RSX_FP_OPCODE_TXB: - case RSX_FP_OPCODE_TXL: - { - //Bits 17-20 of word 1, swapped within u16 sections - //Bits 16-23 are swapped into the upper 8 bits (24-31) - const u32 tex_num = (inst._u32[0] >> 25) & 15; - result.referenced_textures_mask |= (1 << tex_num); - break; - } - case RSX_FP_OPCODE_PK4: - case RSX_FP_OPCODE_UP4: - case RSX_FP_OPCODE_PK2: - case RSX_FP_OPCODE_UP2: - case RSX_FP_OPCODE_PKB: - case RSX_FP_OPCODE_UPB: - case RSX_FP_OPCODE_PK16: - case RSX_FP_OPCODE_UP16: - case RSX_FP_OPCODE_PKG: - case RSX_FP_OPCODE_UPG: - { - result.has_pack_instructions = true; - break; - } - } - } - if (is_any_src_constant(inst)) - { - //Instruction references constant, skip one slot occupied by data - index++; - result.program_constants_buffer_length += 16; - } + if (rsx::assembler::FP::get_operand_count(opcode) > 0 && + is_any_src_constant(inst)) + { + // Instruction references constant, skip one slot occupied by data + index++; + result.program_constants_buffer_length += 16; } index++; diff --git a/rpcs3/Emu/RSX/Program/ProgramStateCache.h b/rpcs3/Emu/RSX/Program/ProgramStateCache.h index efd5dd326a..ce5be4a425 100644 --- a/rpcs3/Emu/RSX/Program/ProgramStateCache.h +++ b/rpcs3/Emu/RSX/Program/ProgramStateCache.h @@ -59,6 +59,7 @@ namespace program_hash_util bool has_pack_instructions; bool has_branch_instructions; + bool has_tex_bx2_conv; bool is_nop_shader; // Does this affect Z-pass testing??? }; diff --git a/rpcs3/Emu/RSX/Program/RSXFragmentProgram.h b/rpcs3/Emu/RSX/Program/RSXFragmentProgram.h index d93ec760e6..7bb8517b85 100644 --- a/rpcs3/Emu/RSX/Program/RSXFragmentProgram.h +++ b/rpcs3/Emu/RSX/Program/RSXFragmentProgram.h @@ -54,6 +54,14 @@ union OPDEST u32 : 9; u32 write_mask : 4; }; + + static OPDEST from_be32(u32 be_word) + { + const u32 _hex = + ((be_word & 0x00FF00FF) << 8) | + ((be_word & 0xFF00FF00) >> 8); + return OPDEST{ .HEX = _hex }; + } }; union SRC0 From b30a44c1367635af0675f61504e1ca45263655c6 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 15 Feb 2026 18:15:42 +0300 Subject: [PATCH 251/630] rsx: Make BX2 flag respect constant overrides --- .../RSXProg/RSXFragmentTextureOps.glsl | 2 +- rpcs3/Emu/RSX/RSXThread.cpp | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index a59e8ae3a1..43dcf9e6eb 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -34,7 +34,7 @@ R"( #define _enable_texture_expand(index) \ do { \ if (_test_bit(TEX_PARAM(index).flags, FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT)) { \ - _texture_flag_override = SIGN_EXPAND_MASK; \ + _texture_flag_override = SIGN_EXPAND_MASK & (_get_bits(TEX_PARAM(index).remap, 16, 4) << EXPAND_A_BIT); \ _texture_flag_erase = GAMMA_CTRL_MASK; \ _texture_bx2_active = true; \ } \ diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index b7c1d2ca77..5b4b732c4d 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2366,15 +2366,19 @@ namespace rsx if (format_features & RSX_FORMAT_FEATURE_GAMMA_CORRECTION) { - // Tests show this is applied post-readout. It's a property of the final value stored in the register and is not remapped. It overwrites even constant channels (REMAP_ZERO | REMAP_ONE) + // Tests show this is applied post-readout. It's a property of the final value stored in the register and is not remapped. + // NOTE: GAMMA correction has no algorithmic effect on constants (0 and 1) so we need not mask it out for correctness. gamma = tex.gamma() & ~(argb8_signed); } if (format_features & RSX_FORMAT_FEATURE_BIASED_NORMALIZATION) { // The renormalization flag applies to all channels. It is weaker than the other flags. - unsigned_remap = (tex.unsigned_remap() == CELL_GCM_TEXTURE_UNSIGNED_REMAP_NORMAL) ? 0u : 0xF; - unsigned_remap &= ~(argb8_signed | gamma); + // This applies on input and is subject to remap overrides + if (tex.unsigned_remap() == CELL_GCM_TEXTURE_UNSIGNED_REMAP_BIASED) + { + unsigned_remap = remap_channel_bits(texture_remap, 0xF) & ~(argb8_signed | gamma); + } } u32 argb8_convert = gamma; @@ -2390,6 +2394,13 @@ namespace rsx texture_control |= argb8_convert; texture_control |= format_features << texture_control_bits::FORMAT_FEATURES_OFFSET; + + if (current_fp_metadata.has_tex_bx2_conv) + { + const u32 remap_hi = remap_channel_bits(texture_remap, 0xFu); + current_fragment_program.texture_params[i].remap &= ~(0xFu << 16u); + current_fragment_program.texture_params[i].remap |= (remap_hi << 16u); + } } current_fragment_program.texture_params[i].control = texture_control; From 0faa8945bc20956ce5ddc3b00aa0cd5ad33110bb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 18 Feb 2026 02:25:13 +0300 Subject: [PATCH 252/630] rsx/vk: Fix bug with custom border color sampler storage - If an app used multiple border colors, only the first one was being applied. --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 2 +- rpcs3/Emu/RSX/VK/vkutils/sampler.cpp | 14 +++----------- rpcs3/Emu/RSX/VK/vkutils/sampler.h | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 59f9bfb40a..491078cc93 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -275,7 +275,7 @@ void VKGSRender::load_texture_env() auto get_border_color = [&](const rsx::Texture auto& tex) { - return m_device->get_custom_border_color_support().require_border_color_remap + return m_device->get_custom_border_color_support().require_border_color_remap ? tex.remapped_border_color() : rsx::decode_border_color(tex.border_color()); }; diff --git a/rpcs3/Emu/RSX/VK/vkutils/sampler.cpp b/rpcs3/Emu/RSX/VK/vkutils/sampler.cpp index 073fc514d0..53066e2f4a 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/sampler.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/sampler.cpp @@ -182,16 +182,8 @@ namespace vk return found == m_generic_sampler_pool.end() ? nullptr : found->second.get(); } - const auto block = m_custom_color_sampler_pool.equal_range(key.base_key); - for (auto it = block.first; it != block.second; ++it) - { - if (it->second->key.border_color_key == key.border_color_key) - { - return it->second.get(); - } - } - - return nullptr; + const auto found = m_custom_color_sampler_pool.find(key); + return found == m_custom_color_sampler_pool.end() ? nullptr : found->second.get(); } cached_sampler_object_t* sampler_pool_t::emplace(const sampler_pool_key_t& key, std::unique_ptr& object) @@ -204,7 +196,7 @@ namespace vk return iterator->second.get(); } - const auto [iterator, _unused] = m_custom_color_sampler_pool.emplace(key.base_key, std::move(object)); + const auto [iterator, _unused] = m_custom_color_sampler_pool.emplace(key, std::move(object)); return iterator->second.get(); } diff --git a/rpcs3/Emu/RSX/VK/vkutils/sampler.h b/rpcs3/Emu/RSX/VK/vkutils/sampler.h index f1d81d542f..232f1073d7 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/sampler.h +++ b/rpcs3/Emu/RSX/VK/vkutils/sampler.h @@ -64,6 +64,22 @@ namespace vk { u64 base_key; u64 border_color_key; + + bool operator == (const sampler_pool_key_t& that) const + { + return this->base_key == that.base_key && + this->border_color_key == that.border_color_key; + } + }; + + struct sampler_pool_key_hash + { + size_t operator()(const vk::sampler_pool_key_t& k) const noexcept + { + usz result = k.base_key; + result ^= k.border_color_key + 0x9e3779b97f4a7c15ULL + (result << 6) + (result >> 2); + return result; + } }; struct cached_sampler_object_t : public vk::sampler, public rsx::ref_counted @@ -75,7 +91,7 @@ namespace vk class sampler_pool_t { std::unordered_map> m_generic_sampler_pool; - std::unordered_map> m_custom_color_sampler_pool; + std::unordered_map, sampler_pool_key_hash> m_custom_color_sampler_pool; public: From dc63f2fc1f75316987f4e4b898f0792db91d8f65 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 18 Feb 2026 03:07:50 +0300 Subject: [PATCH 253/630] rsx: Correct border-color register value for shader texel remapping - PS3 border color does not correctly support signed channels and instead treats them as simple compression - We instead perform the reverse conversion before sending it to our shader pipeline --- rpcs3/Emu/RSX/RSXTexture.cpp | 73 +++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index 52f8183545..e770923696 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -4,6 +4,15 @@ #include "rsx_utils.h" #include "Emu/system_config.h" +#include "util/simd.hpp" + +#if defined(ARCH_ARM64) +#if !defined(_MSC_VER) +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif +#undef FORCE_INLINE +#include "Emu/CPU/sse2neon.h" +#endif namespace rsx { @@ -291,7 +300,69 @@ namespace rsx u32 fragment_texture::border_color() const { - return registers[NV4097_SET_TEXTURE_BORDER_COLOR + (m_index * 8)]; + const u32 raw = registers[NV4097_SET_TEXTURE_BORDER_COLOR + (m_index * 8)]; + const u32 sext = argb_signed(); + + if (!sext) [[ likely ]] + { + return raw; + } + + // Border color is broken on PS3. The SNORM behavior is completely broken and behaves like BIASED renormalization instead. + // To solve the mismatch, we need to first do a bit expansion on the value then store it as sign extended. The second part is a natural part of numbers on a binary system, so we only need to do the former. + static constexpr u32 expand4_lut[16] = + { + 0x00000000u, // 0000 + 0xFF000000u, // 0001 + 0x00FF0000u, // 0010 + 0xFFFF0000u, // 0011 + 0x0000FF00u, // 0100 + 0xFF00FF00u, // 0101 + 0x00FFFF00u, // 0110 + 0xFFFFFF00u, // 0111 + 0x000000FFu, // 1000 + 0xFF0000FFu, // 1001 + 0x00FF00FFu, // 1010 + 0xFFFF00FFu, // 1011 + 0x0000FFFFu, // 1100 + 0xFF00FFFFu, // 1101 + 0x00FFFFFFu, // 1110 + 0xFFFFFFFFu // 1111 + }; + + // Bit pattern expand and reverse BE -> LE using LUT + const u32 mask = expand4_lut[sext]; + + // Now we perform the compensation operation + // BIAS operation = (V - 128 / 127) + + // Load + const __m128i _0 = _mm_setzero_si128(); + const __m128i _128 = _mm_set1_epi32(128); + const __m128i _127 = _mm_set1_epi32(127); + const __m128i _255 = _mm_set1_epi32(255); + + const auto be_raw = be_t(raw); + __m128i v = _mm_cvtsi32_si128(static_cast(be_raw)); + v = _mm_unpacklo_epi8(v, _0); + v = _mm_unpacklo_epi16(v, _0); // [ 0, 64, 255, 128 ] + + // Conversion: x = (y - 128) + v = _mm_sub_epi32(v, _128); // [ -128, -64, 127, 0 ] + + // Convert to signed encoding (reverse sext) + v = _mm_slli_epi32(v, 24); + v = _mm_srli_epi32(v, 24); + + // Pack down + v = _mm_packs_epi32(v, _0); + v = _mm_packus_epi16(v, _0); + + // Read + const u32 conv = _mm_cvtsi128_si32(v); + + // Merge + return (conv & mask) | (raw & ~mask); } color4f fragment_texture::remapped_border_color() const From 2064bd87e37da1d0946f7c5b62f2d38003abff8e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 18 Feb 2026 03:26:51 +0300 Subject: [PATCH 254/630] rsx: Fix GCC build --- rpcs3/Emu/RSX/RSXTexture.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index e770923696..b3f9dc1962 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -6,6 +6,11 @@ #include "Emu/system_config.h" #include "util/simd.hpp" +#if !defined(_MSC_VER) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" +#endif + #if defined(ARCH_ARM64) #if !defined(_MSC_VER) #pragma GCC diagnostic ignored "-Wstrict-aliasing" From 53dcf2ba00b0f1395d6e782841fdd6a8558e121a Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Thu, 19 Feb 2026 22:18:34 +0100 Subject: [PATCH 255/630] rpcn_client: Misc fixes Fix missing freeaddrinfo Fix wrong return value in a rpcn_client::connect() path Fix missing 0 presence validation in vec_stream::get_string() --- rpcs3/Emu/NP/rpcn_client.cpp | 6 ++++-- rpcs3/Emu/NP/rpcn_client.h | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index d7bb274c66..38a4ad95ca 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -896,7 +896,7 @@ namespace rpcn return error_and_disconnect("Failed to send all the bytes"); } - res = 0; + continue; } n_sent += res; } @@ -1055,6 +1055,8 @@ namespace rpcn found = found->ai_next; } + freeaddrinfo(addr_info); + if (!found_ipv4) { rpcn_log.error("connect: Failed to find IPv4 for %s", host); @@ -1156,7 +1158,7 @@ namespace rpcn if (!connected || terminate) { state = rpcn_state::failure_other; - return true; + return false; } if (received_version != RPCN_PROTOCOL_VERSION) diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index 56ba17d04d..377cd9c898 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -79,6 +79,14 @@ public: res.push_back(vec[i]); i++; } + + // Make sure we hit terminating 0 + if (i >= vec.size()) + { + error = true; + return {}; + } + i++; if (!empty && res.empty()) From b7b0e06a5404306b37299f204e11082684c3729e Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Thu, 19 Feb 2026 23:44:10 +0100 Subject: [PATCH 256/630] sys_net/lv2_socket_native: Various fixes Fix is_socket_connected(always returned false) Implement SYS_NET_IP_TTLCHK and SYS_NET_IP_MAXTTL Fix lv2_socket_native::sendmsg, it was only sending the first iovec Fix sys_net_bnet_sendto addrlen check Fix assert in lv2_socket_native::recvfrom() --- rpcs3/Emu/Cell/lv2/sys_net.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_net.h | 2 +- .../Cell/lv2/sys_net/lv2_socket_native.cpp | 50 ++++++++++--------- .../Emu/Cell/lv2/sys_net/lv2_socket_native.h | 4 ++ 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index 827a4c98f2..27731e44ca 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -992,7 +992,7 @@ error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr buf, u32 l fmt::throw_exception("sys_net_bnet_sendto(s=%d): unknown flags (0x%x)", flags); } - if (addr && addrlen < 8) + if (addr && addrlen < sizeof(sys_net_sockaddr)) { sys_net.error("sys_net_bnet_sendto(s=%d): bad addrlen (%u)", s, addrlen); return -SYS_NET_EINVAL; diff --git a/rpcs3/Emu/Cell/lv2/sys_net.h b/rpcs3/Emu/Cell/lv2/sys_net.h index b1f9ef7268..68e7041df0 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.h +++ b/rpcs3/Emu/Cell/lv2/sys_net.h @@ -107,7 +107,7 @@ enum lv2_ip_option : s32 SYS_NET_IP_MULTICAST_LOOP = 11, SYS_NET_IP_ADD_MEMBERSHIP = 12, SYS_NET_IP_DROP_MEMBERSHIP = 13, - SYS_NET_IP_TTLCHK = 23, + SYS_NET_IP_TTLCHK = 23, // This is probably the equivalent of IP_MINTTL on FreeBSD SYS_NET_IP_MAXTTL = 24, SYS_NET_IP_DONTFRAG = 26 }; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp index d420f23cc8..2eb47d7b55 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp @@ -551,12 +551,14 @@ std::tuple lv2_socket_native::getsockopt(s32 } case SYS_NET_IP_TTLCHK: { - sys_net.error("sys_net_bnet_getsockopt(IPPROTO_IP, SYS_NET_IP_TTLCHK): stubbed option"); + out_val._int = min_ttl; + out_len = sizeof(s32); return {CELL_OK, out_val, out_len}; } case SYS_NET_IP_MAXTTL: { - sys_net.error("sys_net_bnet_getsockopt(IPPROTO_IP, SYS_NET_IP_MAXTTL): stubbed option"); + out_val._int = max_ttl; + out_len = sizeof(s32); return {CELL_OK, out_val, out_len}; } case SYS_NET_IP_DONTFRAG: @@ -834,13 +836,13 @@ s32 lv2_socket_native::setsockopt(s32 level, s32 optname, const std::vector& } case SYS_NET_IP_TTLCHK: { - sys_net.error("sys_net_bnet_setsockopt(s=%d, IPPROTO_IP): Stubbed option (0x%x) (SYS_NET_IP_TTLCHK)", lv2_id, optname); - break; + min_ttl = native_int; + return {}; } case SYS_NET_IP_MAXTTL: { - sys_net.error("sys_net_bnet_setsockopt(s=%d, IPPROTO_IP): Stubbed option (0x%x) (SYS_NET_IP_MAXTTL)", lv2_id, optname); - break; + max_ttl = native_int; + return {}; } case SYS_NET_IP_DONTFRAG: { @@ -910,7 +912,7 @@ std::optional, sys_net_sockaddr>> lv2_socket_nat { auto& nph = g_fxo->get>(); const auto packet = dnshook.get_dns_packet(lv2_id); - ensure(packet.size() < len); + ensure(packet.size() <= len); memcpy(res_buf.data(), packet.data(), packet.size()); native_addr.ss_family = AF_INET; (reinterpret_cast<::sockaddr_in*>(&native_addr))->sin_port = std::bit_cast>(53); // htons(53) @@ -1069,18 +1071,20 @@ std::optional lv2_socket_native::sendmsg(s32 flags, const sys_net_msghdr& m return {-SYS_NET_ECONNRESET}; } + std::vector buf_copy; for (int i = 0; i < msg.msg_iovlen; i++) { auto iov_base = msg.msg_iov[i].iov_base; const u32 len = msg.msg_iov[i].iov_len; - const std::vector buf_copy(vm::_ptr(iov_base.addr()), vm::_ptr(iov_base.addr()) + len); + const auto* src = vm::_ptr(iov_base.addr()); + buf_copy.insert(buf_copy.end(), src, src + len); + } - native_result = ::send(native_socket, reinterpret_cast(buf_copy.data()), ::narrow(buf_copy.size()), native_flags); + native_result = ::send(native_socket, reinterpret_cast(buf_copy.data()), ::narrow(buf_copy.size()), native_flags); - if (native_result >= 0) - { - return {native_result}; - } + if (native_result >= 0) + { + return {native_result}; } result = get_last_error(!so_nbio && (flags & SYS_NET_MSG_DONTWAIT) == 0); @@ -1232,16 +1236,16 @@ bool lv2_socket_native::is_socket_connected() return false; } - fd_set readfds, writefds; - struct timeval timeout{0, 0}; // Zero timeout + pollfd pfd{}; + pfd.fd = native_socket; + pfd.events = POLLIN | POLLOUT; - FD_ZERO(&readfds); - FD_ZERO(&writefds); - FD_SET(native_socket, &readfds); - FD_SET(native_socket, &writefds); - - // Use select to check for readability and writability - const int result = ::select(1, &readfds, &writefds, NULL, &timeout); + // Use poll to check for readability and writability +#ifdef _WIN32 + const int result = WSAPoll(&pfd, 1, 0); +#else + const int result = ::poll(&pfd, 1, 0); +#endif if (result < 0) { @@ -1250,5 +1254,5 @@ bool lv2_socket_native::is_socket_connected() } // Socket is connected if it's readable or writable - return FD_ISSET(native_socket, &readfds) || FD_ISSET(native_socket, &writefds); + return (pfd.revents & (POLLIN | POLLOUT)) != 0; } diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h index cf07dfcb76..84f4218cbd 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h @@ -70,6 +70,10 @@ private: s32 so_reuseaddr = 0; s32 so_reuseport = 0; #endif + // Those values come from FreeBSD + s32 min_ttl = 1; + s32 max_ttl = 64; + u16 bound_port = 0; bool feign_tcp_conn_failure = false; // Savestate load related }; From aaf84a844542cf0697c19cb0d8579eff705b10c5 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 20 Feb 2026 00:53:12 +0100 Subject: [PATCH 257/630] sys_net/P2P: Various fixes Fix RTT adjustment Fix possible dead pointer interaction in lv2_socket_native::recvfrom() Fix iterator invalidation in nt_p2p_port::recv_data() --- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp | 5 ++--- rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp | 10 ++++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp index c0790a2e33..771402809e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp @@ -112,7 +112,6 @@ public: // reply is late, increases rtt auto& msg = it->second; - const auto addr = msg.dst_addr.sin_addr.s_addr; rtt_info rtt = rtts[msg.sock_id]; // Only increases rtt once per loop(in case a big number of packets are sent at once) if (!rtt_increased.count(msg.sock_id)) @@ -120,7 +119,7 @@ public: rtt.num_retries += 1; // Increases current rtt by 10% rtt.rtt_time += (rtt.rtt_time / 10); - rtts[addr] = rtt; + rtts[msg.sock_id] = rtt; rtt_increased.emplace(msg.sock_id); } @@ -625,7 +624,7 @@ std::tuple, sys_net_sockaddr> lv2_socket_p2ps: sys_net_sockaddr ps3_addr{}; auto* paddr = reinterpret_cast(&ps3_addr); - lv2_socket_p2ps* sock_client = reinterpret_cast(idm::check_unlocked(p2ps_client)); + auto sock_client = static_cast>(idm::get_unlocked(p2ps_client)); { std::lock_guard lock(sock_client->mutex); paddr->sin_family = SYS_NET_AF_INET; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp index 61039c7856..67be0df63b 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp @@ -249,8 +249,9 @@ bool nt_p2p_port::recv_data() auto& bound_sockets = ::at32(bound_p2p_vports, dst_vport); - for (const auto sock_id : bound_sockets) + for (auto it = bound_sockets.begin(); it != bound_sockets.end();) { + s32 sock_id = *it; const auto sock = idm::check(sock_id, [&](lv2_socket& sock) { ensure(sock.get_type() == SYS_NET_SOCK_DGRAM_P2P); @@ -262,12 +263,17 @@ bool nt_p2p_port::recv_data() if (!sock) { sys_net.error("Socket %d found in bound_p2p_vports didn't exist!", sock_id); - bound_sockets.erase(sock_id); + it = bound_sockets.erase(it); if (bound_sockets.empty()) { bound_p2p_vports.erase(dst_vport); + break; } } + else + { + it++; + } } return true; From ff992a67c8e1c1eb83c39ab619c1eab564e80c36 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 19 Feb 2026 23:58:34 +0100 Subject: [PATCH 258/630] win/fs: check file handle with GetFileInformationByHandle when creating fs::file On empty mounted drives CreateFileW may return a valid handle even if the drive is not usable. We have to check the file handle early. Otherwise other functions may fail later as a result. --- Utilities/File.cpp | 24 +++++++++++++++++------- Utilities/File.h | 14 +++++++------- rpcs3/Loader/ISO.h | 16 ++++++++-------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/Utilities/File.cpp b/Utilities/File.cpp index 30e6414675..d2adb22c61 100644 --- a/Utilities/File.cpp +++ b/Utilities/File.cpp @@ -398,12 +398,11 @@ namespace fs class windows_file final : public file_base { HANDLE m_handle; - atomic_t m_pos; + atomic_t m_pos {0}; public: windows_file(HANDLE handle) : m_handle(handle) - , m_pos(0) { } @@ -417,10 +416,10 @@ namespace fs stat_t get_stat() override { - FILE_BASIC_INFO basic_info; + FILE_BASIC_INFO basic_info {}; ensure(GetFileInformationByHandleEx(m_handle, FileBasicInfo, &basic_info, sizeof(FILE_BASIC_INFO))); // "file::stat" - stat_t info; + stat_t info {}; info.is_directory = (basic_info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; info.is_writable = (basic_info.FileAttributes & FILE_ATTRIBUTE_READONLY) == 0; info.size = this->size(); @@ -441,7 +440,7 @@ namespace fs bool trunc(u64 length) override { - FILE_END_OF_FILE_INFO _eof; + FILE_END_OF_FILE_INFO _eof {}; _eof.EndOfFile.QuadPart = length; if (!SetFileInformationByHandle(m_handle, FileEndOfFileInfo, &_eof, sizeof(_eof))) @@ -563,6 +562,7 @@ namespace fs u64 size() override { + // NOTE: this can fail if we access a mounted empty drive (e.g. after unmounting an iso). LARGE_INTEGER size; ensure(GetFileSizeEx(m_handle, &size)); // "file::size" @@ -579,7 +579,7 @@ namespace fs file_id id{"windows_file"}; id.data.resize(sizeof(FILE_ID_INFO)); - FILE_ID_INFO info; + FILE_ID_INFO info {}; if (!GetFileInformationByHandleEx(m_handle, FileIdInfo, &info, sizeof(info))) { @@ -625,7 +625,7 @@ namespace fs struct ::stat file_info; ensure(::fstat(m_fd, &file_info) == 0); // "file::stat" - stat_t info; + stat_t info {}; info.is_directory = S_ISDIR(file_info.st_mode); info.is_writable = file_info.st_mode & 0200; // HACK: approximation info.size = file_info.st_size; @@ -1656,6 +1656,16 @@ fs::file::file(const std::string& path, bs_t mode) return; } + // Check if the handle is actually valid. + // This can fail on empty mounted drives (e.g. with ERROR_NOT_READY or ERROR_INVALID_FUNCTION). + BY_HANDLE_FILE_INFORMATION info; + if (!GetFileInformationByHandle(handle, &info)) + { + CloseHandle(handle); + g_tls_error = to_error(GetLastError()); + return; + } + m_file = std::make_unique(handle); #else int flags = O_CLOEXEC; // Ensures all files are closed on execl for auto updater diff --git a/Utilities/File.h b/Utilities/File.h index 7e6356da7b..dd2db42a46 100644 --- a/Utilities/File.h +++ b/Utilities/File.h @@ -66,13 +66,13 @@ namespace fs // File attributes (TODO) struct stat_t { - bool is_directory; - bool is_symlink; - bool is_writable; - u64 size; - s64 atime; - s64 mtime; - s64 ctime; + bool is_directory = false; + bool is_symlink = false; + bool is_writable = false; + u64 size = 0; + s64 atime = 0; + s64 mtime = 0; + s64 ctime = 0; using enable_bitcopy = std::true_type; diff --git a/rpcs3/Loader/ISO.h b/rpcs3/Loader/ISO.h index 3af4732aad..588e4b8491 100644 --- a/rpcs3/Loader/ISO.h +++ b/rpcs3/Loader/ISO.h @@ -13,16 +13,16 @@ void unload_iso(); struct iso_extent_info { - u64 start; - u64 size; + u64 start = 0; + u64 size = 0; }; struct iso_fs_metadata { std::string name; - s64 time; - bool is_directory; - bool has_multiple_extents; + s64 time = 0; + bool is_directory = false; + bool has_multiple_extents = false; std::vector extents; u64 size() const; @@ -30,7 +30,7 @@ struct iso_fs_metadata struct iso_fs_node { - iso_fs_metadata metadata; + iso_fs_metadata metadata {}; std::vector> children; }; @@ -38,7 +38,7 @@ class iso_file : public fs::file_base { private: fs::file m_file; - iso_fs_metadata m_meta; + iso_fs_metadata m_meta {}; u64 m_pos = 0; std::pair get_extent_pos(u64 pos) const; @@ -80,7 +80,7 @@ class iso_archive { private: std::string m_path; - iso_fs_node m_root; + iso_fs_node m_root {}; fs::file m_file; public: From a29758de6e14cf148e2a2af89c7a74fea8979411 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 20 Feb 2026 14:48:03 +0100 Subject: [PATCH 259/630] signaling_handler: bugfix and cleanup --- rpcs3/Emu/NP/np_cache.cpp | 4 ++-- rpcs3/Emu/NP/np_handler.cpp | 4 ++-- rpcs3/Emu/NP/np_helpers.cpp | 7 +++++++ rpcs3/Emu/NP/np_helpers.h | 1 + rpcs3/Emu/NP/np_notifications.cpp | 2 +- rpcs3/Emu/NP/rpcn_client.cpp | 2 +- rpcs3/Emu/NP/signaling_handler.cpp | 12 ++++++------ 7 files changed, 20 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/NP/np_cache.cpp b/rpcs3/Emu/NP/np_cache.cpp index 04223da545..4731e0cede 100644 --- a/rpcs3/Emu/NP/np_cache.cpp +++ b/rpcs3/Emu/NP/np_cache.cpp @@ -377,7 +377,7 @@ namespace np if (!rooms.contains(room_id)) { - np_cache.error("np_cache::get_memberid cache miss room_id: room_id(%d)/npid(%s)", room_id, static_cast(npid.handle.data)); + np_cache.error("np_cache::get_memberid cache miss room_id: room_id(%d)/npid(%s)", room_id, np::npid_to_string(npid)); return std::nullopt; } @@ -389,7 +389,7 @@ namespace np return id; } - np_cache.error("np_cache::get_memberid cache miss member_id: room_id(%d)/npid(%s)", room_id, static_cast(npid.handle.data)); + np_cache.error("np_cache::get_memberid cache miss member_id: room_id(%d)/npid(%s)", room_id, np::npid_to_string(npid)); return std::nullopt; } diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index c4db3350c0..3041f24424 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1361,7 +1361,7 @@ namespace np player_history& np_handler::get_player_and_set_timestamp(const SceNpId& npid, u64 timestamp) { - std::string npid_str = std::string(npid.handle.data); + std::string npid_str = np::npid_to_string(npid); if (!players_history.contains(npid_str)) { @@ -1641,7 +1641,7 @@ namespace np return SCE_NP_BASIC_ERROR_NOT_CONNECTED; } - auto friend_infos = rpcn->get_friend_presence_by_npid(std::string(npid.handle.data)); + auto friend_infos = rpcn->get_friend_presence_by_npid(np::npid_to_string(npid)); if (!friend_infos) { return SCE_NP_BASIC_ERROR_INVALID_ARGUMENT; diff --git a/rpcs3/Emu/NP/np_helpers.cpp b/rpcs3/Emu/NP/np_helpers.cpp index 79f61ca627..39c59afdb0 100644 --- a/rpcs3/Emu/NP/np_helpers.cpp +++ b/rpcs3/Emu/NP/np_helpers.cpp @@ -89,6 +89,13 @@ namespace np // npid->reserved[0] = 1; } + std::string npid_to_string(const SceNpId& npid) + { + char npid_str[17]{}; + std::memcpy(npid_str, npid.handle.data, 16); + return std::string(npid_str); + } + void string_to_online_name(std::string_view str, SceNpOnlineName& online_name) { memset(&online_name, 0, sizeof(online_name)); diff --git a/rpcs3/Emu/NP/np_helpers.h b/rpcs3/Emu/NP/np_helpers.h index c33b4ca001..a51499ca64 100644 --- a/rpcs3/Emu/NP/np_helpers.h +++ b/rpcs3/Emu/NP/np_helpers.h @@ -13,6 +13,7 @@ namespace np std::optional string_to_communication_id(std::string_view str); void string_to_npid(std::string_view str, SceNpId& npid); + std::string npid_to_string(const SceNpId& npid); void string_to_online_name(std::string_view str, SceNpOnlineName& online_name); void string_to_avatar_url(std::string_view str, SceNpAvatarUrl& avatar_url); void strings_to_userinfo(std::string_view npid, std::string_view online_name, std::string_view avatar_url, SceNpUserInfo& user_info); diff --git a/rpcs3/Emu/NP/np_notifications.cpp b/rpcs3/Emu/NP/np_notifications.cpp index d5756a8351..92072d2b5a 100644 --- a/rpcs3/Emu/NP/np_notifications.cpp +++ b/rpcs3/Emu/NP/np_notifications.cpp @@ -54,7 +54,7 @@ namespace np const u16 member_id = notif_data->roomMemberDataInternal->memberId; const SceNpId& npid = notif_data->roomMemberDataInternal->userInfo.npId; - rpcn_log.notice("Join notification told to connect to member(%d=%s) of room(%d): %s:%d", member_id, reinterpret_cast(npid.handle.data), room_id, ip_to_string(addr_p2p), port_p2p); + rpcn_log.notice("Join notification told to connect to member(%d=%s) of room(%d): %s:%d", member_id, np::npid_to_string(npid), room_id, ip_to_string(addr_p2p), port_p2p); // Attempt Signaling auto& sigh = g_fxo->get>(); diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 38a4ad95ca..071afa2b3f 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -2318,7 +2318,7 @@ namespace rpcn { np2_structs::GetScoreGameDataRequest pb_req; pb_req.set_boardid(board_id); - pb_req.set_npid(reinterpret_cast(npid.handle.data)); + pb_req.set_npid(np::npid_to_string(npid)); pb_req.set_pcid(pc_id); std::string serialized; diff --git a/rpcs3/Emu/NP/signaling_handler.cpp b/rpcs3/Emu/NP/signaling_handler.cpp index 2e4ac5df56..e6d79f1fca 100644 --- a/rpcs3/Emu/NP/signaling_handler.cpp +++ b/rpcs3/Emu/NP/signaling_handler.cpp @@ -426,9 +426,10 @@ void signaling_handler::operator()() if (sig.sig_info->time_last_msg_recvd < now - 60s && cmd != signal_info) { // We had no connection to opponent for 60 seconds, consider the connection dead + auto retire_info = sig.sig_info; sign_log.notice("Timeout disconnection"); - update_si_status(sig.sig_info, SCE_NP_SIGNALING_CONN_STATUS_INACTIVE, SCE_NP_SIGNALING_ERROR_TIMEOUT); - retire_packet(sig.sig_info, signal_ping); // Retire ping packet if necessary + update_si_status(retire_info, SCE_NP_SIGNALING_CONN_STATUS_INACTIVE, SCE_NP_SIGNALING_ERROR_TIMEOUT); + retire_packet(retire_info, signal_ping); // Retire ping packet if necessary break; // qpackets has been emptied of all packets for this user so we're requeuing } @@ -784,7 +785,7 @@ void signaling_handler::send_information_packets(u32 addr, u16 port, const SceNp u32 signaling_handler::get_always_conn_id(const SceNpId& npid) { - std::string npid_str(reinterpret_cast(npid.handle.data)); + std::string npid_str = np::npid_to_string(npid); if (npid_to_conn_id.contains(npid_str)) return ::at32(npid_to_conn_id, npid_str); @@ -810,9 +811,8 @@ u32 signaling_handler::init_sig1(const SceNpId& npid) sig_peers[conn_id]->conn_status = SCE_NP_SIGNALING_CONN_STATUS_PENDING; // Request peer infos from RPCN - std::string npid_str(reinterpret_cast(npid.handle.data)); auto& nph = g_fxo->get>(); - nph.req_sign_infos(npid_str, conn_id); + nph.req_sign_infos(np::npid_to_string(npid), conn_id); } return conn_id; @@ -839,7 +839,7 @@ std::optional signaling_handler::get_conn_id_from_npid(const SceNpId& npid) { std::lock_guard lock(data_mutex); - std::string npid_str(reinterpret_cast(npid.handle.data)); + std::string npid_str = np::npid_to_string(npid); if (npid_to_conn_id.contains(npid_str)) return ::at32(npid_to_conn_id, npid_str); From a6b5c7e79f57c666b0f1e0f9f4fe3e8e3b886a00 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 20 Feb 2026 15:45:15 +0100 Subject: [PATCH 260/630] Generalize np::npid_to_string() use --- rpcs3/Emu/Cell/Modules/sceNp.cpp | 8 ++++---- rpcs3/Emu/NP/clans_client.cpp | 18 +++++++++--------- rpcs3/Emu/NP/np_handler.cpp | 2 +- rpcs3/Emu/NP/np_notifications.cpp | 6 +++--- rpcs3/Emu/NP/np_requests.cpp | 2 +- rpcs3/Emu/NP/np_structs_extra.cpp | 13 +++++++------ rpcs3/Emu/NP/pb_helpers.cpp | 2 +- rpcs3/Emu/NP/rpcn_client.cpp | 12 ++++++------ rpcs3/Emu/NP/signaling_handler.cpp | 8 ++------ 9 files changed, 34 insertions(+), 37 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index 2a2075f0ca..3eee01cf9a 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -1199,7 +1199,7 @@ error_code _sceNpBasicSendMessage(vm::cptr to, vm::cptr data, u32 .msgFeatures = {}, .data = std::vector(static_cast(data.get_ptr()), static_cast(data.get_ptr()) + size)}; std::set npids; - npids.insert(std::string(to->handle.data)); + npids.insert(np::npid_to_string(*to)); nph.send_message(msg_data, npids); @@ -1228,7 +1228,7 @@ error_code sceNpBasicSendMessageGui(ppu_thread& ppu, vm::cptrmsgId, msg->mainType, msg->subType, msg->msgFeatures, msg->count, msg->npids); for (u32 i = 0; i < msg->count && msg->npids; i++) { - sceNp.trace("sceNpBasicSendMessageGui: NpId[%d] = %s", i, static_cast(&msg->npids[i].handle.data[0])); + sceNp.trace("sceNpBasicSendMessageGui: NpId[%d] = %s", i, np::npid_to_string(msg->npids[i])); } sceNp.notice("sceNpBasicSendMessageGui: subject: %s", msg->subject); sceNp.notice("sceNpBasicSendMessageGui: body: %s", msg->body); @@ -1398,7 +1398,7 @@ error_code sceNpBasicSendMessageGui(ppu_thread& ppu, vm::cptrcount; i++) { - npids.insert(std::string(msg->npids[i].handle.data)); + npids.insert(np::npid_to_string(msg->npids[i])); } } @@ -7144,7 +7144,7 @@ error_code sceNpUtilCanonicalizeNpIdForPsp(vm::ptr npId) error_code sceNpUtilCmpNpId(vm::ptr id1, vm::ptr id2) { - sceNp.trace("sceNpUtilCmpNpId(id1=*0x%x(%s), id2=*0x%x(%s))", id1, id1 ? id1->handle.data : "", id2, id2 ? id2->handle.data : ""); + sceNp.trace("sceNpUtilCmpNpId(id1=*0x%x(%s), id2=*0x%x(%s))", id1, id1 ? np::npid_to_string(*id1) : std::string(), id2, id2 ? np::npid_to_string(*id2) : std::string()); if (!id1 || !id2) { diff --git a/rpcs3/Emu/NP/clans_client.cpp b/rpcs3/Emu/NP/clans_client.cpp index da3f506c91..e2d9fa9de0 100644 --- a/rpcs3/Emu/NP/clans_client.cpp +++ b/rpcs3/Emu/NP/clans_client.cpp @@ -464,7 +464,7 @@ namespace clan clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); @@ -656,7 +656,7 @@ namespace clan clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); @@ -674,7 +674,7 @@ namespace clan clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); @@ -832,7 +832,7 @@ namespace clan clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); @@ -850,7 +850,7 @@ namespace clan clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); @@ -868,7 +868,7 @@ namespace clan clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); @@ -902,7 +902,7 @@ namespace clan clan.append_child("id").text().set(clan_id); pugi::xml_node role = clan.append_child("onlinename"); - role.text().set(nph.get_npid().handle.data); + role.text().set(np::npid_to_string(nph.get_npid()).c_str()); pugi::xml_node description = clan.append_child("description"); description.text().set(info.description); @@ -990,7 +990,7 @@ namespace clan clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); @@ -1008,7 +1008,7 @@ namespace clan clan.append_child("ticket").text().set(ticket.c_str()); clan.append_child("id").text().set(clan_id); - const std::string jid_str = fmt::format(JID_FORMAT, np_id.handle.data); + const std::string jid_str = fmt::format(JID_FORMAT, np::npid_to_string(np_id)); clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_node role_node = clan.append_child("role"); diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index 3041f24424..1fc9342329 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1024,7 +1024,7 @@ namespace np } } - nph_log.notice("basic_event: event:%d, from:%s(%s), size:%d", *event, static_cast(from->userId.handle.data), static_cast(from->name.data), *size); + nph_log.notice("basic_event: event:%d, from:%s(%s), size:%d", *event, np::npid_to_string(from->userId), static_cast(from->name.data), *size); return CELL_OK; } diff --git a/rpcs3/Emu/NP/np_notifications.cpp b/rpcs3/Emu/NP/np_notifications.cpp index 92072d2b5a..6d6d511ee0 100644 --- a/rpcs3/Emu/NP/np_notifications.cpp +++ b/rpcs3/Emu/NP/np_notifications.cpp @@ -41,7 +41,7 @@ namespace np return; } - rpcn_log.notice("Received notification that user %s(%d) joined the room(%d)", notif_data->roomMemberDataInternal->userInfo.npId.handle.data, notif_data->roomMemberDataInternal->memberId, room_id); + rpcn_log.notice("Received notification that user %s(%d) joined the room(%d)", np::npid_to_string(notif_data->roomMemberDataInternal->userInfo.npId), notif_data->roomMemberDataInternal->memberId, room_id); extra_nps::print_SceNpMatching2RoomMemberDataInternal(notif_data->roomMemberDataInternal.get_ptr()); // We initiate signaling if necessary @@ -98,7 +98,7 @@ namespace np return; } - rpcn_log.notice("Received notification that user %s(%d) left the room(%d)", notif_data->roomMemberDataInternal->userInfo.npId.handle.data, notif_data->roomMemberDataInternal->memberId, room_id); + rpcn_log.notice("Received notification that user %s(%d) left the room(%d)", np::npid_to_string(notif_data->roomMemberDataInternal->userInfo.npId), notif_data->roomMemberDataInternal->memberId, room_id); extra_nps::print_SceNpMatching2RoomMemberDataInternal(notif_data->roomMemberDataInternal.get_ptr()); if (room_event_cb) @@ -204,7 +204,7 @@ namespace np return; } - rpcn_log.notice("Received notification that user's %s(%d) room (%d) data was updated", notif_data->newRoomMemberDataInternal->userInfo.npId.handle.data, notif_data->newRoomMemberDataInternal->memberId, room_id); + rpcn_log.notice("Received notification that user's %s(%d) room (%d) data was updated", np::npid_to_string(notif_data->newRoomMemberDataInternal->userInfo.npId), notif_data->newRoomMemberDataInternal->memberId, room_id); extra_nps::print_SceNpMatching2RoomMemberDataInternal(notif_data->newRoomMemberDataInternal.get_ptr()); if (room_event_cb) diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index 3f21f24cd3..ed7023cc89 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -310,7 +310,7 @@ namespace np if (npid_res != CELL_OK) continue; - rpcn_log.notice("JoinRoomResult told to connect to member(%d=%s) of room(%d): %s:%d", member_id, reinterpret_cast(npid_p2p->handle.data), room_id, ip_to_string(addr_p2p), port_p2p); + rpcn_log.notice("JoinRoomResult told to connect to member(%d=%s) of room(%d): %s:%d", member_id, np::npid_to_string(*npid_p2p), room_id, ip_to_string(addr_p2p), port_p2p); // Attempt Signaling auto& sigh = g_fxo->get>(); diff --git a/rpcs3/Emu/NP/np_structs_extra.cpp b/rpcs3/Emu/NP/np_structs_extra.cpp index 58770c450f..6774b20bc4 100644 --- a/rpcs3/Emu/NP/np_structs_extra.cpp +++ b/rpcs3/Emu/NP/np_structs_extra.cpp @@ -2,6 +2,7 @@ #include "stdafx.h" #include #include "np_structs_extra.h" +#include "np_helpers.h" LOG_CHANNEL(sceNp); LOG_CHANNEL(sceNp2); @@ -13,7 +14,7 @@ namespace extra_nps void print_SceNpUserInfo2(const SceNpUserInfo2* user) { sceNp2.warning("SceNpUserInfo2:"); - sceNp2.warning("npid: %s", static_cast(user->npId.handle.data)); + sceNp2.warning("npid: %s", np::npid_to_string(user->npId)); sceNp2.warning("onlineName: *0x%x(%s)", user->onlineName, user->onlineName ? static_cast(user->onlineName->data) : ""); sceNp2.warning("avatarUrl: *0x%x(%s)", user->avatarUrl, user->avatarUrl ? static_cast(user->avatarUrl->data) : ""); } @@ -208,7 +209,7 @@ namespace extra_nps { sceNp2.warning("SceNpMatching2RoomMemberDataInternal:"); sceNp2.warning("next: *0x%x", member->next); - sceNp2.warning("npId: %s", member->userInfo.npId.handle.data); + sceNp2.warning("npId: %s", np::npid_to_string(member->userInfo.npId)); sceNp2.warning("onlineName: %s", member->userInfo.onlineName ? member->userInfo.onlineName->data : ""); sceNp2.warning("avatarUrl: %s", member->userInfo.avatarUrl ? member->userInfo.avatarUrl->data : ""); sceNp2.warning("joinDate: %lld", member->joinDate.tick); @@ -460,7 +461,7 @@ namespace extra_nps void print_SceNpScoreRankData(const SceNpScoreRankData* data) { sceNp.warning("sceNpScoreRankData:"); - sceNp.warning("npId: %s", static_cast(data->npId.handle.data)); + sceNp.warning("npId: %s", np::npid_to_string(data->npId)); sceNp.warning("onlineName: %s", static_cast(data->onlineName.data)); sceNp.warning("pcId: %d", data->pcId); sceNp.warning("serialRank: %d", data->serialRank); @@ -474,7 +475,7 @@ namespace extra_nps void print_SceNpScoreRankData_deprecated(const SceNpScoreRankData_deprecated* data) { sceNp.warning("sceNpScoreRankData_deprecated:"); - sceNp.warning("npId: %s", static_cast(data->npId.handle.data)); + sceNp.warning("npId: %s", np::npid_to_string(data->npId)); sceNp.warning("onlineName: %s", static_cast(data->onlineName.data)); sceNp.warning("serialRank: %d", data->serialRank); sceNp.warning("rank: %d", data->rank); @@ -542,7 +543,7 @@ namespace extra_nps void print_SceNpUserInfo(const SceNpUserInfo* data) { - sceNp.warning("userId: %s", data->userId.handle.data); + sceNp.warning("userId: %s", np::npid_to_string(data->userId)); sceNp.warning("name: %s", data->name.data); sceNp.warning("icon: %s", data->icon.data); } @@ -576,7 +577,7 @@ namespace extra_nps if (data->kick_actor) { - sceNp.warning("kick_actor: %s", data->kick_actor->handle.data); + sceNp.warning("kick_actor: %s", np::npid_to_string(*data->kick_actor)); } sceNp.warning("opt: 0x%x", data->kick_actor); diff --git a/rpcs3/Emu/NP/pb_helpers.cpp b/rpcs3/Emu/NP/pb_helpers.cpp index 41b0ca4579..83170426ff 100644 --- a/rpcs3/Emu/NP/pb_helpers.cpp +++ b/rpcs3/Emu/NP/pb_helpers.cpp @@ -263,7 +263,7 @@ namespace np for (u32 i = 0; i < room_info->memberList.membersNum; i++) { SceNpMatching2RoomMemberDataInternal* sce_member = &room_info->memberList.members[i]; - if (strcmp(sce_member->userInfo.npId.handle.data, npid.handle.data) == 0) + if (strncmp(sce_member->userInfo.npId.handle.data, npid.handle.data, 16) == 0) { room_info->memberList.me = room_info->memberList.members + i; edata.add_relocation(room_info->memberList.me); diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 071afa2b3f..86a688705e 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -1756,7 +1756,7 @@ namespace rpcn { continue; } - pb_req.add_alloweduser(req->allowedUser[i].handle.data); + pb_req.add_alloweduser(np::npid_to_string(req->allowedUser[i])); } } @@ -1768,7 +1768,7 @@ namespace rpcn { continue; } - pb_req.add_blockeduser(req->blockedUser[i].handle.data); + pb_req.add_blockeduser(np::npid_to_string(req->blockedUser[i])); } } @@ -2267,7 +2267,7 @@ namespace rpcn for (usz i = 0; i < npids.size(); i++) { auto* npid_entry = pb_req.add_npids(); - npid_entry->set_npid(static_cast(npids[i].first.handle.data)); + npid_entry->set_npid(np::npid_to_string(npids[i].first)); npid_entry->set_pcid(npids[i].second); } @@ -2414,7 +2414,7 @@ namespace rpcn if (option->isLastChangedAuthorId) { - pb_req.set_islastchangedauthorid(option->isLastChangedAuthorId->handle.data); + pb_req.set_islastchangedauthorid(np::npid_to_string(*option->isLastChangedAuthorId)); } } @@ -2443,7 +2443,7 @@ namespace rpcn if (option->isLastChangedAuthorId) { - pb_req.set_islastchangedauthorid(option->isLastChangedAuthorId->handle.data); + pb_req.set_islastchangedauthorid(np::npid_to_string(*option->isLastChangedAuthorId)); } if (option->compareValue) @@ -2499,7 +2499,7 @@ namespace rpcn if (option->isLastChangedAuthorId) { - pb_req.set_islastchangedauthorid(option->isLastChangedAuthorId->handle.data); + pb_req.set_islastchangedauthorid(np::npid_to_string(*option->isLastChangedAuthorId)); } } diff --git a/rpcs3/Emu/NP/signaling_handler.cpp b/rpcs3/Emu/NP/signaling_handler.cpp index e6d79f1fca..97a2673e0f 100644 --- a/rpcs3/Emu/NP/signaling_handler.cpp +++ b/rpcs3/Emu/NP/signaling_handler.cpp @@ -256,9 +256,7 @@ void signaling_handler::process_incoming_messages() addr.s_addr = op_addr; char ip_str[16]; inet_ntop(AF_INET, &addr, ip_str, sizeof(ip_str)); - std::string_view npid(sp->npid.handle.data); - - sign_log.trace("SP %s from %s:%d(npid: %s)", sp->command, ip_str, op_port, npid); + sign_log.trace("SP %s from %s:%d(npid: %s)", sp->command, ip_str, op_port, np::npid_to_string(sp->npid)); } bool reply = false, schedule_repeat = false; @@ -675,9 +673,7 @@ std::shared_ptr signaling_handler::get_signaling_ptr(const signa { u32 conn_id; - char npid_buf[17]{}; - memcpy(npid_buf, sp->npid.handle.data, 16); - std::string npid(npid_buf); + std::string npid = np::npid_to_string(sp->npid); if (!npid_to_conn_id.contains(npid)) return nullptr; From 48667d68b2165e295e0c9a8e2d97ff94afad6cd8 Mon Sep 17 00:00:00 2001 From: Ani Date: Fri, 20 Feb 2026 12:33:54 +0100 Subject: [PATCH 261/630] rpcs3: Target c++23 --- CMakeLists.txt | 8 ++++---- rpcs3/CMakeLists.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 65e415bdb7..738d9bbf17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,12 +13,12 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11) - message(FATAL_ERROR "RPCS3 requires at least gcc-11.") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13) + message(FATAL_ERROR "RPCS3 requires at least gcc-13.") endif() elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.0) - message(FATAL_ERROR "RPCS3 requires at least clang-12.0.") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0) + message(FATAL_ERROR "RPCS3 requires at least clang-19.0.") endif() endif() diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index e32597f792..41597127b8 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -8,7 +8,7 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/git-version.cmake) include(ConfigureCompiler) include(CheckFunctionExists) -set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD 23) if(UNIX AND NOT APPLE AND NOT ANDROID) add_compile_definitions(DATADIR="${CMAKE_INSTALL_FULL_DATADIR}/rpcs3") From 6de8861b4eeb32c1adea3180c45c2f4aa9ed1a1e Mon Sep 17 00:00:00 2001 From: Ani Date: Fri, 20 Feb 2026 13:21:31 +0100 Subject: [PATCH 262/630] rpcs3: Target c++23 (msvc) --- buildfiles/msvc/common_default.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildfiles/msvc/common_default.props b/buildfiles/msvc/common_default.props index 04f6502839..bfddbb5465 100644 --- a/buildfiles/msvc/common_default.props +++ b/buildfiles/msvc/common_default.props @@ -13,7 +13,7 @@ stdcpplatest - stdcpp20 + stdcpp23 _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING=1;_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions) false -d2FH4- %(AdditionalOptions) From fec2be87f615e1ca912f05aaacebc6bfe7075e64 Mon Sep 17 00:00:00 2001 From: Ani Date: Fri, 20 Feb 2026 13:40:00 +0100 Subject: [PATCH 263/630] types.hpp: #include Co-Authored-By: RipleyTom --- rpcs3/util/types.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/util/types.hpp b/rpcs3/util/types.hpp index 4a2ef5baea..a1a07bac69 100644 --- a/rpcs3/util/types.hpp +++ b/rpcs3/util/types.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #if defined(__SSE2__) || defined(_M_X64) || defined(_M_AMD64) || defined(__x86_64__) || defined(__amd64__) #define ARCH_X64 1 From c7d7f2d03b7a613b28117e8eca618541db8d8b6b Mon Sep 17 00:00:00 2001 From: Ani Date: Fri, 20 Feb 2026 14:15:39 +0100 Subject: [PATCH 264/630] Thread: Move include to .h Co-Authored-By: RipleyTom --- Utilities/Thread.cpp | 1 - Utilities/Thread.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 810b8fd7c5..08dce12315 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -8,7 +8,6 @@ #include "Emu/RSX/RSXThread.h" #include "Thread.h" #include "Utilities/JIT.h" -#include #include #ifdef ARCH_ARM64 diff --git a/Utilities/Thread.h b/Utilities/Thread.h index 02e5db56ff..7cd9a7c7ea 100644 --- a/Utilities/Thread.h +++ b/Utilities/Thread.h @@ -4,6 +4,7 @@ #include "util/atomic.hpp" #include "util/shared_ptr.hpp" +#include #include // Hardware core layout From e075170cc485b803a9d91f67728cd6349a9b10da Mon Sep 17 00:00:00 2001 From: Ani Date: Fri, 20 Feb 2026 14:17:41 +0100 Subject: [PATCH 265/630] JITASM: include on APPLE Co-Authored-By: RipleyTom --- Utilities/JITASM.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Utilities/JITASM.cpp b/Utilities/JITASM.cpp index acb5f40b04..90c09bb0bf 100644 --- a/Utilities/JITASM.cpp +++ b/Utilities/JITASM.cpp @@ -14,6 +14,10 @@ #define CAN_OVERCOMMIT #endif +#if defined(__APPLE__) +#include +#endif + LOG_CHANNEL(jit_log, "JIT"); void jit_announce(uptr func, usz size, std::string_view name) From bfea622999c9207c3a2d1561fecc61c4f92622d0 Mon Sep 17 00:00:00 2001 From: Ani Date: Fri, 20 Feb 2026 14:50:35 +0100 Subject: [PATCH 266/630] sys_time: include on NOT WIN32 --- rpcs3/Emu/Cell/lv2/sys_time.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/Emu/Cell/lv2/sys_time.cpp b/rpcs3/Emu/Cell/lv2/sys_time.cpp index 539bb9dedf..a71a11ba31 100644 --- a/rpcs3/Emu/Cell/lv2/sys_time.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_time.cpp @@ -118,6 +118,7 @@ static int clock_gettime(int clk_id, struct timespec* tp) #ifndef _WIN32 +#include #include static struct timespec start_time = []() From 89efca9f63c14d631bb07025ff83158ebad6a7be Mon Sep 17 00:00:00 2001 From: Ani Date: Fri, 20 Feb 2026 15:26:22 +0100 Subject: [PATCH 267/630] system_utils: include --- rpcs3/Emu/system_utils.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/Emu/system_utils.hpp b/rpcs3/Emu/system_utils.hpp index d8f4f59d8a..fd8717f4f9 100644 --- a/rpcs3/Emu/system_utils.hpp +++ b/rpcs3/Emu/system_utils.hpp @@ -3,6 +3,7 @@ #include "util/types.hpp" #include #include +#include enum class game_content_type { From 6bfb33279f6989f3ff9ea2dc40ef45d6aeb57ef8 Mon Sep 17 00:00:00 2001 From: Ani Date: Fri, 20 Feb 2026 16:11:11 +0100 Subject: [PATCH 268/630] test_fmt: include --- rpcs3/tests/test_fmt.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/tests/test_fmt.cpp b/rpcs3/tests/test_fmt.cpp index 95c31d17c6..069051bd1a 100644 --- a/rpcs3/tests/test_fmt.cpp +++ b/rpcs3/tests/test_fmt.cpp @@ -1,3 +1,4 @@ +#include #include #include "Utilities/StrUtil.h" From 3585881a6c6d8a5fad78ec1949be89a7a20b9be3 Mon Sep 17 00:00:00 2001 From: oltolm Date: Sun, 22 Feb 2026 01:59:55 +0100 Subject: [PATCH 269/630] cellSaveData: fix "Your comparator is not a valid strict-weak ordering" --- rpcs3/Emu/Cell/Modules/cellSaveData.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp index a4d160fdcb..7878e86642 100644 --- a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp @@ -876,39 +876,42 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v // Sort the entries { - const u32 order = setList->sortOrder; const u32 type = setList->sortType; - std::sort(save_entries.begin(), save_entries.end(), [order, type](const SaveDataEntry& entry1, const SaveDataEntry& entry2) -> bool + auto comp = [type](const SaveDataEntry& entry1, const SaveDataEntry& entry2) -> bool { const bool mtime_lower = entry1.mtime < entry2.mtime; const bool mtime_equal = entry1.mtime == entry2.mtime; const bool subtitle_lower = entry1.subtitle < entry2.subtitle; const bool subtitle_equal = entry1.subtitle == entry2.subtitle; - const bool revert_order = order == CELL_SAVEDATA_SORTORDER_DESCENT; if (type == CELL_SAVEDATA_SORTTYPE_MODIFIEDTIME) { if (mtime_equal) { - return subtitle_lower != revert_order; + return subtitle_lower; } - return mtime_lower != revert_order; + return mtime_lower; } else if (type == CELL_SAVEDATA_SORTTYPE_SUBTITLE) { if (subtitle_equal) { - return mtime_lower != revert_order; + return mtime_lower; } - return subtitle_lower != revert_order; + return subtitle_lower; } ensure(false); return true; - }); + }; + + if (setList->sortOrder == CELL_SAVEDATA_SORTORDER_ASCENT) + std::sort(save_entries.begin(), save_entries.end(), comp); + else + std::sort(save_entries.rbegin(), save_entries.rend(), comp); } // Fill the listGet->dirList array From e22c83f4cec4b3f70815ffc780ffa22b6d91818c Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 21 Feb 2026 14:03:04 +0300 Subject: [PATCH 270/630] rsx: Improve comments/documentation around border color SEXT convert --- rpcs3/Emu/RSX/RSXTexture.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index b3f9dc1962..e6483b51d7 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -315,6 +315,7 @@ namespace rsx // Border color is broken on PS3. The SNORM behavior is completely broken and behaves like BIASED renormalization instead. // To solve the mismatch, we need to first do a bit expansion on the value then store it as sign extended. The second part is a natural part of numbers on a binary system, so we only need to do the former. + // Note that the input color is in BE order (BGRA) so we reverse the mask to match. static constexpr u32 expand4_lut[16] = { 0x00000000u, // 0000 @@ -335,7 +336,7 @@ namespace rsx 0xFFFFFFFFu // 1111 }; - // Bit pattern expand and reverse BE -> LE using LUT + // Bit pattern expand const u32 mask = expand4_lut[sext]; // Now we perform the compensation operation @@ -344,16 +345,14 @@ namespace rsx // Load const __m128i _0 = _mm_setzero_si128(); const __m128i _128 = _mm_set1_epi32(128); - const __m128i _127 = _mm_set1_epi32(127); - const __m128i _255 = _mm_set1_epi32(255); - const auto be_raw = be_t(raw); - __m128i v = _mm_cvtsi32_si128(static_cast(be_raw)); + // Explode the bytes. + __m128i v = _mm_cvtsi32_si128(raw); v = _mm_unpacklo_epi8(v, _0); - v = _mm_unpacklo_epi16(v, _0); // [ 0, 64, 255, 128 ] + v = _mm_unpacklo_epi16(v, _0); // Conversion: x = (y - 128) - v = _mm_sub_epi32(v, _128); // [ -128, -64, 127, 0 ] + v = _mm_sub_epi32(v, _128); // Convert to signed encoding (reverse sext) v = _mm_slli_epi32(v, 24); From 2b7bb9ef0ac7f7559822b6dd30a6cf2cb7eb065a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 21 Feb 2026 16:49:01 +0300 Subject: [PATCH 271/630] rsx: Add format_ex utility --- rpcs3/Emu/RSX/Common/TextureUtils.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.h b/rpcs3/Emu/RSX/Common/TextureUtils.h index 65f4ef5c6f..c32152fecd 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.h +++ b/rpcs3/Emu/RSX/Common/TextureUtils.h @@ -137,6 +137,22 @@ namespace rsx using enum format_features; + struct texture_format_ex + { + texture_format_ex() = default; + texture_format_ex(u32 bits) + : format_bits(bits) + {} + + bool valid() const { return format_bits != 0; } + u32 format() const { return format_bits & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN); } + + //private: + u32 format_bits = 0; + u32 features = 0; + u32 texel_remap_control = 0; + }; + // Sampled image descriptor class sampled_image_descriptor_base { @@ -179,6 +195,7 @@ namespace rsx u64 surface_cache_tag = 0; texcoord_xform_t texcoord_xform; + texture_format_ex format_ex; }; struct typeless_xfer From 2d7b72a769b4085b893bfa3430fe7ac66c7f8f2b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 21 Feb 2026 17:44:06 +0300 Subject: [PATCH 272/630] rsx: Implement format_ex decoding for FS inputs --- rpcs3/Emu/RSX/RSXTexture.cpp | 61 ++++++++++++++++++++++++++++++++++++ rpcs3/Emu/RSX/RSXTexture.h | 3 ++ rpcs3/Emu/RSX/color_utils.h | 28 +++++++++++++++++ 3 files changed, 92 insertions(+) diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index e6483b51d7..6f8eec0e3b 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -2,6 +2,8 @@ #include "RSXTexture.h" #include "rsx_utils.h" +#include "Common/TextureUtils.h" +#include "Program/GLSLCommon.h" #include "Emu/system_config.h" #include "util/simd.hpp" @@ -63,6 +65,65 @@ namespace rsx return ((registers[NV4097_SET_TEXTURE_FORMAT + (m_index * 8)] >> 8) & 0xff); } + texture_format_ex fragment_texture::format_ex() const + { + const auto format_bits = format(); + const auto base_format = format_bits & ~(CELL_GCM_TEXTURE_UN | CELL_GCM_TEXTURE_LN); + const auto format_features = rsx::get_format_features(base_format); + if (format_features == 0) + { + return { format_bits }; + } + + // NOTE: The unsigned_remap=bias flag being set flags the texture as being compressed normal (2n-1 / BX2) (UE3) + // NOTE: The ARGB8_signed flag means to reinterpret the raw bytes as signed. This is different than unsigned_remap=bias which does range decompression. + // This is a separate method of setting the format to signed mode without doing so per-channel + // Precedence = SNORM > GAMMA > UNSIGNED_REMAP/BX2 + // Games using mixed flags: (See Resistance 3 for GAMMA/BX2 relationship, UE3 for BX2 effect) + u32 argb_signed_ = 0; + u32 unsigned_remap_ = 0; + u32 gamma_ = 0; + + if (format_features & RSX_FORMAT_FEATURE_SIGNED_COMPONENTS) + { + // Tests show this is applied pre-readout. It's just a property of the incoming bytes and is therefore subject to remap. + argb_signed_ = decoded_remap().shuffle_mask_bits(argb_signed()); + } + + if (format_features & RSX_FORMAT_FEATURE_GAMMA_CORRECTION) + { + // Tests show this is applied post-readout. It's a property of the final value stored in the register and is not remapped. + // NOTE: GAMMA correction has no algorithmic effect on constants (0 and 1) so we need not mask it out for correctness. + gamma_ = gamma() & ~(argb_signed_); + } + + if (format_features & RSX_FORMAT_FEATURE_BIASED_NORMALIZATION) + { + // The renormalization flag applies to all channels. It is weaker than the other flags. + // This applies on input and is subject to remap overrides + if (unsigned_remap() == CELL_GCM_TEXTURE_UNSIGNED_REMAP_BIASED) + { + unsigned_remap_ = decoded_remap().shuffle_mask_bits(0xFu) & ~(argb_signed_ | gamma_); + } + } + + u32 format_convert = gamma_; + + // The options are mutually exclusive + ensure((argb_signed_ & gamma_) == 0); + ensure((argb_signed_ & unsigned_remap_) == 0); + ensure((gamma_ & unsigned_remap_) == 0); + + // NOTE: Hardware tests show that remapping bypasses the channel swizzles completely + format_convert |= (argb_signed_ << texture_control_bits::SEXT_OFFSET); + format_convert |= (unsigned_remap_ << texture_control_bits::EXPAND_OFFSET); + + texture_format_ex result { format_bits }; + result.features = format_features; + result.texel_remap_control = format_convert; + return result; + } + bool fragment_texture::is_compressed_format() const { int texture_format = format() & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN); diff --git a/rpcs3/Emu/RSX/RSXTexture.h b/rpcs3/Emu/RSX/RSXTexture.h index 5517a39e3f..3b0ccdebce 100644 --- a/rpcs3/Emu/RSX/RSXTexture.h +++ b/rpcs3/Emu/RSX/RSXTexture.h @@ -4,6 +4,8 @@ namespace rsx { + struct texture_format_ex; + class fragment_texture { protected: @@ -33,6 +35,7 @@ namespace rsx // cubemap as a separate dimension. rsx::texture_dimension_extended get_extended_texture_dimension() const; u8 format() const; + texture_format_ex format_ex() const; bool is_compressed_format() const; u16 mipmap() const; diff --git a/rpcs3/Emu/RSX/color_utils.h b/rpcs3/Emu/RSX/color_utils.h index fd3156bd3e..40335c07e3 100644 --- a/rpcs3/Emu/RSX/color_utils.h +++ b/rpcs3/Emu/RSX/color_utils.h @@ -39,6 +39,34 @@ namespace rsx return remapped; } + + /** + * Remap color channel bits based on a remap vector. The output is a normalized selector of each color channel with spread. + * The input bits are an action selector. e.g a mask of channels that need to be interpreted as SNORM or BX2 + * The output is a final mask on which post-sampling channels the operation applies to. + * Examples: + * - If we have remap as [ 1 R R R ] and mask of R (0010) then we get 1110. Remapper spreads 'R' action to all channels where it should apply. + */ + u32 shuffle_mask_bits(u32 bits) const + { + if (!bits || encoded == RSX_TEXTURE_REMAP_IDENTITY) [[likely]] + { + return bits; + } + + u32 result = 0; + for (u8 channel = 0; channel < 4; ++channel) + { + if (control_map[channel] != CELL_GCM_TEXTURE_REMAP_REMAP || // Channel not read from input + (bits & (1u << channel_map[channel])) == 0) // Input channel is not enabled in the mask + { + continue; + } + result |= (1u << channel); + } + return result; + } + template requires std::is_integral_v || std::is_floating_point_v std::array remap(const std::array& components) const From f5cf818bcc02ce940e38cfd772ca1681f5b66054 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 21 Feb 2026 17:47:46 +0300 Subject: [PATCH 273/630] rsx: Disable interpolation for SNORM emulated textures --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 16 ++++++-- rpcs3/Emu/RSX/RSXThread.cpp | 77 ++----------------------------------- rpcs3/Emu/RSX/VK/VKDraw.cpp | 8 +++- 3 files changed, 22 insertions(+), 79 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index e8ea4bc714..475507ee78 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -2,6 +2,7 @@ #include "GLGSRender.h" #include "../rsx_methods.h" #include "../Common/BufferUtils.h" +#include "../Program/GLSLCommon.h" #include "Emu/RSX/NV47/HW/context_accessors.define.h" @@ -315,6 +316,8 @@ void GLGSRender::load_texture_env() if (sampler_state->validate()) { + sampler_state->format_ex = tex.format_ex(); + if (m_textures_dirty[i]) { m_fs_sampler_states[i].apply(tex, fs_sampler_state[i].get()); @@ -324,12 +327,17 @@ void GLGSRender::load_texture_env() m_graphics_state |= rsx::fragment_program_state_dirty; } - if (const auto texture_format = tex.format() & ~(CELL_GCM_TEXTURE_UN | CELL_GCM_TEXTURE_LN); - sampler_state->format_class != rsx::classify_format(texture_format) && - (texture_format == CELL_GCM_TEXTURE_A8R8G8B8 || texture_format == CELL_GCM_TEXTURE_D8R8G8B8)) + const auto texture_format = sampler_state->format_ex.format(); + // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking. + // If accurate graphics are desired, force a bitcast to COLOR as a workaround. + const bool is_depth_reconstructed = sampler_state->format_class != rsx::classify_format(texture_format) && + (texture_format == CELL_GCM_TEXTURE_A8R8G8B8 || texture_format == CELL_GCM_TEXTURE_D8R8G8B8); + // SNORM conversion required in shader. Do not interpolate to avoid introducing discontinuities due to how negative numbers work + const bool is_snorm = (sampler_state->format_ex.texel_remap_control & rsx::texture_control_bits::SEXT_MASK) != 0; + + if (is_depth_reconstructed || is_snorm) { // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking. - // If accurate graphics are desired, force a bitcast to COLOR as a workaround. m_fs_sampler_states[i].set_parameteri(GL_TEXTURE_MIN_FILTER, GL_NEAREST); m_fs_sampler_states[i].set_parameteri(GL_TEXTURE_MAG_FILTER, GL_NEAREST); } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 5b4b732c4d..5bfc60ee2a 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2321,83 +2321,14 @@ namespace rsx } } - if (const auto format_features = rsx::get_format_features(format); format_features != 0) + if (const auto& format_ex = sampler_descriptors[i]->format_ex; format_ex.features != 0) { - // NOTE: The unsigned_remap=bias flag being set flags the texture as being compressed normal (2n-1 / BX2) (UE3) - // NOTE: The ARGB8_signed flag means to reinterpret the raw bytes as signed. This is different than unsigned_remap=bias which does range decompression. - // This is a separate method of setting the format to signed mode without doing so per-channel - // Precedence = SNORM > GAMMA > UNSIGNED_REMAP/BX2 - // Games using mixed flags: (See Resistance 3 for GAMMA/BX2 relationship, UE3 for BX2 effect) - u32 argb8_signed = 0; - u32 unsigned_remap = 0; - u32 gamma = 0; - - auto remap_channel_bits = [](const rsx::texture_channel_remap_t& remap, u32 bits) -> u32 - { - if (!bits || remap.encoded == RSX_TEXTURE_REMAP_IDENTITY) [[ likely ]] - { - return bits; - } - - u32 result = 0; - for (u8 channel = 0; channel < 4; ++channel) - { - switch (remap.control_map[channel]) - { - case CELL_GCM_TEXTURE_REMAP_REMAP: - if (bits & (1u << remap.channel_map[channel])) - { - result |= (1u << channel); - } - break; - default: - break; - } - } - return result; - }; - - const auto texture_remap = tex.decoded_remap(); - if (format_features & RSX_FORMAT_FEATURE_SIGNED_COMPONENTS) - { - // Tests show this is applied pre-readout. It's just a property of the incoming bytes and is therefore subject to remap. - argb8_signed = remap_channel_bits(texture_remap, tex.argb_signed()); - } - - if (format_features & RSX_FORMAT_FEATURE_GAMMA_CORRECTION) - { - // Tests show this is applied post-readout. It's a property of the final value stored in the register and is not remapped. - // NOTE: GAMMA correction has no algorithmic effect on constants (0 and 1) so we need not mask it out for correctness. - gamma = tex.gamma() & ~(argb8_signed); - } - - if (format_features & RSX_FORMAT_FEATURE_BIASED_NORMALIZATION) - { - // The renormalization flag applies to all channels. It is weaker than the other flags. - // This applies on input and is subject to remap overrides - if (tex.unsigned_remap() == CELL_GCM_TEXTURE_UNSIGNED_REMAP_BIASED) - { - unsigned_remap = remap_channel_bits(texture_remap, 0xF) & ~(argb8_signed | gamma); - } - } - - u32 argb8_convert = gamma; - - // The options are mutually exclusive - ensure((argb8_signed & gamma) == 0); - ensure((argb8_signed & unsigned_remap) == 0); - ensure((gamma & unsigned_remap) == 0); - - // NOTE: Hardware tests show that remapping bypasses the channel swizzles completely - argb8_convert |= (argb8_signed << texture_control_bits::SEXT_OFFSET); - argb8_convert |= (unsigned_remap << texture_control_bits::EXPAND_OFFSET); - texture_control |= argb8_convert; - - texture_control |= format_features << texture_control_bits::FORMAT_FEATURES_OFFSET; + texture_control |= format_ex.texel_remap_control; + texture_control |= format_ex.features << texture_control_bits::FORMAT_FEATURES_OFFSET; if (current_fp_metadata.has_tex_bx2_conv) { - const u32 remap_hi = remap_channel_bits(texture_remap, 0xFu); + const u32 remap_hi = tex.decoded_remap().shuffle_mask_bits(0xFu); current_fragment_program.texture_params[i].remap &= ~(0xFu << 16u); current_fragment_program.texture_params[i].remap |= (remap_hi << 16u); } diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 491078cc93..7a9d6aae6e 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "../Common/BufferUtils.h" +#include "../Program/GLSLCommon.h" #include "../rsx_methods.h" #include "VKAsyncScheduler.h" @@ -307,6 +308,8 @@ void VKGSRender::load_texture_env() if (sampler_state->validate()) { + sampler_state->format_ex = tex.format_ex(); + if (sampler_state->is_cyclic_reference) { check_for_cyclic_refs |= true; @@ -324,7 +327,7 @@ void VKGSRender::load_texture_env() f32 min_lod = 0.f, max_lod = 0.f; f32 lod_bias = 0.f; - const u32 texture_format = tex.format() & ~(CELL_GCM_TEXTURE_UN | CELL_GCM_TEXTURE_LN); + const u32 texture_format = sampler_state->format_ex.format(); VkBool32 compare_enabled = VK_FALSE; VkCompareOp depth_compare_mode = VK_COMPARE_OP_NEVER; @@ -350,7 +353,8 @@ void VKGSRender::load_texture_env() if (sampler_state->format_class == RSX_FORMAT_CLASS_COLOR) [[likely]] { // Most PS3-like formats can be linearly filtered without problem - can_sample_linear = true; + // Exclude textures that require SNORM conversion however + can_sample_linear = (sampler_state->format_ex.texel_remap_control & rsx::texture_control_bits::SEXT_MASK) == 0; } else if (sampler_state->format_class != rsx::classify_format(texture_format) && (texture_format == CELL_GCM_TEXTURE_A8R8G8B8 || texture_format == CELL_GCM_TEXTURE_D8R8G8B8)) From 3b494202059f7ff94f27b44414d8b173496b31fd Mon Sep 17 00:00:00 2001 From: oltolm Date: Sun, 22 Feb 2026 12:26:27 +0100 Subject: [PATCH 274/630] cellVdec: replace std::aligned_union_t with a union --- rpcs3/Emu/Cell/Modules/cellVdec.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/cellVdec.cpp b/rpcs3/Emu/Cell/Modules/cellVdec.cpp index 5cf5e64a51..3205afd786 100644 --- a/rpcs3/Emu/Cell/Modules/cellVdec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVdec.cpp @@ -1462,7 +1462,12 @@ error_code cellVdecGetPicItem(ppu_thread& ppu, u32 handle, vm::pptr picInfo; + union + { + CellVdecAvcInfo avcInfo; + CellVdecDivxInfo divxInfo; + CellVdecMpeg2Info mpeg2Info; + } picInfo; }; AVFrame* frame{}; From 260c98618614c070067c6b0b1a82f2e8199d7d4a Mon Sep 17 00:00:00 2001 From: silviolet Date: Wed, 11 Feb 2026 13:27:40 -0500 Subject: [PATCH 275/630] Implemented sorted emit_data for YAML nodes - emit_data now Recursively sorts each node in a YAML node and outputs them as per the function description, originally a TODO - The default config is still unsorted so when you click save or apply the sorted file will appear --- rpcs3/rpcs3qt/emu_settings.cpp | 37 ++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index 20bb58ba93..ccb2308509 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -25,8 +25,41 @@ namespace { static NEVER_INLINE void emit_data(YAML::Emitter& out, const YAML::Node& node) { - // TODO - out << node; + if (!node || node.IsNull()) + { + // I chose to output a null when nothing is present so that recursive YAML Value calls can be matched to a null value instead of nothing + out << YAML::Null; + return; + } + if (node.IsMap()) + { + std::vector keys; + keys.reserve(node.size()); + // generate vector of strings to be sorted using the as function from YAML documentation + for (const auto& pair : node) + { + keys.push_back(pair.first.as()); + } + std::sort(keys.begin(), keys.end()); + // recursively generate sorted maps + // alternative implementations could have stops at specified recursion levels or maybe just the first two levels would be sorted + out << YAML::BeginMap; + for (const std::string& key : keys) + { + out << YAML::Key << key; + out << YAML::Value; + emit_data(out, node[key]); + } + out << YAML::EndMap; + } + // alternatively: an else statement could be used however I wanted to follow a similar format to the += operator so the YAML Undefined class can be ignored + else if (node.IsScalar() || node.IsSequence()) + { + out << node; + } + // this exists to preserve the same functionality as before where Undefined nodes would still be output, can be removed or consolidated with the else if branch + else + out << node; } // Incrementally load YAML From 064c006339f9e5b46e43c4dfa8d0c8e1e18eeece Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Wed, 25 Feb 2026 00:58:09 +0100 Subject: [PATCH 276/630] Various sys_ fixes --- rpcs3/Emu/Cell/lv2/sys_cond.cpp | 1 + rpcs3/Emu/Cell/lv2/sys_event.cpp | 7 ++++--- rpcs3/Emu/Cell/lv2/sys_event.h | 1 - rpcs3/Emu/Cell/lv2/sys_lwcond.cpp | 2 ++ rpcs3/Emu/Cell/lv2/sys_mutex.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_spu.cpp | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_cond.cpp b/rpcs3/Emu/Cell/lv2/sys_cond.cpp index 401ed3bd66..f66146ae01 100644 --- a/rpcs3/Emu/Cell/lv2/sys_cond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_cond.cpp @@ -59,6 +59,7 @@ CellError lv2_cond::on_id_create() if (!mutex) { _mutex = static_cast>(ensure(idm::get_unlocked(mtx_id))); + mutex = static_cast(_mutex.get()); } // Defer function diff --git a/rpcs3/Emu/Cell/lv2/sys_event.cpp b/rpcs3/Emu/Cell/lv2/sys_event.cpp index 8b3de14bf7..d50ae87f9d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event.cpp @@ -621,7 +621,7 @@ error_code sys_event_port_create(cpu_thread& cpu, vm::ptr eport_id, s32 por sys_event.warning("sys_event_port_create(eport_id=*0x%x, port_type=%d, name=0x%llx)", eport_id, port_type, name); - if (port_type != SYS_EVENT_PORT_LOCAL && port_type != 3) + if (port_type != SYS_EVENT_PORT_LOCAL && port_type != SYS_EVENT_PORT_IPC) { sys_event.error("sys_event_port_create(): unknown port type (%d)", port_type); return CELL_EINVAL; @@ -675,8 +675,9 @@ error_code sys_event_port_connect_local(cpu_thread& cpu, u32 eport_id, u32 equeu std::lock_guard lock(id_manager::g_mutex); const auto port = idm::check_unlocked(eport_id); + auto queue = idm::get_unlocked(equeue_id); - if (!port || !idm::check_unlocked(equeue_id)) + if (!port || !queue) { return CELL_ESRCH; } @@ -691,7 +692,7 @@ error_code sys_event_port_connect_local(cpu_thread& cpu, u32 eport_id, u32 equeu return CELL_EISCONN; } - port->queue = idm::get_unlocked(equeue_id); + port->queue = std::move(queue); return CELL_OK; } diff --git a/rpcs3/Emu/Cell/lv2/sys_event.h b/rpcs3/Emu/Cell/lv2/sys_event.h index 6c43798a30..8364361e6c 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event.h +++ b/rpcs3/Emu/Cell/lv2/sys_event.h @@ -7,7 +7,6 @@ #include class cpu_thread; -class spu_thrread; // Event Queue Type enum : u32 diff --git a/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp b/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp index 43bfb308ba..ebe4dfc07c 100644 --- a/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp @@ -487,6 +487,8 @@ error_code _sys_lwcond_queue_wait(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id { ensure(cond.unqueue(cond.sq, &ppu)); ppu.state += cpu_flag::again; + cond.lwmutex_waiters--; + mutex->lwcond_waiters--; return; } diff --git a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp index e6c96ffd64..9f436ae4d3 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp @@ -85,7 +85,7 @@ error_code sys_mutex_create(ppu_thread& ppu, vm::ptr mutex_id, vm::ptr(_attr.pshared, _attr.ipc_key, _attr.flags, [&]() + if (auto error = lv2_obj::create(_attr.pshared, ipc_key, _attr.flags, [&]() { return make_shared( _attr.protocol, diff --git a/rpcs3/Emu/Cell/lv2/sys_spu.cpp b/rpcs3/Emu/Cell/lv2/sys_spu.cpp index 3665efcd0a..ff4294a24f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_spu.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_spu.cpp @@ -437,7 +437,7 @@ struct spu_limits_t raw_spu_count += spu_thread::g_raw_spu_ctr; // physical_spus_count >= spu_limit returns EBUSY, not EINVAL! - if (spu_limit + raw_limit > 6 || raw_spu_count > raw_limit || physical_spus_count >= spu_limit || physical_spus_count > spu_limit || controllable_spu_count > spu_limit) + if (spu_limit + raw_limit > 6 || raw_spu_count > raw_limit || physical_spus_count >= spu_limit || controllable_spu_count > spu_limit) { return false; } From bc93fdf9f40f8cef00edb1d506cf0266f4aa27c2 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 25 Feb 2026 07:10:06 +0100 Subject: [PATCH 277/630] input: Add some logging to mouse_gyro_handler --- rpcs3/Input/mouse_gyro_handler.cpp | 50 ++++++++++++++++-------------- rpcs3/Input/mouse_gyro_handler.h | 27 ++++++++-------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/rpcs3/Input/mouse_gyro_handler.cpp b/rpcs3/Input/mouse_gyro_handler.cpp index 6f1c7cd637..e1b241f9cd 100644 --- a/rpcs3/Input/mouse_gyro_handler.cpp +++ b/rpcs3/Input/mouse_gyro_handler.cpp @@ -1,3 +1,4 @@ +#include "stdafx.h" #include "mouse_gyro_handler.h" #include @@ -7,53 +8,57 @@ #include +LOG_CHANNEL(gui_log, "GUI"); + void mouse_gyro_handler::clear() { - active = false; - reset = false; - gyro_x = DEFAULT_MOTION_X; - gyro_y = DEFAULT_MOTION_Y; - gyro_z = DEFAULT_MOTION_Z; + m_active = false; + m_reset = false; + m_gyro_x = DEFAULT_MOTION_X; + m_gyro_y = DEFAULT_MOTION_Y; + m_gyro_z = DEFAULT_MOTION_Z; } bool mouse_gyro_handler::toggle_enabled() { - enabled = !enabled; + m_enabled = !m_enabled; clear(); - return enabled; + return m_enabled; } void mouse_gyro_handler::set_gyro_active() { - active = true; + gui_log.notice("Mouse-based gyro activated"); + m_active = true; } void mouse_gyro_handler::set_gyro_reset() { - active = false; - reset = true; + gui_log.notice("Mouse-based gyro deactivated"); + m_active = false; + m_reset = true; } void mouse_gyro_handler::set_gyro_xz(s32 off_x, s32 off_y) { - if (!active) + if (!m_active) return; - gyro_x = static_cast(std::clamp(off_x, 0, DEFAULT_MOTION_X * 2 - 1)); - gyro_z = static_cast(std::clamp(off_y, 0, DEFAULT_MOTION_Z * 2 - 1)); + m_gyro_x = static_cast(std::clamp(off_x, 0, DEFAULT_MOTION_X * 2 - 1)); + m_gyro_z = static_cast(std::clamp(off_y, 0, DEFAULT_MOTION_Z * 2 - 1)); } void mouse_gyro_handler::set_gyro_y(s32 steps) { - if (!active) + if (!m_active) return; - gyro_y = static_cast(std::clamp(gyro_y + steps, 0, DEFAULT_MOTION_Y * 2 - 1)); + m_gyro_y = static_cast(std::clamp(m_gyro_y + steps, 0, DEFAULT_MOTION_Y * 2 - 1)); } void mouse_gyro_handler::handle_event(QEvent* ev, const QWindow& win) { - if (!enabled) + if (!m_enabled) return; // Mouse-based motion input. @@ -119,15 +124,12 @@ void mouse_gyro_handler::handle_event(QEvent* ev, const QWindow& win) void mouse_gyro_handler::apply_gyro(const std::shared_ptr& pad) { - if (!enabled) - return; - - if (!pad || !pad->is_connected()) + if (!m_enabled || !pad || !pad->is_connected()) return; // Inject mouse-based motion sensor values into pad sensors for gyro emulation. // The Qt frontend maps cursor offset and wheel input to absolute motion values while RMB is held. - if (reset) + if (m_reset) { // RMB released → reset motion pad->m_sensors[0].m_value = DEFAULT_MOTION_X; @@ -139,8 +141,8 @@ void mouse_gyro_handler::apply_gyro(const std::shared_ptr& pad) { // RMB held → accumulate motion // Axes have been chosen as tested in Sly 4 minigames. Top-down view motion uses X/Z axes. - pad->m_sensors[0].m_value = gyro_x; // Mouse X → Motion X - pad->m_sensors[1].m_value = gyro_y; // Mouse Wheel → Motion Y - pad->m_sensors[2].m_value = gyro_z; // Mouse Y → Motion Z + pad->m_sensors[0].m_value = m_gyro_x; // Mouse X → Motion X + pad->m_sensors[1].m_value = m_gyro_y; // Mouse Wheel → Motion Y + pad->m_sensors[2].m_value = m_gyro_z; // Mouse Y → Motion Z } } diff --git a/rpcs3/Input/mouse_gyro_handler.h b/rpcs3/Input/mouse_gyro_handler.h index 97a745d919..9c53f574e4 100644 --- a/rpcs3/Input/mouse_gyro_handler.h +++ b/rpcs3/Input/mouse_gyro_handler.h @@ -10,24 +10,23 @@ class QWindow; // Mouse-based motion sensor emulation state. class mouse_gyro_handler { -private: - atomic_t enabled = false; // Whether mouse-based gyro emulation mode has been enabled by using the associated hotkey - - atomic_t active = false; // Whether right mouse button is currently held (gyro active) - atomic_t reset = false; // One-shot reset request on right mouse button release - atomic_t gyro_x = DEFAULT_MOTION_X; // Accumulated from mouse X position relative to center - atomic_t gyro_y = DEFAULT_MOTION_Y; // Accumulated from mouse wheel delta - atomic_t gyro_z = DEFAULT_MOTION_Z; // Accumulated from mouse Y position relative to center - - void set_gyro_active(); - void set_gyro_reset(); - void set_gyro_xz(s32 off_x, s32 off_y); - void set_gyro_y(s32 steps); - public: void clear(); bool toggle_enabled(); void handle_event(QEvent* ev, const QWindow& win); void apply_gyro(const std::shared_ptr& pad); + +private: + atomic_t m_enabled = false; // Whether mouse-based gyro emulation mode has been enabled by using the associated hotkey + atomic_t m_active = false; // Whether right mouse button is currently held (gyro active) + atomic_t m_reset = false; // One-shot reset request on right mouse button release + atomic_t m_gyro_x = DEFAULT_MOTION_X; // Accumulated from mouse X position relative to center + atomic_t m_gyro_y = DEFAULT_MOTION_Y; // Accumulated from mouse wheel delta + atomic_t m_gyro_z = DEFAULT_MOTION_Z; // Accumulated from mouse Y position relative to center + + void set_gyro_active(); + void set_gyro_reset(); + void set_gyro_xz(s32 off_x, s32 off_y); + void set_gyro_y(s32 steps); }; From f6429a1ae84a3968f57a21f3ac13d679d61313c2 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 25 Feb 2026 07:40:08 +0100 Subject: [PATCH 278/630] overlays: add fullscreen toggle to home menu --- .../HomeMenu/overlay_home_menu_main_menu.cpp | 15 ++++++++++++++- rpcs3/Emu/localized_string_id.h | 1 + rpcs3/rpcs3qt/gs_frame.cpp | 9 +++++++++ rpcs3/rpcs3qt/localized_emu.h | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp index 7a6a5a6b47..368ac4dd39 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp @@ -12,6 +12,8 @@ extern atomic_t g_user_asked_for_recording; +atomic_t g_user_asked_for_fullscreen = false; + namespace rsx { namespace overlays @@ -80,7 +82,7 @@ namespace rsx if (btn != pad_button::cross) return page_navigation::stay; rsx_log.notice("User selected trophies in home menu"); - Emu.CallFromMainThread([trop_name = std::move(trop_name)]() + Emu.CallFromMainThread([trop_name]() { if (auto manager = g_fxo->try_get()) { @@ -110,6 +112,17 @@ namespace rsx return page_navigation::exit; }); + std::unique_ptr fullscreen = std::make_unique(get_localized_string(localized_string_id::HOME_MENU_TOGGLE_FULLSCREEN)); + add_item(fullscreen, [](pad_button btn) -> page_navigation + { + if (btn != pad_button::cross) + return page_navigation::stay; + + rsx_log.notice("User selected toggle fullscreen in home menu"); + g_user_asked_for_fullscreen = true; + return page_navigation::stay; // No need to exit + }); + add_page(std::make_shared(x, y, width, height, use_separators, this)); std::unique_ptr restart = std::make_unique(get_localized_string(localized_string_id::HOME_MENU_RESTART)); diff --git a/rpcs3/Emu/localized_string_id.h b/rpcs3/Emu/localized_string_id.h index 399b45c437..9ab9f57a9b 100644 --- a/rpcs3/Emu/localized_string_id.h +++ b/rpcs3/Emu/localized_string_id.h @@ -277,6 +277,7 @@ enum class localized_string_id HOME_MENU_RELOAD_SECOND_SAVESTATE, HOME_MENU_RELOAD_THIRD_SAVESTATE, HOME_MENU_RELOAD_FOURTH_SAVESTATE, + HOME_MENU_TOGGLE_FULLSCREEN, HOME_MENU_RECORDING, HOME_MENU_TROPHIES, HOME_MENU_TROPHY_LIST_TITLE, diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index 6557168cce..74ecf7fccd 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -51,6 +51,7 @@ LOG_CHANNEL(screenshot_log, "SCREENSHOT"); LOG_CHANNEL(mark_log, "MARK"); LOG_CHANNEL(gui_log, "GUI"); +extern atomic_t g_user_asked_for_fullscreen; extern atomic_t g_user_asked_for_recording; extern atomic_t g_user_asked_for_screenshot; extern atomic_t g_user_asked_for_frame_capture; @@ -840,6 +841,14 @@ void gs_frame::flip(draw_context_t, bool /*skip_frame*/) toggle_recording(); }); } + + if (g_user_asked_for_fullscreen.exchange(false)) + { + Emu.CallFromMainThread([this]() + { + toggle_fullscreen(); + }); + } } bool gs_frame::can_consume_frame() const diff --git a/rpcs3/rpcs3qt/localized_emu.h b/rpcs3/rpcs3qt/localized_emu.h index 7d4453a1bd..d05d3e52ee 100644 --- a/rpcs3/rpcs3qt/localized_emu.h +++ b/rpcs3/rpcs3qt/localized_emu.h @@ -298,6 +298,7 @@ private: case localized_string_id::HOME_MENU_RELOAD_SECOND_SAVESTATE: return tr("Reload Second-To-Last Emulation State"); case localized_string_id::HOME_MENU_RELOAD_THIRD_SAVESTATE: return tr("Reload Third-To-Last Emulation State"); case localized_string_id::HOME_MENU_RELOAD_FOURTH_SAVESTATE: return tr("Reload Fourth-To-Last Emulation State"); + case localized_string_id::HOME_MENU_TOGGLE_FULLSCREEN: return tr("Toggle Fullscreen"); case localized_string_id::HOME_MENU_RECORDING: return tr("Start/Stop Recording"); case localized_string_id::HOME_MENU_TROPHIES: return tr("Trophies"); case localized_string_id::HOME_MENU_TROPHY_LIST_TITLE: return tr("Trophy Progress: %0").arg(std::forward(args)...); From 8a0eae0ccdc53a0185e65b25c6472f201fbeb7f7 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 25 Feb 2026 07:50:26 +0100 Subject: [PATCH 279/630] overlays: allow to go to begin/end of list without auto repeat --- .../RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp | 12 ++++++++++++ rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp | 7 ++++++- rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp | 3 ++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp index 81c1ebecba..edfb932d26 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp @@ -215,12 +215,24 @@ namespace rsx case pad_button::dpad_up: case pad_button::ls_up: { + if (!is_auto_repeat && get_selected_index() <= 0) + { + select_entry(get_elements_count() - 1); + break; + } + select_previous(); break; } case pad_button::dpad_down: case pad_button::ls_down: { + if (!is_auto_repeat && get_selected_index() >= (get_elements_count() - 1)) + { + select_entry(0); + break; + } + select_next(); break; } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp b/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp index 093902dbe3..1b6f4e8fc6 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp @@ -189,7 +189,12 @@ namespace rsx update_selection(); } - int list_view::get_selected_index() const + u16 list_view::get_elements_count() const + { + return m_elements_count; + } + + s32 list_view::get_selected_index() const { return m_selected_entry; } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp b/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp index c2378c5319..8f191dd404 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp @@ -34,7 +34,8 @@ namespace rsx void add_entry(std::unique_ptr& entry); - int get_selected_index() const; + u16 get_elements_count() const; + s32 get_selected_index() const; bool get_cancel_only() const; const overlay_element* get_selected_entry() const; From 9ede04c4b9f867d3568b7cf193fb8d4af71f54f9 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 25 Feb 2026 08:02:17 +0100 Subject: [PATCH 280/630] Invalidate some global variables in gs_frame dtor --- rpcs3/rpcs3qt/gs_frame.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index 74ecf7fccd..ef6fa7cb46 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -151,6 +151,9 @@ gs_frame::gs_frame(QScreen* screen, const QRect& geometry, const QIcon& appIcon, gs_frame::~gs_frame() { g_user_asked_for_screenshot = false; + g_user_asked_for_recording = false; + g_user_asked_for_frame_capture = false; + g_user_asked_for_fullscreen = false; pad::g_home_menu_requested = false; // Save active screen to gui settings From 7c8b915ba1eae5097825b40964e8b7290945d72c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 25 Feb 2026 09:01:08 +0100 Subject: [PATCH 281/630] tiny style fixes --- rpcs3/Emu/title.h | 2 +- rpcs3/rpcs3qt/gs_frame.cpp | 6 +++--- rpcs3/rpcs3qt/gs_frame.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/title.h b/rpcs3/Emu/title.h index 7084231f32..783ad7abb4 100644 --- a/rpcs3/Emu/title.h +++ b/rpcs3/Emu/title.h @@ -11,7 +11,7 @@ namespace rpcs3 std::string title_id; std::string renderer; std::string vulkan_adapter; - double fps = .0; + double fps = 0.0; }; std::string get_formatted_title(const title_format_data& title_data); diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index ef6fa7cb46..67a750316e 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -205,12 +205,12 @@ void gs_frame::update_shortcuts() } } -void gs_frame::paintEvent(QPaintEvent *event) +void gs_frame::paintEvent(QPaintEvent* event) { Q_UNUSED(event) } -void gs_frame::showEvent(QShowEvent *event) +void gs_frame::showEvent(QShowEvent* event) { // We have to calculate new window positions, since the frame is only known once the window was created. // We will try to find the originally requested dimensions if possible by moving the frame. @@ -805,7 +805,7 @@ f64 gs_frame::client_display_rate() return rate; } -void gs_frame::flip(draw_context_t, bool /*skip_frame*/) +void gs_frame::flip(draw_context_t /*context*/, bool /*skip_frame*/) { static Timer fps_t; diff --git a/rpcs3/rpcs3qt/gs_frame.h b/rpcs3/rpcs3qt/gs_frame.h index a00773240e..5e63a2d9c1 100644 --- a/rpcs3/rpcs3qt/gs_frame.h +++ b/rpcs3/rpcs3qt/gs_frame.h @@ -85,8 +85,8 @@ public: protected: video_renderer m_renderer; - void paintEvent(QPaintEvent *event) override; - void showEvent(QShowEvent *event) override; + void paintEvent(QPaintEvent* event) override; + void showEvent(QShowEvent* event) override; void close() override; void reset() override; From 9e7268ed6de007a4ea09b31d162f7c52b9af47fb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 17:02:15 +0300 Subject: [PATCH 282/630] gl: Despaghettify texture handling --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 149 +++++++++++++++++++++--------------- 1 file changed, 87 insertions(+), 62 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index 475507ee78..b167ab24c2 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -299,95 +299,114 @@ void GLGSRender::load_texture_env() for (u32 textures_ref = current_fp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) + { continue; + } if (!fs_sampler_state[i]) + { fs_sampler_state[i] = std::make_unique(); + } auto sampler_state = static_cast(fs_sampler_state[i].get()); const auto& tex = rsx::method_registers.fragment_textures[i]; const auto previous_format_class = sampler_state->format_class; - if (m_samplers_dirty || m_textures_dirty[i] || m_gl_texture_cache.test_if_descriptor_expired(cmd, m_rtts, sampler_state, tex)) + if (!m_samplers_dirty && + !m_textures_dirty[i] && + !m_gl_texture_cache.test_if_descriptor_expired(cmd, m_rtts, sampler_state, tex)) { - if (tex.enabled()) - { - *sampler_state = m_gl_texture_cache.upload_texture(cmd, tex, m_rtts); + continue; + } - if (sampler_state->validate()) - { - sampler_state->format_ex = tex.format_ex(); + const bool is_sampler_dirty = m_textures_dirty[i]; + m_textures_dirty[i] = false; - if (m_textures_dirty[i]) - { - m_fs_sampler_states[i].apply(tex, fs_sampler_state[i].get()); - } - else if (sampler_state->format_class != previous_format_class) - { - m_graphics_state |= rsx::fragment_program_state_dirty; - } + if (!tex.enabled()) + { + *sampler_state = {}; + continue; + } - const auto texture_format = sampler_state->format_ex.format(); - // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking. - // If accurate graphics are desired, force a bitcast to COLOR as a workaround. - const bool is_depth_reconstructed = sampler_state->format_class != rsx::classify_format(texture_format) && - (texture_format == CELL_GCM_TEXTURE_A8R8G8B8 || texture_format == CELL_GCM_TEXTURE_D8R8G8B8); - // SNORM conversion required in shader. Do not interpolate to avoid introducing discontinuities due to how negative numbers work - const bool is_snorm = (sampler_state->format_ex.texel_remap_control & rsx::texture_control_bits::SEXT_MASK) != 0; + *sampler_state = m_gl_texture_cache.upload_texture(cmd, tex, m_rtts); + if (!sampler_state->validate()) + { + continue; + } - if (is_depth_reconstructed || is_snorm) - { - // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking. - m_fs_sampler_states[i].set_parameteri(GL_TEXTURE_MIN_FILTER, GL_NEAREST); - m_fs_sampler_states[i].set_parameteri(GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } - } - } - else - { - *sampler_state = {}; - } + sampler_state->format_ex = tex.format_ex(); - m_textures_dirty[i] = false; + if (is_sampler_dirty) + { + m_fs_sampler_states[i].apply(tex, fs_sampler_state[i].get()); + } + else if (sampler_state->format_class != previous_format_class) + { + m_graphics_state |= rsx::fragment_program_state_dirty; + } + + const auto texture_format = sampler_state->format_ex.format(); + // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking. + // If accurate graphics are desired, force a bitcast to COLOR as a workaround. + const bool is_depth_reconstructed = sampler_state->format_class != rsx::classify_format(texture_format) && + (texture_format == CELL_GCM_TEXTURE_A8R8G8B8 || texture_format == CELL_GCM_TEXTURE_D8R8G8B8); + // SNORM conversion required in shader. Do not interpolate to avoid introducing discontinuities due to how negative numbers work + const bool is_snorm = (sampler_state->format_ex.texel_remap_control & rsx::texture_control_bits::SEXT_MASK) != 0; + + if (is_depth_reconstructed || is_snorm) + { + // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking. + m_fs_sampler_states[i].set_parameteri(GL_TEXTURE_MIN_FILTER, GL_NEAREST); + m_fs_sampler_states[i].set_parameteri(GL_TEXTURE_MAG_FILTER, GL_NEAREST); } } for (u32 textures_ref = current_vp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) + { continue; + } if (!vs_sampler_state[i]) + { vs_sampler_state[i] = std::make_unique(); + } auto sampler_state = static_cast(vs_sampler_state[i].get()); const auto& tex = rsx::method_registers.vertex_textures[i]; const auto previous_format_class = sampler_state->format_class; - if (m_samplers_dirty || m_vertex_textures_dirty[i] || m_gl_texture_cache.test_if_descriptor_expired(cmd, m_rtts, sampler_state, tex)) + if (!m_samplers_dirty && + !m_vertex_textures_dirty[i] && + !m_gl_texture_cache.test_if_descriptor_expired(cmd, m_rtts, sampler_state, tex)) { - if (rsx::method_registers.vertex_textures[i].enabled()) - { - *sampler_state = m_gl_texture_cache.upload_texture(cmd, rsx::method_registers.vertex_textures[i], m_rtts); + continue; + } - if (sampler_state->validate()) - { - if (m_vertex_textures_dirty[i]) - { - m_vs_sampler_states[i].apply(tex, vs_sampler_state[i].get()); - } - else if (sampler_state->format_class != previous_format_class) - { - m_graphics_state |= rsx::vertex_program_state_dirty; - } - } - } - else - { - *sampler_state = {}; - } + const bool is_sampler_dirty = m_vertex_textures_dirty[i]; + m_vertex_textures_dirty[i] = false; - m_vertex_textures_dirty[i] = false; + if (!tex.enabled()) + { + *sampler_state = {}; + continue; + } + + *sampler_state = m_gl_texture_cache.upload_texture(cmd, rsx::method_registers.vertex_textures[i], m_rtts); + + if (!sampler_state->validate()) + { + continue; + } + + if (m_vertex_textures_dirty[i]) + { + m_vs_sampler_states[i].apply(tex, vs_sampler_state[i].get()); + } + else if (sampler_state->format_class != previous_format_class) + { + m_graphics_state |= rsx::vertex_program_state_dirty; } } @@ -402,7 +421,9 @@ void GLGSRender::bind_texture_env() for (u32 textures_ref = current_fp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) + { continue; + } gl::texture_view* view = nullptr; auto sampler_state = static_cast(fs_sampler_state[i].get()); @@ -442,22 +463,26 @@ void GLGSRender::bind_texture_env() for (u32 textures_ref = current_vp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) + { continue; + } auto sampler_state = static_cast(vs_sampler_state[i].get()); + gl::texture_view* view = nullptr; if (rsx::method_registers.vertex_textures[i].enabled() && sampler_state->validate()) { - if (sampler_state->image_handle) [[likely]] + if (view = sampler_state->image_handle; !view) { - sampler_state->image_handle->bind(cmd, GL_VERTEX_TEXTURES_START + i); - } - else - { - m_gl_texture_cache.create_temporary_subresource(cmd, sampler_state->external_subresource_desc)->bind(cmd, GL_VERTEX_TEXTURES_START + i); + view = m_gl_texture_cache.create_temporary_subresource(cmd, sampler_state->external_subresource_desc); } } + + if (view) [[likely]] + { + view->bind(cmd, GL_VERTEX_TEXTURES_START + i); + } else { cmd->bind_texture(GL_VERTEX_TEXTURES_START + i, GL_TEXTURE_2D, GL_NONE); From b9bdbfa55b3380ae0b35e360a5d1895d910e43f6 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 17:25:25 +0300 Subject: [PATCH 283/630] vk: De-sphaggetify texture handling --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 419 +++++++++++++++++++----------------- 1 file changed, 220 insertions(+), 199 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 7a9d6aae6e..27a07faf43 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -263,7 +263,7 @@ void VKGSRender::load_texture_env() { // Load textures bool check_for_cyclic_refs = false; - auto check_surface_cache_sampler = [&](auto descriptor, const auto& tex) + auto check_surface_cache_sampler_valid = [&](auto descriptor, const auto& tex) { if (!m_texture_cache.test_if_descriptor_expired(*m_current_command_buffer, m_rtts, descriptor, tex)) { @@ -286,242 +286,259 @@ void VKGSRender::load_texture_env() for (u32 textures_ref = current_fp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) + { continue; + } if (!fs_sampler_state[i]) + { fs_sampler_state[i] = std::make_unique(); + } auto sampler_state = static_cast(fs_sampler_state[i].get()); const auto& tex = rsx::method_registers.fragment_textures[i]; const auto previous_format_class = fs_sampler_state[i]->format_class; - if (m_samplers_dirty || m_textures_dirty[i] || !check_surface_cache_sampler(sampler_state, tex)) + if (!m_samplers_dirty && + !m_textures_dirty[i] && + check_surface_cache_sampler_valid(sampler_state, tex)) { - if (tex.enabled()) + continue; + } + + const bool is_sampler_dirty = m_textures_dirty[i]; + m_textures_dirty[i] = false; + + if (!tex.enabled()) + { + *sampler_state = {}; + continue; + } + + *sampler_state = m_texture_cache.upload_texture(*m_current_command_buffer, tex, m_rtts); + if (!sampler_state->validate()) + { + continue; + } + + sampler_state->format_ex = tex.format_ex(); + + if (sampler_state->is_cyclic_reference) + { + check_for_cyclic_refs |= true; + } + + if (!is_sampler_dirty && sampler_state->format_class != previous_format_class) + { + // Host details changed but RSX is not aware + m_graphics_state |= rsx::fragment_program_state_dirty; + } + + if (!is_sampler_dirty && fs_sampler_handles[i]) + { + // Nothing to change, use cached sampler + continue; + } + + VkFilter mag_filter; + vk::minification_filter min_filter; + f32 min_lod = 0.f, max_lod = 0.f; + f32 lod_bias = 0.f; + + const u32 texture_format = sampler_state->format_ex.format(); + VkBool32 compare_enabled = VK_FALSE; + VkCompareOp depth_compare_mode = VK_COMPARE_OP_NEVER; + + if (texture_format >= CELL_GCM_TEXTURE_DEPTH24_D8 && texture_format <= CELL_GCM_TEXTURE_DEPTH16_FLOAT) + { + compare_enabled = VK_TRUE; + depth_compare_mode = vk::get_compare_func(tex.zfunc(), true); + } + + const f32 af_level = vk::max_aniso(tex.max_aniso()); + const auto wrap_s = vk::vk_wrap_mode(tex.wrap_s()); + const auto wrap_t = vk::vk_wrap_mode(tex.wrap_t()); + const auto wrap_r = vk::vk_wrap_mode(tex.wrap_r()); + + // NOTE: In vulkan, the border color can bypass the sample swizzle stage. + // Check the device properties to determine whether to pre-swizzle the colors or not. + const auto border_color = rsx::is_border_clamped_texture(tex) + ? vk::border_color_t(get_border_color(tex)) + : vk::border_color_t(VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK); + + // Check if non-point filtering can even be used on this format + bool can_sample_linear; + if (sampler_state->format_class == RSX_FORMAT_CLASS_COLOR) [[likely]] + { + // Most PS3-like formats can be linearly filtered without problem + // Exclude textures that require SNORM conversion however + can_sample_linear = (sampler_state->format_ex.texel_remap_control & rsx::texture_control_bits::SEXT_MASK) == 0; + } + else if (sampler_state->format_class != rsx::classify_format(texture_format) && + (texture_format == CELL_GCM_TEXTURE_A8R8G8B8 || texture_format == CELL_GCM_TEXTURE_D8R8G8B8)) + { + // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking + can_sample_linear = false; + } + else + { + // Not all GPUs support linear filtering of depth formats + const auto vk_format = sampler_state->image_handle ? sampler_state->image_handle->image()->format() : + vk::get_compatible_sampler_format(m_device->get_formats_support(), sampler_state->external_subresource_desc.gcm_format); + + can_sample_linear = m_device->get_format_properties(vk_format).optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; + } + + const auto mipmap_count = tex.get_exact_mipmap_count(); + min_filter = vk::get_min_filter(tex.min_filter()); + + if (can_sample_linear) + { + mag_filter = vk::get_mag_filter(tex.mag_filter()); + } + else + { + mag_filter = VK_FILTER_NEAREST; + min_filter.filter = VK_FILTER_NEAREST; + } + + if (min_filter.sample_mipmaps && mipmap_count > 1) + { + f32 actual_mipmaps; + if (sampler_state->upload_context == rsx::texture_upload_context::shader_read) { - *sampler_state = m_texture_cache.upload_texture(*m_current_command_buffer, tex, m_rtts); + actual_mipmaps = static_cast(mipmap_count); + } + else if (sampler_state->external_subresource_desc.op == rsx::deferred_request_command::mipmap_gather) + { + // Clamp min and max lod + actual_mipmaps = static_cast(sampler_state->external_subresource_desc.sections_to_copy.size()); } else { - *sampler_state = {}; + actual_mipmaps = 1.f; } - if (sampler_state->validate()) + if (actual_mipmaps > 1.f) { - sampler_state->format_ex = tex.format_ex(); + min_lod = tex.min_lod(); + max_lod = tex.max_lod(); + lod_bias = tex.bias(); - if (sampler_state->is_cyclic_reference) + min_lod = std::min(min_lod, actual_mipmaps - 1.f); + max_lod = std::min(max_lod, actual_mipmaps - 1.f); + + if (min_filter.mipmap_mode == VK_SAMPLER_MIPMAP_MODE_NEAREST) { - check_for_cyclic_refs |= true; - } - - if (!m_textures_dirty[i] && sampler_state->format_class != previous_format_class) - { - // Host details changed but RSX is not aware - m_graphics_state |= rsx::fragment_program_state_dirty; - } - - bool replace = !fs_sampler_handles[i]; - VkFilter mag_filter; - vk::minification_filter min_filter; - f32 min_lod = 0.f, max_lod = 0.f; - f32 lod_bias = 0.f; - - const u32 texture_format = sampler_state->format_ex.format(); - VkBool32 compare_enabled = VK_FALSE; - VkCompareOp depth_compare_mode = VK_COMPARE_OP_NEVER; - - if (texture_format >= CELL_GCM_TEXTURE_DEPTH24_D8 && texture_format <= CELL_GCM_TEXTURE_DEPTH16_FLOAT) - { - compare_enabled = VK_TRUE; - depth_compare_mode = vk::get_compare_func(tex.zfunc(), true); - } - - const f32 af_level = vk::max_aniso(tex.max_aniso()); - const auto wrap_s = vk::vk_wrap_mode(tex.wrap_s()); - const auto wrap_t = vk::vk_wrap_mode(tex.wrap_t()); - const auto wrap_r = vk::vk_wrap_mode(tex.wrap_r()); - - // NOTE: In vulkan, the border color can bypass the sample swizzle stage. - // Check the device properties to determine whether to pre-swizzle the colors or not. - const auto border_color = rsx::is_border_clamped_texture(tex) - ? vk::border_color_t(get_border_color(tex)) - : vk::border_color_t(VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK); - - // Check if non-point filtering can even be used on this format - bool can_sample_linear; - if (sampler_state->format_class == RSX_FORMAT_CLASS_COLOR) [[likely]] - { - // Most PS3-like formats can be linearly filtered without problem - // Exclude textures that require SNORM conversion however - can_sample_linear = (sampler_state->format_ex.texel_remap_control & rsx::texture_control_bits::SEXT_MASK) == 0; - } - else if (sampler_state->format_class != rsx::classify_format(texture_format) && - (texture_format == CELL_GCM_TEXTURE_A8R8G8B8 || texture_format == CELL_GCM_TEXTURE_D8R8G8B8)) - { - // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking - can_sample_linear = false; - } - else - { - // Not all GPUs support linear filtering of depth formats - const auto vk_format = sampler_state->image_handle ? sampler_state->image_handle->image()->format() : - vk::get_compatible_sampler_format(m_device->get_formats_support(), sampler_state->external_subresource_desc.gcm_format); - - can_sample_linear = m_device->get_format_properties(vk_format).optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; - } - - const auto mipmap_count = tex.get_exact_mipmap_count(); - min_filter = vk::get_min_filter(tex.min_filter()); - - if (can_sample_linear) - { - mag_filter = vk::get_mag_filter(tex.mag_filter()); - } - else - { - mag_filter = VK_FILTER_NEAREST; - min_filter.filter = VK_FILTER_NEAREST; - } - - if (min_filter.sample_mipmaps && mipmap_count > 1) - { - f32 actual_mipmaps; - if (sampler_state->upload_context == rsx::texture_upload_context::shader_read) - { - actual_mipmaps = static_cast(mipmap_count); - } - else if (sampler_state->external_subresource_desc.op == rsx::deferred_request_command::mipmap_gather) - { - // Clamp min and max lod - actual_mipmaps = static_cast(sampler_state->external_subresource_desc.sections_to_copy.size()); - } - else - { - actual_mipmaps = 1.f; - } - - if (actual_mipmaps > 1.f) - { - min_lod = tex.min_lod(); - max_lod = tex.max_lod(); - lod_bias = tex.bias(); - - min_lod = std::min(min_lod, actual_mipmaps - 1.f); - max_lod = std::min(max_lod, actual_mipmaps - 1.f); - - if (min_filter.mipmap_mode == VK_SAMPLER_MIPMAP_MODE_NEAREST) - { - // Round to nearest 0.5 to work around some broken games - // Unlike openGL, sampler parameters cannot be dynamically changed on vulkan, leading to many permutations - lod_bias = std::floor(lod_bias * 2.f + 0.5f) * 0.5f; - } - } - else - { - min_lod = max_lod = lod_bias = 0.f; - min_filter.mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST; - } - } - - if (fs_sampler_handles[i] && m_textures_dirty[i]) - { - if (!fs_sampler_handles[i]->matches(wrap_s, wrap_t, wrap_r, false, lod_bias, af_level, min_lod, max_lod, - min_filter.filter, mag_filter, min_filter.mipmap_mode, border_color, compare_enabled, depth_compare_mode)) - { - replace = true; - } - } - - if (replace) - { - fs_sampler_handles[i] = vk::get_resource_manager()->get_sampler( - *m_device, - fs_sampler_handles[i], - wrap_s, wrap_t, wrap_r, - false, - lod_bias, af_level, min_lod, max_lod, - min_filter.filter, mag_filter, min_filter.mipmap_mode, - border_color, compare_enabled, depth_compare_mode); + // Round to nearest 0.5 to work around some broken games + // Unlike openGL, sampler parameters cannot be dynamically changed on vulkan, leading to many permutations + lod_bias = std::floor(lod_bias * 2.f + 0.5f) * 0.5f; } } - - m_textures_dirty[i] = false; + else + { + min_lod = max_lod = lod_bias = 0.f; + min_filter.mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST; + } } + + if (fs_sampler_handles[i] && + fs_sampler_handles[i]->matches(wrap_s, wrap_t, wrap_r, false, lod_bias, af_level, min_lod, max_lod, + min_filter.filter, mag_filter, min_filter.mipmap_mode, border_color, compare_enabled, depth_compare_mode)) + { + continue; + } + + fs_sampler_handles[i] = vk::get_resource_manager()->get_sampler( + *m_device, + fs_sampler_handles[i], + wrap_s, wrap_t, wrap_r, + false, + lod_bias, af_level, min_lod, max_lod, + min_filter.filter, mag_filter, min_filter.mipmap_mode, + border_color, compare_enabled, depth_compare_mode); } for (u32 textures_ref = current_vp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) + { continue; + } if (!vs_sampler_state[i]) + { vs_sampler_state[i] = std::make_unique(); + } auto sampler_state = static_cast(vs_sampler_state[i].get()); const auto& tex = rsx::method_registers.vertex_textures[i]; const auto previous_format_class = sampler_state->format_class; - if (m_samplers_dirty || m_vertex_textures_dirty[i] || !check_surface_cache_sampler(sampler_state, tex)) + if (!m_samplers_dirty && + !m_vertex_textures_dirty[i] && + check_surface_cache_sampler_valid(sampler_state, tex)) { - if (rsx::method_registers.vertex_textures[i].enabled()) - { - *sampler_state = m_texture_cache.upload_texture(*m_current_command_buffer, tex, m_rtts); - } - else - { - *sampler_state = {}; - } - - if (sampler_state->validate()) - { - if (sampler_state->is_cyclic_reference || sampler_state->external_subresource_desc.do_not_cache) - { - check_for_cyclic_refs |= true; - } - - if (!m_vertex_textures_dirty[i] && sampler_state->format_class != previous_format_class) - { - // Host details changed but RSX is not aware - m_graphics_state |= rsx::vertex_program_state_dirty; - } - - bool replace = !vs_sampler_handles[i]; - const VkBool32 unnormalized_coords = !!(tex.format() & CELL_GCM_TEXTURE_UN); - const auto min_lod = tex.min_lod(); - const auto max_lod = tex.max_lod(); - const auto wrap_s = vk::vk_wrap_mode(tex.wrap_s()); - const auto wrap_t = vk::vk_wrap_mode(tex.wrap_t()); - - // NOTE: In vulkan, the border color can bypass the sample swizzle stage. - // Check the device properties to determine whether to pre-swizzle the colors or not. - const auto border_color = is_border_clamped_texture(tex) - ? vk::border_color_t(get_border_color(tex)) - : vk::border_color_t(VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK); - - if (vs_sampler_handles[i]) - { - if (!vs_sampler_handles[i]->matches(wrap_s, wrap_t, VK_SAMPLER_ADDRESS_MODE_REPEAT, - unnormalized_coords, 0.f, 1.f, min_lod, max_lod, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST, border_color)) - { - replace = true; - } - } - - if (replace) - { - vs_sampler_handles[i] = vk::get_resource_manager()->get_sampler( - *m_device, - vs_sampler_handles[i], - wrap_s, wrap_t, VK_SAMPLER_ADDRESS_MODE_REPEAT, - unnormalized_coords, - 0.f, 1.f, min_lod, max_lod, - VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST, border_color); - } - } - - m_vertex_textures_dirty[i] = false; + continue; } + + const bool is_sampler_dirty = m_vertex_textures_dirty[i]; + m_vertex_textures_dirty[i] = false; + + if (!rsx::method_registers.vertex_textures[i].enabled()) + { + *sampler_state = {}; + continue; + } + + *sampler_state = m_texture_cache.upload_texture(*m_current_command_buffer, tex, m_rtts); + if (!sampler_state->validate()) + { + continue; + } + + if (sampler_state->is_cyclic_reference || sampler_state->external_subresource_desc.do_not_cache) + { + check_for_cyclic_refs |= true; + } + + if (!is_sampler_dirty && sampler_state->format_class != previous_format_class) + { + // Host details changed but RSX is not aware + m_graphics_state |= rsx::vertex_program_state_dirty; + } + + if (!is_sampler_dirty && vs_sampler_handles[i]) + { + continue; + } + + const VkBool32 unnormalized_coords = !!(tex.format() & CELL_GCM_TEXTURE_UN); + const auto min_lod = tex.min_lod(); + const auto max_lod = tex.max_lod(); + const auto wrap_s = vk::vk_wrap_mode(tex.wrap_s()); + const auto wrap_t = vk::vk_wrap_mode(tex.wrap_t()); + + // NOTE: In vulkan, the border color can bypass the sample swizzle stage. + // Check the device properties to determine whether to pre-swizzle the colors or not. + const auto border_color = is_border_clamped_texture(tex) + ? vk::border_color_t(get_border_color(tex)) + : vk::border_color_t(VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK); + + if (vs_sampler_handles[i] && + vs_sampler_handles[i]->matches(wrap_s, wrap_t, VK_SAMPLER_ADDRESS_MODE_REPEAT, + unnormalized_coords, 0.f, 1.f, min_lod, max_lod, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST, border_color)) + { + continue; + } + + vs_sampler_handles[i] = vk::get_resource_manager()->get_sampler( + *m_device, + vs_sampler_handles[i], + wrap_s, wrap_t, VK_SAMPLER_ADDRESS_MODE_REPEAT, + unnormalized_coords, + 0.f, 1.f, min_lod, max_lod, + VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST, border_color); } m_samplers_dirty.store(false); @@ -557,7 +574,9 @@ bool VKGSRender::bind_texture_env() for (u32 textures_ref = current_fp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) + { continue; + } vk::image_view* view = nullptr; auto sampler_state = static_cast(fs_sampler_state[i].get()); @@ -627,7 +646,9 @@ bool VKGSRender::bind_texture_env() for (u32 textures_ref = current_vp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i) { if (!(textures_ref & 1)) + { continue; + } if (!rsx::method_registers.vertex_textures[i].enabled()) { From f2a17e489806daf46bd943a43383fed9cfa870dc Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 18:13:23 +0300 Subject: [PATCH 284/630] rsx: Add format override functionality to format_ex --- rpcs3/Emu/RSX/Common/TextureUtils.h | 3 ++ rpcs3/Emu/RSX/Program/GLSLCommon.h | 42 +------------------------- rpcs3/Emu/RSX/color_utils.h | 46 +++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 41 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.h b/rpcs3/Emu/RSX/Common/TextureUtils.h index c32152fecd..551052f0ad 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.h +++ b/rpcs3/Emu/RSX/Common/TextureUtils.h @@ -147,6 +147,9 @@ namespace rsx bool valid() const { return format_bits != 0; } u32 format() const { return format_bits & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN); } + bool hw_SNORM_possible() const { return (texel_remap_control & SEXT_MASK) == SEXT_MASK; } + bool hw_SRGB_possible() const { return (texel_remap_control & GAMMA_CTRL_MASK) == GAMMA_RGB_MASK; } + //private: u32 format_bits = 0; u32 features = 0; diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.h b/rpcs3/Emu/RSX/Program/GLSLCommon.h index ae22464f12..81b5043fc9 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.h +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.h @@ -4,52 +4,12 @@ #include "GLSLTypes.h" #include "ShaderParam.h" +#include "../color_utils.h" struct RSXFragmentProgram; namespace rsx { - // TODO: Move this somewhere else once more compilers are supported other than glsl - enum texture_control_bits - { - GAMMA_A = 0, - GAMMA_R, - GAMMA_G, - GAMMA_B, - ALPHAKILL, - RENORMALIZE, - EXPAND_A, - EXPAND_R, - EXPAND_G, - EXPAND_B, - SEXT_A, - SEXT_R, - SEXT_G, - SEXT_B, - DEPTH_FLOAT, - DEPTH_COMPARE_OP, - DEPTH_COMPARE_1, - DEPTH_COMPARE_2, - FILTERED_MAG, - FILTERED_MIN, - UNNORMALIZED_COORDS, - CLAMP_TEXCOORDS_BIT, - WRAP_S, - WRAP_T, - WRAP_R, - FF_SIGNED_BIT, - FF_BIASED_RENORM_BIT, - FF_GAMMA_BIT, - FF_16BIT_CHANNELS_BIT, - - GAMMA_CTRL_MASK = (1 << GAMMA_R) | (1 << GAMMA_G) | (1 << GAMMA_B) | (1 << GAMMA_A), - EXPAND_MASK = (1 << EXPAND_R) | (1 << EXPAND_G) | (1 << EXPAND_B) | (1 << EXPAND_A), - EXPAND_OFFSET = EXPAND_A, - SEXT_MASK = (1 << SEXT_R) | (1 << SEXT_G) | (1 << SEXT_B) | (1 << SEXT_A), - SEXT_OFFSET = SEXT_A, - FORMAT_FEATURES_OFFSET = FF_SIGNED_BIT, - }; - enum ROP_control_bits : u32 { // Commands. These trigger explicit action. diff --git a/rpcs3/Emu/RSX/color_utils.h b/rpcs3/Emu/RSX/color_utils.h index 40335c07e3..25aa6eb7e9 100644 --- a/rpcs3/Emu/RSX/color_utils.h +++ b/rpcs3/Emu/RSX/color_utils.h @@ -7,6 +7,52 @@ namespace rsx { + enum texture_control_bits : u32 + { + GAMMA_A = 0, + GAMMA_R, + GAMMA_G, + GAMMA_B, + ALPHAKILL, + RENORMALIZE, + EXPAND_A, + EXPAND_R, + EXPAND_G, + EXPAND_B, + SEXT_A, + SEXT_R, + SEXT_G, + SEXT_B, + DEPTH_FLOAT, + DEPTH_COMPARE_OP, + DEPTH_COMPARE_1, + DEPTH_COMPARE_2, + FILTERED_MAG, + FILTERED_MIN, + UNNORMALIZED_COORDS, + CLAMP_TEXCOORDS_BIT, + WRAP_S, + WRAP_T, + WRAP_R, + FF_SIGNED_BIT, + FF_BIASED_RENORM_BIT, + FF_GAMMA_BIT, + FF_16BIT_CHANNELS_BIT, + + // Meta + GAMMA_CTRL_MASK = (1 << GAMMA_R) | (1 << GAMMA_G) | (1 << GAMMA_B) | (1 << GAMMA_A), + GAMMA_RGB_MASK = (1 << GAMMA_R) | (1 << GAMMA_G) | (1 << GAMMA_B), + GAMMA_OFFSET = GAMMA_A, + + EXPAND_MASK = (1 << EXPAND_R) | (1 << EXPAND_G) | (1 << EXPAND_B) | (1 << EXPAND_A), + EXPAND_OFFSET = EXPAND_A, + + SEXT_MASK = (1 << SEXT_R) | (1 << SEXT_G) | (1 << SEXT_B) | (1 << SEXT_A), + SEXT_OFFSET = SEXT_A, + + FORMAT_FEATURES_OFFSET = FF_SIGNED_BIT, + }; + struct texture_channel_remap_t { u32 encoded = 0xDEAD; From 4c20bdcc9fafe9d579a0d33184b9a041eb1d1dda Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 18:14:06 +0300 Subject: [PATCH 285/630] vk: Add support for derived image views --- rpcs3/Emu/RSX/VK/VKFramebuffer.cpp | 2 +- rpcs3/Emu/RSX/VK/VKRenderTargets.cpp | 6 ++--- rpcs3/Emu/RSX/VK/VKRenderTargets.h | 2 +- rpcs3/Emu/RSX/VK/vkutils/image.cpp | 35 ++++++++++++++++++++++++---- rpcs3/Emu/RSX/VK/vkutils/image.h | 19 ++++++++++++++- 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKFramebuffer.cpp b/rpcs3/Emu/RSX/VK/VKFramebuffer.cpp index d1fc5a4764..eb5f11ce03 100644 --- a/rpcs3/Emu/RSX/VK/VKFramebuffer.cpp +++ b/rpcs3/Emu/RSX/VK/VKFramebuffer.cpp @@ -45,7 +45,7 @@ namespace vk for (const auto& e : image_list) { const VkImageSubresourceRange subres = { e->aspect(), 0, 1, 0, 1 }; - image_views.push_back(std::make_unique(dev, e, VK_IMAGE_VIEW_TYPE_2D, vk::default_component_map, subres)); + image_views.push_back(std::make_unique(dev, e, e->format(), VK_IMAGE_VIEW_TYPE_2D, vk::default_component_map, subres)); } auto value = std::make_unique(dev, renderpass, width, height, std::move(image_views)); diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp b/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp index 9d66baa9d2..0bd7852c2d 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp @@ -911,15 +911,15 @@ namespace vk m_cyclic_ref_tracker.reset(); } - image_view* render_target::get_view(const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask) + image_view* render_target::get_view(VkFormat format, const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask) { if (remap.encoded == VK_REMAP_VIEW_MULTISAMPLED) { // Special remap flag, intercept here - return vk::viewable_image::get_view(remap.with_encoding(VK_REMAP_IDENTITY), mask); + return vk::viewable_image::get_view(format, remap.with_encoding(VK_REMAP_IDENTITY), mask); } - return vk::viewable_image::get_view(remap, mask); + return vk::viewable_image::get_view(format, remap, mask); } void render_target::memory_barrier(vk::command_buffer& cmd, rsx::surface_access access) diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index 3c3ef0acbd..287c9c2c52 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -110,7 +110,7 @@ namespace vk bool matches_dimensions(u16 _width, u16 _height) const; void reset_surface_counters(); - image_view* get_view(const rsx::texture_channel_remap_t& remap, + image_view* get_view(VkFormat format, const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT) override; // Memory management diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.cpp b/rpcs3/Emu/RSX/VK/vkutils/image.cpp index 5e4c8ce022..ce431945ed 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image.cpp @@ -333,10 +333,10 @@ namespace vk create_impl(); } - image_view::image_view(VkDevice dev, vk::image* resource, VkImageViewType view_type, const VkComponentMapping& mapping, const VkImageSubresourceRange& range) + image_view::image_view(VkDevice dev, vk::image* resource, VkFormat format, VkImageViewType view_type, const VkComponentMapping& mapping, const VkImageSubresourceRange& range) : m_device(dev), m_resource(resource) { - info.format = resource->info.format; + info.format = format == VK_FORMAT_UNDEFINED ? resource->format() : format; info.image = resource->value; info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; info.components = mapping; @@ -379,6 +379,33 @@ namespace vk vkDestroyImageView(m_device, value, nullptr); } + image_view* image_view::as(VkFormat format) + { + if (this->format() == format) + { + return this; + } + + auto self = this->m_root_view + ? this->m_root_view + : this; + + if (auto found = self->m_subviews.find(format); + found != self->m_subviews.end()) + { + return found->second.get(); + } + + // Create a derived + auto view = std::make_unique(m_device, info.image, info.viewType, format, info.components, info.subresourceRange); + view->m_resource = self->m_resource; + view->m_root_view = self; + + auto ret = view.get(); + self->m_subviews.emplace(format, std::move(view)); + return ret; + } + u32 image_view::encoded_component_map() const { #if (VK_DISABLE_COMPONENT_SWIZZLE) @@ -436,7 +463,7 @@ namespace vk return result; } - image_view* viewable_image::get_view(const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask) + image_view* viewable_image::get_view(VkFormat format, const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask) { u32 remap_encoding = remap.encoded; if (remap_encoding == VK_REMAP_IDENTITY) @@ -479,7 +506,7 @@ namespace vk const VkImageSubresourceRange range = { aspect() & mask, 0, info.mipLevels, 0, info.arrayLayers }; ensure(range.aspectMask); - auto view = std::make_unique(*g_render_device, this, VK_IMAGE_VIEW_TYPE_MAX_ENUM, real_mapping, range); + auto view = std::make_unique(*g_render_device, this, format, VK_IMAGE_VIEW_TYPE_MAX_ENUM, real_mapping, range); auto result = view.get(); views.emplace(storage_key, std::move(view)); return result; diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.h b/rpcs3/Emu/RSX/VK/vkutils/image.h index fbe7abb5fd..e494f9e40d 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.h +++ b/rpcs3/Emu/RSX/VK/vkutils/image.h @@ -112,21 +112,29 @@ namespace vk image_view(VkDevice dev, VkImageViewCreateInfo create_info); image_view(VkDevice dev, vk::image* resource, + VkFormat format = VK_FORMAT_UNDEFINED, VkImageViewType view_type = VK_IMAGE_VIEW_TYPE_MAX_ENUM, const VkComponentMapping& mapping = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }, const VkImageSubresourceRange& range = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); ~image_view(); + vk::image_view* as(VkFormat new_format); + u32 encoded_component_map() const; vk::image* image() const; image_view(const image_view&) = delete; image_view(image_view&&) = delete; + VkFormat format() const { return info.format; } + private: + std::unordered_map> m_subviews; + VkDevice m_device; vk::image* m_resource = nullptr; + vk::image_view* m_root_view = nullptr; void create_impl(); void set_debug_name(std::string_view name); @@ -141,9 +149,18 @@ namespace vk public: using image::image; - virtual image_view* get_view(const rsx::texture_channel_remap_t& remap, + virtual image_view* get_view( + VkFormat format, + const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT); + image_view* get_view( + const rsx::texture_channel_remap_t& remap, + VkImageAspectFlags mask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT) + { + return get_view(info.format, remap, mask); + } + void set_native_component_layout(VkComponentMapping new_layout); }; } From 3f174b2a97f672ffc3d097a185d81253298e44fe Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 18:14:27 +0300 Subject: [PATCH 286/630] vk: Implement SNORM and SRGB format overrides --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 46 +++++++++++++++++++----- rpcs3/Emu/RSX/VK/VKFormats.cpp | 66 +++++++++++++++++++++++++++++++++- rpcs3/Emu/RSX/VK/VKFormats.h | 1 + 3 files changed, 104 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 27a07faf43..6bec02ab7c 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -321,23 +321,53 @@ void VKGSRender::load_texture_env() continue; } - sampler_state->format_ex = tex.format_ex(); - if (sampler_state->is_cyclic_reference) { check_for_cyclic_refs |= true; } - if (!is_sampler_dirty && sampler_state->format_class != previous_format_class) + if (!is_sampler_dirty) { - // Host details changed but RSX is not aware - m_graphics_state |= rsx::fragment_program_state_dirty; + if (sampler_state->format_class != previous_format_class) + { + // Host details changed but RSX is not aware + m_graphics_state |= rsx::fragment_program_state_dirty; + } + + if (fs_sampler_handles[i]) + { + // Nothing to change, use cached sampler + continue; + } } - if (!is_sampler_dirty && fs_sampler_handles[i]) + sampler_state->format_ex = tex.format_ex(); + + if (sampler_state->format_ex.texel_remap_control && + sampler_state->image_handle && + sampler_state->upload_context == rsx::texture_upload_context::shader_read) [[ unlikely ]] { - // Nothing to change, use cached sampler - continue; + // Check if we need to override the view format + const auto vk_format = sampler_state->image_handle->format(); + VkFormat format_override = vk_format;; + rsx::flags32_t flags_to_erase = 0u; + + if (sampler_state->format_ex.hw_SNORM_possible()) + { + format_override = vk::get_compatible_snorm_format(vk_format); + flags_to_erase = rsx::texture_control_bits::SEXT_MASK; + } + else if (sampler_state->format_ex.hw_SRGB_possible()) + { + format_override = vk::get_compatible_srgb_format(vk_format); + flags_to_erase = rsx::texture_control_bits::GAMMA_CTRL_MASK; + } + + if (format_override != VK_FORMAT_UNDEFINED && format_override != vk_format) + { + sampler_state->image_handle = sampler_state->image_handle->as(format_override); + sampler_state->format_ex.texel_remap_control &= (~flags_to_erase); + } } VkFilter mag_filter; diff --git a/rpcs3/Emu/RSX/VK/VKFormats.cpp b/rpcs3/Emu/RSX/VK/VKFormats.cpp index f766a70e79..ed824de77d 100644 --- a/rpcs3/Emu/RSX/VK/VKFormats.cpp +++ b/rpcs3/Emu/RSX/VK/VKFormats.cpp @@ -244,16 +244,80 @@ namespace vk { switch (rgb_format) { + // 8-bit + case VK_FORMAT_R8_UNORM: + return VK_FORMAT_R8_SRGB; + case VK_FORMAT_R8G8_UNORM: + return VK_FORMAT_R8G8_SRGB; + case VK_FORMAT_R8G8B8A8_UNORM: + return VK_FORMAT_R8G8B8A8_SRGB; case VK_FORMAT_B8G8R8A8_UNORM: return VK_FORMAT_B8G8R8A8_SRGB; + // 16-bit + case VK_FORMAT_R16_UNORM: + case VK_FORMAT_R16G16_UNORM: + return VK_FORMAT_UNDEFINED; // No match + case VK_FORMAT_A1R5G5B5_UNORM_PACK16: + case VK_FORMAT_R4G4B4A4_UNORM_PACK16: + case VK_FORMAT_R5G6B5_UNORM_PACK16: + case VK_FORMAT_R5G5B5A1_UNORM_PACK16: + return VK_FORMAT_UNDEFINED; // No match + // DXT case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: return VK_FORMAT_BC1_RGBA_SRGB_BLOCK; case VK_FORMAT_BC2_UNORM_BLOCK: return VK_FORMAT_BC2_SRGB_BLOCK; case VK_FORMAT_BC3_UNORM_BLOCK: return VK_FORMAT_BC3_SRGB_BLOCK; + // Depth + case VK_FORMAT_D16_UNORM: + case VK_FORMAT_D32_SFLOAT: + case VK_FORMAT_D32_SFLOAT_S8_UINT: + case VK_FORMAT_D24_UNORM_S8_UINT: + return VK_FORMAT_UNDEFINED; // Unsupported default: - return rgb_format; + rsx_log.error("[SRGB_FMT] Unexpected VkFormat 0x%x", static_cast(rgb_format)); + return VK_FORMAT_UNDEFINED; + } + } + + VkFormat get_compatible_snorm_format(VkFormat rgb_format) + { + switch (rgb_format) + { + // 8-bit + case VK_FORMAT_R8_UNORM: + return VK_FORMAT_R8_SNORM; + case VK_FORMAT_R8G8_UNORM: + return VK_FORMAT_R8G8_SNORM; + case VK_FORMAT_R8G8B8A8_UNORM: + return VK_FORMAT_R8G8B8A8_SNORM; + case VK_FORMAT_B8G8R8A8_UNORM: + return VK_FORMAT_B8G8R8A8_SNORM; + // 16-bit + case VK_FORMAT_R16_UNORM: + return VK_FORMAT_R16_SNORM; + case VK_FORMAT_R16G16_UNORM: + return VK_FORMAT_R16G16_SNORM; + case VK_FORMAT_A1R5G5B5_UNORM_PACK16: + case VK_FORMAT_R4G4B4A4_UNORM_PACK16: + case VK_FORMAT_R5G6B5_UNORM_PACK16: + case VK_FORMAT_R5G5B5A1_UNORM_PACK16: + return VK_FORMAT_UNDEFINED; // No match + // DXT + case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: + case VK_FORMAT_BC2_UNORM_BLOCK: + case VK_FORMAT_BC3_UNORM_BLOCK: + return VK_FORMAT_UNDEFINED; // No match + // Depth + case VK_FORMAT_D16_UNORM: + case VK_FORMAT_D32_SFLOAT: + case VK_FORMAT_D32_SFLOAT_S8_UINT: + case VK_FORMAT_D24_UNORM_S8_UINT: + return VK_FORMAT_UNDEFINED; // Unsupported + default: + rsx_log.error("[SEXT_FMT] Unexpected VkFormat 0x%x", static_cast(rgb_format)); + return VK_FORMAT_UNDEFINED; } } diff --git a/rpcs3/Emu/RSX/VK/VKFormats.h b/rpcs3/Emu/RSX/VK/VKFormats.h index 85b52ca56b..fae25f92b7 100644 --- a/rpcs3/Emu/RSX/VK/VKFormats.h +++ b/rpcs3/Emu/RSX/VK/VKFormats.h @@ -19,6 +19,7 @@ namespace vk VkFormat get_compatible_depth_surface_format(const gpu_formats_support& support, rsx::surface_depth_format2 format); VkFormat get_compatible_sampler_format(const gpu_formats_support& support, u32 format); VkFormat get_compatible_srgb_format(VkFormat rgb_format); + VkFormat get_compatible_snorm_format(VkFormat rgb_format); u8 get_format_texel_width(VkFormat format); std::pair get_format_element_size(VkFormat format); std::pair get_format_convert_flags(VkFormat format); From 07abde4e8d413a05e444f42f6853aee66c2fda9a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 20:05:33 +0300 Subject: [PATCH 287/630] vk: Allow cached view to have mutable format --- rpcs3/Emu/RSX/VK/vkutils/image.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.cpp b/rpcs3/Emu/RSX/VK/vkutils/image.cpp index ce431945ed..c6f71e73f0 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image.cpp @@ -482,7 +482,7 @@ namespace vk if (found != views.end()) { ensure(found->second->info.subresourceRange.aspectMask & mask); - return found->second.get(); + return found->second->as(format); } VkComponentMapping real_mapping; From 0f1735d0df96e662c3e36df5d785e890c9caade1 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 20:26:26 +0300 Subject: [PATCH 288/630] gl: Add support for subviews --- rpcs3/Emu/RSX/GL/glutils/image.cpp | 28 ++++++++++++++++++++++++++++ rpcs3/Emu/RSX/GL/glutils/image.h | 7 ++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index bb6439cc05..7dbd7fc254 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -318,6 +318,34 @@ namespace gl } } + texture_view* texture_view::as(GLenum format) + { + if (format == this->m_view_format) + { + return this; + } + + auto self = m_root_view ? m_root_view : this; + if (auto found = self->m_subviews.find(format); + found != self->m_subviews.end()) + { + return found->second.get(); + } + + GLenum swizzle_argb[4] = + { + component_swizzle[3], + component_swizzle[0], + component_swizzle[1], + component_swizzle[2], + }; + + auto view = std::make_unique(m_image_data, m_target, format, swizzle_argb, m_aspect_flags); + auto ret = view.get(); + self->m_subviews.emplace(format, std::move(view)); + return ret; + } + void texture_view::bind(gl::command_context& cmd, GLuint layer) const { cmd->bind_texture(layer, m_target, m_id); diff --git a/rpcs3/Emu/RSX/GL/glutils/image.h b/rpcs3/Emu/RSX/GL/glutils/image.h index 6617caa54c..4112d833c7 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.h +++ b/rpcs3/Emu/RSX/GL/glutils/image.h @@ -353,7 +353,10 @@ namespace gl GLenum m_aspect_flags = 0; texture* m_image_data = nullptr; - GLenum component_swizzle[4] {}; + GLenum component_swizzle[4]{}; + + std::unordered_map> m_subviews; + texture_view* m_root_view = nullptr; texture_view() = default; @@ -395,6 +398,8 @@ namespace gl virtual ~texture_view(); + texture_view* as(GLenum format); + GLuint id() const { return m_id; From e29cd4cc9311ec8c7f4eafe962f4ebef75ed7eba Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 20:57:16 +0300 Subject: [PATCH 289/630] gl: Implement SNORM and SRGB format overrides --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 47 +++++++++++++++++++++++++++++----- rpcs3/Emu/RSX/GL/GLTexture.cpp | 38 +++++++++++++++++++++++++++ rpcs3/Emu/RSX/GL/GLTexture.h | 2 ++ 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index b167ab24c2..c564adfa20 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -334,17 +334,52 @@ void GLGSRender::load_texture_env() continue; } + if (!is_sampler_dirty) + { + if (sampler_state->format_class != previous_format_class) + { + // Host details changed but RSX is not aware + m_graphics_state |= rsx::fragment_program_state_dirty; + } + + if (m_fs_sampler_states[i]) + { + // Nothing to change, use cached sampler + continue; + } + } + sampler_state->format_ex = tex.format_ex(); - if (is_sampler_dirty) + if (sampler_state->format_ex.texel_remap_control && + sampler_state->image_handle && + sampler_state->upload_context == rsx::texture_upload_context::shader_read) [[ unlikely ]] { - m_fs_sampler_states[i].apply(tex, fs_sampler_state[i].get()); - } - else if (sampler_state->format_class != previous_format_class) - { - m_graphics_state |= rsx::fragment_program_state_dirty; + // Check if we need to override the view format + const auto gl_format = sampler_state->image_handle->view_format(); + GLenum format_override = gl_format; + rsx::flags32_t flags_to_erase = 0u; + + if (sampler_state->format_ex.hw_SNORM_possible()) + { + format_override = gl::get_compatible_snorm_format(gl_format); + flags_to_erase = rsx::texture_control_bits::SEXT_MASK; + } + else if (sampler_state->format_ex.hw_SRGB_possible()) + { + format_override = gl::get_compatible_srgb_format(gl_format); + flags_to_erase = rsx::texture_control_bits::GAMMA_CTRL_MASK; + } + + if (format_override != GL_NONE && format_override != gl_format) + { + sampler_state->image_handle = sampler_state->image_handle->as(format_override); + sampler_state->format_ex.texel_remap_control &= (~flags_to_erase); + } } + m_fs_sampler_states[i].apply(tex, fs_sampler_state[i].get()); + const auto texture_format = sampler_state->format_ex.format(); // Depth format redirected to BGRA8 resample stage. Do not filter to avoid bits leaking. // If accurate graphics are desired, force a bitcast to COLOR as a workaround. diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 9a439177f4..181e5058c8 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -266,6 +266,44 @@ namespace gl fmt::throw_exception("Unknown format 0x%x", texture_format); } + GLenum get_compatible_snorm_format(GLenum base_format) + { + switch (base_format) + { + case GL_R8: + return GL_R8_SNORM; + case GL_RG8: + return GL_RG8_SNORM; + case GL_RGBA8: + return GL_RGBA8_SNORM; + case GL_R16: + return GL_R16_SNORM; + case GL_RG16: + return GL_RG16_SNORM; + case GL_RGBA16: + return GL_RGBA16_SNORM; + default: + return GL_NONE; + } + } + + GLenum get_compatible_srgb_format(GLenum base_format) + { + switch (base_format) + { + case GL_RGBA8: + return GL_SRGB8_ALPHA8_EXT; + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; + default: + return GL_NONE; + } + } + cs_shuffle_base* get_trivial_transform_job(const pixel_buffer_layout& pack_info) { if (!pack_info.swap_bytes) diff --git a/rpcs3/Emu/RSX/GL/GLTexture.h b/rpcs3/Emu/RSX/GL/GLTexture.h index dc6d90098a..10c26dc536 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.h +++ b/rpcs3/Emu/RSX/GL/GLTexture.h @@ -62,6 +62,8 @@ namespace gl std::tuple get_format_type(u32 texture_format); pixel_buffer_layout get_format_type(texture::internal_format format); std::array get_swizzle_remap(u32 texture_format); + GLenum get_compatible_snorm_format(GLenum base_format); + GLenum get_compatible_srgb_format(GLenum base_format); viewable_image* create_texture(u32 gcm_format, u16 width, u16 height, u16 depth, u16 mipmaps, rsx::texture_dimension_extended type); From 794abe20252eb111aea34a79042777e1dfa5b13a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 21:14:15 +0300 Subject: [PATCH 290/630] vk: Clean up image_view interfaces --- rpcs3/Emu/RSX/VK/VKRenderTargets.cpp | 6 +++--- rpcs3/Emu/RSX/VK/VKRenderTargets.h | 2 +- rpcs3/Emu/RSX/VK/vkutils/image.cpp | 6 +++--- rpcs3/Emu/RSX/VK/vkutils/image.h | 8 -------- 4 files changed, 7 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp b/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp index 0bd7852c2d..9d66baa9d2 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp @@ -911,15 +911,15 @@ namespace vk m_cyclic_ref_tracker.reset(); } - image_view* render_target::get_view(VkFormat format, const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask) + image_view* render_target::get_view(const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask) { if (remap.encoded == VK_REMAP_VIEW_MULTISAMPLED) { // Special remap flag, intercept here - return vk::viewable_image::get_view(format, remap.with_encoding(VK_REMAP_IDENTITY), mask); + return vk::viewable_image::get_view(remap.with_encoding(VK_REMAP_IDENTITY), mask); } - return vk::viewable_image::get_view(format, remap, mask); + return vk::viewable_image::get_view(remap, mask); } void render_target::memory_barrier(vk::command_buffer& cmd, rsx::surface_access access) diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index 287c9c2c52..3c3ef0acbd 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -110,7 +110,7 @@ namespace vk bool matches_dimensions(u16 _width, u16 _height) const; void reset_surface_counters(); - image_view* get_view(VkFormat format, const rsx::texture_channel_remap_t& remap, + image_view* get_view(const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT) override; // Memory management diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.cpp b/rpcs3/Emu/RSX/VK/vkutils/image.cpp index c6f71e73f0..c6238ac6e8 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image.cpp @@ -463,7 +463,7 @@ namespace vk return result; } - image_view* viewable_image::get_view(VkFormat format, const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask) + image_view* viewable_image::get_view(const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask) { u32 remap_encoding = remap.encoded; if (remap_encoding == VK_REMAP_IDENTITY) @@ -482,7 +482,7 @@ namespace vk if (found != views.end()) { ensure(found->second->info.subresourceRange.aspectMask & mask); - return found->second->as(format); + return found->second.get(); } VkComponentMapping real_mapping; @@ -506,7 +506,7 @@ namespace vk const VkImageSubresourceRange range = { aspect() & mask, 0, info.mipLevels, 0, info.arrayLayers }; ensure(range.aspectMask); - auto view = std::make_unique(*g_render_device, this, format, VK_IMAGE_VIEW_TYPE_MAX_ENUM, real_mapping, range); + auto view = std::make_unique(*g_render_device, this, format(), VK_IMAGE_VIEW_TYPE_MAX_ENUM, real_mapping, range); auto result = view.get(); views.emplace(storage_key, std::move(view)); return result; diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.h b/rpcs3/Emu/RSX/VK/vkutils/image.h index e494f9e40d..abf708559d 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.h +++ b/rpcs3/Emu/RSX/VK/vkutils/image.h @@ -150,17 +150,9 @@ namespace vk using image::image; virtual image_view* get_view( - VkFormat format, const rsx::texture_channel_remap_t& remap, VkImageAspectFlags mask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT); - image_view* get_view( - const rsx::texture_channel_remap_t& remap, - VkImageAspectFlags mask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT) - { - return get_view(info.format, remap, mask); - } - void set_native_component_layout(VkComponentMapping new_layout); }; } From f27315c821cbdf5762ca355bd4c8db76cbe1a2dd Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 21:36:54 +0300 Subject: [PATCH 291/630] vk: Support explicit mutable format list - Actually important for performance reasons --- rpcs3/Emu/RSX/VK/vkutils/ex.h | 16 ++++++++++++++++ rpcs3/Emu/RSX/VK/vkutils/image.cpp | 14 ++++++++++++-- rpcs3/Emu/RSX/VK/vkutils/image.h | 5 +++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/vkutils/ex.h b/rpcs3/Emu/RSX/VK/vkutils/ex.h index 361ae1d32d..1a80ffbbf5 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/ex.h +++ b/rpcs3/Emu/RSX/VK/vkutils/ex.h @@ -39,6 +39,22 @@ namespace vk VkDescriptorBufferInfoEx() = default; VkDescriptorBufferInfoEx(const vk::buffer& buffer, u64 offset, u64 range); }; + + struct VkFormatEx + { + VkFormat baseFormat = VK_FORMAT_UNDEFINED; + VkFormat* pViewFormats = nullptr; + u32 viewFormatCount = 0u; + + VkFormatEx() = default; + + VkFormatEx(VkFormat format) + : baseFormat(format) + {} + + operator VkFormat() const { return baseFormat; } + bool is_mutable() const { return viewFormatCount != 0; } + }; } // Re-export diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.cpp b/rpcs3/Emu/RSX/VK/vkutils/image.cpp index c6238ac6e8..b58a95c29b 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image.cpp @@ -47,7 +47,7 @@ namespace vk const memory_type_info& memory_type, u32 access_flags, VkImageType image_type, - VkFormat format, + const VkFormatEx& format, u32 width, u32 height, u32 depth, u32 mipmaps, u32 layers, VkSampleCountFlagBits samples, @@ -59,7 +59,6 @@ namespace vk rsx::format_class format_class) : m_device(dev) { - info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; info.imageType = image_type; info.format = format; info.extent = { width, height, depth }; @@ -84,6 +83,16 @@ namespace vk info.pQueueFamilyIndices = concurrency_queue_families.data(); } + VkImageFormatListCreateInfo format_list = { .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO }; + if (format.is_mutable()) + { + info.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; + + format_list.pViewFormats = format.pViewFormats; + format_list.viewFormatCount = format.viewFormatCount; + info.pNext = &format_list; + } + create_impl(dev, access_flags, memory_type, allocation_pool); m_storage_aspect = get_aspect_flags(format); @@ -100,6 +109,7 @@ namespace vk } m_format_class = format_class; + info.pNext = nullptr; } // TODO: Ctor that uses a provided memory heap diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.h b/rpcs3/Emu/RSX/VK/vkutils/image.h index abf708559d..a301db6a6d 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.h +++ b/rpcs3/Emu/RSX/VK/vkutils/image.h @@ -5,6 +5,7 @@ #include "commands.h" #include "device.h" +#include "ex.h" #include "memory.h" #include "unique_resource.h" @@ -46,14 +47,14 @@ namespace vk VkComponentMapping native_component_map = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }; VkImageLayout current_layout = VK_IMAGE_LAYOUT_UNDEFINED; u32 current_queue_family = VK_QUEUE_FAMILY_IGNORED; - VkImageCreateInfo info = {}; + VkImageCreateInfo info = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO }; std::shared_ptr memory; image(const vk::render_device& dev, const memory_type_info& memory_type, u32 access_flags, VkImageType image_type, - VkFormat format, + const VkFormatEx& format, u32 width, u32 height, u32 depth, u32 mipmaps, u32 layers, VkSampleCountFlagBits samples, From 34380b1ee7446b7b270f240d59ddfd6614e3294d Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 22:01:31 +0300 Subject: [PATCH 292/630] vk: Make use of mutable formats for dynamic views --- rpcs3/Emu/RSX/VK/VKFormats.cpp | 33 ------------------------- rpcs3/Emu/RSX/VK/VKTextureCache.cpp | 37 ++++++++++++++++++++++++++++- rpcs3/Emu/RSX/VK/VKTextureCache.h | 3 ++- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKFormats.cpp b/rpcs3/Emu/RSX/VK/VKFormats.cpp index ed824de77d..0110460a51 100644 --- a/rpcs3/Emu/RSX/VK/VKFormats.cpp +++ b/rpcs3/Emu/RSX/VK/VKFormats.cpp @@ -253,15 +253,6 @@ namespace vk return VK_FORMAT_R8G8B8A8_SRGB; case VK_FORMAT_B8G8R8A8_UNORM: return VK_FORMAT_B8G8R8A8_SRGB; - // 16-bit - case VK_FORMAT_R16_UNORM: - case VK_FORMAT_R16G16_UNORM: - return VK_FORMAT_UNDEFINED; // No match - case VK_FORMAT_A1R5G5B5_UNORM_PACK16: - case VK_FORMAT_R4G4B4A4_UNORM_PACK16: - case VK_FORMAT_R5G6B5_UNORM_PACK16: - case VK_FORMAT_R5G5B5A1_UNORM_PACK16: - return VK_FORMAT_UNDEFINED; // No match // DXT case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: return VK_FORMAT_BC1_RGBA_SRGB_BLOCK; @@ -269,14 +260,7 @@ namespace vk return VK_FORMAT_BC2_SRGB_BLOCK; case VK_FORMAT_BC3_UNORM_BLOCK: return VK_FORMAT_BC3_SRGB_BLOCK; - // Depth - case VK_FORMAT_D16_UNORM: - case VK_FORMAT_D32_SFLOAT: - case VK_FORMAT_D32_SFLOAT_S8_UINT: - case VK_FORMAT_D24_UNORM_S8_UINT: - return VK_FORMAT_UNDEFINED; // Unsupported default: - rsx_log.error("[SRGB_FMT] Unexpected VkFormat 0x%x", static_cast(rgb_format)); return VK_FORMAT_UNDEFINED; } } @@ -299,24 +283,7 @@ namespace vk return VK_FORMAT_R16_SNORM; case VK_FORMAT_R16G16_UNORM: return VK_FORMAT_R16G16_SNORM; - case VK_FORMAT_A1R5G5B5_UNORM_PACK16: - case VK_FORMAT_R4G4B4A4_UNORM_PACK16: - case VK_FORMAT_R5G6B5_UNORM_PACK16: - case VK_FORMAT_R5G5B5A1_UNORM_PACK16: - return VK_FORMAT_UNDEFINED; // No match - // DXT - case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: - case VK_FORMAT_BC2_UNORM_BLOCK: - case VK_FORMAT_BC3_UNORM_BLOCK: - return VK_FORMAT_UNDEFINED; // No match - // Depth - case VK_FORMAT_D16_UNORM: - case VK_FORMAT_D32_SFLOAT: - case VK_FORMAT_D32_SFLOAT_S8_UINT: - case VK_FORMAT_D24_UNORM_S8_UINT: - return VK_FORMAT_UNDEFINED; // Unsupported default: - rsx_log.error("[SEXT_FMT] Unexpected VkFormat 0x%x", static_cast(rgb_format)); return VK_FORMAT_UNDEFINED; } } diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index d1b0e536ef..2427cd8da3 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -1025,6 +1025,29 @@ namespace vk const VkFormat vk_format = get_compatible_sampler_format(m_formats_support, gcm_format); VkImageCreateFlags create_flags = is_cubemap ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0; VkSharingMode sharing_mode = (flags & texture_create_flags::shareable) ? VK_SHARING_MODE_CONCURRENT : VK_SHARING_MODE_EXCLUSIVE; + rsx::simple_array mutable_format_list; + + if (flags & texture_create_flags::mutable_format) + { + const VkFormat snorm_fmt = get_compatible_snorm_format(vk_format); + const VkFormat srgb_fmt = get_compatible_srgb_format(vk_format); + + if (snorm_fmt != VK_FORMAT_UNDEFINED) + { + mutable_format_list.push_back(snorm_fmt); + } + + if (srgb_fmt != VK_FORMAT_UNDEFINED) + { + mutable_format_list.push_back(srgb_fmt); + } + + if (!mutable_format_list.empty()) + { + create_flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; + mutable_format_list.push_back(vk_format); + } + } if (auto found = find_cached_image(vk_format, width, height, depth, mipmaps, image_type, create_flags, usage_flags, sharing_mode)) { @@ -1037,9 +1060,16 @@ namespace vk create_flags |= VK_IMAGE_CREATE_SHAREABLE_RPCS3; } + VkFormatEx create_format = vk_format; + if (!mutable_format_list.empty()) + { + create_format.pViewFormats = mutable_format_list.data(); + create_format.viewFormatCount = mutable_format_list.size(); + } + image = new vk::viewable_image(*m_device, m_memory_types.device_local, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - image_type, vk_format, + image_type, create_format, width, height, depth, mipmaps, layer, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_TILING_OPTIMAL, usage_flags, create_flags, VMM_ALLOCATION_POOL_TEXTURE_CACHE, rsx::classify_format(gcm_format)); @@ -1123,6 +1153,11 @@ namespace vk const bool upload_async = rsx::get_current_renderer()->get_backend_config().supports_asynchronous_compute; rsx::flags32_t create_flags = 0; + if (context == rsx::texture_upload_context::shader_read) + { + create_flags |= texture_create_flags::mutable_format; + } + if (upload_async && ensure(g_fxo->try_get())->is_host_mode()) { create_flags |= texture_create_flags::do_not_reuse; diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.h b/rpcs3/Emu/RSX/VK/VKTextureCache.h index 786eb51270..85687c8c69 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.h +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.h @@ -418,7 +418,8 @@ namespace vk { initialize_image_contents = 1, do_not_reuse = 2, - shareable = 4 + shareable = 4, + mutable_format = 8 }; void on_section_destroyed(cached_texture_section& tex) override; From bf5056145e68d0c7789fc152365f34fef121439e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 22:30:46 +0300 Subject: [PATCH 293/630] rsx: Track BX2 reads per-TIU to allow enabling/disabling hw remapping --- rpcs3/Emu/RSX/Program/ProgramStateCache.cpp | 2 +- rpcs3/Emu/RSX/Program/ProgramStateCache.h | 2 +- rpcs3/Emu/RSX/RSXThread.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp index 15546afd7e..4420e51555 100644 --- a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp +++ b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp @@ -651,7 +651,7 @@ fragment_program_utils::fragment_program_metadata fragment_program_utils::analys case RSX_FP_OPCODE_TXB: case RSX_FP_OPCODE_TXL: result.referenced_textures_mask |= (1 << d0.tex_num); - result.has_tex_bx2_conv |= !!d0.exp_tex; + result.bx2_texture_reads_mask |= ((d0.exp_tex ? 1u : 0u) << d0.tex_num); break; case RSX_FP_OPCODE_PK4: case RSX_FP_OPCODE_UP4: diff --git a/rpcs3/Emu/RSX/Program/ProgramStateCache.h b/rpcs3/Emu/RSX/Program/ProgramStateCache.h index ce5be4a425..76e168d20a 100644 --- a/rpcs3/Emu/RSX/Program/ProgramStateCache.h +++ b/rpcs3/Emu/RSX/Program/ProgramStateCache.h @@ -56,10 +56,10 @@ namespace program_hash_util u32 program_ucode_length; u32 program_constants_buffer_length; u16 referenced_textures_mask; + u16 bx2_texture_reads_mask; bool has_pack_instructions; bool has_branch_instructions; - bool has_tex_bx2_conv; bool is_nop_shader; // Does this affect Z-pass testing??? }; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 5bfc60ee2a..65958e189f 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2326,7 +2326,7 @@ namespace rsx texture_control |= format_ex.texel_remap_control; texture_control |= format_ex.features << texture_control_bits::FORMAT_FEATURES_OFFSET; - if (current_fp_metadata.has_tex_bx2_conv) + if (current_fp_metadata.bx2_texture_reads_mask) { const u32 remap_hi = tex.decoded_remap().shuffle_mask_bits(0xFu); current_fragment_program.texture_params[i].remap &= ~(0xFu << 16u); From 0fb8091a31d500df8e3cb6ff6e09a2efc85d49be Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 22:31:18 +0300 Subject: [PATCH 294/630] rsx: Disable HW remapper if BX2 is active or the user requests not to use it --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 4 +++- rpcs3/Emu/RSX/VK/VKDraw.cpp | 4 +++- rpcs3/Emu/RSX/VK/VKTextureCache.cpp | 3 ++- rpcs3/Emu/system_config.h | 1 + 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index c564adfa20..e7d1338868 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -353,7 +353,9 @@ void GLGSRender::load_texture_env() if (sampler_state->format_ex.texel_remap_control && sampler_state->image_handle && - sampler_state->upload_context == rsx::texture_upload_context::shader_read) [[ unlikely ]] + sampler_state->upload_context == rsx::texture_upload_context::shader_read && + (current_fp_metadata.bx2_texture_reads_mask & (1u << i)) == 0 && + g_cfg.video.use_hardware_texel_remapping) [[ unlikely ]] { // Check if we need to override the view format const auto gl_format = sampler_state->image_handle->view_format(); diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 6bec02ab7c..8f14d7e8c7 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -345,7 +345,9 @@ void VKGSRender::load_texture_env() if (sampler_state->format_ex.texel_remap_control && sampler_state->image_handle && - sampler_state->upload_context == rsx::texture_upload_context::shader_read) [[ unlikely ]] + sampler_state->upload_context == rsx::texture_upload_context::shader_read && + (current_fp_metadata.bx2_texture_reads_mask & (1u << i)) == 0 && + g_cfg.video.use_hardware_texel_remapping) [[ unlikely ]] { // Check if we need to override the view format const auto vk_format = sampler_state->image_handle->format(); diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index 2427cd8da3..0c3df5cd9c 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -1153,7 +1153,8 @@ namespace vk const bool upload_async = rsx::get_current_renderer()->get_backend_config().supports_asynchronous_compute; rsx::flags32_t create_flags = 0; - if (context == rsx::texture_upload_context::shader_read) + if (context == rsx::texture_upload_context::shader_read && + g_cfg.video.use_hardware_texel_remapping) { create_flags |= texture_create_flags::mutable_format; } diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index aaa889ce1f..c9e763b5af 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -176,6 +176,7 @@ struct cfg_root : cfg::node cfg::_bool disable_async_host_memory_manager{ this, "Disable Asynchronous Memory Manager", false, true }; cfg::_enum output_scaling{ this, "Output Scaling Mode", output_scaling_mode::bilinear, true }; cfg::_bool record_with_overlays{ this, "Record With Overlays", true, true }; + cfg::_bool use_hardware_texel_remapping{ this, "Use Hardware Texel Remapping", true, false }; struct node_vk : cfg::node { From cee868560a8a8cb50da8c851c8e64be9e6078014 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 22:56:42 +0300 Subject: [PATCH 295/630] rsx: Add configuration toggle to debug tab --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 2 +- rpcs3/Emu/RSX/VK/VKDraw.cpp | 2 +- rpcs3/Emu/RSX/VK/VKTextureCache.cpp | 2 +- rpcs3/Emu/system_config.h | 2 +- rpcs3/rpcs3qt/emu_settings_type.h | 2 ++ rpcs3/rpcs3qt/settings_dialog.cpp | 3 +++ rpcs3/rpcs3qt/settings_dialog.ui | 7 +++++++ rpcs3/rpcs3qt/tooltips.h | 1 + 8 files changed, 17 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index e7d1338868..bdf5a53d01 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -355,7 +355,7 @@ void GLGSRender::load_texture_env() sampler_state->image_handle && sampler_state->upload_context == rsx::texture_upload_context::shader_read && (current_fp_metadata.bx2_texture_reads_mask & (1u << i)) == 0 && - g_cfg.video.use_hardware_texel_remapping) [[ unlikely ]] + !g_cfg.video.disable_hardware_texel_remapping) [[ unlikely ]] { // Check if we need to override the view format const auto gl_format = sampler_state->image_handle->view_format(); diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 8f14d7e8c7..344bde8b64 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -347,7 +347,7 @@ void VKGSRender::load_texture_env() sampler_state->image_handle && sampler_state->upload_context == rsx::texture_upload_context::shader_read && (current_fp_metadata.bx2_texture_reads_mask & (1u << i)) == 0 && - g_cfg.video.use_hardware_texel_remapping) [[ unlikely ]] + !g_cfg.video.disable_hardware_texel_remapping) [[ unlikely ]] { // Check if we need to override the view format const auto vk_format = sampler_state->image_handle->format(); diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index 0c3df5cd9c..c9d9599b9e 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -1154,7 +1154,7 @@ namespace vk rsx::flags32_t create_flags = 0; if (context == rsx::texture_upload_context::shader_read && - g_cfg.video.use_hardware_texel_remapping) + !g_cfg.video.disable_hardware_texel_remapping) { create_flags |= texture_create_flags::mutable_format; } diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index c9e763b5af..8ccf91db0e 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -176,7 +176,7 @@ struct cfg_root : cfg::node cfg::_bool disable_async_host_memory_manager{ this, "Disable Asynchronous Memory Manager", false, true }; cfg::_enum output_scaling{ this, "Output Scaling Mode", output_scaling_mode::bilinear, true }; cfg::_bool record_with_overlays{ this, "Record With Overlays", true, true }; - cfg::_bool use_hardware_texel_remapping{ this, "Use Hardware Texel Remapping", true, false }; + cfg::_bool disable_hardware_texel_remapping{ this, "Disable Hardware ColorSpace Remapping", false, true }; struct node_vk : cfg::node { diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index cc8ab57b96..6a5b6841b1 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -108,6 +108,7 @@ enum class emu_settings_type DisableAsyncHostMM, UseReBAR, RecordWithOverlays, + DisableHWTexelRemapping, // Performance Overlay PerfOverlayEnabled, @@ -312,6 +313,7 @@ inline static const std::map settings_location { emu_settings_type::ForceHwMSAAResolve, { "Video", "Force Hardware MSAA Resolve"}}, { emu_settings_type::DisableAsyncHostMM, { "Video", "Disable Asynchronous Memory Manager"}}, { emu_settings_type::RecordWithOverlays, { "Video", "Record With Overlays"}}, + { emu_settings_type::DisableHWTexelRemapping, { "Video", "Disable Hardware ColorSpace Remapping"}}, // Vulkan { emu_settings_type::VulkanAsyncTextureUploads, { "Video", "Vulkan", "Asynchronous Texture Streaming 2"}}, diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 81e85546e9..0c0fb63efd 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -1555,6 +1555,9 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std m_emu_settings->EnhanceCheckBox(ui->enableSpuEventsBusyLoop, emu_settings_type::EnabledSPUEventsBusyLoop); SubscribeTooltip(ui->enableSpuEventsBusyLoop, tooltips.settings.enable_spu_events_busy_loop); + m_emu_settings->EnhanceCheckBox(ui->disableHardwareTexelRemapping, emu_settings_type::DisableHWTexelRemapping); + SubscribeTooltip(ui->disableHardwareTexelRemapping, tooltips.settings.disable_hw_texel_remapping); + // Comboboxes m_emu_settings->EnhanceComboBox(ui->maxSPURSThreads, emu_settings_type::MaxSPURSThreads, true); diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 6a27f45be3..e394407e11 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -4316,6 +4316,13 @@ + + + + Disable Hardware ColorSpace Remapping + + + diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index abdc60f3dd..e9c8ad436b 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -127,6 +127,7 @@ public: const QString accurate_ppu_128_loop = tr("When enabled, PPU atomic operations will operate on entire cache line data, as opposed to a single 64bit block of memory when disabled.\nNumerical values control whether or not to enable the accurate version based on the atomic operation's length."); const QString enable_performance_report = tr("Measure certain events and print a chart after the emulator is stopped. Don't enable if not asked to."); const QString num_ppu_threads = tr("Affects maximum amount of PPU threads running concurrently, the value of 1 has very low compatibility with games.\n2 is the default, if unsure do not modify this setting."); + const QString disable_hw_texel_remapping = tr("Disables use of hardware-native color-space remapping formats such as _sRGB and _SNORM suffixes.\nDisabling this option increases accuracy compared to PS3 but can also introduce some noise due to how the software emulation works."); // emulator From 585305f434e48afab4c2ac3fbf7314fa537ec7fb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 22 Feb 2026 23:27:06 +0300 Subject: [PATCH 296/630] rsx: Improve hardware texel remapping support - Fixes issues observed when the remap is requested on a hardcoded channel - In that scenario, fall back to software --- rpcs3/Emu/RSX/Common/TextureUtils.cpp | 36 +++++++++++++++++++++++++++ rpcs3/Emu/RSX/Common/TextureUtils.h | 10 ++++++-- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.cpp b/rpcs3/Emu/RSX/Common/TextureUtils.cpp index 7fe0431baf..4c92f18aaa 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.cpp +++ b/rpcs3/Emu/RSX/Common/TextureUtils.cpp @@ -847,6 +847,16 @@ namespace rsx } } + bool texture_format_ex::hw_SNORM_possible() const + { + return (texel_remap_control & SEXT_MASK) == (get_host_format_snorm_mask(format()) << SEXT_OFFSET); + } + + bool texture_format_ex::hw_SRGB_possible() const + { + return (texel_remap_control & GAMMA_CTRL_MASK) == GAMMA_RGB_MASK; + } + std::vector get_subresources_layout(const rsx::fragment_texture& texture) { return get_subresources_layout_impl(texture); @@ -1255,6 +1265,32 @@ namespace rsx fmt::throw_exception("Unknown format 0x%x", texture_format); } + /** + * Returns a channel mask in ARGB that can be SNORM-converted + * Some formats have a hardcoded constant in one lane which we cannot SNORM-interpret in hardware. + */ + u32 get_host_format_snorm_mask(u32 format) + { + switch (format) + { + case CELL_GCM_TEXTURE_B8: + case CELL_GCM_TEXTURE_R5G6B5: + case CELL_GCM_TEXTURE_R6G5B5: + case CELL_GCM_TEXTURE_D1R5G5B5: + case CELL_GCM_TEXTURE_D8R8G8B8: + case CELL_GCM_TEXTURE_COMPRESSED_B8R8_G8R8: + case CELL_GCM_TEXTURE_COMPRESSED_R8B8_R8G8: + // Hardcoded alpha formats + return 0b1110; + + case CELL_GCM_TEXTURE_X16: + // This one is a mess. X and Z are hardcoded. Not supported. + // Fall through instead of throw + default: + return 0b1111; + } + } + /** * A texture is stored as an array of blocks, where a block is a pixel for standard texture * but is a structure containing several pixels for compressed format diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.h b/rpcs3/Emu/RSX/Common/TextureUtils.h index 551052f0ad..f8d899a6ca 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.h +++ b/rpcs3/Emu/RSX/Common/TextureUtils.h @@ -147,8 +147,8 @@ namespace rsx bool valid() const { return format_bits != 0; } u32 format() const { return format_bits & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN); } - bool hw_SNORM_possible() const { return (texel_remap_control & SEXT_MASK) == SEXT_MASK; } - bool hw_SRGB_possible() const { return (texel_remap_control & GAMMA_CTRL_MASK) == GAMMA_RGB_MASK; } + bool hw_SNORM_possible() const; + bool hw_SRGB_possible() const; //private: u32 format_bits = 0; @@ -296,6 +296,12 @@ namespace rsx */ rsx::flags32_t get_format_features(u32 texture_format); + /** + * Returns a channel mask in ARGB that can be SNORM-converted + * Some formats have a hardcoded constant in one lane which we cannot SNORM-interpret in hardware. + */ + u32 get_host_format_snorm_mask(u32 format); + /** * Returns number of texel rows encoded in one pitch-length line of bytes */ From 759ef0f5b0b1c8e4cfe01a5f4d7ee5b8b7818203 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 23 Feb 2026 00:23:23 +0300 Subject: [PATCH 297/630] rsx: Add border color correction for hardware SNORM formats --- Utilities/geometry.h | 8 ++++++ rpcs3/Emu/RSX/GL/glutils/sampler.cpp | 25 +++++++++++++++++-- rpcs3/Emu/RSX/RSXTexture.cpp | 18 ++++++++------ rpcs3/Emu/RSX/RSXTexture.h | 8 +++--- rpcs3/Emu/RSX/VK/VKDraw.cpp | 37 ++++++++++++++++++++++------ 5 files changed, 75 insertions(+), 21 deletions(-) diff --git a/Utilities/geometry.h b/Utilities/geometry.h index faace6c77e..3ffbc04dd3 100644 --- a/Utilities/geometry.h +++ b/Utilities/geometry.h @@ -821,6 +821,14 @@ struct color4_base a *= rhs; } + void operator += (const color4_base& rhs) + { + r += rhs.r; + g += rhs.g; + b += rhs.b; + a += rhs.a; + } + constexpr color4_base operator * (const color4_base& rhs) const { return { r * rhs.r, g * rhs.g, b * rhs.b, a * rhs.a }; diff --git a/rpcs3/Emu/RSX/GL/glutils/sampler.cpp b/rpcs3/Emu/RSX/GL/glutils/sampler.cpp index 580caf0dc2..0d37dc3524 100644 --- a/rpcs3/Emu/RSX/GL/glutils/sampler.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/sampler.cpp @@ -82,11 +82,32 @@ namespace gl { // NOTE: In OpenGL, the border texels are processed by the pipeline and will be swizzled by the texture view. // Therefore, we pass the raw value here, and the texture view will handle the rest for us. - const auto encoded_color = tex.border_color(); + const bool sext_conv_required = (sampled_image->format_ex.texel_remap_control & rsx::SEXT_MASK) != 0; + const auto encoded_color = tex.border_color(sext_conv_required); if (get_parameteri(GL_TEXTURE_BORDER_COLOR) != encoded_color) { m_propertiesi[GL_TEXTURE_BORDER_COLOR] = encoded_color; - const auto border_color = rsx::decode_border_color(encoded_color); + auto border_color = rsx::decode_border_color(encoded_color); + + if (const auto snorm_mask = tex.argb_signed(); + !sext_conv_required && tex.argb_signed()) [[ unlikely ]] + { + // Hardware SNORM is active + ensure(sampled_image->format_ex.hw_SNORM_possible()); + + // Convert the border color in host space (2N - 1) + // HW does the conversion in integer space as (x - 128) / 127 which introduces a biasing error. + const float bias_v = 128.f / 255.f; + const float scale_v = 255.f / 127.f; + + color4f scale{ 1.f }, bias{ 0.f }; + if (snorm_mask & 1) { scale.a = scale_v; bias.a = -bias_v; } + if (snorm_mask & 2) { scale.r = scale_v; bias.r = -bias_v; } + if (snorm_mask & 4) { scale.g = scale_v; bias.g = -bias_v; } + if (snorm_mask & 8) { scale.b = scale_v; bias.b = -bias_v; } + border_color = (border_color + bias) * scale; + } + glSamplerParameterfv(sampler_handle, GL_TEXTURE_BORDER_COLOR, border_color.rgba); } } diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index 6f8eec0e3b..071a1c8a78 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -364,11 +364,15 @@ namespace rsx return dimension() != rsx::texture_dimension::dimension1d ? ((registers[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index * 8)]) & 0xffff) : 1; } - u32 fragment_texture::border_color() const + u32 fragment_texture::border_color(bool apply_colorspace_remapping) const { const u32 raw = registers[NV4097_SET_TEXTURE_BORDER_COLOR + (m_index * 8)]; - const u32 sext = argb_signed(); + if (!apply_colorspace_remapping) [[ likely ]] + { + return raw; + } + const u32 sext = argb_signed(); if (!sext) [[ likely ]] { return raw; @@ -430,9 +434,9 @@ namespace rsx return (conv & mask) | (raw & ~mask); } - color4f fragment_texture::remapped_border_color() const + color4f fragment_texture::remapped_border_color(bool apply_colorspace_remapping) const { - color4f base_color = rsx::decode_border_color(border_color()); + color4f base_color = rsx::decode_border_color(border_color(apply_colorspace_remapping)); if (remap() == RSX_TEXTURE_REMAP_IDENTITY) { return base_color; @@ -571,14 +575,14 @@ namespace rsx return dimension() != rsx::texture_dimension::dimension1d ? ((registers[NV4097_SET_VERTEX_TEXTURE_IMAGE_RECT + (m_index * 8)]) & 0xffff) : 1; } - u32 vertex_texture::border_color() const + u32 vertex_texture::border_color(bool) const { return registers[NV4097_SET_VERTEX_TEXTURE_BORDER_COLOR + (m_index * 8)]; } - color4f vertex_texture::remapped_border_color() const + color4f vertex_texture::remapped_border_color(bool) const { - return rsx::decode_border_color(border_color()); + return rsx::decode_border_color(border_color(false)); } u16 vertex_texture::depth() const diff --git a/rpcs3/Emu/RSX/RSXTexture.h b/rpcs3/Emu/RSX/RSXTexture.h index 3b0ccdebce..3acb532c0f 100644 --- a/rpcs3/Emu/RSX/RSXTexture.h +++ b/rpcs3/Emu/RSX/RSXTexture.h @@ -80,8 +80,8 @@ namespace rsx u16 height() const; // Border Color - u32 border_color() const; - color4f remapped_border_color() const; + u32 border_color(bool apply_colorspace_remapping = false) const; + color4f remapped_border_color(bool apply_colorspace_remapping = false) const; u16 depth() const; u32 pitch() const; @@ -136,8 +136,8 @@ namespace rsx u16 height() const; // Border Color - u32 border_color() const; - color4f remapped_border_color() const; + u32 border_color(bool = false) const; + color4f remapped_border_color(bool = false) const; u16 depth() const; u32 pitch() const; diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 344bde8b64..e13cc9aa94 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -274,11 +274,11 @@ void VKGSRender::load_texture_env() return false; }; - auto get_border_color = [&](const rsx::Texture auto& tex) + auto get_border_color = [&](const rsx::Texture auto& tex, bool remap_colorspace) { return m_device->get_custom_border_color_support().require_border_color_remap - ? tex.remapped_border_color() - : rsx::decode_border_color(tex.border_color()); + ? tex.remapped_border_color(remap_colorspace) + : rsx::decode_border_color(tex.border_color(remap_colorspace)); }; std::lock_guard lock(m_sampler_mutex); @@ -394,9 +394,30 @@ void VKGSRender::load_texture_env() // NOTE: In vulkan, the border color can bypass the sample swizzle stage. // Check the device properties to determine whether to pre-swizzle the colors or not. - const auto border_color = rsx::is_border_clamped_texture(tex) - ? vk::border_color_t(get_border_color(tex)) - : vk::border_color_t(VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK); + const bool sext_conv_required = (sampler_state->format_ex.texel_remap_control & rsx::texture_control_bits::SEXT_MASK) != 0; + vk::border_color_t border_color(VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK); + + if (rsx::is_border_clamped_texture(tex)) + { + auto color_value = get_border_color(tex, sext_conv_required); + if (const auto snorm_mask = tex.argb_signed(); + !sext_conv_required && snorm_mask) + { + // Convert the border color in host space (2N - 1) + // HW does the conversion in integer space as (x - 128) / 127 which introduces a biasing error. + const float bias_v = 128.f / 255.f; + const float scale_v = 255.f / 127.f; + + color4f scale{ 1.f }, bias{ 0.f }; + if (snorm_mask & 1) { scale.a = scale_v; bias.a = -bias_v; } + if (snorm_mask & 2) { scale.r = scale_v; bias.r = -bias_v; } + if (snorm_mask & 4) { scale.g = scale_v; bias.g = -bias_v; } + if (snorm_mask & 8) { scale.b = scale_v; bias.b = -bias_v; } + color_value = (color_value + bias) * scale; + } + + border_color = color_value; + } // Check if non-point filtering can even be used on this format bool can_sample_linear; @@ -404,7 +425,7 @@ void VKGSRender::load_texture_env() { // Most PS3-like formats can be linearly filtered without problem // Exclude textures that require SNORM conversion however - can_sample_linear = (sampler_state->format_ex.texel_remap_control & rsx::texture_control_bits::SEXT_MASK) == 0; + can_sample_linear = !sext_conv_required; } else if (sampler_state->format_class != rsx::classify_format(texture_format) && (texture_format == CELL_GCM_TEXTURE_A8R8G8B8 || texture_format == CELL_GCM_TEXTURE_D8R8G8B8)) @@ -554,7 +575,7 @@ void VKGSRender::load_texture_env() // NOTE: In vulkan, the border color can bypass the sample swizzle stage. // Check the device properties to determine whether to pre-swizzle the colors or not. const auto border_color = is_border_clamped_texture(tex) - ? vk::border_color_t(get_border_color(tex)) + ? vk::border_color_t(get_border_color(tex, false)) : vk::border_color_t(VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK); if (vs_sampler_handles[i] && From cb7c3488ab02ed0264a7dfd2643f35e8ed86c5dc Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 23 Feb 2026 00:50:47 +0300 Subject: [PATCH 298/630] rsx: Do not emit format conversion code in shaders if the feature is unused - The sampling logic has become increasingly complex yet it is needed very rarely --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 1 + rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 5 ++++ .../RSXProg/RSXFragmentTextureOps.glsl | 29 ++++++++++++++++++- rpcs3/Emu/RSX/Program/GLSLTypes.h | 1 + rpcs3/Emu/RSX/RSXThread.cpp | 8 +++++ rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 1 + rpcs3/Emu/RSX/gcm_enums.h | 2 ++ 7 files changed, 46 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index f8cc046569..5271390af9 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -237,6 +237,7 @@ void GLFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) m_shader_props.require_tex3D_ops = properties.has_tex3D; m_shader_props.require_shadowProj_ops = properties.shadow_sampler_mask != 0 && properties.has_texShadowProj; m_shader_props.require_alpha_kill = !!(m_prog.ctrl & RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL); + m_shader_props.require_color_format_convert = !!(m_prog.ctrl & RSX_SHADER_CONTROL_TEXTURE_FORMAT_CONVERT); glsl::insert_glsl_legacy_function(OS, m_shader_props); } diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index ebf73e935a..800a9979ff 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -408,6 +408,11 @@ namespace glsl enabled_options.push_back("_ENABLE_TEXTURE_ALPHA_KILL"); } + if (props.require_color_format_convert) + { + enabled_options.push_back("_ENABLE_FORMAT_CONVERSION"); + } + program_common::define_glsl_switches(OS, enabled_options); enabled_options.clear(); diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index 43dcf9e6eb..0ca9118057 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -46,8 +46,10 @@ R"( _texture_bx2_active = false; \ } while (false) #define TEX_FLAGS(index) ((TEX_PARAM(index).flags & ~(_texture_flag_erase)) | _texture_flag_override) -#else +#elif defined(_ENABLE_TEXTURE_ALPHA_KILL) || defined(_ENABLE_FORMAT_CONVERSION) #define TEX_FLAGS(index) (TEX_PARAM(index).flags) +#else + #define TEX_FLAGS(index) 0 #endif #define TEX_NAME(index) tex##index @@ -193,6 +195,8 @@ vec4 _texcoord_xform_shadow(const in vec4 coord4, const in sampler_info params) #endif // _EMULATE_SHADOW +#ifdef _ENABLE_FORMAT_CONVERSION + vec4 _sext_unorm8x4(const in vec4 x) { // TODO: Handle clamped sign-extension @@ -285,4 +289,27 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) return rgba; } +#elif defined(_ENABLE_TEXTURE_ALPHA_KILL) + +vec4 _process_texel(in vec4 rgba, const in uint control_bits) +{ + if (_test_bit(control_bits, ALPHAKILL)) + { + // Alphakill + if (rgba.a < 0.000001) + { + _kill(); + return rgba; + } + } + + return rgba; +} + +#else + +#define _process_texel(rgba, control) rgba + +#endif // _ENABLE_FORMAT_CONVERSION + )" diff --git a/rpcs3/Emu/RSX/Program/GLSLTypes.h b/rpcs3/Emu/RSX/Program/GLSLTypes.h index 8f7cb6fa03..685d87fafd 100644 --- a/rpcs3/Emu/RSX/Program/GLSLTypes.h +++ b/rpcs3/Emu/RSX/Program/GLSLTypes.h @@ -60,5 +60,6 @@ namespace glsl bool require_tex3D_ops : 1; // Include 3D texture stuff (including cubemap) bool require_shadowProj_ops : 1; // Include shadow2DProj projection textures (1D is unsupported anyway) bool require_alpha_kill : 1; // Include alpha kill checking code + bool require_color_format_convert : 1; // Include colorspace conversion code }; }; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 65958e189f..a8aa7cdf60 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2315,6 +2315,7 @@ namespace rsx case CELL_GCM_TEXTURE_R5G6B5: case CELL_GCM_TEXTURE_R6G5B5: texture_control |= (1 << texture_control_bits::RENORMALIZE); + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_TEXTURE_FORMAT_CONVERT; break; default: break; @@ -2326,8 +2327,15 @@ namespace rsx texture_control |= format_ex.texel_remap_control; texture_control |= format_ex.features << texture_control_bits::FORMAT_FEATURES_OFFSET; + if (format_ex.texel_remap_control) + { + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_TEXTURE_FORMAT_CONVERT; + } + if (current_fp_metadata.bx2_texture_reads_mask) { + current_fragment_program.ctrl |= RSX_SHADER_CONTROL_TEXTURE_FORMAT_CONVERT; + const u32 remap_hi = tex.decoded_remap().shuffle_mask_bits(0xFu); current_fragment_program.texture_params[i].remap &= ~(0xFu << 16u); current_fragment_program.texture_params[i].remap |= (remap_hi << 16u); diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index af2e60ec93..02709d9b5c 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -336,6 +336,7 @@ void VKFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) m_shader_props.require_tex3D_ops = properties.has_tex3D; m_shader_props.require_shadowProj_ops = properties.shadow_sampler_mask != 0 && properties.has_texShadowProj; m_shader_props.require_alpha_kill = !!(m_prog.ctrl & RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL); + m_shader_props.require_color_format_convert = !!(m_prog.ctrl & RSX_SHADER_CONTROL_TEXTURE_FORMAT_CONVERT); // Declare global constants if (m_shader_props.require_fog_read) diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index 6662df1653..542151e340 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -468,6 +468,8 @@ namespace gcm RSX_SHADER_CONTROL_DISABLE_EARLY_Z = 0x2000000, // Do not allow early-Z optimizations on this shader + RSX_SHADER_CONTROL_TEXTURE_FORMAT_CONVERT = 0x4000000, // Allow format conversions (BX2, SNORM, SRGB, RENORM) + // Meta RSX_SHADER_CONTROL_META_USES_DISCARD = (RSX_SHADER_CONTROL_USES_KIL | RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL | RSX_SHADER_CONTROL_ALPHA_TEST | RSX_SHADER_CONTROL_POLYGON_STIPPLE | RSX_SHADER_CONTROL_ALPHA_TO_COVERAGE) }; From 34f0e865ac6d2baa31ffc5c379d1fd743c282fc3 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 23 Feb 2026 01:42:49 +0300 Subject: [PATCH 299/630] rsx: Get rid of some guessing when handling special hardware formats --- rpcs3/Emu/RSX/Common/TextureUtils.h | 10 ++++++++++ rpcs3/Emu/RSX/GL/GLDraw.cpp | 4 ++++ rpcs3/Emu/RSX/GL/glutils/sampler.cpp | 14 ++++++++------ rpcs3/Emu/RSX/VK/VKDraw.cpp | 8 ++++++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.h b/rpcs3/Emu/RSX/Common/TextureUtils.h index f8d899a6ca..1cc9c21248 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.h +++ b/rpcs3/Emu/RSX/Common/TextureUtils.h @@ -135,6 +135,12 @@ namespace rsx RSX_FORMAT_FEATURE_16BIT_CHANNELS = (1 << 3), // Complements RSX_FORMAT_FEATURE_SIGNED_COMPONENTS }; + enum host_format_features : u8 + { + RSX_HOST_FORMAT_FEATURE_SNORM = (1 << 0), + RSX_HOST_FORMAT_FEATURE_SRGB = (1 << 1), + }; + using enum format_features; struct texture_format_ex @@ -150,10 +156,14 @@ namespace rsx bool hw_SNORM_possible() const; bool hw_SRGB_possible() const; + bool host_snorm_format_active() const { return host_features & RSX_HOST_FORMAT_FEATURE_SNORM; } + bool host_srgb_format_active() const { return host_features & RSX_HOST_FORMAT_FEATURE_SRGB; } + //private: u32 format_bits = 0; u32 features = 0; u32 texel_remap_control = 0; + u32 host_features = 0; }; // Sampled image descriptor diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index bdf5a53d01..10e5f6da31 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -361,22 +361,26 @@ void GLGSRender::load_texture_env() const auto gl_format = sampler_state->image_handle->view_format(); GLenum format_override = gl_format; rsx::flags32_t flags_to_erase = 0u; + rsx::flags32_t host_flags_to_set = 0u; if (sampler_state->format_ex.hw_SNORM_possible()) { format_override = gl::get_compatible_snorm_format(gl_format); flags_to_erase = rsx::texture_control_bits::SEXT_MASK; + host_flags_to_set = rsx::RSX_HOST_FORMAT_FEATURE_SNORM; } else if (sampler_state->format_ex.hw_SRGB_possible()) { format_override = gl::get_compatible_srgb_format(gl_format); flags_to_erase = rsx::texture_control_bits::GAMMA_CTRL_MASK; + host_flags_to_set = rsx::RSX_HOST_FORMAT_FEATURE_SRGB; } if (format_override != GL_NONE && format_override != gl_format) { sampler_state->image_handle = sampler_state->image_handle->as(format_override); sampler_state->format_ex.texel_remap_control &= (~flags_to_erase); + sampler_state->format_ex.host_features |= host_flags_to_set; } } diff --git a/rpcs3/Emu/RSX/GL/glutils/sampler.cpp b/rpcs3/Emu/RSX/GL/glutils/sampler.cpp index 0d37dc3524..387228983c 100644 --- a/rpcs3/Emu/RSX/GL/glutils/sampler.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/sampler.cpp @@ -84,23 +84,25 @@ namespace gl // Therefore, we pass the raw value here, and the texture view will handle the rest for us. const bool sext_conv_required = (sampled_image->format_ex.texel_remap_control & rsx::SEXT_MASK) != 0; const auto encoded_color = tex.border_color(sext_conv_required); - if (get_parameteri(GL_TEXTURE_BORDER_COLOR) != encoded_color) + const auto host_features = sampled_image->format_ex.host_features; + + if (get_parameteri(GL_TEXTURE_BORDER_COLOR) != encoded_color || + get_parameteri(GL_TEXTURE_BORDER_VALUES_NV) != host_features) { m_propertiesi[GL_TEXTURE_BORDER_COLOR] = encoded_color; - auto border_color = rsx::decode_border_color(encoded_color); + m_propertiesi[GL_TEXTURE_BORDER_VALUES_NV] = host_features; - if (const auto snorm_mask = tex.argb_signed(); - !sext_conv_required && tex.argb_signed()) [[ unlikely ]] + auto border_color = rsx::decode_border_color(encoded_color); + if (sampled_image->format_ex.host_snorm_format_active()) [[ unlikely ]] { // Hardware SNORM is active - ensure(sampled_image->format_ex.hw_SNORM_possible()); - // Convert the border color in host space (2N - 1) // HW does the conversion in integer space as (x - 128) / 127 which introduces a biasing error. const float bias_v = 128.f / 255.f; const float scale_v = 255.f / 127.f; color4f scale{ 1.f }, bias{ 0.f }; + const auto snorm_mask = tex.argb_signed(); if (snorm_mask & 1) { scale.a = scale_v; bias.a = -bias_v; } if (snorm_mask & 2) { scale.r = scale_v; bias.r = -bias_v; } if (snorm_mask & 4) { scale.g = scale_v; bias.g = -bias_v; } diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index e13cc9aa94..2e62edd331 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -353,22 +353,26 @@ void VKGSRender::load_texture_env() const auto vk_format = sampler_state->image_handle->format(); VkFormat format_override = vk_format;; rsx::flags32_t flags_to_erase = 0u; + rsx::flags32_t host_flags_to_set = 0u; if (sampler_state->format_ex.hw_SNORM_possible()) { format_override = vk::get_compatible_snorm_format(vk_format); flags_to_erase = rsx::texture_control_bits::SEXT_MASK; + host_flags_to_set = rsx::RSX_HOST_FORMAT_FEATURE_SNORM; } else if (sampler_state->format_ex.hw_SRGB_possible()) { format_override = vk::get_compatible_srgb_format(vk_format); flags_to_erase = rsx::texture_control_bits::GAMMA_CTRL_MASK; + host_flags_to_set = rsx::RSX_HOST_FORMAT_FEATURE_SRGB; } if (format_override != VK_FORMAT_UNDEFINED && format_override != vk_format) { sampler_state->image_handle = sampler_state->image_handle->as(format_override); sampler_state->format_ex.texel_remap_control &= (~flags_to_erase); + sampler_state->format_ex.host_features |= host_flags_to_set; } } @@ -400,8 +404,7 @@ void VKGSRender::load_texture_env() if (rsx::is_border_clamped_texture(tex)) { auto color_value = get_border_color(tex, sext_conv_required); - if (const auto snorm_mask = tex.argb_signed(); - !sext_conv_required && snorm_mask) + if (sampler_state->format_ex.host_snorm_format_active()) { // Convert the border color in host space (2N - 1) // HW does the conversion in integer space as (x - 128) / 127 which introduces a biasing error. @@ -409,6 +412,7 @@ void VKGSRender::load_texture_env() const float scale_v = 255.f / 127.f; color4f scale{ 1.f }, bias{ 0.f }; + const auto snorm_mask = tex.argb_signed(); if (snorm_mask & 1) { scale.a = scale_v; bias.a = -bias_v; } if (snorm_mask & 2) { scale.r = scale_v; bias.r = -bias_v; } if (snorm_mask & 4) { scale.g = scale_v; bias.g = -bias_v; } From 4fa3aaf2b5867cf68d48fa4a0407f65ce0f43e20 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 24 Feb 2026 01:25:29 +0300 Subject: [PATCH 300/630] rsx: Fix flickering when initializing texture units --- rpcs3/Emu/RSX/Common/TextureUtils.h | 9 +++++++++ rpcs3/Emu/RSX/GL/GLDraw.cpp | 2 +- rpcs3/Emu/RSX/VK/VKDraw.cpp | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.h b/rpcs3/Emu/RSX/Common/TextureUtils.h index 1cc9c21248..eb64410418 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.h +++ b/rpcs3/Emu/RSX/Common/TextureUtils.h @@ -159,6 +159,15 @@ namespace rsx bool host_snorm_format_active() const { return host_features & RSX_HOST_FORMAT_FEATURE_SNORM; } bool host_srgb_format_active() const { return host_features & RSX_HOST_FORMAT_FEATURE_SRGB; } + operator bool() const { return valid(); } + + bool operator == (const texture_format_ex& that) const + { + return this->format_bits == that.format_bits && + this->features == that.features && + this->host_features == that.host_features; + } + //private: u32 format_bits = 0; u32 features = 0; diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index 10e5f6da31..940534cdea 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -342,7 +342,7 @@ void GLGSRender::load_texture_env() m_graphics_state |= rsx::fragment_program_state_dirty; } - if (m_fs_sampler_states[i]) + if (sampler_state->format_ex) { // Nothing to change, use cached sampler continue; diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 2e62edd331..c0cb429593 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -334,7 +334,7 @@ void VKGSRender::load_texture_env() m_graphics_state |= rsx::fragment_program_state_dirty; } - if (fs_sampler_handles[i]) + if (sampler_state->format_ex) { // Nothing to change, use cached sampler continue; From 94cd6a6f9e3e92d8e40334824e579f909b9f1bd4 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 24 Feb 2026 01:35:33 +0300 Subject: [PATCH 301/630] gl/vk: Clean up vertex texture handling - Clean up code after refactors --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 2 +- rpcs3/Emu/RSX/VK/VKDraw.cpp | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index 940534cdea..3de2585523 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -441,7 +441,7 @@ void GLGSRender::load_texture_env() continue; } - if (m_vertex_textures_dirty[i]) + if (is_sampler_dirty) { m_vs_sampler_states[i].apply(tex, vs_sampler_state[i].get()); } diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index c0cb429593..634131b13b 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -559,15 +559,18 @@ void VKGSRender::load_texture_env() check_for_cyclic_refs |= true; } - if (!is_sampler_dirty && sampler_state->format_class != previous_format_class) + if (!is_sampler_dirty) { - // Host details changed but RSX is not aware - m_graphics_state |= rsx::vertex_program_state_dirty; - } + if (sampler_state->format_class != previous_format_class) + { + // Host details changed but RSX is not aware + m_graphics_state |= rsx::vertex_program_state_dirty; + } - if (!is_sampler_dirty && vs_sampler_handles[i]) - { - continue; + if (vs_sampler_handles[i]) + { + continue; + } } const VkBool32 unnormalized_coords = !!(tex.format() & CELL_GCM_TEXTURE_UN); From 99c9c16187dbaf4bd49acc797d41bdb0b0dd9cdb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 24 Feb 2026 02:34:30 +0300 Subject: [PATCH 302/630] rsx: Disallow sRGB hardware format promotion unless no remap is required --- rpcs3/Emu/RSX/Common/TextureUtils.cpp | 3 ++- rpcs3/Emu/RSX/Common/TextureUtils.h | 4 +++- rpcs3/Emu/RSX/RSXTexture.cpp | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.cpp b/rpcs3/Emu/RSX/Common/TextureUtils.cpp index 4c92f18aaa..937508035b 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.cpp +++ b/rpcs3/Emu/RSX/Common/TextureUtils.cpp @@ -854,7 +854,8 @@ namespace rsx bool texture_format_ex::hw_SRGB_possible() const { - return (texel_remap_control & GAMMA_CTRL_MASK) == GAMMA_RGB_MASK; + return encoded_remap == RSX_TEXTURE_REMAP_IDENTITY && + (texel_remap_control & GAMMA_CTRL_MASK) == GAMMA_RGB_MASK; } std::vector get_subresources_layout(const rsx::fragment_texture& texture) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.h b/rpcs3/Emu/RSX/Common/TextureUtils.h index eb64410418..31f43432dc 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.h +++ b/rpcs3/Emu/RSX/Common/TextureUtils.h @@ -165,12 +165,14 @@ namespace rsx { return this->format_bits == that.format_bits && this->features == that.features && - this->host_features == that.host_features; + this->host_features == that.host_features && + this->encoded_remap == that.encoded_remap; } //private: u32 format_bits = 0; u32 features = 0; + u32 encoded_remap = 0; u32 texel_remap_control = 0; u32 host_features = 0; }; diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index 071a1c8a78..0d18cf0cd3 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -121,6 +121,7 @@ namespace rsx texture_format_ex result { format_bits }; result.features = format_features; result.texel_remap_control = format_convert; + result.encoded_remap = remap(); return result; } From daa53c8642f3ab4240b188df59f03130208172a7 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 24 Feb 2026 21:20:33 +0300 Subject: [PATCH 303/630] vk: Fix cubemap detection logic --- rpcs3/Emu/RSX/VK/vkutils/image.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.cpp b/rpcs3/Emu/RSX/VK/vkutils/image.cpp index b58a95c29b..9197c5a936 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image.cpp @@ -23,7 +23,7 @@ namespace vk break; case VK_IMAGE_TYPE_2D: longest_dim = std::max(info.extent.width, info.extent.height); - dim_limit = (info.flags == VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) ? gpu_limits.maxImageDimensionCube : gpu_limits.maxImageDimension2D; + dim_limit = (info.flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) ? gpu_limits.maxImageDimensionCube : gpu_limits.maxImageDimension2D; break; case VK_IMAGE_TYPE_3D: longest_dim = std::max({ info.extent.width, info.extent.height, info.extent.depth }); @@ -360,7 +360,7 @@ namespace vk info.viewType = VK_IMAGE_VIEW_TYPE_1D; break; case VK_IMAGE_TYPE_2D: - if (resource->info.flags == VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) + if (resource->info.flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) info.viewType = VK_IMAGE_VIEW_TYPE_CUBE; else if (resource->info.arrayLayers == 1) info.viewType = VK_IMAGE_VIEW_TYPE_2D; From 41e036473a898c46147f868dba5534666b9bd36f Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 25 Feb 2026 02:34:20 +0300 Subject: [PATCH 304/630] rsx: Fix broken shaders when depth format conversion is enabled with no format conversion code active --- rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 5 +++++ .../Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index 800a9979ff..28cbaa61f0 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -413,6 +413,11 @@ namespace glsl enabled_options.push_back("_ENABLE_FORMAT_CONVERSION"); } + if (props.require_depth_conversion) + { + enabled_options.push_back("_ENABLE_DEPTH_FORMAT_RECONSTRUCTION"); + } + program_common::define_glsl_switches(OS, enabled_options); enabled_options.clear(); diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index 0ca9118057..aaf4dc434a 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -46,7 +46,7 @@ R"( _texture_bx2_active = false; \ } while (false) #define TEX_FLAGS(index) ((TEX_PARAM(index).flags & ~(_texture_flag_erase)) | _texture_flag_override) -#elif defined(_ENABLE_TEXTURE_ALPHA_KILL) || defined(_ENABLE_FORMAT_CONVERSION) +#elif defined(_ENABLE_TEXTURE_ALPHA_KILL) || defined(_ENABLE_FORMAT_CONVERSION) || defined(_ENABLE_DEPTH_FORMAT_RECONSTRUCTION) #define TEX_FLAGS(index) (TEX_PARAM(index).flags) #else #define TEX_FLAGS(index) 0 From 8396cc2300d7e07ab02b1095c26bc5448737af82 Mon Sep 17 00:00:00 2001 From: Ani Date: Sat, 14 Feb 2026 14:05:36 +0100 Subject: [PATCH 305/630] openal: Update to 1.25.1 --- 3rdparty/OpenAL/openal-soft | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/OpenAL/openal-soft b/3rdparty/OpenAL/openal-soft index 75c0059630..c41d64c6a3 160000 --- a/3rdparty/OpenAL/openal-soft +++ b/3rdparty/OpenAL/openal-soft @@ -1 +1 @@ -Subproject commit 75c00596307bf05ba7bbc8c7022836bf52f17477 +Subproject commit c41d64c6a35f6174bf4a27010aeac52a8d3bb2c6 From 60db25980f3220bcb47f902cf051dba467913d82 Mon Sep 17 00:00:00 2001 From: Ani Date: Thu, 26 Feb 2026 00:02:52 +0100 Subject: [PATCH 306/630] ci: Update docker to 1.9 --- .github/workflows/rpcs3.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 0132095f41..740e844d04 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -30,23 +30,23 @@ jobs: matrix: include: - os: ubuntu-24.04 - docker_img: "rpcs3/rpcs3-ci-jammy:1.8" + docker_img: "rpcs3/rpcs3-ci-jammy:1.9" build_sh: "/rpcs3/.ci/build-linux.sh" compiler: clang UPLOAD_COMMIT_HASH: d812f1254a1157c80fd402f94446310560f54e5f UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux" - os: ubuntu-24.04 - docker_img: "rpcs3/rpcs3-ci-jammy:1.8" + docker_img: "rpcs3/rpcs3-ci-jammy:1.9" build_sh: "/rpcs3/.ci/build-linux.sh" compiler: gcc - os: ubuntu-24.04-arm - docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.8" + docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.9" build_sh: "/rpcs3/.ci/build-linux-aarch64.sh" compiler: clang UPLOAD_COMMIT_HASH: a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1 UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux-arm64" - os: ubuntu-24.04-arm - docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.8" + docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.9" build_sh: "/rpcs3/.ci/build-linux-aarch64.sh" compiler: gcc name: RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} From b30a20c2dc368f76e81ee484d2322a2c35848656 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Thu, 26 Feb 2026 21:22:15 +0100 Subject: [PATCH 307/630] More sys_ fixes --- rpcs3/Emu/Cell/lv2/sys_event.cpp | 3 +- rpcs3/Emu/Cell/lv2/sys_event_flag.cpp | 52 +++++++++++---------------- rpcs3/Emu/Cell/lv2/sys_mutex.h | 6 +++- rpcs3/Emu/Cell/lv2/sys_rwlock.cpp | 2 ++ rpcs3/Emu/Cell/lv2/sys_semaphore.cpp | 4 +-- 5 files changed, 30 insertions(+), 37 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_event.cpp b/rpcs3/Emu/Cell/lv2/sys_event.cpp index d50ae87f9d..2d8417cbfc 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event.cpp @@ -170,8 +170,7 @@ CellError lv2_event_queue::send(lv2_event event, bool* notified_thread, lv2_even { if (auto cpu = get_current_cpu_thread()) { - cpu->state += cpu_flag::again; - cpu->state += cpu_flag::exit; + cpu->state += cpu_flag::again + cpu_flag::exit; } sys_event.warning("Ignored event!"); diff --git a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp index c28efaf711..89a6c42ac5 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp @@ -19,6 +19,22 @@ lv2_event_flag::lv2_event_flag(utils::serial& ar) ar(pattern); } +// Always set result +struct sys_event_store_result +{ + vm::ptr ptr; + u64 val = 0; + + ~sys_event_store_result() noexcept + { + if (ptr) + { + cpu_thread::get_current()->check_state(); + *ptr = val; + } + } +}; + std::function lv2_event_flag::load(utils::serial& ar) { return load_func(make_shared(stx::exact_t(ar))); @@ -120,21 +136,7 @@ error_code sys_event_flag_wait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, vm ppu.gpr[5] = mode; ppu.gpr[6] = 0; - // Always set result - struct store_result - { - vm::ptr ptr; - u64 val = 0; - - ~store_result() noexcept - { - if (ptr) - { - cpu_thread::get_current()->check_state(); - *ptr = val; - } - } - } store{result}; + sys_event_store_result store{result}; if (!lv2_event_flag::check_mode(mode)) { @@ -273,21 +275,7 @@ error_code sys_event_flag_trywait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, sys_event_flag.trace("sys_event_flag_trywait(id=0x%x, bitptn=0x%llx, mode=0x%x, result=*0x%x)", id, bitptn, mode, result); - // Always set result - struct store_result - { - vm::ptr ptr; - u64 val = 0; - - ~store_result() noexcept - { - if (ptr) - { - cpu_thread::get_current()->check_state(); - *ptr = val; - } - } - } store{result}; + sys_event_store_result store{result}; if (!lv2_event_flag::check_mode(mode)) { @@ -556,8 +544,6 @@ error_code sys_event_flag_get(ppu_thread& ppu, u32 id, vm::ptr flags) return +flag.pattern; }); - ppu.check_state(); - if (!flag) { if (flags) *flags = 0; @@ -569,6 +555,8 @@ error_code sys_event_flag_get(ppu_thread& ppu, u32 id, vm::ptr flags) return CELL_EFAULT; } + ppu.check_state(); + *flags = flag.ret; return CELL_OK; } diff --git a/rpcs3/Emu/Cell/lv2/sys_mutex.h b/rpcs3/Emu/Cell/lv2/sys_mutex.h index f82f913399..c4fe04ce2a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mutex.h +++ b/rpcs3/Emu/Cell/lv2/sys_mutex.h @@ -173,7 +173,11 @@ struct lv2_mutex final : lv2_obj if (sq == data.sq) { - atomic_storage::release(control.raw().owner, res->id); + if (cpu_flag::again - res->state) + { + atomic_storage::release(control.raw().owner, res->id); + } + return false; } diff --git a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp index c2abd40284..e60d4895cc 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp @@ -441,6 +441,8 @@ error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout) continue; } + ppu.state += cpu_flag::wait; + std::lock_guard lock(rwlock->mutex); if (!rwlock->unqueue(rwlock->wq, &ppu)) diff --git a/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp b/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp index 7440cf2def..b6ca578977 100644 --- a/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp @@ -72,7 +72,7 @@ error_code sys_semaphore_create(ppu_thread& ppu, vm::ptr sem_id, vm::ptr(ppu.test_stopped()); + ppu.check_state(); *sem_id = idm::last_id(); return CELL_OK; @@ -358,7 +358,7 @@ error_code sys_semaphore_get_value(ppu_thread& ppu, u32 sem_id, vm::ptr cou return CELL_EFAULT; } - static_cast(ppu.test_stopped()); + ppu.check_state(); *count = sema.ret; return CELL_OK; From 3b6afc1d9acb62d00c580a07d7884212a05251eb Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 27 Feb 2026 08:02:46 +0100 Subject: [PATCH 308/630] Final sys_ fixes --- rpcs3/Emu/Cell/lv2/sys_config.cpp | 34 ++++++++----- rpcs3/Emu/Cell/lv2/sys_config.h | 7 ++- rpcs3/Emu/Cell/lv2/sys_dbg.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_event.cpp | 20 ++++---- rpcs3/Emu/Cell/lv2/sys_fs.cpp | 18 ++----- rpcs3/Emu/Cell/lv2/sys_mmapper.cpp | 17 +++++-- rpcs3/Emu/Cell/lv2/sys_net.cpp | 48 +++++++++---------- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h | 2 +- .../Cell/lv2/sys_net/lv2_socket_native.cpp | 6 +-- .../Emu/Cell/lv2/sys_net/lv2_socket_native.h | 2 +- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp | 4 +- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h | 2 +- .../Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp | 9 +--- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h | 2 +- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp | 3 +- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h | 2 +- rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp | 1 + rpcs3/Emu/Cell/lv2/sys_prx.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp | 16 +++---- rpcs3/Emu/Cell/lv2/sys_ss.cpp | 3 +- rpcs3/Emu/Cell/lv2/sys_uart.cpp | 6 ++- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 16 ++++--- rpcs3/Emu/Cell/lv2/sys_vm.cpp | 2 +- 23 files changed, 110 insertions(+), 114 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_config.cpp b/rpcs3/Emu/Cell/lv2/sys_config.cpp index 0179a6b7f2..54cb2d6ce8 100644 --- a/rpcs3/Emu/Cell/lv2/sys_config.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_config.cpp @@ -174,20 +174,28 @@ bool lv2_config_service_listener::check_service(const lv2_config_service& servic return true; } -bool lv2_config_service_listener::notify(const shared_ptr& event) -{ - service_events.emplace_back(event); - return event->notify(); -} - bool lv2_config_service_listener::notify(const shared_ptr& service) { - if (!check_service(*service)) - return false; + { + std::lock_guard lock(mutex_service_events); - // Create service event and notify queue! - const auto event = lv2_config_service_event::create(handle, service, *this); - return notify(event); + if (!check_service(*service)) + return false; + + // Create service event and notify queue! + const auto event = lv2_config_service_event::create(handle, service, *this); + service_events.emplace_back(event); + + if (!event->notify()) + { + // If we fail to deliver the event to the queue just clean the event up or it'll hold the listener alive forever + g_fxo->get().remove_service_event(event->id); + service_events.pop_back(); + return false; + } + } + + return true; } void lv2_config_service_listener::notify_all() @@ -267,7 +275,7 @@ void lv2_config_service_event::write(sys_config_service_event_t *dst) const { const auto registered = service->is_registered(); - dst->service_listener_handle = listener.get_id(); + dst->service_listener_handle = listener_id; dst->registered = registered; dst->service_id = service->id; dst->user_id = service->user_id; @@ -346,7 +354,7 @@ error_code sys_config_get_service_event(u32 config_hdl, u32 event_id, vm::ptrget().find_event(event_id); - if (!event) + if (!event || event->handle != cfg) { return CELL_ESRCH; } diff --git a/rpcs3/Emu/Cell/lv2/sys_config.h b/rpcs3/Emu/Cell/lv2/sys_config.h index 0804671141..aaf4c6f5d0 100644 --- a/rpcs3/Emu/Cell/lv2/sys_config.h +++ b/rpcs3/Emu/Cell/lv2/sys_config.h @@ -296,11 +296,10 @@ private: // The service listener owns the service events - service events will not be freed as long as their corresponding listener exists // This has been confirmed to be the case in realhw + shared_mutex mutex_service_events; std::vector> service_events; shared_ptr handle; - bool notify(const shared_ptr& event); - public: const sys_config_service_id service_id; const u64 min_verbosity; @@ -370,14 +369,14 @@ public: // This has been confirmed to be the case in realhw const shared_ptr handle; const shared_ptr service; - const lv2_config_service_listener& listener; + const u32 listener_id; // Constructors (should not be used directly) lv2_config_service_event(shared_ptr _handle, shared_ptr _service, const lv2_config_service_listener& _listener) noexcept : id(get_next_id()) , handle(std::move(_handle)) , service(std::move(_service)) - , listener(_listener) + , listener_id(_listener.get_id()) { } diff --git a/rpcs3/Emu/Cell/lv2/sys_dbg.cpp b/rpcs3/Emu/Cell/lv2/sys_dbg.cpp index 27fa51b148..eb04cff61b 100644 --- a/rpcs3/Emu/Cell/lv2/sys_dbg.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_dbg.cpp @@ -105,7 +105,7 @@ error_code sys_dbg_write_process_memory(s32 pid, u32 address, u32 size, vm::cptr i += op_size; } - if (!is_exec || i >= end) + if ((!is_exec || i >= end) && exec_update_size > 0) { // Commit executable data update // The read memory is also super ptr so memmove can work correctly on all implementations diff --git a/rpcs3/Emu/Cell/lv2/sys_event.cpp b/rpcs3/Emu/Cell/lv2/sys_event.cpp index 2d8417cbfc..c5fa15cf55 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event.cpp @@ -308,6 +308,15 @@ error_code sys_event_queue_destroy(ppu_thread& ppu, u32 equeue_id, s32 mode) return CELL_EBUSY; } + for (auto cpu = head; cpu; cpu = cpu->get_next_cpu()) + { + if (cpu->state & cpu_flag::again) + { + ppu.state += cpu_flag::again; + return CELL_EAGAIN; + } + } + if (!queue.events.empty()) { // Copy events for logging, does not empty @@ -320,17 +329,6 @@ error_code sys_event_queue_destroy(ppu_thread& ppu, u32 equeue_id, s32 mode) { qlock.unlock(); } - else - { - for (auto cpu = head; cpu; cpu = cpu->get_next_cpu()) - { - if (cpu->state & cpu_flag::again) - { - ppu.state += cpu_flag::again; - return CELL_EAGAIN; - } - } - } return {}; }); diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.cpp b/rpcs3/Emu/Cell/lv2/sys_fs.cpp index 961d0d6ad3..312754af8a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_fs.cpp @@ -382,7 +382,7 @@ lv2_fs_object::lv2_fs_object(utils::serial& ar, bool) u64 lv2_file::op_read(const fs::file& file, vm::ptr buf, u64 size, u64 opt_pos) { - if (u64 region = buf.addr() >> 28, region_end = (buf.addr() & 0xfff'ffff) + (size & 0xfff'ffff); region == region_end && ((region >> 28) == 0 || region >= 0xC)) + if (u64 region = buf.addr() >> 28, region_end = (buf.addr() + size) >> 28; region == region_end && region == 0) { // Optimize reads from safe memory return (opt_pos == umax ? file.read(buf.get_ptr(), size) : file.read_at(opt_pos, buf.get_ptr(), size)); @@ -1391,7 +1391,8 @@ error_code sys_fs_opendir(ppu_thread& ppu, vm::cptr path, vm::ptr fd) // Add additional entries for split file candidates (while ends with .66600) while (mp.mp != &g_mp_sys_dev_hdd1 && data.back().name.ends_with(".66600")) { - data.emplace_back(data.back()).name.resize(data.back().name.size() - 6); + fs::dir_entry copy = data.back(); + data.emplace_back(copy).name.resize(copy.name.size() - 6); } } @@ -2147,6 +2148,7 @@ error_code sys_fs_fcntl(ppu_thread& ppu, u32 fd, u32 op, vm::ptr _arg, u32 sys_fs.notice("sys_fs_fcntl(0xc0000006): %s", vpath); // Check only mountpoint + vpath = vpath.substr(0, vpath.find_first_of('\0')); vpath = vpath.substr(0, vpath.find_first_of("/", 1)); // Some mountpoints seem to be handled specially @@ -2635,8 +2637,6 @@ error_code sys_fs_lseek(ppu_thread& ppu, u32 fd, s64 offset, s32 whence, vm::ptr error_code sys_fs_fdatasync(ppu_thread& ppu, u32 fd) { - lv2_obj::sleep(ppu); - sys_fs.trace("sys_fs_fdadasync(fd=%d)", fd); const auto file = idm::get_unlocked(fd); @@ -2661,8 +2661,6 @@ error_code sys_fs_fdatasync(ppu_thread& ppu, u32 fd) error_code sys_fs_fsync(ppu_thread& ppu, u32 fd) { - lv2_obj::sleep(ppu); - sys_fs.trace("sys_fs_fsync(fd=%d)", fd); const auto file = idm::get_unlocked(fd); @@ -2903,14 +2901,6 @@ error_code sys_fs_chmod(ppu_thread&, vm::cptr path, s32 mode) { // Try to locate split files - for (u32 i = 66601; i <= 66699; i++) - { - if (mp != &g_mp_sys_dev_hdd1 && !fs::get_stat(fmt::format("%s.%u", local_path, i), info) && !info.is_directory) - { - break; - } - } - if (fs::get_stat(local_path + ".66600", info) && !info.is_directory) { break; diff --git a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp index d7b66adfd8..0723564a5e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp @@ -333,7 +333,7 @@ error_code sys_mmapper_allocate_shared_memory_ext(ppu_thread& ppu, u64 ipc_key, } } - if (flags & ~SYS_MEMORY_PAGE_SIZE_MASK) + if (flags & ~SYS_MEMORY_GRANULARITY_MASK) { return CELL_EINVAL; } @@ -401,6 +401,11 @@ error_code sys_mmapper_allocate_shared_memory_from_container_ext(ppu_thread& ppu sys_mmapper.todo("sys_mmapper_allocate_shared_memory_from_container_ext(ipc_key=0x%x, size=0x%x, flags=0x%x, cid=0x%x, entries=*0x%x, entry_count=0x%x, mem_id=*0x%x)", ipc_key, size, flags, cid, entries, entry_count, mem_id); + if (size == 0) + { + return CELL_EALIGN; + } + switch (flags & SYS_MEMORY_PAGE_SIZE_MASK) { case SYS_MEMORY_PAGE_SIZE_1M: @@ -546,8 +551,7 @@ error_code sys_mmapper_free_address(ppu_thread& ppu, u32 addr) // If a memory block is freed, remove it from page notification table. auto& pf_entries = g_fxo->get(); - std::lock_guard lock(pf_entries.mutex); - + std::unique_lock lock(pf_entries.mutex); auto ind_to_remove = pf_entries.entries.begin(); for (; ind_to_remove != pf_entries.entries.end(); ++ind_to_remove) { @@ -558,7 +562,11 @@ error_code sys_mmapper_free_address(ppu_thread& ppu, u32 addr) } if (ind_to_remove != pf_entries.entries.end()) { + u32 port_id = ind_to_remove->port_id; pf_entries.entries.erase(ind_to_remove); + lock.unlock(); + sys_event_port_disconnect(ppu, port_id); + sys_event_port_destroy(ppu, port_id); } return CELL_OK; @@ -826,7 +834,6 @@ error_code sys_mmapper_enable_page_fault_notification(ppu_thread& ppu, u32 start vm::var port_id(0); error_code res = sys_event_port_create(ppu, port_id, SYS_EVENT_PORT_LOCAL, SYS_MEMORY_PAGE_FAULT_EVENT_KEY); - sys_event_port_connect_local(ppu, *port_id, event_queue_id); if (res + 0u == CELL_EAGAIN) { @@ -834,6 +841,8 @@ error_code sys_mmapper_enable_page_fault_notification(ppu_thread& ppu, u32 start return CELL_EAGAIN; } + sys_event_port_connect_local(ppu, *port_id, event_queue_id); + auto& pf_entries = g_fxo->get(); std::unique_lock lock(pf_entries.mutex); diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index 27731e44ca..a860d43b12 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -563,37 +563,34 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr(-SYS_NET_EINTR)) + if (state & cpu_flag::signal) { - return -SYS_NET_EINTR; + break; } - if (result) - { - if (result < 0) - { - return sys_net_error{result}; - } + ppu.state.wait(state); + } - return not_an_error(result); + if (ppu.gpr[3] == static_cast(-SYS_NET_EINTR)) + { + return -SYS_NET_EINTR; + } + + if (result) + { + if (result < 0) + { + return sys_net_error{result}; } + + return not_an_error(result); } return CELL_OK; @@ -1295,7 +1292,7 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 n if (auto sock = idm::check_unlocked(fds_buf[i].fd)) { - signaled += sock->poll(fds_buf[i], _fds[i]); + sock->poll(fds_buf[i], _fds[i]); #ifdef _WIN32 connecting[i] = sock->is_connecting(); #endif @@ -1303,7 +1300,6 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 n else { fds_buf[i].revents |= SYS_NET_POLLNVAL; - signaled++; } } @@ -1536,9 +1532,9 @@ error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr select(bs_t selected, pollfd& native_pfd) = 0; error_code abort_socket(s32 flags); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp index 2eb47d7b55..b422db814b 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp @@ -1147,14 +1147,14 @@ s32 lv2_socket_native::shutdown(s32 how) return -get_last_error(false); } -s32 lv2_socket_native::poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) +void lv2_socket_native::poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) { // Check for fake packet for dns interceptions auto& dnshook = g_fxo->get(); if (sn_pfd.events & SYS_NET_POLLIN && dnshook.is_dns(sn_pfd.fd) && dnshook.is_dns_queue(sn_pfd.fd)) { sn_pfd.revents |= SYS_NET_POLLIN; - return 1; + return; } if (sn_pfd.events & ~(SYS_NET_POLLIN | SYS_NET_POLLOUT | SYS_NET_POLLERR)) { @@ -1171,8 +1171,6 @@ s32 lv2_socket_native::poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) { native_pfd.events |= POLLOUT; } - - return 0; } std::tuple lv2_socket_native::select(bs_t selected, pollfd& native_pfd) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h index 84f4218cbd..af9e6a57b7 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h @@ -50,7 +50,7 @@ public: std::optional sendto(s32 flags, const std::vector& buf, std::optional opt_sn_addr, bool is_lock = true) override; std::optional sendmsg(s32 flags, const sys_net_msghdr& msg, bool is_lock = true) override; - s32 poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) override; + void poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) override; std::tuple select(bs_t selected, pollfd& native_pfd) override; bool is_socket_connected(); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp index 67cefe3e3e..903752085b 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp @@ -364,7 +364,7 @@ s32 lv2_socket_p2p::shutdown([[maybe_unused]] s32 how) return CELL_OK; } -s32 lv2_socket_p2p::poll(sys_net_pollfd& sn_pfd, [[maybe_unused]] pollfd& native_pfd) +void lv2_socket_p2p::poll(sys_net_pollfd& sn_pfd, [[maybe_unused]] pollfd& native_pfd) { std::lock_guard lock(mutex); ensure(vport); @@ -381,8 +381,6 @@ s32 lv2_socket_p2p::poll(sys_net_pollfd& sn_pfd, [[maybe_unused]] pollfd& native { sn_pfd.revents |= SYS_NET_POLLOUT; } - - return sn_pfd.revents ? 1 : 0; } std::tuple lv2_socket_p2p::select(bs_t selected, [[maybe_unused]] pollfd& native_pfd) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h index b8fadb3d53..ec6c1d8b31 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h @@ -30,7 +30,7 @@ public: void close() override; s32 shutdown(s32 how) override; - s32 poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) override; + void poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) override; std::tuple select(bs_t selected, pollfd& native_pfd) override; void handle_new_data(sys_net_sockaddr_in_p2p p2p_addr, std::vector p2p_data); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp index 771402809e..cb59557458 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp @@ -985,7 +985,7 @@ s32 lv2_socket_p2ps::shutdown([[maybe_unused]] s32 how) return CELL_OK; } -s32 lv2_socket_p2ps::poll(sys_net_pollfd& sn_pfd, [[maybe_unused]] pollfd& native_pfd) +void lv2_socket_p2ps::poll(sys_net_pollfd& sn_pfd, [[maybe_unused]] pollfd& native_pfd) { std::lock_guard lock(mutex); sys_net.trace("[P2PS] poll checking for 0x%X", sn_pfd.events); @@ -1002,14 +1002,7 @@ s32 lv2_socket_p2ps::poll(sys_net_pollfd& sn_pfd, [[maybe_unused]] pollfd& nativ { sn_pfd.revents |= SYS_NET_POLLOUT; } - - if (sn_pfd.revents) - { - return 1; - } } - - return 0; } std::tuple lv2_socket_p2ps::select(bs_t selected, [[maybe_unused]] pollfd& native_pfd) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h index 8158138936..ac23528d57 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h @@ -89,7 +89,7 @@ public: void close() override; s32 shutdown(s32 how) override; - s32 poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) override; + void poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) override; std::tuple select(bs_t selected, pollfd& native_pfd) override; private: diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp index 6e74bd512f..39ae39e5b5 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp @@ -134,10 +134,9 @@ s32 lv2_socket_raw::shutdown([[maybe_unused]] s32 how) return {}; } -s32 lv2_socket_raw::poll([[maybe_unused]] sys_net_pollfd& sn_pfd, [[maybe_unused]] pollfd& native_pfd) +void lv2_socket_raw::poll([[maybe_unused]] sys_net_pollfd& sn_pfd, [[maybe_unused]] pollfd& native_pfd) { LOG_ONCE(raw_poll, "lv2_socket_raw::poll"); - return {}; } std::tuple lv2_socket_raw::select([[maybe_unused]] bs_t selected, [[maybe_unused]] pollfd& native_pfd) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h index 01b7255884..a03339354f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h @@ -32,6 +32,6 @@ public: void close() override; s32 shutdown(s32 how) override; - s32 poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) override; + void poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) override; std::tuple select(bs_t selected, pollfd& native_pfd) override; }; diff --git a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp index e2463ca101..f26b650346 100644 --- a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp @@ -305,6 +305,7 @@ error_code sys_ppu_thread_detach(ppu_thread& ppu, u32 thread_id) { // Join and notify thread (it is detached from IDM now so it must be done explicitly now) *ptr = thread_state::finished; + return CELL_OK; } return result; diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index 046d19c48e..f20b6be6cb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -899,7 +899,7 @@ error_code _sys_prx_register_library(ppu_thread& ppu, vm::ptr library) { for (u32 lib_addr = prx.exports_start, index = 0; lib_addr < prx.exports_end; index++, lib_addr += vm::read8(lib_addr) ? vm::read8(lib_addr) : sizeof_lib) { - if (std::memcpy(vm::base(lib_addr), mem_copy.data(), sizeof_lib) == 0) + if (std::memcmp(vm::base(lib_addr), mem_copy.data(), sizeof_lib) == 0) { atomic_storage::release(prx.m_external_loaded_flags[index], true); return true; diff --git a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp index 2ba15b1146..29a1fa3501 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp @@ -46,14 +46,14 @@ namespace rsxaudio_ringbuf_reader static void set_timestamp(rsxaudio_shmem::ringbuf_t& ring_buf, u64 timestamp) { const s32 entry_idx_raw = (ring_buf.read_idx + ring_buf.rw_max_idx - (ring_buf.rw_max_idx > 2) - 1) % ring_buf.rw_max_idx; - const s32 entry_idx = std::clamp(entry_idx_raw, 0, SYS_RSXAUDIO_RINGBUF_SZ); + const s32 entry_idx = std::clamp(entry_idx_raw, 0, SYS_RSXAUDIO_RINGBUF_SZ - 1); ring_buf.entries[entry_idx].timestamp = convert_to_timebased_time(timestamp); } static std::tuple update_status(rsxaudio_shmem::ringbuf_t& ring_buf) { - const s32 read_idx = std::clamp(ring_buf.read_idx, 0, SYS_RSXAUDIO_RINGBUF_SZ); + const s32 read_idx = std::clamp(ring_buf.read_idx, 0, SYS_RSXAUDIO_RINGBUF_SZ - 1); if ((ring_buf.entries[read_idx].valid & 1) == 0U) { @@ -61,7 +61,7 @@ namespace rsxaudio_ringbuf_reader } const s32 entry_idx_raw = (ring_buf.read_idx + ring_buf.rw_max_idx - (ring_buf.rw_max_idx > 2)) % ring_buf.rw_max_idx; - const s32 entry_idx = std::clamp(entry_idx_raw, 0, SYS_RSXAUDIO_RINGBUF_SZ); + const s32 entry_idx = std::clamp(entry_idx_raw, 0, SYS_RSXAUDIO_RINGBUF_SZ - 1); ring_buf.entries[read_idx].valid = 0; ring_buf.queue_notify_idx = (ring_buf.queue_notify_idx + 1) % ring_buf.queue_notify_step; @@ -72,7 +72,7 @@ namespace rsxaudio_ringbuf_reader static std::pair get_addr(const rsxaudio_shmem::ringbuf_t& ring_buf) { - const s32 read_idx = std::clamp(ring_buf.read_idx, 0, SYS_RSXAUDIO_RINGBUF_SZ); + const s32 read_idx = std::clamp(ring_buf.read_idx, 0, SYS_RSXAUDIO_RINGBUF_SZ - 1); if (ring_buf.entries[read_idx].valid & 1) { @@ -1392,9 +1392,9 @@ void rsxaudio_backend_thread::operator()() return; } - static rsxaudio_state ra_state{}; - static emu_audio_cfg emu_cfg{}; - static bool backend_failed = false; + rsxaudio_state ra_state{}; + emu_audio_cfg emu_cfg{}; + bool backend_failed = false; for (;;) { @@ -2018,7 +2018,7 @@ void rsxaudio_periodic_tmr::cancel_timer_unlocked() { const u64 flag = 1; const auto wr_res = write(cancel_event, &flag, sizeof(flag)); - ensure(wr_res == sizeof(flag) || wr_res == -EAGAIN); + ensure(wr_res == sizeof(flag) || errno == EAGAIN); } #elif defined(BSD) || defined(__APPLE__) handle[TIMER_ID].flags = (handle[TIMER_ID].flags & ~EV_ENABLE) | EV_DISABLE; diff --git a/rpcs3/Emu/Cell/lv2/sys_ss.cpp b/rpcs3/Emu/Cell/lv2/sys_ss.cpp index 2c4b1282fd..725adbcfc3 100644 --- a/rpcs3/Emu/Cell/lv2/sys_ss.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_ss.cpp @@ -24,7 +24,7 @@ struct lv2_update_manager // For example, 4.90 should be converted to 0x4900000000000 std::erase(version_str, '.'); - if (std::from_chars(version_str.data(), version_str.data() + version_str.size(), system_sw_version, 16).ec != std::errc{}) + if (std::from_chars(version_str.data(), version_str.data() + version_str.size(), system_sw_version, 16).ec == std::errc{}) system_sw_version <<= 40; else system_sw_version = 0; @@ -79,6 +79,7 @@ struct lv2_update_manager if (malloc_set.count(addr)) { + malloc_set.erase(addr); return vm::dealloc(addr, vm::main); } diff --git a/rpcs3/Emu/Cell/lv2/sys_uart.cpp b/rpcs3/Emu/Cell/lv2/sys_uart.cpp index 67e91b97a0..0049b60ffe 100644 --- a/rpcs3/Emu/Cell/lv2/sys_uart.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_uart.cpp @@ -1531,9 +1531,11 @@ private: } }(); + if (sce_idx == umax) + return PS3AV_STATUS_INVALID_VIDEO_PARAM; + const video_sce_param &sce_param = sce_param_arr[sce_idx]; - if (sce_idx == umax || - video_head_cfg.video_head > PS3AV_HEAD_B_ANALOG || + if (video_head_cfg.video_head > PS3AV_HEAD_B_ANALOG || video_head_cfg.video_order > 1 || video_head_cfg.video_format > 16 || video_head_cfg.video_out_format > 16 || diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index e1c3caf9d7..dca61f3be8 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -1173,11 +1173,15 @@ error_code sys_usbd_get_device_list(ppu_thread& ppu, u32 handle, vm::ptr - u32 i_tocopy = std::min(max_devices, ::size32(usbh.handled_devices)); + const u32 i_tocopy = std::min(max_devices, ::size32(usbh.handled_devices)); + u32 index = 0; - for (u32 index = 0; index < i_tocopy; index++) + for (const auto& [_, device] : usbh.handled_devices) { - device_list[index] = usbh.handled_devices[index].first; + if (index == i_tocopy) + break; + + device_list[index++] = device.first; } return not_an_error(i_tocopy); @@ -1409,7 +1413,7 @@ error_code sys_usbd_receive_event(ppu_thread& ppu, u32 handle, vm::ptr arg1 if (is_stopped(state)) { - std::lock_guard lock(usbh.mutex); + std::lock_guard lock(usbh.mutex_sq); for (auto cpu = +usbh.sq; cpu; cpu = cpu->next_cpu) { @@ -1587,7 +1591,7 @@ error_code sys_usbd_get_transfer_status(ppu_thread& ppu, u32 handle, u32 id_tran std::lock_guard lock(usbh.mutex); - if (!usbh.is_init) + if (!usbh.is_init || id_transfer >= MAX_SYS_USBD_TRANSFERS) return CELL_EINVAL; const auto status = usbh.get_transfer_status(id_transfer); @@ -1607,7 +1611,7 @@ error_code sys_usbd_get_isochronous_transfer_status(ppu_thread& ppu, u32 handle, std::lock_guard lock(usbh.mutex); - if (!usbh.is_init) + if (!usbh.is_init || id_transfer >= MAX_SYS_USBD_TRANSFERS) return CELL_EINVAL; const auto status = usbh.get_isochronous_transfer_status(id_transfer); diff --git a/rpcs3/Emu/Cell/lv2/sys_vm.cpp b/rpcs3/Emu/Cell/lv2/sys_vm.cpp index 2a224d2339..49337cf223 100644 --- a/rpcs3/Emu/Cell/lv2/sys_vm.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_vm.cpp @@ -97,7 +97,7 @@ error_code sys_vm_memory_map(ppu_thread& ppu, u64 vsize, u64 psize, u32 cid, u64 // Look for unmapped space if (const auto area = vm::find_map(0x10000000, 0x10000000, 2 | (flag & SYS_MEMORY_PAGE_SIZE_MASK))) { - sys_vm.warning("sys_vm_memory_map(): Found VM 0x%x area (vsize=0x%x)", addr, vsize); + sys_vm.warning("sys_vm_memory_map(): Found VM 0x%x area (vsize=0x%x)", area->addr, vsize); // Alloc all memory (shall not fail) ensure(area->alloc(static_cast(vsize))); From cc1b4c8fd106774ee7f15b17b244c6f758442d39 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Fri, 30 Jan 2026 10:22:36 +0200 Subject: [PATCH 309/630] Fix strcpy_trunc type validation --- Utilities/StrUtil.h | 8 ++++---- rpcs3/Emu/Cell/Modules/sceNp.h | 28 ++++++++++++++-------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Utilities/StrUtil.h b/Utilities/StrUtil.h index d274cc074d..66c351d60f 100644 --- a/Utilities/StrUtil.h +++ b/Utilities/StrUtil.h @@ -13,13 +13,13 @@ std::string wchar_to_utf8(std::wstring_view src); std::string utf16_to_utf8(std::u16string_view src); std::u16string utf8_to_utf16(std::string_view src); -// Copy null-terminated string from a std::string or a char array to a char array with truncation -template +// Copy null-terminated string from a std::basic_string or a char array to a char array with truncation +template requires requires (D& d, T& t) { std::declval() = &d[0]; } inline void strcpy_trunc(D&& dst, const T& src) { const usz count = std::size(src) >= std::size(dst) ? std::max(std::size(dst), 1) - 1 : std::size(src); - std::memcpy(std::data(dst), std::data(src), count); - std::memset(std::data(dst) + count, 0, std::size(dst) - count); + std::copy_n(std::data(src), count, std::data(dst)); + std::fill_n(std::data(dst) + count, std::size(dst) - count, std::remove_cvref_t{}); } // Convert string to signed integer diff --git a/rpcs3/Emu/Cell/Modules/sceNp.h b/rpcs3/Emu/Cell/Modules/sceNp.h index 88dd2d816b..1bc0a345db 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.h +++ b/rpcs3/Emu/Cell/Modules/sceNp.h @@ -1397,9 +1397,9 @@ struct SceNpBasicMessageDetails // Presence details of an user struct SceNpBasicPresenceDetails { - s8 title[SCE_NP_BASIC_PRESENCE_TITLE_SIZE_MAX]; - s8 status[SCE_NP_BASIC_PRESENCE_STATUS_SIZE_MAX]; - s8 comment[SCE_NP_BASIC_PRESENCE_COMMENT_SIZE_MAX]; + char title[SCE_NP_BASIC_PRESENCE_TITLE_SIZE_MAX]; + char status[SCE_NP_BASIC_PRESENCE_STATUS_SIZE_MAX]; + char comment[SCE_NP_BASIC_PRESENCE_COMMENT_SIZE_MAX]; u8 data[SCE_NP_BASIC_MAX_PRESENCE_SIZE]; be_t size; be_t state; @@ -1410,9 +1410,9 @@ struct SceNpBasicPresenceDetails2 { be_t struct_size; be_t state; - s8 title[SCE_NP_BASIC_PRESENCE_TITLE_SIZE_MAX]; - s8 status[SCE_NP_BASIC_PRESENCE_EXTENDED_STATUS_SIZE_MAX]; - s8 comment[SCE_NP_BASIC_PRESENCE_COMMENT_SIZE_MAX]; + char title[SCE_NP_BASIC_PRESENCE_TITLE_SIZE_MAX]; + char status[SCE_NP_BASIC_PRESENCE_EXTENDED_STATUS_SIZE_MAX]; + char comment[SCE_NP_BASIC_PRESENCE_COMMENT_SIZE_MAX]; u8 data[SCE_NP_BASIC_MAX_PRESENCE_SIZE]; be_t size; }; @@ -1420,9 +1420,9 @@ struct SceNpBasicPresenceDetails2 // Country/region code struct SceNpCountryCode { - s8 data[2]; - s8 term; - s8 padding[1]; + char data[2]; + char term; + char padding[1]; }; // Date information @@ -1451,8 +1451,8 @@ struct SceNpScoreGameInfo // Ranking comment structure struct SceNpScoreComment { - s8 data[SCE_NP_SCORE_COMMENT_MAXLEN]; - s8 term[1]; + char data[SCE_NP_SCORE_COMMENT_MAXLEN]; + char term[1]; }; // Ranking information structure @@ -1524,15 +1524,15 @@ struct SceNpScoreNpIdPcId // Basic clan information to be used in raking struct SceNpScoreClanBasicInfo { - s8 clanName[SCE_NP_CLANS_CLAN_NAME_MAX_LENGTH + 1]; - s8 clanTag[SCE_NP_CLANS_CLAN_TAG_MAX_LENGTH + 1]; + char clanName[SCE_NP_CLANS_CLAN_NAME_MAX_LENGTH + 1]; + char clanTag[SCE_NP_CLANS_CLAN_TAG_MAX_LENGTH + 1]; u8 reserved[10]; }; // Clan member information handled in ranking struct SceNpScoreClansMemberDescription { - s8 description[SCE_NP_CLANS_CLAN_DESCRIPTION_MAX_LENGTH + 1]; + char description[SCE_NP_CLANS_CLAN_DESCRIPTION_MAX_LENGTH + 1]; }; // Clan ranking information From bbd91dad925e0a0bba6aed9092b3ecce47b03918 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Wed, 10 Dec 2025 09:48:18 +0200 Subject: [PATCH 310/630] SPU DisAsm: Disable unlikely float representations --- rpcs3/Emu/Cell/PPUDisAsm.cpp | 2 +- rpcs3/Emu/Cell/SPUDisAsm.h | 24 +++++++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUDisAsm.cpp b/rpcs3/Emu/Cell/PPUDisAsm.cpp index 484688ee12..ebfdffb5bc 100644 --- a/rpcs3/Emu/Cell/PPUDisAsm.cpp +++ b/rpcs3/Emu/Cell/PPUDisAsm.cpp @@ -330,7 +330,7 @@ void comment_constant(std::string& last_opcode, u64 value, bool print_float = fa // Comment constant formation fmt::append(last_opcode, " #0x%xh", value); - if (print_float && ((value >> 31) <= 1u || (value >> 31) == 0x1'ffff'ffffu)) + if (print_float && ((value >> 31) <= 1u || (value >> 31) == 0x1'ffff'ffffu) && (value > 0x3fffff && (value << 32 >> 32) < 0xffc00000)) { const f32 float_val = std::bit_cast(static_cast(value)); diff --git a/rpcs3/Emu/Cell/SPUDisAsm.h b/rpcs3/Emu/Cell/SPUDisAsm.h index 0d5862025b..5b1f097393 100644 --- a/rpcs3/Emu/Cell/SPUDisAsm.h +++ b/rpcs3/Emu/Cell/SPUDisAsm.h @@ -903,8 +903,14 @@ public: if (auto [is_const, value] = try_get_const_equal_value_array(+op.ra); is_const) { + if (value % 0x200 != 0) + { + // si10 is overwritten - likely an analysis mistake + return; + } + // Comment constant formation - comment_constant(last_opcode, value | static_cast(op.si10)); + comment_constant(last_opcode, value | static_cast(op.si10), false); } } void ORHI(spu_opcode_t op) @@ -941,8 +947,14 @@ public: if (auto [is_const, value] = try_get_const_equal_value_array(op.ra); is_const) { + if (value % 0x200 != 0) + { + // si10 is overwritten - likely an analysis mistake + return; + } + // Comment constant formation - comment_constant(last_opcode, value + static_cast(op.si10)); + comment_constant(last_opcode, value + static_cast(op.si10), false); } } void AHI(spu_opcode_t op) @@ -963,8 +975,14 @@ public: if (auto [is_const, value] = try_get_const_equal_value_array(op.ra); is_const) { + if (value % 0x200 != 0) + { + // si10 is overwritten - likely an analysis mistake + return; + } + // Comment constant formation - comment_constant(last_opcode, value ^ static_cast(op.si10)); + comment_constant(last_opcode, value ^ static_cast(op.si10), false); } } void XORHI(spu_opcode_t op) From f39d82f9906a1ce3b86d06c6fcb29d46eeaa9f99 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sun, 8 Feb 2026 14:53:45 +0200 Subject: [PATCH 311/630] SPU: Fix spu_itype::zregmod --- rpcs3/Emu/Cell/SPUAnalyser.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUAnalyser.h b/rpcs3/Emu/Cell/SPUAnalyser.h index 103c655a9e..123a629bed 100644 --- a/rpcs3/Emu/Cell/SPUAnalyser.h +++ b/rpcs3/Emu/Cell/SPUAnalyser.h @@ -51,22 +51,22 @@ struct spu_itype RDCH, RCHCNT, - BR, // branch_tag first + BR, // branch_tag first, zregmod_tag (2) first BRA, BRNZ, BRZ, BRHNZ, BRHZ, - BRSL, - BRASL, IRET, BI, BISLED, - BISL, BIZ, BINZ, BIHZ, - BIHNZ, // branch_tag last + BIHNZ, // zregmod_tag (2) last + BRSL, + BRASL, + BISL, // branch_tag last ILH, // constant_tag_first ILHU, @@ -245,7 +245,7 @@ struct spu_itype // Test for branch instruction friend constexpr bool operator &(type value, branch_tag) { - return value >= BR && value <= BIHNZ; + return value >= BR && value <= BISL; } // Test for floating point instruction @@ -299,7 +299,7 @@ struct spu_itype // Test for non register-modifying instruction friend constexpr bool operator &(type value, zregmod_tag) { - return value >= HEQ && value <= STQR; + return (value >= HEQ && value <= STQR) || (value >= BR && value <= BIHNZ); } }; From 16b05c930f71cc04af467206961efad5be1d1815 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Mon, 9 Feb 2026 21:50:38 +0200 Subject: [PATCH 312/630] Misc: Force define LLVM for IntelliSense --- rpcs3/stdafx.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rpcs3/stdafx.h b/rpcs3/stdafx.h index b1e768dc52..e2f04ca1b1 100644 --- a/rpcs3/stdafx.h +++ b/rpcs3/stdafx.h @@ -22,3 +22,7 @@ #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export + +#if defined(__INTELLISENSE__) && !defined(LLVM_AVAILABLE) +#define LLVM_AVAILABLE +#endif From 188151fa995048d5e63fb5f4b8356c17d249e563 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Wed, 18 Feb 2026 15:13:42 +0200 Subject: [PATCH 313/630] SPU/misc: Remove outdated Instruction statistics --- rpcs3/Emu/Cell/SPUCommonRecompiler.cpp | 102 ------------------------- rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 18 ++--- 2 files changed, 6 insertions(+), 114 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp index 4d04b13666..a930bdc548 100644 --- a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp @@ -1176,108 +1176,6 @@ void spu_cache::initialize(bool build_existing_cache) if ((g_cfg.core.spu_decoder == spu_decoder_type::asmjit || g_cfg.core.spu_decoder == spu_decoder_type::llvm) && !func_list.empty()) { spu_log.success("SPU Runtime: Built %u functions.", func_list.size()); - - if (g_cfg.core.spu_debug) - { - std::string dump; - dump.reserve(10'000'000); - - std::map, spu_program*, span_less> sorted; - - for (auto&& f : func_list) - { - // Interpret as a byte string - std::span data = {reinterpret_cast(f.data.data()), f.data.size() * sizeof(u32)}; - - sorted[data] = &f; - } - - std::unordered_set depth_n; - - u32 n_max = 0; - - for (auto&& [bytes, f] : sorted) - { - { - sha1_context ctx; - u8 output[20]; - - sha1_starts(&ctx); - sha1_update(&ctx, bytes.data(), bytes.size()); - sha1_finish(&ctx, output); - fmt::append(dump, "\n\t[%s] ", fmt::base57(output)); - } - - u32 depth_m = 0; - - for (auto&& [data, f2] : sorted) - { - u32 depth = 0; - - if (f2 == f) - { - continue; - } - - for (u32 i = 0; i < bytes.size(); i++) - { - if (i < data.size() && data[i] == bytes[i]) - { - depth++; - } - else - { - break; - } - } - - depth_n.emplace(depth); - depth_m = std::max(depth, depth_m); - } - - fmt::append(dump, "c=%06d,d=%06d ", depth_n.size(), depth_m); - - bool sk = false; - - for (u32 i = 0; i < std::min(bytes.size(), std::max(256, depth_m)); i++) - { - if (depth_m == i) - { - dump += '|'; - sk = true; - } - - fmt::append(dump, "%02x", bytes[i]); - - if (i % 4 == 3) - { - if (sk) - { - sk = false; - } - else - { - dump += ' '; - } - - dump += ' '; - } - } - - fmt::append(dump, "\n\t%49s", ""); - - for (u32 i = 0; i < std::min(f->data.size(), std::max(64, utils::aligned_div(depth_m, 4))); i++) - { - fmt::append(dump, "%-10s", g_spu_iname.decode(std::bit_cast>(f->data[i]))); - } - - n_max = std::max(n_max, ::size32(depth_n)); - - depth_n.clear(); - } - - spu_log.notice("SPU Cache Dump (max_c=%d): %s", n_max, dump); - } } // Initialize global cache instance diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index eb44289320..2e14b09517 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -2802,12 +2802,9 @@ public: std::string& llvm_log = function_log; raw_string_ostream out(llvm_log); - if (g_cfg.core.spu_debug) - { - fmt::append(llvm_log, "LLVM IR at 0x%x:\n", func.entry_point); - out << *_module; // print IR - out << "\n\n"; - } + fmt::append(llvm_log, "LLVM IR at 0x%x:\n", func.entry_point); + out << *_module; // print IR + out << "\n\n"; if (verifyModule(*_module, &out)) { @@ -3274,12 +3271,9 @@ public: std::string llvm_log; raw_string_ostream out(llvm_log); - if (g_cfg.core.spu_debug) - { - fmt::append(llvm_log, "LLVM IR (interpreter):\n"); - out << *_module; // print IR - out << "\n\n"; - } + fmt::append(llvm_log, "LLVM IR (interpreter):\n"); + out << *_module; // print IR + out << "\n\n"; if (verifyModule(*_module, &out)) { From 35ccd63dbc1cbefd7ee5a299340ed148ab9dd829 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Fri, 20 Feb 2026 17:57:33 +0200 Subject: [PATCH 314/630] Win32/File.cpp: Fix fs::file constraints to avoid crashes --- Utilities/File.cpp | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/Utilities/File.cpp b/Utilities/File.cpp index d2adb22c61..490605c792 100644 --- a/Utilities/File.cpp +++ b/Utilities/File.cpp @@ -117,6 +117,7 @@ static fs::error to_error(DWORD e) case ERROR_NEGATIVE_SEEK: return fs::error::inval; case ERROR_DIRECTORY: return fs::error::inval; case ERROR_INVALID_NAME: return fs::error::inval; + case ERROR_INVALID_FUNCTION: return fs::error::inval; case ERROR_SHARING_VIOLATION: return fs::error::acces; case ERROR_DIR_NOT_EMPTY: return fs::error::notempty; case ERROR_NOT_READY: return fs::error::noent; @@ -584,7 +585,7 @@ namespace fs if (!GetFileInformationByHandleEx(m_handle, FileIdInfo, &info, sizeof(info))) { // Try GetFileInformationByHandle as a fallback - BY_HANDLE_FILE_INFORMATION info2; + BY_HANDLE_FILE_INFORMATION info2{}; ensure(GetFileInformationByHandle(m_handle, &info2)); info = {}; @@ -1658,11 +1659,40 @@ fs::file::file(const std::string& path, bs_t mode) // Check if the handle is actually valid. // This can fail on empty mounted drives (e.g. with ERROR_NOT_READY or ERROR_INVALID_FUNCTION). - BY_HANDLE_FILE_INFORMATION info; + BY_HANDLE_FILE_INFORMATION info{}; if (!GetFileInformationByHandle(handle, &info)) { + const DWORD last_error = GetLastError(); CloseHandle(handle); - g_tls_error = to_error(GetLastError()); + + if (last_error == ERROR_INVALID_FUNCTION) + { + g_tls_error = fs::error::isdir; + return; + } + + g_tls_error = to_error(last_error); + return; + } + + if (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + CloseHandle(handle); + g_tls_error = fs::error::isdir; + return; + } + + if (info.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) + { + CloseHandle(handle); + g_tls_error = fs::error::acces; + return; + } + + if ((mode & fs::write) && (info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + { + CloseHandle(handle); + g_tls_error = fs::error::readonly; return; } @@ -2605,7 +2635,7 @@ bool fs::pending_file::commit(bool overwrite) while (file_handle != INVALID_HANDLE_VALUE) { // Get file ID (used to check for hardlinks) - BY_HANDLE_FILE_INFORMATION file_info; + BY_HANDLE_FILE_INFORMATION file_info{}; if (!GetFileInformationByHandle(file_handle, &file_info) || file_info.nNumberOfLinks == 1) { From 1ec3de9e8f0903843c253e80bec64529edc2e7d7 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sat, 21 Feb 2026 19:32:48 +0200 Subject: [PATCH 315/630] SPU Analyzer: Fix analysis of instructions without regmod --- rpcs3/Emu/Cell/SPUCommonRecompiler.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp index a930bdc548..b4a7945ff3 100644 --- a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp @@ -3603,6 +3603,11 @@ spu_program spu_recompiler_base::analyse(const be_t* ls, u32 entry_point, s default: { + if (type & spu_itype::zregmod) + { + break; + } + // Unconst const u32 op_rt = type & spu_itype::_quadrop ? +op.rt4 : +op.rt; m_regmod[pos / 4] = op_rt; From 45c6e938a5eee47f6e276b33463020866005d67d Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:50:37 +0200 Subject: [PATCH 316/630] SPU LLVM: Expand SPU Profiling to blocks --- rpcs3/Emu/CPU/CPUThread.cpp | 6 +----- rpcs3/Emu/Cell/SPUCommonRecompiler.cpp | 4 +++- rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 8 ++++++++ rpcs3/Emu/Cell/SPUThread.cpp | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index afec56f7e1..e37e6ed0da 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -206,11 +206,7 @@ struct cpu_prof // Print only 7 hash characters out of 11 (which covers roughly 48 bits) if (type_id == 2) { - fmt::append(results, "\n\t[%s", fmt::base57(be_t{name})); - results.resize(results.size() - 4); - - // Print chunk address from lowest 16 bits - fmt::append(results, "...chunk-0x%05x]: %.4f%% (%u)", (name & 0xffff) * 4, _frac * 100., count); + fmt::append(results, "\n\t[%s]: %.4f%% (%u)", spu_block_hash{name}, _frac * 100., count); } else { diff --git a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp index b4a7945ff3..1b6003036b 100644 --- a/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUCommonRecompiler.cpp @@ -7391,6 +7391,7 @@ void spu_recompiler_base::dump(const spu_program& result, std::string& out) SPUDisAsm dis_asm(cpu_disasm_mode::dump, reinterpret_cast(result.data.data()), result.lower_bound); std::string hash; + be_t hash_start{}; if (!result.data.empty()) { @@ -7401,6 +7402,7 @@ void spu_recompiler_base::dump(const spu_program& result, std::string& out) sha1_update(&ctx, reinterpret_cast(result.data.data()), result.data.size() * 4); sha1_finish(&ctx, output); fmt::append(hash, "%s", fmt::base57(output)); + std::memcpy(&hash_start, output, sizeof(hash_start)); } else { @@ -7413,7 +7415,7 @@ void spu_recompiler_base::dump(const spu_program& result, std::string& out) { if (m_block_info[bb.first / 4]) { - fmt::append(out, "A: [0x%05x] %s\n", bb.first, m_entry_info[bb.first / 4] ? (m_ret_info[bb.first / 4] ? "Chunk" : "Entry") : "Block"); + fmt::append(out, "A: [0x%05x] %s [%s]\n", bb.first, m_entry_info[bb.first / 4] ? (m_ret_info[bb.first / 4] ? "Chunk" : "Entry") : "Block", spu_block_hash{(hash_start & -65536) + bb.first / 4}); fmt::append(out, "\t F: 0x%05x\n", bb.second.func); diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 2e14b09517..d42acd3560 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -2160,6 +2160,14 @@ public: } } + if (bb.preds.size() >= 2) + { + if (g_cfg.core.spu_prof || g_cfg.core.spu_debug) + { + m_ir->CreateStore(m_ir->getInt64((m_hash_start & -65536) | (baddr >> 2)), spu_ptr(&spu_thread::block_hash)); + } + } + // State check at the beginning of the chunk if (need_check || (bi == 0 && g_cfg.core.spu_block_size != spu_block_size_type::safe)) { diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 7b70dcdbd2..b9a77d7696 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -164,7 +164,7 @@ void fmt_class_string::format(std::string& out, u64 arg) out.resize(out.size() - 4); // Print chunk address from lowest 16 bits - fmt::append(out, "...chunk-0x%05x", (arg & 0xffff) * 4); + fmt::append(out, "-0x%05x", (arg & 0xffff) * 4); } enum class spu_block_hash_short : u64{}; From 0f3275ec8241af5838690a1c6d9f4da8eddcb35b Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sat, 28 Feb 2026 09:14:34 +0200 Subject: [PATCH 317/630] sys_fs: Fixup op_read --- rpcs3/Emu/Cell/lv2/sys_fs.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.cpp b/rpcs3/Emu/Cell/lv2/sys_fs.cpp index 312754af8a..172dbc60b5 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_fs.cpp @@ -382,10 +382,12 @@ lv2_fs_object::lv2_fs_object(utils::serial& ar, bool) u64 lv2_file::op_read(const fs::file& file, vm::ptr buf, u64 size, u64 opt_pos) { - if (u64 region = buf.addr() >> 28, region_end = (buf.addr() + size) >> 28; region == region_end && region == 0) + if (u64 region = buf.addr() >> 28, region_end = (buf.addr() + size) >> 28; + size < u32{umax} && region == region_end && (region == 0 || region == 0xD) && vm::check_addr(buf.addr(), vm::page_writable, static_cast(size))) { // Optimize reads from safe memory - return (opt_pos == umax ? file.read(buf.get_ptr(), size) : file.read_at(opt_pos, buf.get_ptr(), size)); + const auto buf_ptr = vm::get_super_ptr(buf.addr()); + return (opt_pos == umax ? file.read(buf_ptr, size) : file.read_at(opt_pos, buf_ptr, size)); } // Copy data from intermediate buffer (avoid passing vm pointer to a native API) @@ -412,6 +414,14 @@ u64 lv2_file::op_read(const fs::file& file, vm::ptr buf, u64 size, u64 opt u64 lv2_file::op_write(const fs::file& file, vm::cptr buf, u64 size) { + if (u64 region = buf.addr() >> 28, region_end = (buf.addr() + size) >> 28; + size < u32{umax} && region == region_end && (region == 0 || region == 0xD) && vm::check_addr(buf.addr(), vm::page_readable, static_cast(size))) + { + // Optimize writes from safe memory + const auto buf_ptr = vm::get_super_ptr(buf.addr()); + return file.write(buf_ptr, size); + } + // Copy data to intermediate buffer (avoid passing vm pointer to a native API) std::vector local_buf(std::min(size, 65536)); From a9d4e1399a621bf5ed1087daf2a5d707a00153fb Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 25 Feb 2026 21:01:03 +0100 Subject: [PATCH 318/630] Update zlib to 1.3.2 --- 3rdparty/zlib/zlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/zlib/zlib b/3rdparty/zlib/zlib index 51b7f2abda..da607da739 160000 --- a/3rdparty/zlib/zlib +++ b/3rdparty/zlib/zlib @@ -1 +1 @@ -Subproject commit 51b7f2abdade71cd9bb0e7a373ef2610ec6f9daf +Subproject commit da607da739fa6047df13e66a2af6b8bec7c2a498 From 8cee5a33d0709ea2642b7353c026f421f4d5c3cf Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 25 Feb 2026 21:12:46 +0100 Subject: [PATCH 319/630] Fix some warnings --- rpcs3/Emu/NP/pb_helpers.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/NP/pb_helpers.cpp b/rpcs3/Emu/NP/pb_helpers.cpp index 83170426ff..3debd0ba20 100644 --- a/rpcs3/Emu/NP/pb_helpers.cpp +++ b/rpcs3/Emu/NP/pb_helpers.cpp @@ -532,8 +532,8 @@ namespace np if (!mi.msg().empty()) { - sce_mi->msgLen = ::narrow(mi.msg().size()); - auto* ptr_msg_data = static_cast(edata.allocate(mi.msg().size(), sce_mi->msg)); + sce_mi->msgLen = ::size32(mi.msg()); + auto* ptr_msg_data = static_cast(edata.allocate(::size32(mi.msg()), sce_mi->msg)); memcpy(ptr_msg_data, mi.msg().data(), mi.msg().size()); } } @@ -575,8 +575,8 @@ namespace np if (!resp.opt().empty()) { - room_status->opt_len = ::narrow(resp.opt().size()); - u8* opt_data = static_cast(edata.allocate(resp.opt().size(), room_status->opt)); + room_status->opt_len = ::size32(resp.opt()); + u8* opt_data = static_cast(edata.allocate(::size32(resp.opt()), room_status->opt)); memcpy(opt_data, resp.opt().data(), resp.opt().size()); } @@ -604,8 +604,8 @@ namespace np cur_attr->id = attr.attr_id(); if (!attr.data().empty()) { - cur_attr->value.data.size = ::narrow(attr.data().size()); - u8* data_ptr = static_cast(edata.allocate(attr.data().size(), cur_attr->value.data.ptr)); + cur_attr->value.data.size = ::size32(attr.data()); + u8* data_ptr = static_cast(edata.allocate(::size32(attr.data()), cur_attr->value.data.ptr)); memcpy(data_ptr, attr.data().data(), attr.data().size()); } else From b8f4aaa6fb6e5d1296ce982cb8bb1f5897ba0294 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 25 Feb 2026 21:14:08 +0100 Subject: [PATCH 320/630] Update SDL to 3.4.2 --- 3rdparty/libsdl-org/SDL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libsdl-org/SDL b/3rdparty/libsdl-org/SDL index a962f40bbb..683181b47c 160000 --- a/3rdparty/libsdl-org/SDL +++ b/3rdparty/libsdl-org/SDL @@ -1 +1 @@ -Subproject commit a962f40bbba175e9716557a25d5d7965f134a3d3 +Subproject commit 683181b47cfabd293e3ea409f838915b8297a4fd From 3624dac22b592439990c0e9560ed7ea4cc9d8b04 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 18:56:18 +0100 Subject: [PATCH 321/630] clans: remove unused struct --- rpcs3/Emu/NP/clans_client.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rpcs3/Emu/NP/clans_client.cpp b/rpcs3/Emu/NP/clans_client.cpp index e2d9fa9de0..c529d5ea38 100644 --- a/rpcs3/Emu/NP/clans_client.cpp +++ b/rpcs3/Emu/NP/clans_client.cpp @@ -128,12 +128,6 @@ void fmt_class_string::format(std::string& out, u64 arg namespace clan { - struct curl_memory - { - char* response; - size_t size; - }; - size_t clans_client::curl_write_callback(void* data, size_t size, size_t nmemb, void* clientp) { const size_t realsize = size * nmemb; From 37a125ddbdf1bb13e784ceec8dc7301df412847c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 18:56:35 +0100 Subject: [PATCH 322/630] clans: const correctness --- rpcs3/Emu/NP/np_handler.cpp | 6 +++--- rpcs3/Emu/NP/np_handler.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index 1fc9342329..f0cdc55ee2 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -254,7 +254,7 @@ namespace np // Trim null characters const auto& vec = node.data.data_vec; - auto it = std::find(vec.begin(), vec.end(), 0); + const auto it = std::find(vec.begin(), vec.end(), 0); return std::string(vec.begin(), it); } @@ -1375,12 +1375,12 @@ namespace np return history; } - u32 np_handler::get_clan_ticket_ready() + u32 np_handler::get_clan_ticket_ready() const { return clan_ticket_ready.load(); } - ticket np_handler::get_clan_ticket() + ticket np_handler::get_clan_ticket() const { clan_ticket_ready.wait(0, atomic_wait_timeout{60'000'000'000}); // 60 seconds diff --git a/rpcs3/Emu/NP/np_handler.h b/rpcs3/Emu/NP/np_handler.h index 9c02007a9c..62b69a73ac 100644 --- a/rpcs3/Emu/NP/np_handler.h +++ b/rpcs3/Emu/NP/np_handler.h @@ -257,8 +257,8 @@ namespace np // Misc stuff void req_ticket(u32 version, const SceNpId* npid, const char* service_id, const u8* cookie, u32 cookie_size, const char* entitlement_id, u32 consumed_count); const ticket& get_ticket() const; - u32 get_clan_ticket_ready(); - ticket get_clan_ticket(); + u32 get_clan_ticket_ready() const; + ticket get_clan_ticket() const; void add_player_to_history(const SceNpId* npid, const char* description); u32 add_players_to_history(const SceNpId* npids, const char* description, u32 count); u32 get_players_history_count(u32 options); From df5b624e451e16e43016f267d7deeab415d66593 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 18:56:49 +0100 Subject: [PATCH 323/630] clans: use std::move for ticket --- rpcs3/Emu/Cell/lv2/sys_fs.cpp | 2 +- rpcs3/Emu/NP/np_requests.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.cpp b/rpcs3/Emu/Cell/lv2/sys_fs.cpp index 172dbc60b5..ffd31227a8 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_fs.cpp @@ -900,7 +900,7 @@ lv2_file::open_raw_result_t lv2_file::open_raw(const std::string& local_path, s3 switch (auto error = fs::g_tls_error) { case fs::error::noent: return {CELL_ENOENT}; - default: sys_fs.error("lv2_file::open(): unknown error %s", error); + default: sys_fs.error("lv2_file::open(): unknown error %s", error); break; } return {CELL_EIO}; diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index ed7023cc89..cd18892277 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -920,19 +920,19 @@ namespace np ensure(!reply.is_error(), "Malformed reply to RequestTicket command"); auto incoming_ticket = ticket(std::move(ticket_raw)); - + // Clans: check if ticket belongs to the clan service. // If so, hijack the ticket and cache it for future use. if (incoming_ticket.get_service_id() == CLANS_SERVICE_ID) { - clan_ticket = incoming_ticket; + clan_ticket = std::move(incoming_ticket); clan_ticket_ready.store(1); clan_ticket_ready.notify_all(); - + return; } - current_ticket = incoming_ticket; + current_ticket = std::move(incoming_ticket); auto ticket_size = static_cast(current_ticket.size()); if (manager_cb) From 198c2e9eb835dbe95c674ad8c98138fb080f1ff4 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 28 Feb 2026 12:36:43 +0100 Subject: [PATCH 324/630] Qt: attempt to download up to 3 times on return_code -255 --- rpcs3/rpcs3qt/downloader.cpp | 37 ++++++++++++++++++++++++-- rpcs3/rpcs3qt/downloader.h | 3 ++- rpcs3/rpcs3qt/game_compatibility.cpp | 15 ++++------- rpcs3/rpcs3qt/patch_manager_dialog.cpp | 4 +-- rpcs3/rpcs3qt/update_manager.cpp | 4 +-- rpcs3/rpcs3qt/update_manager.h | 16 +++++------ 6 files changed, 54 insertions(+), 25 deletions(-) diff --git a/rpcs3/rpcs3qt/downloader.cpp b/rpcs3/rpcs3qt/downloader.cpp index ae97dc8f77..39078c880d 100644 --- a/rpcs3/rpcs3qt/downloader.cpp +++ b/rpcs3/rpcs3qt/downloader.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "downloader.h" #include "curl_handle.h" @@ -7,6 +8,8 @@ #include "util/logs.hpp" +#include + LOG_CHANNEL(network_log, "NET"); usz curl_write_cb_compat(char* ptr, usz /*size*/, usz nmemb, void* userdata) @@ -31,7 +34,7 @@ downloader::~downloader() } } -void downloader::start(const std::string& url, bool follow_location, bool show_progress_dialog, const QString& progress_dialog_title, bool keep_progress_dialog_open, int expected_size) +void downloader::start(const std::string& url, bool follow_location, bool show_progress_dialog, const QString& progress_dialog_title, bool keep_progress_dialog_open, int expected_size, bool check_return_code, bool again) { network_log.notice("Starting download from URL: %s", url); @@ -49,6 +52,21 @@ void downloader::start(const std::string& url, bool follow_location, bool show_p m_curl_buf.clear(); m_curl_abort = false; + if (again) + { + m_download_attempts++; + + if (m_progress_dialog && m_download_attempts > 1) + { + handle_buffer_update(0, 100); + m_progress_dialog->setLabelText(tr("Please wait... Trying again")); + } + } + else + { + m_download_attempts = 1; + } + CURLcode err = curl_easy_setopt(m_curl->get_curl(), CURLOPT_URL, url.c_str()); if (err != CURLE_OK) network_log.error("curl_easy_setopt(CURLOPT_URL, %s) error: %s", url, curl_easy_strerror(err)); @@ -77,7 +95,7 @@ void downloader::start(const std::string& url, bool follow_location, bool show_p } }); - connect(m_thread, &QThread::finished, this, [this]() + connect(m_thread, &QThread::finished, this, [=, this]() { if (m_curl_abort) { @@ -93,6 +111,21 @@ void downloader::start(const std::string& url, bool follow_location, bool show_p if (m_curl_success) { network_log.notice("Download finished"); + + if (check_return_code && m_download_attempts < 3) + { + const QJsonObject json_data = QJsonDocument::fromJson(m_curl_buf).object(); + const int return_code = json_data["return_code"].toInt(-255); + + if (return_code == -255) + { + network_log.error("Error during download. Trying to download again (attempts=%d, return_code=%d)", m_download_attempts, return_code); + std::this_thread::sleep_for(500ms); // Wait for a little while + start(url, follow_location, show_progress_dialog, progress_dialog_title, keep_progress_dialog_open, expected_size, check_return_code, true); + return; + } + } + Q_EMIT signal_download_finished(m_curl_buf); } }); diff --git a/rpcs3/rpcs3qt/downloader.h b/rpcs3/rpcs3qt/downloader.h index 5a2a44fabe..be0cd0e568 100644 --- a/rpcs3/rpcs3qt/downloader.h +++ b/rpcs3/rpcs3qt/downloader.h @@ -21,7 +21,7 @@ public: explicit downloader(QWidget* parent = nullptr); ~downloader(); - void start(const std::string& url, bool follow_location, bool show_progress_dialog, const QString& progress_dialog_title = "", bool keep_progress_dialog_open = false, int expected_size = -1); + void start(const std::string& url, bool follow_location, bool show_progress_dialog, const QString& progress_dialog_title = "", bool keep_progress_dialog_open = false, int expected_size = -1, bool check_return_code = true, bool again = false); usz update_buffer(char* data, usz size); void update_progress_dialog(const QString& title) const; @@ -46,6 +46,7 @@ private: atomic_t m_curl_abort = false; atomic_t m_curl_success = false; double m_actual_download_size = -1.0; + u32 m_download_attempts = 0; progress_dialog* m_progress_dialog = nullptr; atomic_t m_keep_progress_dialog_open = false; diff --git a/rpcs3/rpcs3qt/game_compatibility.cpp b/rpcs3/rpcs3qt/game_compatibility.cpp index 2845659716..b9cb32a7c1 100644 --- a/rpcs3/rpcs3qt/game_compatibility.cpp +++ b/rpcs3/rpcs3qt/game_compatibility.cpp @@ -69,7 +69,7 @@ void game_compatibility::handle_download_canceled() bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_download) { - const int return_code = json_data["return_code"].toInt(); + const int return_code = json_data["return_code"].toInt(-255); if (return_code < 0) { @@ -78,15 +78,10 @@ bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_downl std::string error_message; switch (return_code) { - case -1: - error_message = "Server Error - Internal Error"; - break; - case -2: - error_message = "Server Error - Maintenance Mode"; - break; - default: - error_message = "Server Error - Unknown Error"; - break; + case -1: error_message = "Server Error - Internal Error"; break; + case -2: error_message = "Server Error - Maintenance Mode"; break; + case -255: error_message = "Server Error - Return code not found"; break; + default: error_message = "Server Error - Unknown Error"; break; } compat_log.error("%s: return code %d", error_message, return_code); Q_EMIT DownloadError(QString::fromStdString(error_message) + " " + QString::number(return_code)); diff --git a/rpcs3/rpcs3qt/patch_manager_dialog.cpp b/rpcs3/rpcs3qt/patch_manager_dialog.cpp index 227a4a3a47..a41d8ed7b5 100644 --- a/rpcs3/rpcs3qt/patch_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/patch_manager_dialog.cpp @@ -1184,9 +1184,9 @@ bool patch_manager_dialog::handle_json(const QByteArray& data) } if (return_code != -1) - patch_log.error("Patch download error: %s return code: %d", error_message, return_code); + patch_log.error("Patch download error: %s, return code: %d", error_message, return_code); else - patch_log.warning("Patch download error: %s return code: %d", error_message, return_code); + patch_log.warning("Patch download error: %s, return code: %d", error_message, return_code); return false; } diff --git a/rpcs3/rpcs3qt/update_manager.cpp b/rpcs3/rpcs3qt/update_manager.cpp index 6929e08318..ec4d7ce44f 100644 --- a/rpcs3/rpcs3qt/update_manager.cpp +++ b/rpcs3/rpcs3qt/update_manager.cpp @@ -135,9 +135,9 @@ bool update_manager::handle_json(bool automatic, bool check_only, bool auto_acce } if (return_code != -1) - update_log.error("Update error: %s return code: %d", error_message, return_code); + update_log.error("Update error: %s, return code: %d", error_message, return_code); else - update_log.warning("Update error: %s return code: %d", error_message, return_code); + update_log.warning("Update error: %s, return code: %d", error_message, return_code); // If a user clicks "Check for Updates" with a custom build ask him if he's sure he wants to update to latest version if (!automatic && return_code == -1) diff --git a/rpcs3/rpcs3qt/update_manager.h b/rpcs3/rpcs3qt/update_manager.h index 8e7d9e8eb0..98ef5cf3f1 100644 --- a/rpcs3/rpcs3qt/update_manager.h +++ b/rpcs3/rpcs3qt/update_manager.h @@ -13,6 +13,14 @@ class update_manager final : public QObject { Q_OBJECT +public: + update_manager(QObject* parent, std::shared_ptr gui_settings); + void check_for_updates(bool automatic, bool check_only, bool auto_accept, QWidget* parent = nullptr); + void update(bool auto_accept); + +Q_SIGNALS: + void signal_update_available(bool update_available); + private: downloader* m_downloader = nullptr; QWidget* m_parent = nullptr; @@ -45,12 +53,4 @@ private: bool handle_json(bool automatic, bool check_only, bool auto_accept, const QByteArray& data); bool handle_rpcs3(const QByteArray& data, bool auto_accept); - -public: - update_manager(QObject* parent, std::shared_ptr gui_settings); - void check_for_updates(bool automatic, bool check_only, bool auto_accept, QWidget* parent = nullptr); - void update(bool auto_accept); - -Q_SIGNALS: - void signal_update_available(bool update_available); }; From 5ca19eabd548d517b8834e2aa3e08ab90e8d9ebf Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 28 Feb 2026 18:55:31 +0100 Subject: [PATCH 325/630] NP code review sceNpTrophy fixes - sceNpTrophyGetTrophyUnlockState: signed 1 was potentially shifted by 31(UB) - sceNpTrophyUnlockTrophy: used a reader_lock and was missing check for read only context cellGame fixes - cellHddGameCheck: missing log parameters - cellGameDataCheckCreate2: missing log parameter - cellGameThemeInstall: condition inverted checking for extension + added tolower just in case - cellGameThemeInstallFromBuffer: OOB access, buf is always filled from the start and then used as a parameter to the CB sceNp fixes - sceNpManagerGetTicket: Made accurate from RE - sceNpDrmGetTimelimit: Fix msec calculation sceNp2 fixes -sceNpMatching2ContextStartAsync: avoid capturing ctx -sceNpMatching2ContextStop: Minor error value swap rpcn_client fixes -add_friend: missing log parameter -handle_friend_notification: misc validation issue np_handler fixes -ticket: Missing move in move constructor -ticket::parse: Misc validation fix -get_player_history_entry: potential UB fix np_requests fixes -Wrong CB event_type set for get_room_member_data_external_list! -reply_tus_get_data was not copying status data! -Order of error check in reply_get_room_member_data_external_list was wrong -Improved logging np_requests_gui: -Added missing guards for gui_notifications upnp_handler fixes -Highest density of bugs per line of code in the west, let's pretend I never wrote this signaling_handler fixes -Swapped to multimap to avoid collisions on timestamps Misc fixes --- Utilities/bin_patch.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellGame.cpp | 12 ++--- rpcs3/Emu/Cell/Modules/sceNp.cpp | 15 +++--- rpcs3/Emu/Cell/Modules/sceNp2.cpp | 4 +- rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp | 8 ++-- rpcs3/Emu/NP/np_handler.cpp | 15 +++--- rpcs3/Emu/NP/np_helpers.cpp | 4 +- rpcs3/Emu/NP/np_helpers.h | 2 +- rpcs3/Emu/NP/np_notifications.cpp | 3 ++ rpcs3/Emu/NP/np_requests.cpp | 64 ++++++++++++++------------ rpcs3/Emu/NP/np_requests_gui.cpp | 27 ++++++++--- rpcs3/Emu/NP/rpcn_client.cpp | 4 +- rpcs3/Emu/NP/signaling_handler.cpp | 1 + rpcs3/Emu/NP/signaling_handler.h | 2 +- rpcs3/Emu/NP/upnp_handler.cpp | 35 +++++++------- rpcs3/Emu/NP/upnp_handler.h | 2 +- 16 files changed, 111 insertions(+), 89 deletions(-) diff --git a/Utilities/bin_patch.cpp b/Utilities/bin_patch.cpp index 9449d808c0..fd94b830e0 100644 --- a/Utilities/bin_patch.cpp +++ b/Utilities/bin_patch.cpp @@ -329,7 +329,7 @@ bool patch_engine::load(patch_map& patches_map, const std::string& path, std::st is_valid = false; continue; } - else if (serial.size() != 9 || !std::all_of(serial.begin(), serial.end(), [](char c) { return std::isalnum(c); })) + else if (serial.size() != 9 || !std::all_of(serial.begin(), serial.end(), [](char c) { return std::isalnum(static_cast(c)); })) { append_log_message(log_messages, fmt::format("Error: Serial '%s' invalid (patch: %s, key: %s, location: %s, file: %s)", serial, description, main_key, get_yaml_node_location(serial_node), path), &patch_log.error); is_valid = false; diff --git a/rpcs3/Emu/Cell/Modules/cellGame.cpp b/rpcs3/Emu/Cell/Modules/cellGame.cpp index 371aa2a7b3..51e5ed6a33 100644 --- a/rpcs3/Emu/Cell/Modules/cellGame.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGame.cpp @@ -492,8 +492,8 @@ error_code cellHddGameCheck(ppu_thread& ppu, u32 version, vm::cptr dirName strcpy_trunc(get->getParam.titleLang[i], psf::get_string(psf, fmt::format("TITLE_%02d", i))); } - cellGame.warning("cellHddGameCheck(): Data exists:\nATTRIBUTE: 0x%x, RESOLUTION: 0x%x, RESOLUTION: 0x%x, SOUND_FORMAT: 0x%x, dataVersion: %s" - , get->getParam.attribute, get->getParam.resolution, get->getParam.soundFormat, get->getParam.soundFormat, std::span(reinterpret_cast(get->getParam.dataVersion), 6)); + cellGame.warning("cellHddGameCheck(): Data exists:\nATTRIBUTE: 0x%x, RESOLUTION: 0x%x, SOUND_FORMAT: 0x%x, dataVersion: %s" + , get->getParam.attribute, get->getParam.resolution, get->getParam.soundFormat, std::span(reinterpret_cast(get->getParam.dataVersion), 6)); } // TODO ? @@ -580,7 +580,7 @@ error_code cellHddGameCheck(ppu_thread& ppu, u32 version, vm::cptr dirName break; default: - cellGame.error("cellHddGameCheck(): callback returned unknown error (code=0x%x). Error message: %s", result->invalidMsg); + cellGame.error("cellHddGameCheck(): callback returned unknown error (code=0x%x). Error message: %s", result->result, result->invalidMsg); error_msg = get_localized_string(localized_string_id::CELL_HDD_GAME_CHECK_INVALID, "%s", result->invalidMsg); break; } @@ -1199,7 +1199,7 @@ error_code cellGameDataCheckCreate2(ppu_thread& ppu, u32 version, vm::cptr break; default: - cellGame.error("cellGameDataCheckCreate2(): callback returned unknown error (code=0x%x). Error message: %s", cbResult->invalidMsg); + cellGame.error("cellGameDataCheckCreate2(): callback returned unknown error (code=0x%x). Error message: %s", cbResult->result, cbResult->invalidMsg); error_msg = get_localized_string(localized_string_id::CELL_GAMEDATA_CHECK_INVALID, "%s", cbResult->invalidMsg); break; } @@ -1747,7 +1747,7 @@ error_code cellGameThemeInstall(vm::cptr usrdirPath, vm::cptr fileNa { u32 magic{}; - if (src_path.ends_with(".p3t") || !theme.read(magic) || magic != "P3TF"_u32) + if (!fmt::to_lower(src_path).ends_with(".p3t") || !theme.read(magic) || magic != "P3TF"_u32) { return CELL_GAME_ERROR_INVALID_THEME_FILE; } @@ -1819,7 +1819,7 @@ error_code cellGameThemeInstallFromBuffer(ppu_thread& ppu, u32 fileSize, u32 buf const u32 read_size = std::min(bufSize, fileSize - file_offset); cellGame.notice("cellGameThemeInstallFromBuffer: writing %d bytes at pos %d", read_size, file_offset); - if (theme.write(reinterpret_cast(buf.get_ptr()) + file_offset, read_size) != read_size) + if (theme.write(reinterpret_cast(buf.get_ptr()), read_size) != read_size) { cellGame.error("cellGameThemeInstallFromBuffer: failed to write to destination file '%s' (error=%s)", dst_path, fs::g_tls_error); diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index 3eee01cf9a..e82491eac1 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -871,7 +871,7 @@ error_code sceNpDrmGetTimelimit(vm::cptr path, vm::ptr time_remain) } // Convert time to milliseconds - s64 msec = *sec * 1000ll + *nsec / 1000ll; + s64 msec = *sec * 1000ll + *nsec / 1'000'000ll; // Return the remaining time in microseconds if (npd.activate_time != 0 && msec < npd.activate_time) @@ -4242,19 +4242,16 @@ error_code sceNpManagerGetTicket(vm::ptr buffer, vm::ptr bufferSize) } const auto& ticket = nph.get_ticket(); - *bufferSize = static_cast(ticket.size()); if (!buffer) { + *bufferSize = static_cast(ticket.size()); return CELL_OK; } - if (*bufferSize < ticket.size()) - { - return SCE_NP_ERROR_INVALID_ARGUMENT; - } - - memcpy(buffer.get_ptr(), ticket.data(), ticket.size()); + const u32 size_read = std::min(::size32(ticket), static_cast(*bufferSize)); + std::memcpy(buffer.get_ptr(), ticket.data(), size_read); + *bufferSize = size_read; return CELL_OK; } @@ -5676,7 +5673,7 @@ error_code scenp_score_record_score(s32 transId, SceNpScoreBoardId boardId, SceN else { data = &gameInfo->nativeData[0]; - data_size = 64; + data_size = sizeof(gameInfo->nativeData); } nph.record_score(trans_ctx, boardId, score, scoreComment, data, data_size, tmpRank, async); diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index c9816b60f5..7809676078 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -1135,7 +1135,7 @@ error_code sceNpMatching2ContextStartAsync(SceNpMatching2ContextId ctxId, u32 ti { sysutil_register_cb([=, context_callback = ctx->context_callback, context_callback_param = ctx->context_callback_param](ppu_thread& cb_ppu) -> s32 { - context_callback(cb_ppu, ctxId, SCE_NP_MATCHING2_CONTEXT_EVENT_Start, SCE_NP_MATCHING2_EVENT_CAUSE_CONTEXT_ACTION, 0, ctx->context_callback_param); + context_callback(cb_ppu, ctxId, SCE_NP_MATCHING2_CONTEXT_EVENT_Start, SCE_NP_MATCHING2_EVENT_CAUSE_CONTEXT_ACTION, 0, context_callback_param); return 0; }); } @@ -1760,7 +1760,7 @@ error_code sceNpMatching2ContextStop(SceNpMatching2ContextId ctxId) const auto ctx = get_match2_context(ctxId); if (!ctx) - return SCE_NP_MATCHING2_ERROR_INVALID_CONTEXT_ID; + return SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_FOUND; if (!ctx->started.compare_and_swap_test(1, 0)) return SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_STARTED; diff --git a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp index 803d174549..866db860ec 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp @@ -1026,14 +1026,14 @@ error_code sceNpTrophyUnlockTrophy(ppu_thread& ppu, u32 context, u32 handle, s32 auto& trophy_manager = g_fxo->get(); - reader_lock lock(trophy_manager.mtx); + std::scoped_lock lock(trophy_manager.mtx); if (!trophy_manager.is_initialized) { return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; } - const auto [ctxt, error] = trophy_manager.get_context_ex(context, handle); + const auto [ctxt, error] = trophy_manager.get_context_ex(context, handle, true); if (error) { @@ -1184,9 +1184,9 @@ error_code sceNpTrophyGetTrophyUnlockState(u32 context, u32 handle, vm::ptrGetTrophyUnlockState(id)) - flags->flag_bits[id / 32] |= 1 << (id % 32); + flags->flag_bits[id / 32] |= 1u << (id % 32); else - flags->flag_bits[id / 32] &= ~(1 << (id % 32)); + flags->flag_bits[id / 32] &= ~(1u << (id % 32)); } return CELL_OK; diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index f0cdc55ee2..f1fda0752c 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -111,7 +111,7 @@ namespace np } ticket::ticket(std::vector&& raw_data) - : raw_data(raw_data) + : raw_data(std::move(raw_data)) { parse(); } @@ -387,7 +387,7 @@ namespace np return; } - if (nodes[0].id != 0x3000 && nodes[1].id != 0x3002) + if (nodes[0].id != 0x3000 || nodes[1].id != 0x3002) { ticket_log.error("The 2 blobs ids are incorrect"); return; @@ -1467,14 +1467,13 @@ namespace np if (all_history) { + if (index >= players_history.size()) + return false; + auto it = players_history.begin(); std::advance(it, index); - - if (it != players_history.end()) - { - string_to_npid(it->first, *npid); - return true; - } + string_to_npid(it->first, *npid); + return true; } else { diff --git a/rpcs3/Emu/NP/np_helpers.cpp b/rpcs3/Emu/NP/np_helpers.cpp index 39c59afdb0..9d651693d9 100644 --- a/rpcs3/Emu/NP/np_helpers.cpp +++ b/rpcs3/Emu/NP/np_helpers.cpp @@ -20,7 +20,7 @@ namespace np return std::string(ip_str); } - std::string ether_to_string(std::array& ether) + std::string ether_to_string(const std::array& ether) { return fmt::format("%02X:%02X:%02X:%02X:%02X:%02X", ether[0], ether[1], ether[2], ether[3], ether[4], ether[5]); } @@ -110,7 +110,7 @@ namespace np bool is_valid_npid(const SceNpId& npid) { - if (!std::all_of(npid.handle.data, npid.handle.data + 16, [](char c) { return std::isalnum(c) || c == '-' || c == '_' || c == 0; } ) + if (!std::all_of(npid.handle.data, npid.handle.data + 16, [](char c) { return std::isalnum(static_cast(c)) || c == '-' || c == '_' || c == 0; } ) || npid.handle.data[16] != 0 || !std::all_of(npid.handle.dummy, npid.handle.dummy + 3, [](char val) { return val == 0; }) ) { diff --git a/rpcs3/Emu/NP/np_helpers.h b/rpcs3/Emu/NP/np_helpers.h index a51499ca64..d9e2a9d076 100644 --- a/rpcs3/Emu/NP/np_helpers.h +++ b/rpcs3/Emu/NP/np_helpers.h @@ -7,7 +7,7 @@ namespace np { std::string ip_to_string(u32 addr); - std::string ether_to_string(std::array& ether); + std::string ether_to_string(const std::array& ether); bool validate_communication_id(const SceNpCommunicationId& com_id); std::string communication_id_to_string(const SceNpCommunicationId& communicationId); std::optional string_to_communication_id(std::string_view str); diff --git a/rpcs3/Emu/NP/np_notifications.cpp b/rpcs3/Emu/NP/np_notifications.cpp index 6d6d511ee0..9b64882f0f 100644 --- a/rpcs3/Emu/NP/np_notifications.cpp +++ b/rpcs3/Emu/NP/np_notifications.cpp @@ -381,7 +381,10 @@ namespace np auto ctx = get_matching_context(ctx_id); if (!ctx) + { + np_memory.free(edata.addr()); return; + } gui_cache.add_room(room_info->room_status.id); diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index cd18892277..d9dd6dc337 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -191,7 +191,7 @@ namespace np case rpcn::ErrorType::RoomGroupMaxSlotMismatch: error_code = SCE_NP_MATCHING2_SERVER_ERROR_MAX_OVER_SLOT_GROUP; break; case rpcn::ErrorType::RoomPasswordMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_PASSWORD; break; case rpcn::ErrorType::RoomGroupNoJoinLabel: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_JOIN_GROUP_LABEL; break; - default: fmt::throw_exception("Unexpected error in reply to CreateRoom: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to CreateRoom: %s", error); } if (error_code != CELL_OK) @@ -262,7 +262,7 @@ namespace np case rpcn::ErrorType::RoomPasswordMismatch: error_code = SCE_NP_MATCHING2_SERVER_ERROR_PASSWORD_MISMATCH; break; case rpcn::ErrorType::RoomGroupFull: error_code = SCE_NP_MATCHING2_SERVER_ERROR_GROUP_FULL; break; case rpcn::ErrorType::RoomGroupJoinLabelNotFound: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_GROUP; break; - default: fmt::throw_exception("Unexpected error in reply to JoinRoom: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to JoinRoom: %s", error); } if (error_code != 0) @@ -348,7 +348,7 @@ namespace np case rpcn::ErrorType::NoError: break; case rpcn::ErrorType::NotFound: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; // Unsure if this should return another error(missing user in room has no appropriate error code) case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; - default: fmt::throw_exception("Unexpected error in reply to LeaveRoom: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to LeaveRoom: %s", error); } if (error_code != CELL_OK) @@ -447,7 +447,7 @@ namespace np u32 np_handler::get_room_member_data_external_list(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetRoomMemberDataExternalListRequest* req) { - const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetRoomDataExternalList, true); + const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetRoomMemberDataExternalList, true); if (!get_rpcn()->get_room_member_data_external_list(req_id, get_match2_context(ctx_id)->communicationId, req->roomId)) { @@ -465,13 +465,18 @@ namespace np if (!cb_info_opt) return; - ensure(error == rpcn::ErrorType::NoError, "Unexpected error in GetRoomMemberDataExternalList reply"); - - if (error == rpcn::ErrorType::RoomMissing) + switch (error) + { + case rpcn::ErrorType::NoError: + break; + case rpcn::ErrorType::RoomMissing: { cb_info_opt->queue_callback(req_id, 0, SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM, 0); return; } + default: + fmt::throw_exception("Unexpected error in GetRoomMemberDataExternalList reply: %s", error); + } const auto resp = reply.get_protobuf(); ensure(!reply.is_error(), "Malformed reply to GetRoomMemberDataExternalList command"); @@ -518,7 +523,7 @@ namespace np case rpcn::ErrorType::NoError: break; case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; case rpcn::ErrorType::Unauthorized: error_code = SCE_NP_MATCHING2_SERVER_ERROR_FORBIDDEN; break; - default: fmt::throw_exception("Unexpected error in reply to SetRoomDataExternal: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to SetRoomDataExternal: %s", error); } cb_info_opt->queue_callback(req_id, 0, error_code, 0); @@ -550,7 +555,7 @@ namespace np { case rpcn::ErrorType::NoError: break; case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; - default: fmt::throw_exception("Unexpected error in reply to GetRoomDataInternal: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to GetRoomDataInternal: %s", error); } if (error_code != CELL_OK) @@ -606,7 +611,7 @@ namespace np { case rpcn::ErrorType::NoError: break; case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; - default: fmt::throw_exception("Unexpected error in reply to GetRoomDataInternal: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to SetRoomDataInternal: %s", error); } cb_info_opt->queue_callback(req_id, 0, error_code, 0); @@ -640,7 +645,7 @@ namespace np case rpcn::ErrorType::NoError: break; case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; case rpcn::ErrorType::NotFound: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_USER; break; - default: fmt::throw_exception("Unexpected error in reply to GetRoomMemberDataInternal: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to GetRoomMemberDataInternal: %s", error); } if (error_code != CELL_OK) @@ -694,7 +699,7 @@ namespace np case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; case rpcn::ErrorType::NotFound: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_USER; break; case rpcn::ErrorType::Unauthorized: error_code = SCE_NP_MATCHING2_SERVER_ERROR_FORBIDDEN; break; - default: fmt::throw_exception("Unexpected error in reply to SetRoomMemberDataInternal: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to SetRoomMemberDataInternal: %s", error); } cb_info_opt->queue_callback(req_id, 0, error_code, 0); @@ -723,7 +728,7 @@ namespace np switch (error) { case rpcn::ErrorType::NoError: break; - default: fmt::throw_exception("Unexpected error in reply to SetUserInfo: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to SetUserInfo: %s", error); } cb_info_opt->queue_callback(req_id, 0, 0, 0); @@ -755,7 +760,7 @@ namespace np { case rpcn::ErrorType::NoError: break; case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; - default: fmt::throw_exception("Unexpected error in reply to PingRoomOwner: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to PingRoomOwner: %s", error); } if (error_code != CELL_OK) @@ -803,7 +808,7 @@ namespace np case rpcn::ErrorType::NoError: break; case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; case rpcn::ErrorType::Unauthorized: error_code = SCE_NP_MATCHING2_SERVER_ERROR_FORBIDDEN; break; - default: fmt::throw_exception("Unexpected error in reply to SendRoomMessage: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to SendRoomMessage: %s", error); } cb_info_opt->queue_callback(req_id, 0, error_code, 0); @@ -841,7 +846,7 @@ namespace np rpcn_log.error("Signaling information was requested for a user that doesn't exist or is not online"); return; } - default: fmt::throw_exception("Unexpected error in reply to RequestSignalingInfos: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to RequestSignalingInfos: %s", error); } const auto resp = reply.get_protobuf(); @@ -861,9 +866,7 @@ namespace np const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetLobbyInfoList, false); auto cb_info_opt = take_pending_request(req_id); - - if (!cb_info_opt) - return true; + ensure (cb_info_opt); const u32 event_key = get_event_key(); @@ -1017,7 +1020,7 @@ namespace np { case rpcn::ErrorType::NoError: break; case rpcn::ErrorType::NotFound: error_code = SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_BOARD_MASTER_NOT_FOUND; break; - default: fmt::throw_exception("Unexpected error in reply to GetBoardInfos: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to GetBoardInfos: %s", error); } if (error_code != CELL_OK) @@ -1091,7 +1094,7 @@ namespace np score_trans->wake_cond.notify_one(); return; } - default: fmt::throw_exception("Unexpected error in reply_record_score: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply_record_score: %s", error); } auto tmp_rank = reply.get(); @@ -1154,7 +1157,7 @@ namespace np case rpcn::ErrorType::NotFound: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_STORE_NOT_FOUND); break; case rpcn::ErrorType::ScoreInvalid: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_SCORE); break; case rpcn::ErrorType::ScoreHasData: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_GAME_DATA_ALREADY_EXISTS); break; - default: fmt::throw_exception("Unexpected error in reply to RecordScoreData: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to RecordScoreData: %s", error); } } @@ -1207,7 +1210,7 @@ namespace np { case rpcn::ErrorType::NoError: break; case rpcn::ErrorType::NotFound: score_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_GAME_DATA_MASTER_NOT_FOUND); return; - default: fmt::throw_exception("Unexpected error in reply to GetScoreData: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to GetScoreData: %s", error); } auto* tdata = std::get_if(&score_trans->tdata); @@ -1287,7 +1290,7 @@ namespace np switch (error) { case rpcn::ErrorType::NoError: break; - default: fmt::throw_exception("Unexpected error in GetScoreResponse: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in GetScoreResponse: %s", error); } const auto resp = reply.get_protobuf(); @@ -1476,7 +1479,7 @@ namespace np case rpcn::ErrorType::NotFound: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); break; case rpcn::ErrorType::Unauthorized: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); break; case rpcn::ErrorType::CondFail: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); break; - default: fmt::throw_exception("Unexpected error in handle_tus_no_data: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in handle_tus_no_data: %s", error); } } @@ -1499,7 +1502,7 @@ namespace np case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); - default: fmt::throw_exception("Unexpected error in handle_TusVarResponse: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in handle_TusVarResponse: %s", error); } const auto resp = reply.get_protobuf(); @@ -1555,7 +1558,7 @@ namespace np case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); - default: fmt::throw_exception("Unexpected error in handle_TusVariable: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in handle_TusVariable: %s", error); } auto pb_var = reply.get_protobuf(); @@ -1603,7 +1606,7 @@ namespace np case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); - default: fmt::throw_exception("Unexpected error in handle_TusDataStatusResponse: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in handle_TusDataStatusResponse: %s", error); } const auto resp = reply.get_protobuf(); @@ -1803,7 +1806,7 @@ namespace np if (!tdata) { trans_ctx->tdata = tdata_tus_get_data{.recvSize = recvSize, .dataStatus = dataStatus, .data = data}; - const u32 req_id = get_req_id(REQUEST_ID_HIGH::SCORE); + const u32 req_id = get_req_id(REQUEST_ID_HIGH::TUS); get_rpcn()->tus_get_data(req_id, trans_ctx->communicationId, targetNpId, slotId, vuser); transaction_async_handler(std::move(lock), trans_ctx, req_id, async); return; @@ -1844,7 +1847,7 @@ namespace np case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); - default: fmt::throw_exception("Unexpected error in reply to TusGetData: %d", static_cast(error)); + default: fmt::throw_exception("Unexpected error in reply to TusGetData: %s", error); } auto pb_data = reply.get_protobuf(); @@ -1870,6 +1873,7 @@ namespace np data_status->data = tdata->data; data_status->dataSize = ::narrow(pb_data->data().size()); data_status->info.infoSize = ::narrow(pb_status.info().size()); + memcpy(data_status->info.data, pb_data->status().info().data(), std::min(pb_data->status().info().size(), sizeof(data_status->info.data))); const u32 to_copy = std::min(data_status->dataSize, tdata->recvSize); memcpy(data, pb_data->data().data(), to_copy); diff --git a/rpcs3/Emu/NP/np_requests_gui.cpp b/rpcs3/Emu/NP/np_requests_gui.cpp index be6026afa6..5e38a57e77 100644 --- a/rpcs3/Emu/NP/np_requests_gui.cpp +++ b/rpcs3/Emu/NP/np_requests_gui.cpp @@ -303,7 +303,11 @@ namespace np gui_cache.del_room(room_status->id); - gui_notifications.list.emplace(std::make_pair(gui_notifications.current_gui_ctx_id, req_id), gui_notification{.event = SCE_NP_MATCHING_EVENT_LEAVE_ROOM_DONE, .edata = std::move(edata)}); + { + std::lock_guard lock(gui_notifications.mutex); + gui_notifications.list.emplace(std::make_pair(gui_notifications.current_gui_ctx_id, req_id), gui_notification{.event = SCE_NP_MATCHING_EVENT_LEAVE_ROOM_DONE, .edata = std::move(edata)}); + } + ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_LEAVE_ROOM_DONE, 0); } @@ -453,7 +457,11 @@ namespace np extra_nps::print_SceNpMatchingRoom(room_info); - gui_notifications.list.emplace(std::make_pair(gui_notifications.current_gui_ctx_id, req_id), gui_notification{.event = SCE_NP_MATCHING_EVENT_GET_ROOM_SEARCH_FLAG_DONE, .edata = std::move(edata)}); + { + std::lock_guard lock(gui_notifications.mutex); + gui_notifications.list.emplace(std::make_pair(gui_notifications.current_gui_ctx_id, req_id), gui_notification{.event = SCE_NP_MATCHING_EVENT_GET_ROOM_SEARCH_FLAG_DONE, .edata = std::move(edata)}); + } + ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_GET_ROOM_SEARCH_FLAG_DONE, 0); } @@ -548,7 +556,11 @@ namespace np extra_nps::print_SceNpMatchingRoom(room_info); - gui_notifications.list.emplace(std::make_pair(gui_notifications.current_gui_ctx_id, req_id), gui_notification{.event = SCE_NP_MATCHING_EVENT_GET_ROOM_INFO_DONE, .edata = std::move(edata)}); + { + std::lock_guard lock(gui_notifications.mutex); + gui_notifications.list.emplace(std::make_pair(gui_notifications.current_gui_ctx_id, req_id), gui_notification{.event = SCE_NP_MATCHING_EVENT_GET_ROOM_INFO_DONE, .edata = std::move(edata)}); + } + ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_GET_ROOM_INFO_DONE, 0); } @@ -581,9 +593,13 @@ namespace np SceNpRoomId room_id{}; ensure(!resp->id().empty() && resp->id().size() == sizeof(SceNpRoomId::opt)); + ctx->wakey = 0; std::memcpy(room_id.opt, resp->id().data(), sizeof(SceNpRoomId::opt)); - const auto [_, inserted] = pending_quickmatching.insert_or_assign(room_id, ctx->ctx_id); - ensure(inserted); + { + std::lock_guard lock(this->mutex_quickmatching); + const auto [_, inserted] = pending_quickmatching.insert_or_assign(room_id, ctx->ctx_id); + ensure(inserted); + } // Now that the reply has been received, we start the wait for the notification ctx->thread = std::make_unique>>("NP GUI Timeout Worker", [ctx, req_id, this](SceNpRoomId room_id) @@ -615,7 +631,6 @@ namespace np } }); - ctx->wakey = 0; auto& thread = *ctx->thread; thread(room_id); } diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 86a688705e..56cfabd855 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -1489,7 +1489,7 @@ namespace rpcn if (error == ErrorType::NoError) rpcn_log.success("add_friend(\"%s\") succeeded", friend_username); else - rpcn_log.error("add_friend(\"%s\") failed with error: %s", error); + rpcn_log.error("add_friend(\"%s\") failed with error: %s", friend_username, error); return error; } @@ -3085,7 +3085,7 @@ namespace rpcn } case NotificationType::FriendPresenceChanged: { - const std::string username = vdata.get_string(true); + const std::string username = vdata.get_string(false); SceNpCommunicationId pr_com_id = vdata.get_com_id(); std::string pr_title = fmt::truncate(vdata.get_string(true), SCE_NP_BASIC_PRESENCE_TITLE_SIZE_MAX - 1); std::string pr_status = fmt::truncate(vdata.get_string(true), SCE_NP_BASIC_PRESENCE_EXTENDED_STATUS_SIZE_MAX - 1); diff --git a/rpcs3/Emu/NP/signaling_handler.cpp b/rpcs3/Emu/NP/signaling_handler.cpp index 97a2673e0f..85c9321e28 100644 --- a/rpcs3/Emu/NP/signaling_handler.cpp +++ b/rpcs3/Emu/NP/signaling_handler.cpp @@ -774,6 +774,7 @@ void signaling_handler::send_information_packets(u32 addr, u16 port, const SceNp auto& sent_packet = sig_packet; sent_packet.command = signal_info; + retire_packet(si, signal_info); send_signaling_packet(sent_packet, addr, port); queue_signaling_packet(sent_packet, si, steady_clock::now() + REPEAT_INFO_DELAY); wake_up(); diff --git a/rpcs3/Emu/NP/signaling_handler.h b/rpcs3/Emu/NP/signaling_handler.h index b4ec8229b8..a3eb027fe1 100644 --- a/rpcs3/Emu/NP/signaling_handler.h +++ b/rpcs3/Emu/NP/signaling_handler.h @@ -133,7 +133,7 @@ private: signaling_packet sig_packet{}; - std::map qpackets; // (wakeup time, packet) + std::multimap qpackets; // (wakeup time, packet) u32 cur_conn_id = 1; std::unordered_map npid_to_conn_id; // (npid, conn_id) diff --git a/rpcs3/Emu/NP/upnp_handler.cpp b/rpcs3/Emu/NP/upnp_handler.cpp index dca00de986..c19e30d441 100644 --- a/rpcs3/Emu/NP/upnp_handler.cpp +++ b/rpcs3/Emu/NP/upnp_handler.cpp @@ -89,12 +89,10 @@ void upnp_handler::upnp_enable() if (desc_xml) { - IGDdatas igd_data{}; - UPNPUrls igd_urls{}; - parserootdesc(desc_xml, desc_xml_size, &igd_data); + parserootdesc(desc_xml, desc_xml_size, &m_igd_data); free(desc_xml); desc_xml = nullptr; - GetUPNPUrls(&igd_urls, &igd_data, dev->descURL, 1); + GetUPNPUrls(&m_igd_urls, &m_igd_data, dev->descURL, 1); upnp_log.notice("Found UPnP device type:%s at %s", dev->st, dev->descURL); @@ -116,24 +114,28 @@ void upnp_handler::upnp_enable() freeUPNPDevlist(devlist); } -void upnp_handler::add_port_redir(std::string_view addr, u16 internal_port, std::string_view protocol) +void upnp_handler::add_port_redir(const std::string& addr, u16 internal_port, std::string_view protocol) { if (!m_active) return; std::lock_guard lock(m_mutex); - u16 external_port = internal_port; - std::string internal_port_str = fmt::format("%d", internal_port); + if (m_bindings[std::string(protocol)].contains(internal_port)) + return; + + const std::string internal_port_str = fmt::format("%d", internal_port); + const std::string protocol_str(protocol); + const u32 max_port = std::min(static_cast(internal_port) + 100, 0xFFFFu); int res = 0; - for (u16 external_port = internal_port; external_port < internal_port + 100; external_port++) + for (u32 external_port = internal_port; external_port <= max_port; external_port++) { std::string external_port_str = fmt::format("%d", external_port); - res = UPNP_AddPortMapping(m_igd_urls.controlURL, m_igd_data.first.servicetype, external_port_str.c_str(), internal_port_str.c_str(), addr.data(), "RPCS3", protocol.data(), nullptr, nullptr); + res = UPNP_AddPortMapping(m_igd_urls.controlURL, m_igd_data.first.servicetype, external_port_str.c_str(), internal_port_str.c_str(), addr.c_str(), "RPCS3", protocol_str.c_str(), nullptr, nullptr); if (res == UPNPCOMMAND_SUCCESS) { - m_bindings[std::string(protocol)][internal_port] = external_port; + m_bindings[protocol_str][static_cast(internal_port)] = external_port; upnp_log.notice("Successfully bound %s:%d(%s) to IGD:%d", addr, internal_port, protocol, external_port); return; } @@ -146,7 +148,7 @@ void upnp_handler::add_port_redir(std::string_view addr, u16 internal_port, std: // } } - upnp_log.error("Failed to bind %s:%d(%s) to IGD:(%d=>%d): %d", addr, internal_port, protocol, internal_port, external_port, res); + upnp_log.error("Failed to bind %s:%d(%s) to IGD:(%d=>%d): %d", addr, internal_port, protocol, internal_port, internal_port, res); } void upnp_handler::remove_port_redir(u16 internal_port, std::string_view protocol) @@ -156,27 +158,28 @@ void upnp_handler::remove_port_redir(u16 internal_port, std::string_view protoco std::lock_guard lock(m_mutex); - const std::string str_protocol(protocol); + const std::string protocol_str(protocol); - if (!m_bindings.contains(str_protocol) || !::at32(m_bindings, str_protocol).contains(internal_port)) + if (!m_bindings.contains(protocol_str) || !::at32(m_bindings, protocol_str).contains(internal_port)) { upnp_log.error("tried to unbind port mapping %d to IGD(%s) but it isn't bound", internal_port, protocol); return; } - const u16 external_port = ::at32(::at32(m_bindings, str_protocol), internal_port); + const u16 external_port = ::at32(::at32(m_bindings, protocol_str), internal_port); remove_port_redir_external(external_port, protocol); - ensure(::at32(m_bindings, str_protocol).erase(internal_port)); + ensure(::at32(m_bindings, protocol_str).erase(internal_port)); upnp_log.notice("Successfully deleted port mapping %d to IGD:%d(%s)", internal_port, external_port, protocol); } void upnp_handler::remove_port_redir_external(u16 external_port, std::string_view protocol, bool verbose) { const std::string str_ext_port = fmt::format("%d", external_port); + const std::string protocol_str(protocol); - if (int res = UPNP_DeletePortMapping(m_igd_urls.controlURL, m_igd_data.first.servicetype, str_ext_port.c_str(), protocol.data(), nullptr); res != 0 && verbose) + if (int res = UPNP_DeletePortMapping(m_igd_urls.controlURL, m_igd_data.first.servicetype, str_ext_port.c_str(), protocol_str.c_str(), nullptr); res != 0 && verbose) upnp_log.error("Failed to delete port mapping IGD:%s(%s): %d", str_ext_port, protocol, res); } diff --git a/rpcs3/Emu/NP/upnp_handler.h b/rpcs3/Emu/NP/upnp_handler.h index 40892f7443..1486702cbb 100644 --- a/rpcs3/Emu/NP/upnp_handler.h +++ b/rpcs3/Emu/NP/upnp_handler.h @@ -13,7 +13,7 @@ public: ~upnp_handler(); void upnp_enable(); - void add_port_redir(std::string_view addr, u16 internal_port, std::string_view protocol); + void add_port_redir(const std::string& addr, u16 internal_port, std::string_view protocol); void remove_port_redir(u16 internal_port, std::string_view protocol); bool is_active() const; From 00a1c7278a90d85e5b2e1eb551b9ff80d858b21c Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 16:30:34 +0100 Subject: [PATCH 326/630] config/ux: Disable double-click to fullscreen by default The state of mouse/keyboard on rpcs3 has matured enough to the point where using mouse on rpcs3 to play games is normal. Other games do not fullscreen on double-click, our default should match the expected application behaviour. --- rpcs3/rpcs3qt/gui_settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index a3b6fb4286..21a46259c2 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -256,7 +256,7 @@ namespace gui const gui_save m_discordState = gui_save(meta, "discordState", ""); const gui_save m_check_upd_start = gui_save(meta, "checkUpdateStart", update_on); - const gui_save gs_disableMouse = gui_save(gs_frame, "disableMouse", false); + const gui_save gs_disableMouse = gui_save(gs_frame, "disableMouse", true); const gui_save gs_disableKbHotkeys = gui_save(gs_frame, "disableKbHotkeys", false); const gui_save gs_showMouseFs = gui_save(gs_frame, "showMouseInFullscreen", false); const gui_save gs_lockMouseFs = gui_save(gs_frame, "lockMouseInFullscreen", true); From 928856567670d123b88b458f450bae0051deecb7 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 22:06:01 +0100 Subject: [PATCH 327/630] Qt: properly handle cancel of pkg install dialog --- rpcs3/rpcs3qt/main_window.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 56e125ab11..687358d625 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -938,13 +938,20 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo bool precompile_caches = false; bool create_desktop_shortcuts = false; bool create_app_shortcut = false; + bool canceled = false; game_compatibility* compat = m_game_list_frame ? m_game_list_frame->GetGameCompatibility() : nullptr; // Let the user choose the packages to install and select the order in which they shall be installed. pkg_install_dialog dlg(file_paths, compat, this); - connect(&dlg, &QDialog::accepted, this, [&]() + connect(&dlg, &QDialog::finished, this, [&](int result) { + if (result != QDialog::Accepted) + { + canceled = true; + return; + } + packages = dlg.get_paths_to_install(); precompile_caches = dlg.precompile_caches(); create_desktop_shortcuts = dlg.create_desktop_shortcuts(); @@ -952,6 +959,11 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo }); dlg.exec(); + if (canceled) + { + return false; + } + if (!from_boot) { if (!m_gui_settings->GetBootConfirmation(this)) From 595e42c4f3bfa11b8585ea029e1aa9d2c9c68fd1 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 1 Mar 2026 12:33:42 +0100 Subject: [PATCH 328/630] rpcs3_version: Bump to 0.0.40 --- rpcs3/rpcs3_version.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3_version.cpp b/rpcs3/rpcs3_version.cpp index 19d107e582..6eb904222f 100644 --- a/rpcs3/rpcs3_version.cpp +++ b/rpcs3/rpcs3_version.cpp @@ -26,7 +26,7 @@ namespace rpcs3 const utils::version& get_version() { - static constexpr utils::version version{ 0, 0, 39, utils::version_type::alpha, 1, RPCS3_GIT_VERSION }; + static constexpr utils::version version{ 0, 0, 40, utils::version_type::alpha, 1, RPCS3_GIT_VERSION }; return version; } From e66f1fa3066f99d816fb950aad77d6fc57d0f1c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20D=C3=ADaz=20=C3=81lvarez?= Date: Tue, 3 Mar 2026 21:41:51 +0100 Subject: [PATCH 329/630] Solves render problems due to vertex data being modified before reuse * Stores first 64bit of the vertex data to compare on retrieval as a fingerprint of if the underlying vertex data has been changed --- rpcs3/Emu/RSX/rsx_cache.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index b219745f6a..c73e3c2d11 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -7,6 +7,7 @@ #include "Common/unordered_map.hpp" #include "Emu/System.h" #include "Emu/cache_utils.hpp" +#include "Emu/Memory/vm.h" #include "Emu/RSX/Program/RSXVertexProgram.h" #include "Emu/RSX/Program/RSXFragmentProgram.h" #include "Overlays/Shaders/shader_loading_dialog.h" @@ -478,6 +479,7 @@ namespace rsx uptr local_address; u32 offset_in_heap; u32 data_length; + u64 fingerprint; }; // A weak vertex cache with no data checks or memory range locks @@ -502,11 +504,19 @@ namespace rsx { const auto key = hash(local_addr, data_length); const auto found = vertex_ranges.find(key); + if (found == vertex_ranges.end()) { return nullptr; } + // Check if data in local_address changed vs what was stored in the vertex_cache + if (auto sudo_ptr = vm::get_super_ptr(local_addr); + data_length >= 8 && found->second.fingerprint != *utils::bless(sudo_ptr)) + { + vertex_ranges.erase(key); + return nullptr; + } return std::addressof(found->second); } @@ -516,7 +526,15 @@ namespace rsx v.data_length = data_length; v.local_address = local_addr; v.offset_in_heap = offset_in_heap; + v.fingerprint = 0; + if (data_length >= 8) + { + // Uses get_super_ptr to access vm memory safely + // and bless to avoid endian conversion and circumvent compiler strict aliasing rules. + auto sudo_ptr = vm::get_super_ptr(local_addr); + v.fingerprint = *utils::bless(sudo_ptr); + } const auto key = hash(local_addr, data_length); vertex_ranges[key] = v; } From 11a9011510e8b6c256a86f057764c929afd99a5b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 4 Mar 2026 02:54:42 +0300 Subject: [PATCH 330/630] rsx: Fix memory misalignment for temporary storage - We create the temp storage with alignment of U but then do a type cast to u128 later. This obviously causes problems. --- rpcs3/Emu/RSX/Common/TextureUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.cpp b/rpcs3/Emu/RSX/Common/TextureUtils.cpp index 937508035b..8cf3466bb9 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.cpp +++ b/rpcs3/Emu/RSX/Common/TextureUtils.cpp @@ -244,7 +244,7 @@ struct copy_unmodified_block_swizzled } const u32 size_in_block = padded_width * padded_height * depth * 2; - rsx::simple_array tmp(size_in_block * words_per_block); + rsx::simple_array tmp(size_in_block * words_per_block); if (words_per_block == 1) [[likely]] { From 86b2773c2854ede00ff376d1ee82898c74eb8b71 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 4 Mar 2026 02:56:12 +0300 Subject: [PATCH 331/630] rsx: Clean up after vertex cache changes --- rpcs3/Emu/RSX/rsx_cache.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index c73e3c2d11..625311fc11 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -517,6 +517,7 @@ namespace rsx vertex_ranges.erase(key); return nullptr; } + return std::addressof(found->second); } @@ -526,15 +527,12 @@ namespace rsx v.data_length = data_length; v.local_address = local_addr; v.offset_in_heap = offset_in_heap; - v.fingerprint = 0; - if (data_length >= 8) + if (auto sudo_ptr = vm::get_super_ptr(local_addr); data_length >= 8) { - // Uses get_super_ptr to access vm memory safely - // and bless to avoid endian conversion and circumvent compiler strict aliasing rules. - auto sudo_ptr = vm::get_super_ptr(local_addr); v.fingerprint = *utils::bless(sudo_ptr); } + const auto key = hash(local_addr, data_length); vertex_ranges[key] = v; } From 3750fb2c1f1ff5ccd4996ef42cdf8b16119666c3 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 4 Mar 2026 08:37:26 +0100 Subject: [PATCH 332/630] cellGem: Fix deadlock when cellGemUpdateStart is called before cellCamera delivers images --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 3c7b299af7..1a1e8a7d04 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -1616,6 +1616,7 @@ public: } m_tracker.set_image_data(m_camera_info.buffer.get_ptr(), m_camera_info.bytesize, m_camera_info.width, m_camera_info.height, m_camera_info.format); + m_framenumber++; // using framenumber instead of timestamp since the timestamp could be identical return true; } @@ -1648,6 +1649,7 @@ public: } auto& gem = g_fxo->get(); + u64 last_framenumber = 0; while (thread_ctrl::state() != thread_state::aborting) { @@ -1663,6 +1665,13 @@ public: } } + if (std::exchange(last_framenumber, m_framenumber.load()) == last_framenumber) + { + cellGem.warning("Tracker woke up without new frame. Skipping processing (framenumber=%d)", last_framenumber); + tracker_done(); + continue; + } + m_busy.release(true); // Update PS Move LED colors @@ -1754,6 +1763,7 @@ public: private: atomic_t m_wake_up_tracker = 0; atomic_t m_tracker_done = 0; + atomic_t m_framenumber = 0; atomic_t m_busy = false; ps_move_tracker m_tracker{}; CellCameraInfoEx m_camera_info{}; @@ -3876,13 +3886,15 @@ error_code cellGemUpdateStart(vm::cptr camera_frame, u64 timestamp) gem.camera_frame = camera_frame.addr(); - if (!tracker.set_image(gem.camera_frame)) + const bool image_set = tracker.set_image(gem.camera_frame); + + tracker.wake_up_tracker(); + + if (!image_set) { return not_an_error(CELL_GEM_NO_VIDEO); } - tracker.wake_up_tracker(); - return CELL_OK; } From d46ddcee5d8db68d7f856c5e7015bffc651b419f Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Wed, 4 Mar 2026 01:29:10 +0100 Subject: [PATCH 333/630] Fix mac build --- .ci/build-mac.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/build-mac.sh b/.ci/build-mac.sh index 2f43e05e74..300f69cb06 100755 --- a/.ci/build-mac.sh +++ b/.ci/build-mac.sh @@ -17,7 +17,7 @@ brew install -f --overwrite --quiet ccache "llvm@$LLVM_COMPILER_VER" brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" if [ "$AARCH64" -eq 1 ]; then brew install -f --overwrite --quiet googletest opencv@4 sdl3 vulkan-headers vulkan-loader molten-vk - brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative protobuf + brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative else arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader molten-vk From 5605cf21413be189ca8e2ab866c3ad537b5e79ca Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 5 Mar 2026 15:32:14 +0100 Subject: [PATCH 334/630] Qt: Do not check return code of rpcs3 download --- rpcs3/rpcs3qt/downloader.cpp | 4 ++-- rpcs3/rpcs3qt/downloader.h | 2 +- rpcs3/rpcs3qt/game_compatibility.cpp | 14 +++++++------- rpcs3/rpcs3qt/game_compatibility.h | 2 +- rpcs3/rpcs3qt/patch_manager_dialog.cpp | 2 +- rpcs3/rpcs3qt/update_manager.cpp | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/rpcs3/rpcs3qt/downloader.cpp b/rpcs3/rpcs3qt/downloader.cpp index 39078c880d..65f481bff8 100644 --- a/rpcs3/rpcs3qt/downloader.cpp +++ b/rpcs3/rpcs3qt/downloader.cpp @@ -34,7 +34,7 @@ downloader::~downloader() } } -void downloader::start(const std::string& url, bool follow_location, bool show_progress_dialog, const QString& progress_dialog_title, bool keep_progress_dialog_open, int expected_size, bool check_return_code, bool again) +void downloader::start(const std::string& url, bool follow_location, bool show_progress_dialog, bool check_return_code, const QString& progress_dialog_title, bool keep_progress_dialog_open, int expected_size, bool again) { network_log.notice("Starting download from URL: %s", url); @@ -121,7 +121,7 @@ void downloader::start(const std::string& url, bool follow_location, bool show_p { network_log.error("Error during download. Trying to download again (attempts=%d, return_code=%d)", m_download_attempts, return_code); std::this_thread::sleep_for(500ms); // Wait for a little while - start(url, follow_location, show_progress_dialog, progress_dialog_title, keep_progress_dialog_open, expected_size, check_return_code, true); + start(url, follow_location, show_progress_dialog, check_return_code, progress_dialog_title, keep_progress_dialog_open, expected_size, true); return; } } diff --git a/rpcs3/rpcs3qt/downloader.h b/rpcs3/rpcs3qt/downloader.h index be0cd0e568..35c2d5533e 100644 --- a/rpcs3/rpcs3qt/downloader.h +++ b/rpcs3/rpcs3qt/downloader.h @@ -21,7 +21,7 @@ public: explicit downloader(QWidget* parent = nullptr); ~downloader(); - void start(const std::string& url, bool follow_location, bool show_progress_dialog, const QString& progress_dialog_title = "", bool keep_progress_dialog_open = false, int expected_size = -1, bool check_return_code = true, bool again = false); + void start(const std::string& url, bool follow_location, bool show_progress_dialog, bool check_return_code, const QString& progress_dialog_title = "", bool keep_progress_dialog_open = false, int expected_size = -1, bool again = false); usz update_buffer(char* data, usz size); void update_progress_dialog(const QString& title) const; diff --git a/rpcs3/rpcs3qt/game_compatibility.cpp b/rpcs3/rpcs3qt/game_compatibility.cpp index b9cb32a7c1..a7a4a4bc34 100644 --- a/rpcs3/rpcs3qt/game_compatibility.cpp +++ b/rpcs3/rpcs3qt/game_compatibility.cpp @@ -36,7 +36,7 @@ void game_compatibility::handle_download_finished(const QByteArray& content) compat_log.notice("Database download finished"); // Create new map from database and write database to file if database was valid - if (ReadJSON(QJsonDocument::fromJson(content).object(), true)) + if (handle_json(content, true)) { // Write database to file QFile file(m_filepath); @@ -67,8 +67,9 @@ void game_compatibility::handle_download_canceled() Q_EMIT DownloadCanceled(); } -bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_download) +bool game_compatibility::handle_json(const QByteArray& data, bool after_download) { + const QJsonObject json_data = QJsonDocument::fromJson(data).object(); const int return_code = json_data["return_code"].toInt(-255); if (return_code < 0) @@ -101,7 +102,7 @@ bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_downl m_compat_database.clear(); - QJsonObject json_results = json_data["results"].toObject(); + const QJsonObject json_results = json_data["results"].toObject(); // Retrieve status data for every valid entry for (const auto& key : json_results.keys()) @@ -112,7 +113,7 @@ bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_downl continue; } - QJsonObject json_result = json_results[key].toObject(); + const QJsonObject json_result = json_results[key].toObject(); // Retrieve compatibility information from json compat::status status = ::at32(Status_Data, json_result.value("status").toString("NoResult")); @@ -210,15 +211,14 @@ void game_compatibility::RequestCompatibility(bool online) compat_log.notice("Finished reading database from file: %s", m_filepath); // Create new map from database - ReadJSON(QJsonDocument::fromJson(content).object(), online); - + handle_json(content, online); return; } const std::string url = "https://rpcs3.net/compatibility?api=v1&export"; compat_log.notice("Beginning compatibility database download from: %s", url); - m_downloader->start(url, true, true, tr("Downloading Database")); + m_downloader->start(url, true, true, true, tr("Downloading Database")); // We want to retrieve a new database, therefore refresh gamelist and indicate that Q_EMIT DownloadStarted(); diff --git a/rpcs3/rpcs3qt/game_compatibility.h b/rpcs3/rpcs3qt/game_compatibility.h index 664bafea34..8dc1ce5aa5 100644 --- a/rpcs3/rpcs3qt/game_compatibility.h +++ b/rpcs3/rpcs3qt/game_compatibility.h @@ -138,7 +138,7 @@ private: std::map m_compat_database; /** Creates new map from the database */ - bool ReadJSON(const QJsonObject& json_data, bool after_download); + bool handle_json(const QByteArray& data, bool after_download); public: /** Handles reads, writes and downloads for the compatibility database */ diff --git a/rpcs3/rpcs3qt/patch_manager_dialog.cpp b/rpcs3/rpcs3qt/patch_manager_dialog.cpp index a41d8ed7b5..2e9d980d20 100644 --- a/rpcs3/rpcs3qt/patch_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/patch_manager_dialog.cpp @@ -1163,7 +1163,7 @@ void patch_manager_dialog::download_update(bool automatic, bool auto_accept) } } - m_downloader->start(url, true, !m_download_automatic, tr("Downloading latest patches")); + m_downloader->start(url, true, !m_download_automatic, true, tr("Downloading latest patches")); } bool patch_manager_dialog::handle_json(const QByteArray& data) diff --git a/rpcs3/rpcs3qt/update_manager.cpp b/rpcs3/rpcs3qt/update_manager.cpp index ec4d7ce44f..d32a1810b9 100644 --- a/rpcs3/rpcs3qt/update_manager.cpp +++ b/rpcs3/rpcs3qt/update_manager.cpp @@ -110,7 +110,7 @@ void update_manager::check_for_updates(bool automatic, bool check_only, bool aut const std::string url = fmt::format("https://update.rpcs3.net/?api=v3&c=%s&os_type=%s&os_arch=%s&os_version=%i.%i.%i", rpcs3::get_commit_and_hash().second, os.type, os.arch, os.version_major, os.version_minor, os.version_patch); - m_downloader->start(url, true, !automatic, tr("Checking For Updates"), true); + m_downloader->start(url, true, !automatic, true, tr("Checking For Updates"), true); } bool update_manager::handle_json(bool automatic, bool check_only, bool auto_accept, const QByteArray& data) @@ -440,7 +440,7 @@ void update_manager::update(bool auto_accept) }); update_log.notice("Downloading update..."); - m_downloader->start(m_request_url, true, true, tr("Downloading Update"), true, m_expected_size); + m_downloader->start(m_request_url, true, true, false, tr("Downloading Update"), true, m_expected_size); } bool update_manager::handle_rpcs3(const QByteArray& data, bool auto_accept) From ae6172d86bc79a63af0533c870e13d6702ad2343 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:39:52 +0100 Subject: [PATCH 335/630] Remove unused function --- rpcs3/Emu/Io/LogitechG27.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/rpcs3/Emu/Io/LogitechG27.cpp b/rpcs3/Emu/Io/LogitechG27.cpp index 1f02c92d59..7ae996c864 100644 --- a/rpcs3/Emu/Io/LogitechG27.cpp +++ b/rpcs3/Emu/Io/LogitechG27.cpp @@ -945,17 +945,6 @@ static u8 sdl_to_logitech_g27_pedal(std::map>& j return unsigned_avg * 0xFF / 0xFFFF; } -static inline void set_bit(u8* buf, int bit_num, bool set) -{ - const int byte_num = bit_num / 8; - bit_num %= 8; - const u8 mask = 1 << bit_num; - if (set) - buf[byte_num] = buf[byte_num] | mask; - else - buf[byte_num] = buf[byte_num] & (~mask); -} - void usb_device_logitech_g27::transfer_dfex(u32 buf_size, u8* buf, UsbTransfer* transfer) { DFEX_data data{}; From ec00a06cafceb5849633f4c5f501e975d0f4cc24 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:41:22 +0100 Subject: [PATCH 336/630] Fix warning suppression in windows clang --- Utilities/StrFmt.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Utilities/StrFmt.cpp b/Utilities/StrFmt.cpp index 4431769f3a..d68ef51cb5 100644 --- a/Utilities/StrFmt.cpp +++ b/Utilities/StrFmt.cpp @@ -16,12 +16,12 @@ #include #endif -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -#elif defined(__clang__) +#ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) #else #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" From f2c8b157ef048f57570861d305d2fa8ead03fc92 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:41:56 +0100 Subject: [PATCH 337/630] ISO: pass mode to file --- rpcs3/Loader/ISO.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index e46a1a6b82..af2d18ff7d 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -569,7 +569,7 @@ std::unique_ptr iso_device::open(const std::string& path, bs_t(fs::file(iso_path), *node); + return std::make_unique(fs::file(iso_path, mode), *node); } std::unique_ptr iso_device::open_dir(const std::string& path) From 2a292d1e2e4541162a1b85efa28500f6de2c9b98 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:42:29 +0100 Subject: [PATCH 338/630] rsx: fix unused parameter warning --- rpcs3/Emu/RSX/NV47/HW/nv4097.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp index 17ee040f8c..43c8a5d9f4 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp @@ -306,7 +306,7 @@ namespace rsx REGS(ctx)->decode(reg, REGS(ctx)->latch); } - void set_aa_control(context* ctx, u32 reg, u32 arg) + void set_aa_control(context* ctx, u32 /*reg*/, u32 arg) { const auto latch = REGS(ctx)->latch; if (arg == latch) From c57d6110c4c503e8145c9d18e38042d275cd6995 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:42:51 +0100 Subject: [PATCH 339/630] rsx: add missing default to switch --- rpcs3/Emu/RSX/Program/ProgramStateCache.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp index 4420e51555..528b5c6316 100644 --- a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp +++ b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp @@ -675,6 +675,8 @@ fragment_program_utils::fragment_program_metadata fragment_program_utils::analys // Otherwise we would need to follow the execution chain result.has_branch_instructions = true; break; + default: + break; } if (rsx::assembler::FP::get_operand_count(opcode) > 0 && From 2f9f79eea2673aaafb5ff91e4d294777906d629b Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 6 Mar 2026 08:06:29 +0100 Subject: [PATCH 340/630] PPU Fixes -CallFunction empty function/jump elision was never gone through as cond was always false -MSelf duplicate offset detection never triggered because set was reset each loop -Rel executable memory size calculation used wrong section type --- rpcs3/Emu/Cell/PPUModule.cpp | 6 +++--- rpcs3/Emu/Cell/PPUThread.cpp | 4 ++-- rpcs3/Emu/Cell/PPUTranslator.cpp | 5 ++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index b298539519..e95a1542d8 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -1004,7 +1004,7 @@ static import_result_t ppu_load_imports(const ppu_module& _module, std: // Check address // TODO: The address of use should be extracted from analyser instead - if (fstub && fstub >= _module.segs[0].addr && fstub <= _module.segs[0].addr + _module.segs[0].size) + if (fstub && fstub >= _module.segs[0].addr && fstub < _module.segs[0].addr + _module.segs[0].size) { nid_to_use_addr.emplace(fnid, fstub); } @@ -1895,7 +1895,7 @@ shared_ptr ppu_load_prx(const ppu_prx_object& elf, bool virtual_load, c } else { - ppu_loader.error("Library %s: PRX library info not found"); + ppu_loader.error("Library: PRX library info not found"); } prx->start.set(prx->specials[0xbc9a0086]); @@ -3192,7 +3192,7 @@ bool ppu_load_rel_exec(const ppu_rel_object& elf) for (const auto& s : elf.shdrs) { - if (s.sh_type != sec_type::sht_progbits) + if (s.sh_type == sec_type::sht_progbits) { memsize = utils::align(memsize + vm::cast(s.sh_size), 128); } diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index a9bef5e640..4d690b344d 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -3867,12 +3867,12 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector offs; + for (u32 j = 0; j < hdr.count; j++) { mself_record rec{}; - std::set offs; - if (mself.read(rec) && rec.get_pos(mself.size())) { if (rec.size <= 0x20) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 70d34aa775..1c9f6e2b9d 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -550,11 +550,10 @@ void PPUTranslator::CallFunction(u64 target, Value* indirect) else if (_target >= caddr && _target <= cend) { u32 target_last = static_cast(_target); - std::unordered_set passed_targets{target_last}; // Try to follow unconditional branches as long as there is no infinite loop - while (target_last != _target) + while (true) { const ppu_opcode_t op{*ensure(m_info.get_ptr(target_last))}; const ppu_itype::type itype = g_ppu_itype.decode(op.opcode); @@ -1304,7 +1303,7 @@ void PPUTranslator::VMADDFP(ppu_opcode_t op) if (!m_use_fma && data == v128{}) { set_vr(op.vd, vec_handle_result(a * c + fsplat(0.f))); - ppu_log.notice("LLVM: VMADDFP with -0 addend at [0x%08x]", m_addr + (m_reloc ? m_reloc->addr : 0)); + ppu_log.notice("LLVM: VMADDFP with +0 addend at [0x%08x]", m_addr + (m_reloc ? m_reloc->addr : 0)); return; } } From cf5eb22591f9443eb97c0537eeaf588801afd3f6 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 5 Mar 2026 02:33:25 +0300 Subject: [PATCH 341/630] glutils: Extend buffer_object interface --- rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp | 5 +++++ rpcs3/Emu/RSX/GL/glutils/buffer_object.h | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp index 5c1f0d0447..f3849718d0 100644 --- a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp @@ -131,6 +131,11 @@ namespace gl DSA_CALL2(NamedBufferSubData, m_id, offset, length, data); } + void buffer::fill(GLsizeiptr offset, GLsizeiptr length, GLuint pattern) + { + DSA_CALL2(ClearNamedBufferSubData, m_id, GL_R32UI, offset, length, GL_RED, GL_UNSIGNED_INT, &pattern); + } + GLubyte* buffer::map(GLsizeiptr offset, GLsizeiptr length, access access_) { ensure(m_memory_type == memory_type::host_visible); diff --git a/rpcs3/Emu/RSX/GL/glutils/buffer_object.h b/rpcs3/Emu/RSX/GL/glutils/buffer_object.h index dccb2a314e..28730bdd0d 100644 --- a/rpcs3/Emu/RSX/GL/glutils/buffer_object.h +++ b/rpcs3/Emu/RSX/GL/glutils/buffer_object.h @@ -15,7 +15,9 @@ namespace gl element_array = GL_ELEMENT_ARRAY_BUFFER, uniform = GL_UNIFORM_BUFFER, texture = GL_TEXTURE_BUFFER, - ssbo = GL_SHADER_STORAGE_BUFFER + ssbo = GL_SHADER_STORAGE_BUFFER, + copy_src = GL_COPY_READ_BUFFER, + copy_dst = GL_COPY_WRITE_BUFFER }; enum class access @@ -65,6 +67,8 @@ namespace gl case target::uniform: pname = GL_UNIFORM_BUFFER_BINDING; break; case target::texture: pname = GL_TEXTURE_BUFFER_BINDING; break; case target::ssbo: pname = GL_SHADER_STORAGE_BUFFER_BINDING; break; + case target::copy_src: pname = GL_COPY_READ_BUFFER_BINDING; break; + case target::copy_dst: pname = GL_COPY_WRITE_BUFFER_BINDING; break; default: fmt::throw_exception("Invalid binding state target (0x%x)", static_cast(target_)); } @@ -113,6 +117,7 @@ namespace gl void data(GLsizeiptr size, const void* data_ = nullptr, GLenum usage = GL_STREAM_DRAW); void sub_data(GLsizeiptr offset, GLsizeiptr length, const GLvoid* data); + void fill(GLsizeiptr offset, GLsizeiptr length, GLuint pattern); GLubyte* map(GLsizeiptr offset, GLsizeiptr length, access access_); void unmap(); From a1af15b907a27bc12c6459801cf3d3514f39fb42 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 5 Mar 2026 02:33:47 +0300 Subject: [PATCH 342/630] gl/dma: Fix range calculation when creating DMA blocks --- rpcs3/Emu/RSX/GL/GLDMA.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDMA.cpp b/rpcs3/Emu/RSX/GL/GLDMA.cpp index 3c12009f67..5e60525a5c 100644 --- a/rpcs3/Emu/RSX/GL/GLDMA.cpp +++ b/rpcs3/Emu/RSX/GL/GLDMA.cpp @@ -22,7 +22,7 @@ namespace gl void* userptr = vm::get_super_ptr(base_address); m_data = std::make_unique(); - m_data->create(buffer::target::array, block_size, userptr, buffer::memory_type::userptr, 0); + m_data->create(buffer::target::copy_dst, block_size, userptr, buffer::memory_type::userptr, 0); m_base_address = base_address; // Some drivers may reject userptr input for whatever reason. Check that the state is still valid. @@ -77,7 +77,7 @@ namespace gl { const auto start_block_address = start & s_dma_block_mask; const auto end_block_address = (start + length + s_dma_block_size - 1) & s_dma_block_mask; - return utils::address_range32::start_end(start_block_address, end_block_address); + return utils::address_range32::start_length(start_block_address, end_block_address - start_block_address); } const dma_block& get_block(u32 start, u32 length) From d75e8b24f7f4726656c77467110273588d99fa4e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 5 Mar 2026 02:34:04 +0300 Subject: [PATCH 343/630] [FIXUP] API extend --- rpcs3/Emu/RSX/GL/GLProcTable.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLProcTable.h b/rpcs3/Emu/RSX/GL/GLProcTable.h index 8f42995a9d..5278014b5c 100644 --- a/rpcs3/Emu/RSX/GL/GLProcTable.h +++ b/rpcs3/Emu/RSX/GL/GLProcTable.h @@ -218,6 +218,9 @@ OPENGL_PROC(PFNGLNAMEDBUFFERDATAEXTPROC, NamedBufferDataEXT); OPENGL_PROC(PFNGLNAMEDBUFFERSUBDATAPROC, NamedBufferSubData); OPENGL_PROC(PFNGLNAMEDBUFFERSUBDATAEXTPROC, NamedBufferSubDataEXT); +OPENGL_PROC(PFNGLCLEARNAMEDBUFFERSUBDATAPROC, ClearNamedBufferSubData); +OPENGL_PROC(PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC, ClearNamedBufferSubDataEXT); + // ARB_shader_image_load_store OPENGL_PROC(PFNGLBINDIMAGETEXTUREPROC, BindImageTexture); From 92f63ccc0b09aa90cf5d16a5b73a62a9568988bc Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 6 Mar 2026 02:19:25 +0300 Subject: [PATCH 344/630] rsx/cfg: Silence GCC noise --- .../Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp index 622deefe7c..5e45ec6133 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp +++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp @@ -31,14 +31,14 @@ namespace rsx::assembler::FP switch (dst.prec) { case RSX_FP_PRECISION_REAL: - case RSX_FP_PRECISION_UNKNOWN: + // case RSX_FP_PRECISION_UNKNOWN: // Unreachable break; case RSX_FP_PRECISION_HALF: if (!src0.fp16) return false; break; case RSX_FP_PRECISION_FIXED12: case RSX_FP_PRECISION_FIXED9: - case RSX_FP_PRECISION_SATURATE: + // case RSX_FP_PRECISION_SATURATE: // Unreachable return false; } From 414df8432e56e8b015a4b447242f8127e62197b7 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 6 Mar 2026 03:25:58 +0300 Subject: [PATCH 345/630] gl: Respect internal offsets when performing DMA transfer operations --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index ae3b8e37e9..2c16bc8ba5 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -48,7 +48,7 @@ namespace gl void init_buffer(const gl::texture* src) { - const u32 vram_size = src->pitch() * src->height(); + const u32 vram_size = std::max(src->pitch() * src->height(), get_section_size()); const u32 buffer_size = utils::align(vram_size, 4096); if (pbo) @@ -148,7 +148,7 @@ namespace gl } } - void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& /*src_area*/, const utils::address_range32& /*valid_range*/, u32 pitch) + void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& valid_range, u32 pitch) { init_buffer(src); glGetError(); @@ -165,6 +165,20 @@ namespace gl real_pitch = src->pitch(); rsx_pitch = pitch; + const coord3u src_rgn = + { + { static_cast(src_area.x1), static_cast(src_area.y1), 0 }, + { static_cast(src_area.width()), static_cast(src_area.height()), 1 } + }; + + u32 pbo_offset = 0; + if (valid_range.valid()) + { + const u32 section_base = get_section_base(); + pbo_offset = valid_range.start - section_base; + ensure(valid_range.start >= section_base && pbo_offset <= pbo.size()); + } + bool use_driver_pixel_transform = true; if (get_driver_caps().ARB_compute_shader_supported) [[likely]] { @@ -193,14 +207,14 @@ namespace gl mem_info.image_size_in_bytes *= 2; } - void* out_offset = copy_image_to_buffer(cmd, pack_info, src, &scratch_mem, 0, 0, { {}, src->size3D() }, &mem_info); + void* out_offset = copy_image_to_buffer(cmd, pack_info, src, &scratch_mem, 0, 0, src_rgn, &mem_info); glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); real_pitch = pack_info.size * src->width(); const u64 data_length = pack_info.size * mem_info.image_size_in_texels; - scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), 0, data_length); + scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), pbo_offset, data_length); } else { @@ -225,7 +239,7 @@ namespace gl pack_settings.alignment(1); pack_settings.swap_bytes(pack_unpack_swap_bytes); - src->copy_to(nullptr, format, type, pack_settings); + src->copy_to(reinterpret_cast(pbo_offset), format, type, 0, src_rgn, pack_settings); } if (auto error = glGetError()) From 1c5e30e83f4a9840a712cc70fc69c4a4c2123002 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 6 Mar 2026 12:21:28 +0100 Subject: [PATCH 346/630] input/qt: fix default squircle value in text and remove duplicate comments --- rpcs3/Emu/Io/PadHandler.cpp | 16 ---------------- rpcs3/Emu/Io/PadHandler.h | 8 ++++---- rpcs3/rpcs3qt/tooltips.h | 2 +- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index 9110687a9c..a2ae41349e 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -24,13 +24,11 @@ std::set PadHandlerBase::narrow_set(const std::set& src) return dst; } -// Get new multiplied value based on the multiplier s32 PadHandlerBase::MultipliedInput(s32 raw_value, s32 multiplier) { return (multiplier * raw_value) / 100; } -// Get new scaled value between 0 and range based on its minimum and maximum f32 PadHandlerBase::ScaledInput(f32 raw_value, f32 minimum, f32 maximum, f32 deadzone, f32 range) { if (deadzone > 0 && deadzone > minimum) @@ -46,7 +44,6 @@ f32 PadHandlerBase::ScaledInput(f32 raw_value, f32 minimum, f32 maximum, f32 dea return range * val; } -// Get new scaled value between -range and range based on its minimum and maximum f32 PadHandlerBase::ScaledAxisInput(f32 raw_value, f32 minimum, f32 maximum, f32 deadzone, f32 range) { // convert [min, max] to [0, 1] @@ -79,7 +76,6 @@ f32 PadHandlerBase::ScaledAxisInput(f32 raw_value, f32 minimum, f32 maximum, f32 return (2.0f * range * val) - range; } -// Get normalized trigger value based on the range defined by a threshold u16 PadHandlerBase::NormalizeTriggerInput(u16 value, u32 threshold) const { if (value <= threshold || threshold >= trigger_max) @@ -90,8 +86,6 @@ u16 PadHandlerBase::NormalizeTriggerInput(u16 value, u32 threshold) const return static_cast(ScaledInput(static_cast(value), static_cast(trigger_min), static_cast(trigger_max), static_cast(threshold))); } -// normalizes a directed input, meaning it will correspond to a single "button" and not an axis with two directions -// the input values must lie in 0+ u16 PadHandlerBase::NormalizeDirectedInput(s32 raw_value, s32 threshold, s32 maximum) const { if (threshold >= maximum || maximum <= 0 || raw_value < 0) @@ -114,9 +108,6 @@ u16 PadHandlerBase::NormalizeStickInput(u16 raw_value, s32 threshold, s32 multip return static_cast(ScaledInput(static_cast(scaled_value), 0.0f, static_cast(thumb_max), static_cast(threshold))); } -// This function normalizes stick deadzone based on the DS3's deadzone, which is ~13% (default of anti deadzone) -// X and Y is expected to be in (-255) to 255 range, deadzone should be in terms of thumb stick range -// return is new x and y values in 0-255 range std::tuple PadHandlerBase::NormalizeStickDeadzone(s32 inX, s32 inY, u32 deadzone, u32 anti_deadzone) const { f32 X = inX / 255.0f; @@ -150,28 +141,21 @@ std::tuple PadHandlerBase::NormalizeStickDeadzone(s32 inX, s32 inY, u3 return std::tuple(ConvertAxis(X), ConvertAxis(Y)); } -// get clamped value between 0 and 255 u16 PadHandlerBase::Clamp0To255(f32 input) { return static_cast(std::clamp(input, 0.0f, 255.0f)); } -// get clamped value between 0 and 1023 u16 PadHandlerBase::Clamp0To1023(f32 input) { return static_cast(std::clamp(input, 0.0f, 1023.0f)); } -// input has to be [-1,1]. result will be [0,255] u16 PadHandlerBase::ConvertAxis(f32 value) { return static_cast((value + 1.0) * (255.0 / 2.0)); } -// The DS3, (and i think xbox controllers) give a 'square-ish' type response, so that the corners will give (almost)max x/y instead of the ~30x30 from a perfect circle -// using a simple scale/sensitivity increase would *work* although it eats a chunk of our usable range in exchange -// this might be the best for now, in practice it seems to push the corners to max of 20x20, with a squircle_factor of ~4000 -// This function assumes inX and inY is already in 0-255 void PadHandlerBase::ConvertToSquirclePoint(u16& inX, u16& inY, u32 squircle_factor) { if (!squircle_factor) diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index 98cca72a7d..a273beb3de 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -274,7 +274,7 @@ protected: // the input values must lie in 0+ u16 NormalizeDirectedInput(s32 raw_value, s32 threshold, s32 maximum) const; - // This function normalizes stick deadzone based on the DS3's deadzone, which is ~13% + // This function normalizes stick deadzone based on the DS3's deadzone, which is ~13% (default of anti deadzone) // X and Y is expected to be in (-255) to 255 range, deadzone should be in terms of thumb stick range // return is new x and y values in 0-255 range std::tuple NormalizeStickDeadzone(s32 inX, s32 inY, u32 deadzone, u32 anti_deadzone) const; @@ -284,10 +284,10 @@ public: // Get new multiplied value based on the multiplier static s32 MultipliedInput(s32 raw_value, s32 multiplier); - // Get new scaled value between 0 and 255 based on its minimum and maximum + // Get new scaled value between 0 and range based on its minimum and maximum static f32 ScaledInput(f32 raw_value, f32 minimum, f32 maximum, f32 deadzone, f32 range = 255.0f); - // Get new scaled value between -255 and 255 based on its minimum and maximum + // Get new scaled value between -range and range based on its minimum and maximum static f32 ScaledAxisInput(f32 raw_value, f32 minimum, f32 maximum, f32 deadzone, f32 range = 255.0f); // get clamped value between 0 and 255 @@ -301,7 +301,7 @@ public: // The DS3, (and i think xbox controllers) give a 'square-ish' type response, so that the corners will give (almost)max x/y instead of the ~30x30 from a perfect circle // using a simple scale/sensitivity increase would *work* although it eats a chunk of our usable range in exchange - // this might be the best for now, in practice it seems to push the corners to max of 20x20, with a squircle_factor of 8000 + // this might be the best for now, in practice it seems to push the corners to max of 20x20, with a squircle_factor of ~4000 // This function assumes inX and inY is already in 0-255 static void ConvertToSquirclePoint(u16& inX, u16& inY, u32 squircle_factor); diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index e9c8ad436b..4f983dc18a 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -302,7 +302,7 @@ public: const QString analog_limiter = tr("Applies the stick multipliers while this special button is pressed.
Enable \"Toggle\" if you want to toggle the analog limiter on button press instead.
If no button has been assigned, the stick multipliers are always applied."); const QString pressure_intensity = tr("Controls the intensity of pressure sensitive buttons while this special button is pressed.
Enable \"Toggle\" if you want to toggle the intensity on button press instead.
Use the percentage to change how hard you want to press a button."); const QString pressure_deadzone = tr("Controls the deadzone of pressure sensitive buttons. It determines how far the button has to be pressed until it is recognized by the game. The resulting range will be projected onto the full button sensitivity range."); - const QString squircle_factor = tr("The actual DualShock 3's stick range is not circular but formed like a rounded square (or squircle) which represents the maximum range of the emulated sticks. You can use the squircle values to modify the stick input if your sticks can't reach the corners of that range. A value of 0 does not apply any so called squircling. A value of 8000 is usually recommended."); + const QString squircle_factor = tr("The actual DualShock 3's stick range is not circular but formed like a rounded square (or squircle) which represents the maximum range of the emulated sticks. You can use the squircle values to modify the stick input if your sticks can't reach the corners of that range. A value of 0 does not apply any so called squircling. A value of 4000 is usually recommended."); const QString stick_multiplier = tr("The stick multipliers can be used to change the sensitivity of your stick movements.
The default setting is 1 and represents normal input."); const QString stick_deadzones = tr("A stick's deadzone determines how far the stick has to be moved until it is fully recognized by the game. The resulting range will be projected onto the full input range in order to give you a smooth experience. Movement inside the deadzone is simulated using the anti-deadzone slider (default is 13%), so don't worry if there is still movement shown in the emulated stick preview."); const QString vibration = tr("The PS3 activates two motors (large and small) to handle controller vibrations.
You can enable, disable or even switch these signals for the currently selected pad here.
The game sends values from 0-255 to activate the motors.
Any value smaller or equal the threshold will be set to 0. This is 63 by default for pad handlers other than DualShock3 in order to emulate the DualShock3's behavior."); From d97851376d0adb736dff4715e158b4c2355432b8 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 6 Mar 2026 09:06:53 +0100 Subject: [PATCH 347/630] Add stacktrace in case of exception --- Utilities/Thread.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 08dce12315..6395c32505 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -14,6 +14,11 @@ #include "Emu/CPU/Backends/AArch64/AArch64Signal.h" #endif +#ifdef __cpp_lib_stacktrace +#include "rpcs3_version.h" +#include +#endif + #ifdef _WIN32 #include #include @@ -2800,6 +2805,16 @@ void thread_base::exec() [[noreturn]] void thread_ctrl::emergency_exit(std::string_view reason) { + // Print stacktrace +#ifdef __cpp_lib_stacktrace + if (rpcs3::is_local_build()) + { + std::ostringstream oss; + oss << std::stacktrace::current(); + sys_log.notice("StackTrace\n\n%s\n", oss.str()); + } +#endif + if (const std::string info = dump_useful_thread_info(); !info.empty()) { sys_log.notice("\n%s", info); From 4fd2409b8be1e85c9c25e631012b53abc5a859dc Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 3 Mar 2026 20:41:36 +0100 Subject: [PATCH 348/630] Update FAudio to 26.03 --- 3rdparty/FAudio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/FAudio b/3rdparty/FAudio index e67d761ead..dc034fc671 160000 --- a/3rdparty/FAudio +++ b/3rdparty/FAudio @@ -1 +1 @@ -Subproject commit e67d761ead486de3e69fa11705456bf94df734ca +Subproject commit dc034fc671b07bbd14e8410d5dd6be6da38fdf6d From 69384d7bb4018dd0886fee25afe791bb99fbcbfd Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 5 Jan 2026 12:58:23 +0100 Subject: [PATCH 349/630] Update codebase to SDL 3.4.0 --- rpcs3/Emu/Io/LogitechG27.h | 5 +---- rpcs3/Input/sdl_camera_handler.cpp | 9 --------- rpcs3/Input/sdl_instance.cpp | 4 ++-- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/Io/LogitechG27.h b/rpcs3/Emu/Io/LogitechG27.h index 4ec0d35c0b..dc68db68b9 100644 --- a/rpcs3/Emu/Io/LogitechG27.h +++ b/rpcs3/Emu/Io/LogitechG27.h @@ -38,10 +38,7 @@ struct logitech_g27_ffb_slot logitech_g27_ffb_state state = logitech_g27_ffb_state::inactive; u64 last_update = 0; SDL_HapticEffect last_effect {}; - - // TODO switch to SDL_HapticEffectID when it becomes available in a future SDL release - // Match the return of SDL_CreateHapticEffect for now - int effect_id = -1; + SDL_HapticEffectID effect_id = -1; }; struct sdl_mapping diff --git a/rpcs3/Input/sdl_camera_handler.cpp b/rpcs3/Input/sdl_camera_handler.cpp index 4faf4eaf75..8f6aa965de 100644 --- a/rpcs3/Input/sdl_camera_handler.cpp +++ b/rpcs3/Input/sdl_camera_handler.cpp @@ -10,15 +10,6 @@ LOG_CHANNEL(camera_log, "Camera"); -#if !(SDL_VERSION_ATLEAST(3, 4, 0)) -namespace SDL_CameraPermissionState -{ - constexpr int SDL_CAMERA_PERMISSION_STATE_DENIED = -1; - constexpr int SDL_CAMERA_PERMISSION_STATE_PENDING = 0; - constexpr int SDL_CAMERA_PERMISSION_STATE_APPROVED = 1; -} -#endif - template <> void fmt_class_string::format(std::string& out, u64 arg) { diff --git a/rpcs3/Input/sdl_instance.cpp b/rpcs3/Input/sdl_instance.cpp index d3296f44ba..a1b1410b53 100644 --- a/rpcs3/Input/sdl_instance.cpp +++ b/rpcs3/Input/sdl_instance.cpp @@ -102,8 +102,8 @@ bool sdl_instance::initialize_impl() set_hint(SDL_HINT_JOYSTICK_HIDAPI_PS3, "1"); #endif - // Disable LG4FF driver on windows (only needed for SDL 3.4.0) -#if _WIN32 && SDL_VERSION_ATLEAST(3, 4, 0) + // Disable LG4FF driver on windows +#if _WIN32 set_hint(SDL_HINT_JOYSTICK_HIDAPI_LG4FF, "0"); #endif From 0d80e300a07bb46d1b35e0b4211865c7b641859f Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 4 Mar 2026 19:31:50 +0100 Subject: [PATCH 350/630] Qt: add log level settings --- 3rdparty/yaml-cpp/yaml-cpp | 2 +- Utilities/Config.cpp | 2 +- .../Emu/CPU/Backends/AArch64/AArch64Common.h | 6 +- rpcs3/rpcs3.vcxproj | 2 + rpcs3/rpcs3.vcxproj.filters | 6 + rpcs3/rpcs3qt/CMakeLists.txt | 1 + rpcs3/rpcs3qt/emu_settings.cpp | 44 +++-- rpcs3/rpcs3qt/emu_settings.h | 9 + rpcs3/rpcs3qt/emu_settings_type.h | 6 + rpcs3/rpcs3qt/log_level_dialog.cpp | 155 ++++++++++++++++++ rpcs3/rpcs3qt/log_level_dialog.h | 19 +++ rpcs3/rpcs3qt/settings_dialog.cpp | 12 +- rpcs3/rpcs3qt/settings_dialog.ui | 26 ++- rpcs3/rpcs3qt/tooltips.h | 1 + rpcs3/util/logs.cpp | 11 +- rpcs3/util/logs.hpp | 8 +- 16 files changed, 279 insertions(+), 31 deletions(-) create mode 100644 rpcs3/rpcs3qt/log_level_dialog.cpp create mode 100644 rpcs3/rpcs3qt/log_level_dialog.h diff --git a/3rdparty/yaml-cpp/yaml-cpp b/3rdparty/yaml-cpp/yaml-cpp index 05c44fcd18..51a5d623e3 160000 --- a/3rdparty/yaml-cpp/yaml-cpp +++ b/3rdparty/yaml-cpp/yaml-cpp @@ -1 +1 @@ -Subproject commit 05c44fcd18074836e21e1eda9fc02b3a4a1529b5 +Subproject commit 51a5d623e3fde1f58829a56ba910f1cb33596222 diff --git a/Utilities/Config.cpp b/Utilities/Config.cpp index cee928def7..381ee01079 100644 --- a/Utilities/Config.cpp +++ b/Utilities/Config.cpp @@ -416,7 +416,7 @@ void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs) out << YAML::BeginMap; for (const auto& np : static_cast(rhs).get_map()) { - if (np.second == logs::level::notice) continue; + if (np.second == logs::level::_default) continue; out << YAML::Key << np.first; out << YAML::Value << fmt::format("%s", np.second); } diff --git a/rpcs3/Emu/CPU/Backends/AArch64/AArch64Common.h b/rpcs3/Emu/CPU/Backends/AArch64/AArch64Common.h index dff06dfb81..2ce4fa68b3 100644 --- a/rpcs3/Emu/CPU/Backends/AArch64/AArch64Common.h +++ b/rpcs3/Emu/CPU/Backends/AArch64/AArch64Common.h @@ -20,19 +20,19 @@ namespace aarch64 sp }; - static const char* gpr_names[] = + [[maybe_unused]] static const char* gpr_names[] = { "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "x29", "x30" }; - static const char* spr_names[] = + [[maybe_unused]] static const char* spr_names[] = { "xzr", "pc", "sp" }; - static const char* spr_asm_names[] = + [[maybe_unused]] static const char* spr_asm_names[] = { "xzr", ".", "sp" }; diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 9749f60fcd..cd5d7c8bc4 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -826,6 +826,7 @@ + @@ -1578,6 +1579,7 @@ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index a011ddf62e..6c7841b4fc 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1275,6 +1275,9 @@ Io + + Gui\settings + @@ -1517,6 +1520,9 @@ Io + + Gui\settings + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index b59d6f7a11..6fe8d9db13 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -53,6 +53,7 @@ add_library(rpcs3_ui STATIC localized.cpp localized_emu.cpp log_frame.cpp + log_level_dialog.cpp log_viewer.cpp main_window.cpp memory_string_searcher.cpp diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index ccb2308509..c686394c10 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -31,18 +31,20 @@ namespace out << YAML::Null; return; } + if (node.IsMap()) { std::vector keys; keys.reserve(node.size()); + // generate vector of strings to be sorted using the as function from YAML documentation for (const auto& pair : node) { - keys.push_back(pair.first.as()); + keys.push_back(pair.first.Scalar()); } std::sort(keys.begin(), keys.end()); + // recursively generate sorted maps - // alternative implementations could have stops at specified recursion levels or maybe just the first two levels would be sorted out << YAML::BeginMap; for (const std::string& key : keys) { @@ -51,15 +53,10 @@ namespace emit_data(out, node[key]); } out << YAML::EndMap; + return; } - // alternatively: an else statement could be used however I wanted to follow a similar format to the += operator so the YAML Undefined class can be ignored - else if (node.IsScalar() || node.IsSequence()) - { - out << node; - } - // this exists to preserve the same functionality as before where Undefined nodes would still be output, can be removed or consolidated with the else if branch - else - out << node; + + out << node; } // Incrementally load YAML @@ -910,11 +907,38 @@ std::string emu_settings::GetSetting(emu_settings_type type) const return ""; } +std::map emu_settings::GetMapSettingDefault(emu_settings_type type) const +{ + if (const auto node = cfg_adapter::get_node(m_default_settings, ::at32(settings_location, type)); node && node.IsMap()) + { + return node.as>(); + } + + cfg_log.fatal("GetMapSettingDefault(type=%d) could not retrieve the requested node", static_cast(type)); + return {}; +} + +std::map emu_settings::GetMapSetting(emu_settings_type type) const +{ + if (const auto node = cfg_adapter::get_node(m_current_settings, ::at32(settings_location, type)); node && node.IsMap()) + { + return node.as>(); + } + + cfg_log.fatal("GetMapSetting(type=%d) could not retrieve the requested node", static_cast(type)); + return {}; +} + void emu_settings::SetSetting(emu_settings_type type, const std::string& val) const { cfg_adapter::get_node(m_current_settings, ::at32(settings_location, type)) = val; } +void emu_settings::SetMapSetting(emu_settings_type type, const std::map& val) const +{ + cfg_adapter::get_node(m_current_settings, ::at32(settings_location, type)) = val; +} + emu_settings_type emu_settings::FindSettingsType(const cfg::_base* node) const { // Add key and value to static map on first use diff --git a/rpcs3/rpcs3qt/emu_settings.h b/rpcs3/rpcs3qt/emu_settings.h index 5da946dabe..c5a1e89252 100644 --- a/rpcs3/rpcs3qt/emu_settings.h +++ b/rpcs3/rpcs3qt/emu_settings.h @@ -78,9 +78,18 @@ public: /** Returns the value of the setting type.*/ std::string GetSetting(emu_settings_type type) const; + /** Returns the default map value of the setting type.*/ + std::map GetMapSettingDefault(emu_settings_type type) const; + + /** Returns the value of the setting type as map.*/ + std::map GetMapSetting(emu_settings_type type) const; + /** Sets the setting type to a given value.*/ void SetSetting(emu_settings_type type, const std::string& val) const; + /** Sets the setting type to a given map value.*/ + void SetMapSetting(emu_settings_type type, const std::map& val) const; + /** Try to find the settings type for a given string.*/ emu_settings_type FindSettingsType(const cfg::_base* node) const; diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index 6a5b6841b1..67238571d3 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -217,6 +217,9 @@ enum class emu_settings_type EmptyHdd0Tmp, LimitCacheSize, MaximumCacheSize, + + // Log + Log, }; /** A helper map that keeps track of where a given setting type is located*/ @@ -434,4 +437,7 @@ inline static const std::map settings_location { emu_settings_type::SuspendEmulationSavestateMode, { "Savestate", "Suspend Emulation Savestate Mode" }}, { emu_settings_type::CompatibleEmulationSavestateMode, { "Savestate", "Compatible Savestate Mode" }}, { emu_settings_type::StartSavestatePaused, { "Savestate", "Start Paused" }}, + + // Logs + { emu_settings_type::Log, { "Log" }}, }; diff --git a/rpcs3/rpcs3qt/log_level_dialog.cpp b/rpcs3/rpcs3qt/log_level_dialog.cpp new file mode 100644 index 0000000000..3f5fd3c58d --- /dev/null +++ b/rpcs3/rpcs3qt/log_level_dialog.cpp @@ -0,0 +1,155 @@ +#include "stdafx.h" +#include "log_level_dialog.h" +#include "emu_settings.h" + +#include +#include +#include +#include +#include +#include + +LOG_CHANNEL(cfg_log, "CFG"); + +log_level_dialog::log_level_dialog(QWidget* parent, std::shared_ptr emu_settings) + : QDialog(parent), m_emu_settings(emu_settings) +{ + setWindowTitle(tr("Configure minimum log levels")); + setObjectName("log_level_dialog"); + setAttribute(Qt::WA_DeleteOnClose); + setMinimumSize(QSize(700, 400)); + + const std::set channels = logs::get_channels(); + std::vector> levels; + + const auto add_level = [&levels](logs::level level, const QString& localized) + { + levels.push_back(std::pair(fmt::format("%s", level), localized)); + }; + + add_level(logs::level::always, tr("Always")); + add_level(logs::level::fatal, tr("Fatal")); + add_level(logs::level::error, tr("Error")); + add_level(logs::level::todo, tr("Todo")); + add_level(logs::level::success, tr("Success")); + add_level(logs::level::warning, tr("Warning")); + add_level(logs::level::notice, tr("Notice")); + add_level(logs::level::trace, tr("Trace")); + + const std::map current_settings = m_emu_settings->GetMapSetting(emu_settings_type::Log); + for (const auto& [channel, level] : current_settings) + { + if (!channels.contains(channel)) + { + cfg_log.warning("log_level_dialog: Ignoring unknown channel '%s' found in config file.", channel); + } + } + + m_table = new QTableWidget(static_cast(channels.size()), 2, this); + m_table->setHorizontalHeaderLabels({ tr("Channel"), tr("Level") }); + + int i = 0; + for (const std::string& channel : channels) + { + QComboBox* combo = new QComboBox(); + + for (const auto& [level, localized] : levels) + { + combo->addItem(localized, QString::fromStdString(level)); + } + + connect(combo, &QComboBox::currentIndexChanged, combo, [this, combo, ch = channel](int index) + { + if (index < 0) return; + + const QVariant var = combo->itemData(index); + if (!var.canConvert()) return; + + std::map settings = m_emu_settings->GetMapSetting(emu_settings_type::Log); + + settings[ch] = var.toString().toStdString(); + + m_emu_settings->SetMapSetting(emu_settings_type::Log, settings); + }); + + m_table->setItem(i, 0, new QTableWidgetItem(QString::fromStdString(channel))); + m_table->setCellWidget(i, 1, combo); + + i++; + } + + QLineEdit* filter_edit = new QLineEdit(this); + filter_edit->setPlaceholderText(tr("Filter channels")); + connect(filter_edit, &QLineEdit::textChanged, this, [this](const QString& text) + { + for (int i = 0; i < m_table->rowCount(); i++) + { + if (QTableWidgetItem* item = m_table->item(i, 0)) + { + m_table->setRowHidden(i, !text.isEmpty() && !item->text().contains(text, Qt::CaseInsensitive)); + } + } + }); + + QDialogButtonBox* button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::RestoreDefaults); + connect(button_box, &QDialogButtonBox::clicked, this, [this, button_box, old_settings = m_emu_settings->GetMapSetting(emu_settings_type::Log)](QAbstractButton* button) + { + if (button == button_box->button(QDialogButtonBox::Ok)) + { + accept(); + } + else if (button == button_box->button(QDialogButtonBox::Cancel)) + { + m_emu_settings->SetMapSetting(emu_settings_type::Log, old_settings); + reject(); + } + else if (button == button_box->button(QDialogButtonBox::RestoreDefaults)) + { + m_emu_settings->SetMapSetting(emu_settings_type::Log, m_emu_settings->GetMapSettingDefault(emu_settings_type::Log)); + reload_page(); + } + }); + + reload_page(); + + m_table->resizeColumnsToContents(); + m_table->horizontalHeader()->stretchLastSection(); + + QVBoxLayout* layout = new QVBoxLayout(); + layout->addWidget(filter_edit); + layout->addWidget(m_table); + layout->addWidget(button_box); + setLayout(layout); +} + +log_level_dialog::~log_level_dialog() +{ +} + +void log_level_dialog::reload_page() +{ + const std::map settings = m_emu_settings->GetMapSetting(emu_settings_type::Log); + const QString def_str = QString::fromStdString(fmt::format("%s", logs::level::_default)); + + for (int i = 0; i < m_table->rowCount(); i++) + { + QTableWidgetItem* item = m_table->item(i, 0); + if (!item) continue; + + const std::string channel = item->text().toStdString(); + + if (QComboBox* combo = static_cast(m_table->cellWidget(i, 1))) + { + combo->blockSignals(true); + combo->setCurrentIndex(combo->findData(def_str)); + if (settings.contains(channel)) + { + if (const int index = combo->findData(QString::fromStdString(settings.at(channel))); index >= 0) + { + combo->setCurrentIndex(index); + } + } + combo->blockSignals(false); + } + } +} diff --git a/rpcs3/rpcs3qt/log_level_dialog.h b/rpcs3/rpcs3qt/log_level_dialog.h new file mode 100644 index 0000000000..87a0ccf8a4 --- /dev/null +++ b/rpcs3/rpcs3qt/log_level_dialog.h @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +class emu_settings; + +class log_level_dialog : public QDialog +{ +public: + log_level_dialog(QWidget* parent, std::shared_ptr emu_settings); + virtual ~log_level_dialog(); + +private: + void reload_page(); + + std::shared_ptr m_emu_settings; + QTableWidget* m_table = nullptr; +}; diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 0c0fb63efd..b903db0f52 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -23,13 +23,13 @@ #include "emu_settings_type.h" #include "render_creator.h" #include "microphone_creator.h" -#include "Emu/NP/rpcn_countries.h" +#include "log_level_dialog.h" +#include "Emu/NP/rpcn_countries.h" #include "Emu/GameInfo.h" #include "Emu/System.h" #include "Emu/system_config.h" #include "Emu/title.h" - #include "Emu/Audio/audio_device_enumerator.h" #include "Loader/PSF.h" @@ -2496,6 +2496,14 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std m_emu_settings->EnhanceComboBox(ui->vulkansched, emu_settings_type::VulkanAsyncSchedulerDriver); SubscribeTooltip(ui->gb_vulkansched, tooltips.settings.vulkan_async_scheduler); + // Log levels + SubscribeTooltip(ui->gb_log_levels, tooltips.settings.vulkan_async_scheduler); + connect(ui->pb_log_levels, &QAbstractButton::clicked, this, [this]() + { + log_level_dialog* dlg = new log_level_dialog(this, m_emu_settings); + dlg->open(); + }); + if (!restoreGeometry(m_gui_settings->GetValue(gui::cfg_geometry).toByteArray())) { // Ignore. This will most likely only fail if the setting doesn't contain any values diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index e394407e11..76a418298d 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -265,7 +265,7 @@
- + @@ -2321,9 +2321,9 @@ - - Enable Clans - + + Enable Clans + @@ -4467,7 +4467,7 @@ - + 0 @@ -4545,6 +4545,22 @@ + + + + Log Levels + + + + + + Configure + + + + + + diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index 4f983dc18a..b56e093dff 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -59,6 +59,7 @@ public: const QString paused_savestates = tr("When this mode is on, savestates are loaded and paused on the first frame.\nThis allows players to prepare for gameplay without being thrown into the action immediately."); const QString spu_profiler = tr("When enabled, SPU performance is measured at runtime.\nEnable only at a developer's request because when enabled it reduces performance a bit by itself."); const QString use_ReBAR = tr("When enabled, Vulkan will try to use PCI-e resizable bar address space for GPU uploads of timing-sensitive data.\nThis yields a massive performance win on NVIDIA cards when the base framerate is low.\nFor games with very high framerates, this option can result in worse performance for all GPU vendors.\n"); + const QString log_levels = tr("Set the minimum log levels for any log channels."); // audio diff --git a/rpcs3/util/logs.cpp b/rpcs3/util/logs.cpp index 0276f90e0b..f0afc95bac 100644 --- a/rpcs3/util/logs.cpp +++ b/rpcs3/util/logs.cpp @@ -202,7 +202,7 @@ namespace logs for (auto&& pair : get_logger()->channels) { - pair.second->enabled.release(level::notice); + pair.second->enabled.release(level::_default); } } @@ -271,18 +271,17 @@ namespace logs } } - std::vector get_channels() + std::set get_channels() { - std::vector result; + std::set result; std::lock_guard lock(g_mutex); for (auto&& p : get_logger()->channels) { - // Copy names removing duplicates - if (result.empty() || result.back() != p.first) + if (!p.first.empty()) { - result.push_back(p.first); + result.insert(p.first); } } diff --git a/rpcs3/util/logs.hpp b/rpcs3/util/logs.hpp index 52d163ed43..1b75bd6499 100644 --- a/rpcs3/util/logs.hpp +++ b/rpcs3/util/logs.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include "util/atomic.hpp" #include "Utilities/StrFmt.h" @@ -20,6 +20,8 @@ namespace logs warning = 5, notice = 6, trace = 7, // Lowest severity (usually disabled) + + _default = notice }; struct channel; @@ -163,7 +165,7 @@ namespace logs registerer(channel& _ch); }; - // Log level control: set all channels to level::notice + // Log level control: set all channels to default level::notice void reset(); // Log level control: set all channels to level::always @@ -179,7 +181,7 @@ namespace logs void set_channel_levels(const std::map>& map); // Get all registered log channels - std::vector get_channels(); + std::set get_channels(); // Helper: no additional name specified consteval const char* make_channel_name(const char* name, const char* alt = nullptr) From ac30feeddb4d53f08397897574649228b8c187d1 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 6 Mar 2026 21:25:52 +0100 Subject: [PATCH 351/630] Revert enabling PPU jump elider --- rpcs3/Emu/Cell/PPUTranslator.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 1c9f6e2b9d..ddf7d330a0 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -553,7 +553,9 @@ void PPUTranslator::CallFunction(u64 target, Value* indirect) std::unordered_set passed_targets{target_last}; // Try to follow unconditional branches as long as there is no infinite loop - while (true) + // !! Triggers compilation issues in Asura's Wrath in other parts of the code + // !! See https://github.com/RPCS3/rpcs3/issues/18287 + while (false) { const ppu_opcode_t op{*ensure(m_info.get_ptr(target_last))}; const ppu_itype::type itype = g_ppu_itype.decode(op.opcode); From 14789b536f2122e0f6fc8b9d34958a615ef34619 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 00:23:58 +0300 Subject: [PATCH 352/630] gl: Clean up the awful image copy API - Wrap everything in rsx::io_buffer and gl::buffer to avoid out of bounds issues. - Also abstracts away nasty things like OpenGL offset pointer casts. --- rpcs3/Emu/RSX/Common/io_buffer.h | 7 ++-- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 9 ++--- rpcs3/Emu/RSX/GL/GLOverlays.cpp | 6 ++-- rpcs3/Emu/RSX/GL/GLPresent.cpp | 5 +-- rpcs3/Emu/RSX/GL/GLTexture.cpp | 18 +++------- rpcs3/Emu/RSX/GL/GLTextureCache.h | 4 +-- rpcs3/Emu/RSX/GL/glutils/image.cpp | 43 +++++++++++++++-------- rpcs3/Emu/RSX/GL/glutils/image.h | 13 ++++--- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 5 +++ 9 files changed, 62 insertions(+), 48 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/io_buffer.h b/rpcs3/Emu/RSX/Common/io_buffer.h index 64f95a5e61..59e8e6a32e 100644 --- a/rpcs3/Emu/RSX/Common/io_buffer.h +++ b/rpcs3/Emu/RSX/Common/io_buffer.h @@ -9,7 +9,7 @@ namespace rsx template concept SpanLike = requires(T t) { - { t.data() } -> std::convertible_to; + { t.data() } -> std::convertible_to; { t.size_bytes() } -> std::convertible_to; }; @@ -71,9 +71,10 @@ namespace rsx return static_cast(m_ptr); } - usz size() const + template + T size() const { - return m_size; + return static_cast(m_size); } template diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index ebff202303..408ea9f784 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -249,22 +249,23 @@ void GLGSRender::on_init_thread() // Fallback null texture instead of relying on texture0 { std::array pixeldata = { 0, 0, 0, 0, 0, 0, 0, 0 }; + const rsx::io_buffer src_buf = std::span(pixeldata); // 1D auto tex1D = std::make_unique(GL_TEXTURE_1D, 1, 1, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - tex1D->copy_from(pixeldata.data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex1D->copy_from(src_buf, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); // 2D auto tex2D = std::make_unique(GL_TEXTURE_2D, 1, 1, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - tex2D->copy_from(pixeldata.data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex2D->copy_from(src_buf, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); // 3D auto tex3D = std::make_unique(GL_TEXTURE_3D, 1, 1, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - tex3D->copy_from(pixeldata.data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex3D->copy_from(src_buf, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); // CUBE auto texCUBE = std::make_unique(GL_TEXTURE_CUBE_MAP, 1, 1, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - texCUBE->copy_from(pixeldata.data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + texCUBE->copy_from(src_buf, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); m_null_textures[GL_TEXTURE_1D] = std::move(tex1D); m_null_textures[GL_TEXTURE_2D] = std::move(tex2D); diff --git a/rpcs3/Emu/RSX/GL/GLOverlays.cpp b/rpcs3/Emu/RSX/GL/GLOverlays.cpp index 7d36e5598b..0c4732430c 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.cpp +++ b/rpcs3/Emu/RSX/GL/GLOverlays.cpp @@ -223,7 +223,7 @@ namespace gl gl::texture_view* ui_overlay_renderer::load_simple_image(rsx::overlays::image_info_base* desc, bool temp_resource, u32 owner_uid) { auto tex = std::make_unique(GL_TEXTURE_2D, desc->w, desc->h, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - tex->copy_from(desc->get_data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex->copy_from(desc->as_span(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); const GLenum remap[] = { GL_RED, GL_ALPHA, GL_BLUE, GL_GREEN }; auto view = std::make_unique(tex.get(), remap); @@ -308,7 +308,7 @@ namespace gl const std::vector& glyph_data = font->get_glyph_data(); auto tex = std::make_unique(GL_TEXTURE_2D_ARRAY, font_size.width, font_size.height, font_size.depth, 1, 1, GL_R8, RSX_FORMAT_CLASS_COLOR); - tex->copy_from(glyph_data.data(), gl::texture::format::r, gl::texture::type::ubyte, {}); + tex->copy_from(std::span(glyph_data), gl::texture::format::r, gl::texture::type::ubyte, {}); GLenum remap[] = { GL_RED, GL_RED, GL_RED, GL_RED }; auto view = std::make_unique(tex.get(), remap); @@ -332,7 +332,7 @@ namespace gl if (dirty) { - view->image()->copy_from(desc->get_data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + view->image()->copy_from(desc->as_span(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); } return view; diff --git a/rpcs3/Emu/RSX/GL/GLPresent.cpp b/rpcs3/Emu/RSX/GL/GLPresent.cpp index e7c03dfcf5..4c241d7d33 100644 --- a/rpcs3/Emu/RSX/GL/GLPresent.cpp +++ b/rpcs3/Emu/RSX/GL/GLPresent.cpp @@ -132,7 +132,8 @@ gl::texture* GLGSRender::get_present_source(gl::present_surface_info* info, cons const auto range = utils::address_range32::start_length(info->address, info->pitch * info->height); m_gl_texture_cache.invalidate_range(cmd, range, rsx::invalidation_cause::read); - flip_image->copy_from(vm::base(info->address), static_cast(expected_format), gl::texture::type::uint_8_8_8_8, unpack_settings); + const rsx::io_buffer read_buf = { vm::base(info->address), range.length() }; + flip_image->copy_from(read_buf, static_cast(expected_format), gl::texture::type::uint_8_8_8_8, unpack_settings); image = flip_image.get(); } else if (image->get_internal_format() != static_cast(expected_format)) @@ -368,7 +369,7 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) std::vector sshot_frame(buffer_height * buffer_width * 4); glGetError(); - tex->copy_to(sshot_frame.data(), gl::texture::format::rgba, gl::texture::type::ubyte, pack_settings); + tex->copy_to(std::span(sshot_frame), gl::texture::format::rgba, gl::texture::type::ubyte, pack_settings); m_sshot_tex.reset(); diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 181e5058c8..40c3af180c 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -363,8 +363,7 @@ namespace gl } } - dst->bind(buffer::target::pixel_pack); - src->copy_to(reinterpret_cast(static_cast(dst_offset)), static_cast(pack_info.format), static_cast(pack_info.type), src_level, src_region, {}); + src->copy_to(*dst, dst_offset, static_cast(pack_info.format), static_cast(pack_info.type), src_level, src_region, {}); return false; }; @@ -611,9 +610,8 @@ namespace gl } glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); - transfer_buf->bind(buffer::target::pixel_unpack); - dst->copy_from(reinterpret_cast(u64(out_offset)), static_cast(unpack_info.format), + dst->copy_from(*transfer_buf, out_offset, static_cast(unpack_info.format), static_cast(unpack_info.type), dst_level, dst_region, {}); } } @@ -712,7 +710,6 @@ namespace gl pixel_buffer_layout mem_layout; std::span dst_buffer = staging_buffer; - void* out_pointer = staging_buffer.data(); u8 block_size_in_bytes = rsx::get_format_block_size_in_bytes(format); u64 image_linear_size = staging_buffer.size(); @@ -731,8 +728,6 @@ namespace gl g_compute_decode_buffer.remove(); g_compute_decode_buffer.create(gl::buffer::target::ssbo, min_required_buffer_size); } - - out_pointer = nullptr; } for (const rsx::subresource_layout& layout : input_layouts) @@ -867,7 +862,7 @@ namespace gl else { unpack_settings.swap_bytes(op.require_swap); - dst->copy_from(out_pointer, static_cast(gl_format), static_cast(gl_type), layout.level, region, unpack_settings); + dst->copy_from(staging_buffer, static_cast(gl_format), static_cast(gl_type), layout.level, region, unpack_settings); } } } @@ -1156,9 +1151,7 @@ namespace gl // Start pack operation pixel_pack_settings pack_settings{}; pack_settings.swap_bytes(pack_info.swap_bytes); - - g_typeless_transfer_buffer.get().bind(buffer::target::pixel_pack); - src->copy_to(nullptr, static_cast(pack_info.format), static_cast(pack_info.type), 0, src_region, pack_settings); + src->copy_to(g_typeless_transfer_buffer.get(), 0, static_cast(pack_info.format), static_cast(pack_info.type), 0, src_region, pack_settings); glBindBuffer(GL_PIXEL_PACK_BUFFER, GL_NONE); @@ -1166,8 +1159,7 @@ namespace gl pixel_unpack_settings unpack_settings{}; unpack_settings.swap_bytes(unpack_info.swap_bytes); - g_typeless_transfer_buffer.get().bind(buffer::target::pixel_unpack); - dst->copy_from(nullptr, static_cast(unpack_info.format), static_cast(unpack_info.type), 0, dst_region, unpack_settings); + dst->copy_from(g_typeless_transfer_buffer.get(), 0, static_cast(unpack_info.format), static_cast(unpack_info.type), 0, dst_region, unpack_settings); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, GL_NONE); } } diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 2c16bc8ba5..704589cccf 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -233,13 +233,11 @@ namespace gl pack_unpack_swap_bytes = false; } - pbo.bind(buffer::target::pixel_pack); - pixel_pack_settings pack_settings; pack_settings.alignment(1); pack_settings.swap_bytes(pack_unpack_swap_bytes); - src->copy_to(reinterpret_cast(pbo_offset), format, type, 0, src_rgn, pack_settings); + src->copy_to(pbo, pbo_offset, format, type, 0, src_rgn, pack_settings); } if (auto error = glGetError()) diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index 7dbd7fc254..b70a61f367 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -175,7 +175,7 @@ namespace gl m_id = GL_NONE; } - void texture::copy_from(const void* src, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings) + void texture::copy_from(const rsx::io_buffer& src, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings) { ensure(m_samples <= 1, "Transfer operations are unsupported on multisampled textures."); @@ -185,30 +185,30 @@ namespace gl { case GL_TEXTURE_1D: { - DSA_CALL(TextureSubImage1D, m_id, GL_TEXTURE_1D, level, region.x, region.width, static_cast(format), static_cast(type), src); + DSA_CALL(TextureSubImage1D, m_id, GL_TEXTURE_1D, level, region.x, region.width, static_cast(format), static_cast(type), src.data()); break; } case GL_TEXTURE_2D: { - DSA_CALL(TextureSubImage2D, m_id, GL_TEXTURE_2D, level, region.x, region.y, region.width, region.height, static_cast(format), static_cast(type), src); + DSA_CALL(TextureSubImage2D, m_id, GL_TEXTURE_2D, level, region.x, region.y, region.width, region.height, static_cast(format), static_cast(type), src.data()); break; } case GL_TEXTURE_3D: case GL_TEXTURE_2D_ARRAY: { - DSA_CALL(TextureSubImage3D, m_id, target_, level, region.x, region.y, region.z, region.width, region.height, region.depth, static_cast(format), static_cast(type), src); + DSA_CALL(TextureSubImage3D, m_id, target_, level, region.x, region.y, region.z, region.width, region.height, region.depth, static_cast(format), static_cast(type), src.data()); break; } case GL_TEXTURE_CUBE_MAP: { if (get_driver_caps().ARB_direct_state_access_supported) { - glTextureSubImage3D(m_id, level, region.x, region.y, region.z, region.width, region.height, region.depth, static_cast(format), static_cast(type), src); + glTextureSubImage3D(m_id, level, region.x, region.y, region.z, region.width, region.height, region.depth, static_cast(format), static_cast(type), src.data()); } else { rsx_log.warning("Cubemap upload via texture::copy_from is halfplemented!"); - auto ptr = static_cast(src); + auto ptr = static_cast(src.data()); const auto end = std::min(6u, region.z + region.depth); for (unsigned face = region.z; face < end; ++face) { @@ -221,22 +221,25 @@ namespace gl } } - void texture::copy_from(buffer& buf, u32 gl_format_type, u32 offset, u32 length) + void texture::copy_from(buffer& buf, GLsizeiptr offset, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings) { ensure(m_samples <= 1, "Transfer operations are unsupported on multisampled textures."); - if (get_target() != target::textureBuffer) - fmt::throw_exception("OpenGL error: texture cannot copy from buffer"); + buf.bind(buffer::target::pixel_unpack); - DSA_CALL(TextureBufferRange, m_id, GL_TEXTURE_BUFFER, gl_format_type, buf.id(), offset, length); + const rsx::io_buffer src{ reinterpret_cast(static_cast(offset)), buf.size() - offset }; + copy_from(src, format, type, level, region, pixel_settings); } void texture::copy_from(buffer_view& view) { - copy_from(*view.value(), view.format(), view.offset(), view.range()); + if (get_target() != target::textureBuffer) + fmt::throw_exception("OpenGL error: texture cannot copy from buffer"); + + DSA_CALL(TextureBufferRange, m_id, GL_TEXTURE_BUFFER, view.format(), view.value()->id(), view.offset(), view.range()); } - void texture::copy_to(void* dst, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const + void texture::copy_to(const rsx::io_buffer& dst, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const { ensure(m_samples <= 1, "Transfer operations are unsupported on multisampled textures."); @@ -247,14 +250,14 @@ namespace gl region.width == m_width && region.height == m_height && region.depth == m_depth) { if (caps.ARB_direct_state_access_supported) - glGetTextureImage(m_id, level, static_cast(format), static_cast(type), s32{ smax }, dst); + glGetTextureImage(m_id, level, static_cast(format), static_cast(type), dst.size(), dst.data()); else - glGetTextureImageEXT(m_id, static_cast(m_target), level, static_cast(format), static_cast(type), dst); + glGetTextureImageEXT(m_id, static_cast(m_target), level, static_cast(format), static_cast(type), dst.data()); } else if (caps.ARB_direct_state_access_supported) { glGetTextureSubImage(m_id, level, region.x, region.y, region.z, region.width, region.height, region.depth, - static_cast(format), static_cast(type), s32{ smax }, dst); + static_cast(format), static_cast(type), s32{ smax }, dst.data()); } else { @@ -269,6 +272,16 @@ namespace gl } } + void texture::copy_to(buffer& buf, GLsizeiptr offset, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const + { + ensure(offset < buf.size(), "PBO write is out of range"); + + buf.bind(buffer::target::pixel_pack); + + const rsx::io_buffer dst{ reinterpret_cast(static_cast(offset)), buf.size() - offset }; + copy_to(dst, format, type, level, region, pixel_settings); + } + void texture_view::create(texture* data, GLenum target, GLenum sized_format, const subresource_range& range, const GLenum* argb_swizzle) { m_target = target; diff --git a/rpcs3/Emu/RSX/GL/glutils/image.h b/rpcs3/Emu/RSX/GL/glutils/image.h index 4112d833c7..6af4d28fa1 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.h +++ b/rpcs3/Emu/RSX/GL/glutils/image.h @@ -4,6 +4,7 @@ #include "Utilities/geometry.h" #include "Emu/RSX/Common/TextureUtils.h" +#include "Emu/RSX/Common/io_buffer.h" //using enum rsx::format_class; using namespace ::rsx::format_class_; @@ -321,22 +322,24 @@ namespace gl } // Data management - void copy_from(const void* src, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings); + void copy_from(const rsx::io_buffer& src, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings); - void copy_from(buffer& buf, u32 gl_format_type, u32 offset, u32 length); + void copy_from(buffer& buf, GLsizeiptr offset, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings); void copy_from(buffer_view& view); - void copy_to(void* dst, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const; + void copy_to(const rsx::io_buffer& dst, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const; + + void copy_to(buffer& buf, GLsizeiptr offset, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const; // Convenience wrappers - void copy_from(const void* src, texture::format format, texture::type type, const pixel_unpack_settings& pixel_settings) + void copy_from(const rsx::io_buffer& src, texture::format format, texture::type type, const pixel_unpack_settings& pixel_settings) { const coord3u region = { {}, size3D() }; copy_from(src, format, type, 0, region, pixel_settings); } - void copy_to(void* dst, texture::format format, texture::type type, const pixel_pack_settings& pixel_settings) const + void copy_to(const rsx::io_buffer& dst, texture::format format, texture::type type, const pixel_pack_settings& pixel_settings) const { const coord3u region = { {}, size3D() }; copy_to(dst, format, type, 0, region, pixel_settings); diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index 96090d1597..dd9dd98f4d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -5,6 +5,7 @@ #include "Emu/localized_string.h" #include +#include // Definitions for common UI controls and their routines namespace rsx @@ -39,6 +40,9 @@ namespace rsx image_info_base() {} virtual ~image_info_base() {} virtual const u8* get_data() const = 0; + virtual usz size_bytes() const { return static_cast(w * h * bpp); } + + std::span as_span() const { return { get_data(), size_bytes() }; } }; struct image_info : public image_info_base @@ -56,6 +60,7 @@ namespace rsx void load_data(const std::vector& bytes, bool grayscaled = false); const u8* get_data() const override { return channels == 4 ? data : data_grey.empty() ? nullptr : data_grey.data(); } + usz size_bytes() const override { return data_grey.size(); } }; struct resource_config From 1e16b338b4303984d81a1075f6ad68bfcaf2aa63 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 03:04:59 +0300 Subject: [PATCH 353/630] gl: Add support for named objects --- rpcs3/Emu/RSX/GL/GLProcTable.h | 1 + rpcs3/Emu/RSX/GL/glutils/common.h | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLProcTable.h b/rpcs3/Emu/RSX/GL/GLProcTable.h index 5278014b5c..ad8943bd4f 100644 --- a/rpcs3/Emu/RSX/GL/GLProcTable.h +++ b/rpcs3/Emu/RSX/GL/GLProcTable.h @@ -259,6 +259,7 @@ OPENGL_PROC(PFNGLDELETESYNCPROC, DeleteSync); // KHR_debug OPENGL_PROC(PFNGLDEBUGMESSAGECALLBACKPROC, DebugMessageCallback); +OPENGL_PROC(PFNGLOBJECTLABELPROC, ObjectLabel); // Immutable textures OPENGL_PROC(PFNGLTEXSTORAGE1DPROC, TexStorage1D); diff --git a/rpcs3/Emu/RSX/GL/glutils/common.h b/rpcs3/Emu/RSX/GL/glutils/common.h index f99c3590a6..a147a6e754 100644 --- a/rpcs3/Emu/RSX/GL/glutils/common.h +++ b/rpcs3/Emu/RSX/GL/glutils/common.h @@ -76,6 +76,26 @@ namespace gl } }; + template + struct named_object + { + protected: + GLuint m_id = GL_NONE; + std::string m_name = "Unnamed"; + + public: + void set_name(std::string_view name) + { + m_name = name.data(); + glObjectLabel(Ns, m_id, name.length(), name.data()); + } + + std::string_view name() const + { + return m_name; + } + }; + // Very useful util when capturing traces with RenderDoc static inline void push_debug_label(const char* label) { From 0ea692e9ab1f9bdf793eb539773ee372e514fadb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 03:06:45 +0300 Subject: [PATCH 354/630] gl: Use named_object as the base class for images --- rpcs3/Emu/RSX/GL/glutils/image.cpp | 2 ++ rpcs3/Emu/RSX/GL/glutils/image.h | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index b70a61f367..4760bb1cc9 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -410,6 +410,8 @@ namespace gl auto view = std::make_unique(this, swizzle, aspect_flags); auto result = view.get(); views.emplace(key, std::move(view)); + + result->set_name(fmt::format("%s_%x", name(), remap.encoded)); return result; } diff --git a/rpcs3/Emu/RSX/GL/glutils/image.h b/rpcs3/Emu/RSX/GL/glutils/image.h index 6af4d28fa1..bd974c226a 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.h +++ b/rpcs3/Emu/RSX/GL/glutils/image.h @@ -59,7 +59,7 @@ namespace gl GLuint num_layers; }; - class texture + class texture : public named_object { friend class texture_view; @@ -181,7 +181,6 @@ namespace gl }; protected: - GLuint m_id = GL_NONE; GLuint m_width = 0; GLuint m_height = 0; GLuint m_depth = 0; @@ -346,10 +345,9 @@ namespace gl } }; - class texture_view + class texture_view : public named_object { protected: - GLuint m_id = GL_NONE; GLenum m_target = 0; GLenum m_format = 0; GLenum m_view_format = 0; @@ -465,6 +463,7 @@ namespace gl class viewable_image : public texture { + protected: std::unordered_map> views; public: From 4a51302c583da4747af60802a1f8c2bf4444ace1 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 03:07:57 +0300 Subject: [PATCH 355/630] gl: Propagate native layout from parent when creating temporary subresources --- rpcs3/Emu/RSX/GL/GLTextureCache.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp index c2b0e3c252..e01385d51b 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp @@ -179,6 +179,10 @@ namespace gl auto components = get_component_mapping(gcm_format, rsx::component_order::default_); dst->set_native_component_layout(components); } + else + { + dst->set_native_component_layout(src->get_native_component_layout()); + } return dst->get_view(remap); } From 728d84b1fed0e99b00a7283d58014c4d3024d583 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 03:12:18 +0300 Subject: [PATCH 356/630] gl: Add debug names to some objects --- rpcs3/Emu/RSX/GL/GLTextureCache.cpp | 2 ++ rpcs3/Emu/RSX/GL/GLTextureCache.h | 1 + rpcs3/Emu/RSX/GL/glutils/image.cpp | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp index e01385d51b..f8aa9d95df 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp @@ -152,6 +152,8 @@ namespace gl dst = data.get(); dst->properties_encoding = match_key; m_temporary_surfaces.emplace_back(std::move(data)); + + dst->set_name(fmt::format("[Temp View] id=%u, fmt=0x%x", dst->id(), gcm_format)); } dst->add_ref(); diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 704589cccf..8bfc92f902 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -745,6 +745,7 @@ namespace gl gl::upload_texture(cmd, section->get_raw_texture(), gcm_format, input_swizzled, subresource_layout); + section->get_raw_texture()->set_name(fmt::format("Raw Texture @0x%x", rsx_range.start)); section->last_write_tag = rsx::get_shared_tag(); return section; } diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index 4760bb1cc9..e99a6e15b2 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -411,7 +411,7 @@ namespace gl auto result = view.get(); views.emplace(key, std::move(view)); - result->set_name(fmt::format("%s_%x", name(), remap.encoded)); + result->set_name(fmt::format("%s, remap=%x", name(), remap.encoded)); return result; } From cae8ae63e343ec8acc479016c91a8d93f301b7ed Mon Sep 17 00:00:00 2001 From: kd-11 <15904127+kd-11@users.noreply.github.com> Date: Sat, 7 Mar 2026 13:16:39 +0300 Subject: [PATCH 357/630] gl: Use image dimensions to determine read buffer size --- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 1 - 1 file changed, 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index dd9dd98f4d..f64fdfa47f 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -60,7 +60,6 @@ namespace rsx void load_data(const std::vector& bytes, bool grayscaled = false); const u8* get_data() const override { return channels == 4 ? data : data_grey.empty() ? nullptr : data_grey.data(); } - usz size_bytes() const override { return data_grey.size(); } }; struct resource_config From 7dad9663b2f411458f79a10b1f341d95e153baf7 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 19 Jul 2025 13:59:21 +0200 Subject: [PATCH 358/630] cellDmuxPamf implementation part 1: SPU thread --- rpcs3/Emu/Cell/Modules/cellDmux.h | 4 +- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 1145 ++++++++++++++++++++++- rpcs3/Emu/Cell/Modules/cellDmuxPamf.h | 661 +++++++++++++ rpcs3/Emu/Cell/Modules/cellPamf.h | 1 + rpcs3/Emu/savestate_utils.cpp | 3 +- 5 files changed, 1789 insertions(+), 25 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.h b/rpcs3/Emu/Cell/Modules/cellDmux.h index 1767165283..7c31bbf105 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.h +++ b/rpcs3/Emu/Cell/Modules/cellDmux.h @@ -301,7 +301,7 @@ using CellDmuxCoreOpResetStream = error_code(vm::ptr); using CellDmuxCoreOpCreateThread = error_code(vm::ptr); using CellDmuxCoreOpJoinThread = error_code(vm::ptr); using CellDmuxCoreOpSetStream = error_code(vm::ptr, vm::cptr, u32, b8, u64); -using CellDmuxCoreOpFreeMemory = error_code(vm::ptr, vm::ptr, u32); +using CellDmuxCoreOpReleaseAu = error_code(vm::ptr, vm::ptr, u32); using CellDmuxCoreOpQueryEsAttr = error_code(vm::cptr, vm::cptr, vm::ptr); using CellDmuxCoreOpEnableEs = error_code(vm::ptr, vm::cptr, vm::cptr, vm::cptr>, vm::cptr>, vm::cptr, vm::pptr); using CellDmuxCoreOpDisableEs = u32(vm::ptr); @@ -318,7 +318,7 @@ struct CellDmuxCoreOps vm::bptr createThread; vm::bptr joinThread; vm::bptr setStream; - vm::bptr freeMemory; + vm::bptr releaseAu; vm::bptr queryEsAttr; vm::bptr enableEs; vm::bptr disableEs; diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 70162d4031..7c0fd8ec39 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -1,16 +1,1126 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "Emu/IdManager.h" +#include "Emu/Cell/lv2/sys_sync.h" -#include "cellDmux.h" #include "cellDmuxPamf.h" - +#include vm::gvar g_cell_dmux_core_ops_pamf; vm::gvar g_cell_dmux_core_ops_raw_es; LOG_CHANNEL(cellDmuxPamf) +inline std::pair dmuxPamfStreamIdToTypeChannel(u16 stream_id, u16 private_stream_id) +{ + if ((stream_id & 0xf0) == 0xe0) + { + return { DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO, stream_id & 0x0f }; + } + + if ((stream_id & 0xff) != 0xbd) + { + return { DMUX_PAMF_STREAM_TYPE_INDEX_INVALID, 0 }; + } + + switch (private_stream_id & 0xf0) + { + case 0x40: return { DMUX_PAMF_STREAM_TYPE_INDEX_LPCM, private_stream_id & 0x0f }; + case 0x30: return { DMUX_PAMF_STREAM_TYPE_INDEX_AC3, private_stream_id & 0x0f }; + case 0x00: return { DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX, private_stream_id & 0x0f }; + case 0x20: return { DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA, private_stream_id & 0x0f }; + default: return { DMUX_PAMF_STREAM_TYPE_INDEX_INVALID, 0 }; + } +} + + +// SPU thread + +void dmux_pamf_base::output_queue::pop_back(u32 au_size) +{ + ensure(back - au_size >= buffer.data(), "Invalid au_size"); + back -= au_size; +} + +void dmux_pamf_base::output_queue::pop_back(u8* au_addr) +{ + ensure(au_addr >= buffer.data() && au_addr < std::to_address(buffer.end()), "Invalid au_addr"); + + // If au_begin is in front of the back pointer, unwrap the back pointer (there are no more access units behind the back pointer) + if (au_addr > back) + { + wrap_pos = buffer.data(); + } + + back = au_addr; +} + +void dmux_pamf_base::output_queue::pop_front(u32 au_size) +{ + ensure(front + au_size <= std::to_address(buffer.end()), "Invalid au_size"); + front += au_size; + + // When front reaches wrap_pos, unwrap the queue + if (wrap_pos != buffer.data() && wrap_pos <= front) + { + ensure(wrap_pos == front, "Invalid au_size"); + front = buffer.data(); + wrap_pos = buffer.data(); + } +} + +void dmux_pamf_base::output_queue::push_unchecked(const access_unit_chunk& au_chunk) +{ + std::ranges::copy(au_chunk.cached_data, back); + std::ranges::copy(au_chunk.data, back + au_chunk.cached_data.size()); + back += au_chunk.data.size() + au_chunk.cached_data.size(); +} + +bool dmux_pamf_base::output_queue::push(const access_unit_chunk& au_chunk, const std::function& on_fatal_error) +{ + // If there are any unconsumed access units behind the back pointer, the distance between the front and back pointers is the remaining capacity, + // otherwise the distance between the end of the buffer and the back pointer is the remaining capacity + if (wrap_pos == buffer.data()) + { + // Since it was already checked if there is enough space for au_max_size, this can only occur if the current access unit is larger than au_max_size + if (au_chunk.data.size() + au_chunk.cached_data.size() > static_cast(std::to_address(buffer.end()) - back)) + { + cellDmuxPamf.error("Access unit larger than specified maximum access unit size"); + on_fatal_error(); + return false; + } + } + else if (au_chunk.data.size() + au_chunk.cached_data.size() + 0x10 > static_cast(front - back)) // + sizeof(v128) because of SPU shenanigans probably + { + return false; + } + + push_unchecked(au_chunk); + return true; +} + +bool dmux_pamf_base::output_queue::prepare_next_au(u32 au_max_size) +{ + // LLE always checks the distance between the end of the buffer and the back pointer, even if the back pointer is wrapped around and there are unconsumed access units behind it + if (std::to_address(buffer.end()) - back < au_max_size) + { + // Can't wrap the back pointer around again as long as there are unconsumed access units behind it + if (wrap_pos != buffer.data()) + { + return false; + } + + wrap_pos = back; + back = buffer.data(); + } + + return true; +} + +void dmux_pamf_base::elementary_stream::flush_es() +{ + if (current_au.accumulated_size != 0) + { + ensure(au_queue.get_free_size() >= cache.size()); + au_queue.push_unchecked({ {}, cache }); + + current_au.accumulated_size += static_cast(cache.size()); + + ctx.on_au_found(get_stream_id().first, get_stream_id().second, user_data, { au_queue.peek_back(current_au.accumulated_size), current_au.accumulated_size }, current_au.pts, current_au.dts, + current_au.rap, au_specific_info_size, current_au.au_specific_info_buf); + } + + reset(); + + while (!ctx.on_flush_done(get_stream_id().first, get_stream_id().second, user_data)) {} // The flush_done event is repeatedly fired until it succeeds +} + +void dmux_pamf_base::elementary_stream::reset_es(u8* au_addr) +{ + if (!au_addr) + { + reset(); + au_queue.clear(); + } + else + { + au_queue.pop_back(au_addr); + } +} + +void dmux_pamf_base::elementary_stream::discard_access_unit() +{ + au_queue.pop_back(current_au.accumulated_size - static_cast(au_chunk.data.size() + au_chunk.cached_data.size())); + reset(); + cache.clear(); +} + +template +u32 dmux_pamf_base::elementary_stream::parse_audio_stream_header(std::span pes_packet_data) +{ + u32 extra_header_size_unk = 0; // No clue what this is, I have not found a single instance in any PAMF stream where it is something other than zero + + if (!au_size_unk) // For some reason, LLE uses the member that stores the size of user data access units here as bool + { + // Not checked on LLE + if (pes_packet_data.size() < sizeof(u32)) + { + return umax; + } + + extra_header_size_unk = read_from_ptr>(pes_packet_data) & extra_header_size_unk_mask; + au_size_unk = true; + } + + return extra_header_size_unk + sizeof(u32); +} + +bool dmux_pamf_base::elementary_stream::process_pes_packet_data() +{ + ensure(pes_packet_data, "set_pes_packet_data() should be used before process_stream()"); + + for (;;) + { + switch (state) + { + case state::initial: + if (stream_chunk.empty()) + { + pes_packet_data.reset(); + return true; + } + + // Parse the current stream section and increment the reading position by the amount that was consumed + stream_chunk = stream_chunk.subspan(parse_stream(stream_chunk)); + + current_au.accumulated_size += static_cast(au_chunk.data.size() + au_chunk.cached_data.size()); + + // If the beginning of a new access unit was found, set the current timestamps and rap indicator + if (!current_au.timestamps_rap_set && (current_au.state == access_unit::state::commenced || current_au.state == access_unit::state::m2v_sequence + || (current_au.state == access_unit::state::complete && au_chunk.cached_data.empty()))) + { + set_au_timestamps_rap(); + } + + state = state::pushing_au_queue; + [[fallthrough]]; + + case state::pushing_au_queue: + if (!au_chunk.data.empty() || !au_chunk.cached_data.empty()) + { + if (!au_queue.push(au_chunk, std::bind_front(&dmux_pamf_base::on_fatal_error, &ctx))) + { + ctx.on_au_queue_full(); + return false; + } + + au_chunk.data = {}; + au_chunk.cached_data.clear(); + } + + // This happens if the distance between two delimiters is greater than the size indicated in the info header of the stream. + if (current_au.state == access_unit::state::size_mismatch) + { + // LLE cuts off one byte from the beginning of the current PES packet data and then starts over. + pes_packet_data = pes_packet_data->subspan<1>(); + stream_chunk = *pes_packet_data; + + // It also removes the entire current access unit from the queue, even if it began in an earlier PES packet + au_queue.pop_back(current_au.accumulated_size); + current_au.accumulated_size = 0; + + state = state::initial; + continue; + } + + state = state::notifying_au_found; + [[fallthrough]]; + + case state::notifying_au_found: + if (current_au.state == access_unit::state::complete && !ctx.on_au_found(get_stream_id().first, get_stream_id().second, user_data, + { au_queue.peek_back(current_au.accumulated_size), current_au.accumulated_size }, current_au.pts, current_au.dts, current_au.rap, au_specific_info_size, current_au.au_specific_info_buf)) + { + return false; + } + + state = state::preparing_for_next_au; + [[fallthrough]]; + + case state::preparing_for_next_au: + if (current_au.state == access_unit::state::complete) + { + if (!au_queue.prepare_next_au(au_max_size)) + { + ctx.on_au_queue_full(); + return false; + } + + current_au = {}; + } + + state = state::initial; + } + } +} + +template +u32 dmux_pamf_base::video_stream::parse_stream(std::span stream) +{ + if (current_au.state != access_unit::state::none && (avc || current_au.state != access_unit::state::m2v_sequence)) + { + current_au.state = access_unit::state::incomplete; + } + + // Concatenate the cache of the previous stream section and the beginning of the current section + std::array buf{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; // Prevent false positives (M2V pic start code ends with 0x00) + ensure(cache.size() <= 3, "The size of the cache should never exceed three bytes"); + std::ranges::copy(cache, buf.begin()); + std::copy_n(stream.begin(), std::min(sizeof(u32) - 1, stream.size()), buf.begin() + cache.size()); // Not entirely accurate: LLE always reads three bytes from the stream, even if it is smaller than that + + auto au_chunk_begin = stream.begin(); + s32 cache_idx = 0; + auto stream_it = stream.begin(); + [&] + { + // Search for delimiter in cache + for (; cache_idx < static_cast(cache.size()); cache_idx++) + { + if (const be_t code = read_from_ptr>(buf.data() + cache_idx); + (avc && code == AVC_AU_DELIMITER) || (!avc && (code == M2V_PIC_START || code == M2V_SEQUENCE_HEADER || code == M2V_SEQUENCE_END))) + { + if (current_au.state != access_unit::state::none && (avc || current_au.state != access_unit::state::m2v_sequence)) + { + // The sequence end code is included in the access unit + // LLE increments the stream pointer instead of the cache index, which will cause the access unit to be corrupted at the end + if (!avc && code == M2V_SEQUENCE_END) + { + cellDmuxPamf.warning("M2V sequence end code in cache"); + stream_it += std::min(sizeof(u32), stream.size()); // Not accurate, LLE always increments by four, regardless of the stream size + } + + current_au.state = access_unit::state::complete; + return; + } + + // If current_au.state is none and there was a delimiter found here, then LLE outputs the entire cache, even if the access unit starts at cache_idx > 0 + + current_au.state = avc || code == M2V_PIC_START ? access_unit::state::commenced : access_unit::state::m2v_sequence; + } + } + + // Search for delimiter in stream + for (; stream_it <= stream.end() - sizeof(u32); stream_it++) + { + if (const be_t code = read_from_ptr>(stream_it); + (avc && code == AVC_AU_DELIMITER) || (!avc && (code == M2V_PIC_START || code == M2V_SEQUENCE_HEADER || code == M2V_SEQUENCE_END))) + { + if (current_au.state != access_unit::state::none && (avc || current_au.state != access_unit::state::m2v_sequence)) + { + stream_it += !avc && code == M2V_SEQUENCE_END ? sizeof(u32) : 0; // The sequence end code is included in the access unit + current_au.state = access_unit::state::complete; + return; + } + + au_chunk_begin = avc || current_au.state == access_unit::state::none ? stream_it : au_chunk_begin; + current_au.state = avc || code == M2V_PIC_START ? access_unit::state::commenced : access_unit::state::m2v_sequence; + } + } + }(); + + if (current_au.state != access_unit::state::none) + { + au_chunk.data = { au_chunk_begin, stream_it }; + std::copy_n(cache.begin(), cache_idx, std::back_inserter(au_chunk.cached_data)); + cache.erase(cache.begin(), cache.begin() + cache_idx); + } + + // Cache the end of the stream if an access unit wasn't completed. There could be the beginning of a delimiter in the last three bytes + if (current_au.state != access_unit::state::complete) + { + std::copy(stream_it, stream.end(), std::back_inserter(cache)); + } + + return static_cast((current_au.state != access_unit::state::complete || stream_it > stream.end() ? stream.end() : stream_it) - stream.begin()); +} + +u32 dmux_pamf_base::lpcm_stream::parse_stream_header(std::span pes_packet_data, [[maybe_unused]] s8 pts_dts_flag) +{ + // Not checked on LLE + if (pes_packet_data.size() < sizeof(u8) + 0x10) + { + return umax; + } + + std::memcpy(au_specific_info_buf.data(), &pes_packet_data[1], au_specific_info_buf.size()); + return parse_audio_stream_header<0x7ff>(pes_packet_data); +} + +u32 dmux_pamf_base::lpcm_stream::parse_stream(std::span stream) +{ + if (current_au.state == access_unit::state::none) + { + current_au.au_specific_info_buf = au_specific_info_buf; + } + + if (au_max_size - current_au.accumulated_size > stream.size()) + { + au_chunk.data = stream; + current_au.state = current_au.state == access_unit::state::none ? access_unit::state::commenced : access_unit::state::incomplete; + } + else + { + au_chunk.data = stream.first(au_max_size - current_au.accumulated_size); + current_au.state = access_unit::state::complete; + } + + return static_cast(au_chunk.data.size()); +} + +template +u32 dmux_pamf_base::audio_stream::parse_stream(std::span stream) +{ + const auto parse_au_size = [](be_t data) -> u16 + { + if constexpr (ac3) + { + if (const u8 fscod = data >> 14, frmsizecod = data >> 8 & 0x3f; fscod < 3 && frmsizecod < 38) + { + return AC3_FRMSIZE_TABLE[fscod][frmsizecod] * sizeof(s16); + } + } + else if ((data & 0x3ff) < 0x200) + { + return ((data & 0x3ff) + 1) * 8 + ATRACX_ATS_HEADER_SIZE; + } + + return 0; + }; + + if (current_au.state != access_unit::state::none) + { + current_au.state = access_unit::state::incomplete; + } + + // Concatenate the cache of the previous stream section and the beginning of the current section + std::array buf{}; + ensure(cache.size() <= 3, "The size of the cache should never exceed three bytes"); + std::ranges::copy(cache, buf.begin()); + std::copy_n(stream.begin(), std::min(sizeof(u16) - 1, stream.size()), buf.begin() + cache.size()); + + auto au_chunk_begin = stream.begin(); + s32 cache_idx = 0; + auto stream_it = stream.begin(); + [&] + { + // Search for delimiter in cache + for (; cache_idx <= static_cast(cache.size() + std::min(sizeof(u16) - 1, stream.size()) - sizeof(u16)); cache_idx++) + { + if (const be_t tmp = read_from_ptr>(buf.data() + cache_idx); current_au.size_info_offset != 0) + { + if (--current_au.size_info_offset == 0) + { + current_au.parsed_size = parse_au_size(tmp); + } + } + else if (tmp == SYNC_WORD) + { + if (current_au.state == access_unit::state::none) + { + // If current_au.state is none and there was a delimiter found here, then LLE outputs the entire cache, even if the access unit starts at cache_idx > 0 + + current_au.size_info_offset = ac3 ? sizeof(u16) * 2 : sizeof(u16); + current_au.state = access_unit::state::commenced; + } + else if (const u32 au_size = current_au.accumulated_size + cache_idx; au_size >= current_au.parsed_size) + { + current_au.state = au_size == current_au.parsed_size ? access_unit::state::complete : access_unit::state::size_mismatch; + return; + } + } + } + + // As long as the current access unit hasn't reached the size indicated in its header, we don't need to parse the stream + if (current_au.state != access_unit::state::none && current_au.size_info_offset == 0 && current_au.accumulated_size + cache.size() < current_au.parsed_size) + { + stream_it += std::min(current_au.parsed_size - current_au.accumulated_size - cache.size(), stream.size() - sizeof(u32)); + } + + // Search for delimiter in stream + for (; stream_it <= stream.end() - sizeof(u32); stream_it++) // LLE uses sizeof(u32), even though the delimiter is only two bytes large + { + if (const be_t tmp = read_from_ptr>(stream_it); current_au.size_info_offset != 0) + { + if (--current_au.size_info_offset == 0) + { + current_au.parsed_size = parse_au_size(tmp); + } + } + else if (tmp == SYNC_WORD) + { + if (current_au.state == access_unit::state::none) + { + au_chunk_begin = stream_it; + current_au.size_info_offset = ac3 ? sizeof(u16) * 2 : sizeof(u16); + current_au.state = access_unit::state::commenced; + } + else if (const u32 au_size = static_cast(current_au.accumulated_size + stream_it - au_chunk_begin + cache.size()); au_size >= current_au.parsed_size) + { + current_au.state = au_size == current_au.parsed_size ? access_unit::state::complete : access_unit::state::size_mismatch; + return; + } + } + } + }(); + + if (current_au.state != access_unit::state::none) + { + au_chunk.data = { au_chunk_begin, stream_it }; + std::copy_n(cache.begin(), cache_idx, std::back_inserter(au_chunk.cached_data)); + cache.erase(cache.begin(), cache.begin() + cache_idx); + } + + // Cache the end of the stream if an access unit wasn't completed. There could be the beginning of a delimiter in the last three bytes + if (current_au.state != access_unit::state::complete && current_au.state != access_unit::state::size_mismatch) + { + std::copy(stream_it, stream.end(), std::back_inserter(cache)); + } + + return static_cast((current_au.state != access_unit::state::complete ? stream.end() : stream_it) - stream.begin()); +} + +u32 dmux_pamf_base::user_data_stream::parse_stream_header(std::span pes_packet_data, s8 pts_dts_flag) +{ + if (pts_dts_flag < 0) // PTS field exists + { + // Not checked on LLE + if (pes_packet_data.size() < 2 + sizeof(u32)) + { + return umax; + } + + au_size_unk = read_from_ptr>(pes_packet_data.begin() + 2) - sizeof(u32); + return 10; + } + + return 2; +} + +u32 dmux_pamf_base::user_data_stream::parse_stream(std::span stream) +{ + if (au_size_unk > stream.size()) + { + au_chunk.data = stream; + au_size_unk -= static_cast(stream.size()); + current_au.state = access_unit::state::commenced; // User data streams always use commenced + } + else + { + au_chunk.data = stream.first(au_size_unk); + au_size_unk = 0; + current_au.state = access_unit::state::complete; + } + + return static_cast(stream.size()); // Always consume the entire stream +} + +bool dmux_pamf_base::enable_es(u32 stream_id, u32 private_stream_id, bool is_avc, std::span au_queue_buffer, u32 au_max_size, bool raw_es, u32 user_data) +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + this->raw_es = raw_es; + pack_es_type_idx = type_idx; + + switch (type_idx) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + elementary_streams[0][channel] = is_avc ? static_cast>(std::make_unique>(channel, au_max_size, *this, user_data, au_queue_buffer)) + : std::make_unique>(channel, au_max_size, *this, user_data, au_queue_buffer); + return true; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: elementary_streams[1][channel] = std::make_unique(channel, au_max_size, *this, user_data, au_queue_buffer); return true; + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: elementary_streams[2][channel] = std::make_unique>(channel, au_max_size, *this, user_data, au_queue_buffer); return true; + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: elementary_streams[3][channel] = std::make_unique>(channel, au_max_size, *this, user_data, au_queue_buffer); return true; + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: elementary_streams[4][channel] = std::make_unique(channel, au_max_size, *this, user_data, au_queue_buffer); return true; + default: fmt::throw_exception("Unreachable"); + } +} + +bool dmux_pamf_base::disable_es(u32 stream_id, u32 private_stream_id) +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || !elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + elementary_streams[type_idx][channel] = nullptr; + return true; +} + +bool dmux_pamf_base::release_au(u32 stream_id, u32 private_stream_id, u32 au_size) const +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || !elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + elementary_streams[type_idx][channel]->release_au(au_size); + return true; +} + +bool dmux_pamf_base::flush_es(u32 stream_id, u32 private_stream_id) +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || !elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + state = state::initial; + elementary_streams[type_idx][channel]->flush_es(); + return true; +} + +void dmux_pamf_base::set_stream(std::span stream, bool continuity) +{ + if (!continuity) + { + std::ranges::for_each(elementary_streams | std::views::join | std::views::filter(elementary_stream::is_enabled), &elementary_stream::discard_access_unit); + } + + state = state::initial; + + // Not checked on LLE, it would parse old memory contents or uninitialized memory if the size of the input stream set by the user is not a multiple of 0x800. + // Valid PAMF streams are always a multiple of 0x800 bytes large. + if ((stream.size() & 0x7ff) != 0) + { + cellDmuxPamf.warning("Invalid stream size"); + } + + this->stream = stream; + demux_done_notified = false; +} + +void dmux_pamf_base::reset_stream() +{ + std::ranges::for_each(elementary_streams | std::views::join | std::views::filter(elementary_stream::is_enabled), &elementary_stream::discard_access_unit); + state = state::initial; + stream.reset(); +} + +bool dmux_pamf_base::reset_es(u32 stream_id, u32 private_stream_id, u8* au_addr) +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || !elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + if (!au_addr) + { + state = state::initial; + } + + elementary_streams[type_idx][channel]->reset_es(au_addr); + return true; +} + +bool dmux_pamf_base::process_next_pack() +{ + if (!stream) + { + demux_done_notified = demux_done_notified || on_demux_done(); + return true; + } + + switch (state) + { + case state::initial: + { + // Search for the next pack start code or prog end code + std::span pack{ static_cast(nullptr), PACK_SIZE }; // This initial value is not used, can't be default constructed + + for (;;) + { + if (stream->empty()) + { + stream.reset(); + demux_done_notified = on_demux_done(); + return true; + } + + pack = stream->subspan<0, PACK_SIZE>(); + stream = stream->subspan(); + + // If the input stream is a raw elementary stream, skip everything MPEG-PS related and go straight to elementary stream parsing + if (raw_es) + { + if (elementary_stream::is_enabled(elementary_streams[pack_es_type_idx][0])) + { + elementary_streams[pack_es_type_idx][0]->set_pes_packet_data(pack); + } + + state = state::elementary_stream; + return true; + } + + // While LLE is actually searching the entire section for a pack start code or program end code, + // it doesn't set its current reading position to the address where it found the code, so it would bug out if there isn't one at the start of the section + + if (const be_t code = read_from_ptr>(pack); code == PACK_START) + { + break; + } + else if (code == PROG_END) + { + if (!on_prog_end()) + { + state = state::prog_end; + } + + return true; + } + + cellDmuxPamf.warning("No start code found at the beginning of the current section"); + } + + // Skip over pack header + const u8 pack_stuffing_length = read_from_ptr(pack.subspan()) & 0x7; + std::span current_pes_packet = pack.subspan(PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length); + + if (read_from_ptr>(current_pes_packet) >> 8 != PACKET_START_CODE_PREFIX) + { + cellDmuxPamf.error("Invalid start code after pack header"); + return false; + } + + // Skip over system header if present + if (read_from_ptr>(current_pes_packet) == SYSTEM_HEADER) + { + const u32 system_header_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (system_header_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > current_pes_packet.size()) + { + cellDmuxPamf.error("Invalid system header length"); + return false; + } + + current_pes_packet = current_pes_packet.subspan(system_header_length); + + // The SPU thread isn't doing load + rotate here for 4-byte loading (in valid PAMF streams, the next start code after a system header is always 0x10 byte aligned) + const u32 offset_low = (current_pes_packet.data() - pack.data()) & 0xf; + current_pes_packet = { current_pes_packet.begin() - offset_low, current_pes_packet.end() }; + + if (const be_t code = read_from_ptr>(current_pes_packet); code >> 8 != PACKET_START_CODE_PREFIX) + { + cellDmuxPamf.error("Invalid start code after system header"); + return false; + } + else if (code == PRIVATE_STREAM_2) + { + // A system header is optionally followed by a private stream 2 + // The first two bytes of the stream are the stream id of a video stream. The next access unit of that stream is a random access point/keyframe + + const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (pes_packet_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > current_pes_packet.size()) + { + cellDmuxPamf.error("Invalid private stream 2 length"); + return false; + } + + if (const u8 channel = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET + sizeof(u16)) & 0xf; + elementary_stream::is_enabled(elementary_streams[0][channel])) + { + elementary_streams[0][channel]->set_rap(); + } + + current_pes_packet = current_pes_packet.subspan(pes_packet_length); + } + } + + // Parse PES packet + // LLE only parses the first PES packet per pack (valid PAMF streams only have one PES packet per pack, not including the system header + private stream 2) + + const u32 pes_packet_start_code = read_from_ptr>(current_pes_packet); + + if (pes_packet_start_code >> 8 != PACKET_START_CODE_PREFIX) + { + cellDmuxPamf.error("Invalid start code"); + return false; + } + + // The size of the stream is not checked here because if coming from a pack header, it is guaranteed that there is enough space, + // and if coming from a system header or private stream 2, it was already checked above + const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + const u8 pes_header_data_length = read_from_ptr(current_pes_packet.begin() + PES_HEADER_DATA_LENGTH_OFFSET) + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8); + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (pes_packet_length > current_pes_packet.size() || pes_packet_length <= pes_header_data_length) + { + cellDmuxPamf.error("Invalid pes packet length"); + return false; + } + + const std::span pes_packet_data = current_pes_packet.subspan(pes_header_data_length, pes_packet_length - pes_header_data_length); + + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(pes_packet_start_code, read_from_ptr(pes_packet_data)); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID) + { + cellDmuxPamf.error("Invalid stream type"); + return false; + } + + pack_es_type_idx = type_idx; + pack_es_channel = channel; + + if (elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + const s8 pts_dts_flag = read_from_ptr(current_pes_packet.begin() + PTS_DTS_FLAG_OFFSET); + + if (pts_dts_flag < 0) + { + // The timestamps should be unsigned, but are sign-extended from s32 to u64 on LLE. They probably forgot about integer promotion + const s32 PTS_32_30 = read_from_ptr(current_pes_packet.begin() + 9) >> 1; + const s32 PTS_29_15 = read_from_ptr>(current_pes_packet.begin() + 10) >> 1; + const s32 PTS_14_0 = read_from_ptr>(current_pes_packet.begin() + 12) >> 1; + + elementary_streams[type_idx][channel]->set_pts(PTS_32_30 << 30 | PTS_29_15 << 15 | PTS_14_0); // Bit 32 is discarded + } + + if (pts_dts_flag & 0x40) + { + const s32 DTS_32_30 = read_from_ptr(current_pes_packet.begin() + 14) >> 1; + const s32 DTS_29_15 = read_from_ptr>(current_pes_packet.begin() + 15) >> 1; + const s32 DTS_14_0 = read_from_ptr>(current_pes_packet.begin() + 17) >> 1; + + elementary_streams[type_idx][channel]->set_dts(DTS_32_30 << 30 | DTS_29_15 << 15 | DTS_14_0); // Bit 32 is discarded + } + + const usz stream_header_size = elementary_streams[type_idx][channel]->parse_stream_header(pes_packet_data, pts_dts_flag); + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (stream_header_size > pes_packet_data.size()) + { + cellDmuxPamf.error("Invalid stream header size"); + return false; + } + + elementary_streams[type_idx][channel]->set_pes_packet_data(pes_packet_data.subspan(stream_header_size)); + } + + state = state::elementary_stream; + [[fallthrough]]; + } + case state::elementary_stream: + { + if (!elementary_stream::is_enabled(elementary_streams[pack_es_type_idx][pack_es_channel]) || elementary_streams[pack_es_type_idx][pack_es_channel]->process_pes_packet_data()) + { + state = state::initial; + } + + return true; + } + case state::prog_end: + { + if (on_prog_end()) + { + state = state::initial; + } + + return true; + } + default: + fmt::throw_exception("Unreachable"); + } +} + +u32 dmux_pamf_base::get_enabled_es_count() const +{ + return static_cast(std::ranges::count_if(elementary_streams | std::views::join, elementary_stream::is_enabled)); +} + +bool dmux_pamf_spu_context::get_next_cmd(DmuxPamfCommand& lhs, bool new_stream) const +{ + cellDmuxPamf.trace("Getting next command"); + + if (cmd_queue->pop(lhs)) + { + cellDmuxPamf.trace("Command type: %d", static_cast(lhs.type.get())); + return true; + } + + if ((new_stream || has_work()) && !wait_for_au_queue && !wait_for_event_queue) + { + cellDmuxPamf.trace("No new command, continuing demuxing"); + return false; + } + + cellDmuxPamf.trace("No new command and nothing to do, waiting..."); + + cmd_queue->wait(); + + if (thread_ctrl::state() == thread_state::aborting) + { + return false; + } + + ensure(cmd_queue->pop(lhs)); + + cellDmuxPamf.trace("Command type: %d", static_cast(lhs.type.get())); + return true; +} + +bool dmux_pamf_spu_context::send_event(auto&&... args) const +{ + if (event_queue->size() >= max_enqueued_events) + { + return false; + } + + return ensure(event_queue->emplace(std::forward(args)..., event_queue_was_too_full)); +} + +void dmux_pamf_spu_context::operator()() // cellSpursMain() +{ + DmuxPamfCommand cmd; + + while (thread_ctrl::state() != thread_state::aborting) + { + if (get_next_cmd(cmd, new_stream)) + { + event_queue_was_too_full = wait_for_event_queue; + wait_for_event_queue = false; + wait_for_au_queue = false; + + ensure(cmd_result_queue->emplace(static_cast(cmd.type.value()) + 1)); + + switch (cmd.type) + { + case DmuxPamfCommandType::enable_es: + max_enqueued_events += 2; + enable_es(cmd.enable_es.stream_id, cmd.enable_es.private_stream_id, cmd.enable_es.is_avc, { cmd.enable_es.au_queue_buffer.get_ptr(), cmd.enable_es.au_queue_buffer_size }, + cmd.enable_es.au_max_size, cmd.enable_es.is_raw_es, cmd.enable_es.user_data); + break; + + case DmuxPamfCommandType::disable_es: + disable_es(cmd.disable_flush_es.stream_id, cmd.disable_flush_es.private_stream_id); + max_enqueued_events -= 2; + break; + + case DmuxPamfCommandType::set_stream: + new_stream = true; + break; + + case DmuxPamfCommandType::release_au: + release_au(cmd.release_au.stream_id, cmd.release_au.private_stream_id, cmd.release_au.au_size); + break; + + case DmuxPamfCommandType::flush_es: + flush_es(cmd.disable_flush_es.stream_id, cmd.disable_flush_es.private_stream_id); + break; + + case DmuxPamfCommandType::close: + while (!send_event(DmuxPamfEventType::close)) {} + return; + + case DmuxPamfCommandType::reset_stream: + reset_stream(); + break; + + case DmuxPamfCommandType::reset_es: + reset_es(cmd.reset_es.stream_id, cmd.reset_es.private_stream_id, cmd.reset_es.au_addr ? cmd.reset_es.au_addr.get_ptr() : nullptr); + break; + + case DmuxPamfCommandType::resume: + break; + + default: + cellDmuxPamf.error("Invalid command"); + return; + } + } + else if (thread_ctrl::state() == thread_state::aborting) + { + return; + } + + // Only set the new stream once the previous one has been entirely consumed + if (new_stream && !has_work()) + { + new_stream = false; + + DmuxPamfStreamInfo stream_info; + ensure(stream_info_queue->pop(stream_info)); + + set_stream({ stream_info.stream_addr.get_ptr(), stream_info.stream_size }, stream_info.continuity); + } + + process_next_pack(); + } +} + +void dmux_pamf_base::elementary_stream::save(utils::serial& ar) +{ + // These need to be saved first since they need to be initialized in the constructor's initializer list + if (ar.is_writing()) + { + ar(au_max_size, user_data); + au_queue.save(ar); + } + + ar(state, au_size_unk, au_specific_info_buf, current_au, pts, dts, rap); + + if (state == state::pushing_au_queue) + { + ar(au_chunk.cached_data); + + if (ar.is_writing()) + { + ar(vm::get_addr(au_chunk.data.data()), static_cast(au_chunk.data.size())); + } + else + { + au_chunk.data = { vm::_ptr(ar.pop()), ar.pop() }; + } + } + + if (current_au.state != access_unit::state::complete) + { + ar(cache); + } + + bool save_stream = !!pes_packet_data; + ar(save_stream); + + if (save_stream) + { + if (ar.is_writing()) + { + ensure(stream_chunk.size() <= pes_packet_data->size()); + ar(vm::get_addr(pes_packet_data->data()), static_cast(pes_packet_data->size()), static_cast(stream_chunk.data() - pes_packet_data->data())); + } + else + { + pes_packet_data = { vm::_ptr(ar.pop()), ar.pop() }; + stream_chunk = { pes_packet_data->begin() + ar.pop(), pes_packet_data->end() }; + } + } +} + +void dmux_pamf_base::save_base(utils::serial& ar) +{ + bool stream_not_consumed = !!stream; + + ar(state, stream_not_consumed, demux_done_notified, pack_es_type_idx, raw_es); + + if (stream_not_consumed) + { + if (ar.is_writing()) + { + ar(vm::get_addr(stream->data()), static_cast(stream->size())); + } + else + { + stream = std::span{ vm::_ptr(ar.pop()), ar.pop() }; + } + } + + if (state == state::elementary_stream) + { + ar(pack_es_channel); + } + + std::array enabled_video_streams; + std::array avc_video_streams; + std::array enabled_lpcm_streams; + std::array enabled_ac3_streams; + std::array enabled_atracx_streams; + std::array enabled_user_data_streams; + + if (ar.is_writing()) + { + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO], enabled_video_streams.begin(), elementary_stream::is_enabled); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO], avc_video_streams.begin(), [](auto& es){ return !!dynamic_cast*>(es.get()); }); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_LPCM], enabled_lpcm_streams.begin(), elementary_stream::is_enabled); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_AC3], enabled_ac3_streams.begin(), elementary_stream::is_enabled); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX], enabled_atracx_streams.begin(), elementary_stream::is_enabled); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA], enabled_user_data_streams.begin(), elementary_stream::is_enabled); + } + + ar(enabled_video_streams, avc_video_streams, enabled_lpcm_streams, enabled_ac3_streams, enabled_atracx_streams, enabled_user_data_streams); + + if (ar.is_writing()) + { + std::ranges::for_each(elementary_streams | std::views::join | std::views::filter(elementary_stream::is_enabled), [&](const auto& es){ es->save(ar); }); + } + else + { + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_video_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO][ch] = avc_video_streams[ch] ? static_cast>(std::make_unique>(ar, ch, *this)) + : std::make_unique>(ar, ch, *this); + } + } + + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_lpcm_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_LPCM][ch] = std::make_unique(ar, ch, *this); + } + } + + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_ac3_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_AC3][ch] = std::make_unique>(ar, ch, *this); + } + } + + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_atracx_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX][ch] = std::make_unique>(ar, ch, *this); + } + } + + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_user_data_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA][ch] = std::make_unique(ar, ch, *this); + } + } + } +} + +void dmux_pamf_spu_context::save(utils::serial& ar) +{ + USING_SERIALIZATION_VERSION(cellDmuxPamf); + ar(cmd_queue, new_stream); // The queues are contiguous in guest memory, so we only need to save the address of the first one + save_base(ar); +} + + +// PPU thread + error_code _CellDmuxCoreOpQueryAttr(vm::cptr pamfSpecificInfo, vm::ptr pamfAttr) { cellDmuxPamf.todo("_CellDmuxCoreOpQueryAttr(pamfSpecificInfo=*0x%x, pamfAttr=*0x%x)", pamfSpecificInfo, pamfAttr); @@ -63,9 +1173,9 @@ error_code _CellDmuxCoreOpSetStream(vm::ptr handle, vm::cptr streamA return CELL_OK; } -error_code _CellDmuxCoreOpFreeMemory(vm::ptr esHandle, vm::ptr memAddr, u32 memSize) +error_code _CellDmuxCoreOpReleaseAu(vm::ptr esHandle, vm::ptr memAddr, u32 memSize) { - cellDmuxPamf.todo("_CellDmuxCoreOpFreeMemory(esHandle=*0x%x, memAddr=*0x%x, memSize=0x%x)", esHandle, memAddr, memSize); + cellDmuxPamf.todo("_CellDmuxCoreOpReleaseAu(esHandle=*0x%x, memAddr=*0x%x, memSize=0x%x)", esHandle, memAddr, memSize); return CELL_OK; } @@ -116,6 +1226,7 @@ error_code _CellDmuxCoreOpResetStreamAndWaitDone(vm::ptr handle) return CELL_OK; } +template static void init_gvar(const vm::gvar& var) { var->queryAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryAttr))); @@ -124,7 +1235,10 @@ static void init_gvar(const vm::gvar& var) var->resetStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpResetStream))); var->createThread.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpCreateThread))); var->joinThread.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpJoinThread))); - var->freeMemory.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpFreeMemory))); + var->setStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpSetStream))); + var->releaseAu.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpReleaseAu))); + var->queryEsAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryEsAttr))); + var->enableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpEnableEs))); var->disableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpDisableEs))); var->flushEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpFlushEs))); var->resetEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpResetEs))); @@ -133,21 +1247,8 @@ static void init_gvar(const vm::gvar& var) DECLARE(ppu_module_manager::cellDmuxPamf)("cellDmuxPamf", [] { - REG_VNID(cellDmuxPamf, 0x28b2b7b2, g_cell_dmux_core_ops_pamf).init = [] - { - g_cell_dmux_core_ops_pamf->setStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpSetStream))); - g_cell_dmux_core_ops_pamf->queryEsAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryEsAttr))); - g_cell_dmux_core_ops_pamf->enableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpEnableEs))); - init_gvar(g_cell_dmux_core_ops_pamf); - }; - - REG_VNID(cellDmuxPamf, 0x9728a0e9, g_cell_dmux_core_ops_raw_es).init = [] - { - g_cell_dmux_core_ops_raw_es->setStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpSetStream))); - g_cell_dmux_core_ops_raw_es->queryEsAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryEsAttr))); - g_cell_dmux_core_ops_raw_es->enableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpEnableEs))); - init_gvar(g_cell_dmux_core_ops_raw_es); - }; + REG_VNID(cellDmuxPamf, 0x28b2b7b2, g_cell_dmux_core_ops_pamf).init = []{ init_gvar(g_cell_dmux_core_ops_pamf); }; + REG_VNID(cellDmuxPamf, 0x9728a0e9, g_cell_dmux_core_ops_raw_es).init = []{ init_gvar(g_cell_dmux_core_ops_raw_es); }; REG_HIDDEN_FUNC(_CellDmuxCoreOpQueryAttr); REG_HIDDEN_FUNC(_CellDmuxCoreOpOpen); @@ -157,7 +1258,7 @@ DECLARE(ppu_module_manager::cellDmuxPamf)("cellDmuxPamf", [] REG_HIDDEN_FUNC(_CellDmuxCoreOpJoinThread); REG_HIDDEN_FUNC(_CellDmuxCoreOpSetStream); REG_HIDDEN_FUNC(_CellDmuxCoreOpSetStream); - REG_HIDDEN_FUNC(_CellDmuxCoreOpFreeMemory); + REG_HIDDEN_FUNC(_CellDmuxCoreOpReleaseAu); REG_HIDDEN_FUNC(_CellDmuxCoreOpQueryEsAttr); REG_HIDDEN_FUNC(_CellDmuxCoreOpQueryEsAttr); REG_HIDDEN_FUNC(_CellDmuxCoreOpEnableEs); diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h index 01983b724a..c720fb89c5 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h @@ -1,5 +1,666 @@ #pragma once +#include "Emu/savestate_utils.hpp" +#include "Utilities/Thread.h" +#include "cellPamf.h" +#include "cellDmux.h" +#include + +// Replacement for CellSpursQueue +template requires(std::is_trivial_v && max_num_of_entries > 0) +class alignas(0x80) dmux_pamf_hle_spurs_queue +{ + T* buffer; + + alignas(atomic_t) std::array)> _size; // Stored in a byte array since the PPU context needs to be trivial + u32 front; + u32 back; + + template + bool _pop(T* lhs) + { + atomic_t& _size = *std::launder(reinterpret_cast*>(this->_size.data())); + + if (_size == 0) + { + return false; + } + + if (lhs) + { + *lhs = buffer[front]; + } + + if constexpr (!is_peek) + { + front = (front + 1) % max_num_of_entries; + _size--; + _size.notify_one(); + } + + return true; + } + +public: + void init(T (&buffer)[max_num_of_entries]) + { + this->buffer = buffer; + new (_size.data()) atomic_t(0); + front = 0; + back = 0; + } + + bool pop(T& lhs) { return _pop(&lhs); } + bool pop() { return _pop(nullptr); } + bool peek(T& lhs) const { return const_cast(this)->_pop(&lhs); } + bool emplace(auto&&... args) + { + atomic_t& _size = *std::launder(reinterpret_cast*>(this->_size.data())); + + if (_size >= max_num_of_entries) + { + return false; + } + + new (&buffer[back]) T(std::forward(args)...); + + back = (back + 1) % max_num_of_entries; + _size++; + _size.notify_one(); + + return true; + } + + [[nodiscard]] u32 size() const { return std::launder(reinterpret_cast*>(this->_size.data()))->observe(); } + + void wait() const + { + const atomic_t& _size = *std::launder(reinterpret_cast*>(this->_size.data())); + + while (_size == 0 && thread_ctrl::state() != thread_state::aborting) + { + thread_ctrl::wait_on(_size, 0); + } + } +}; + +enum class DmuxPamfCommandType : u32 +{ + enable_es = 0, + disable_es = 2, + set_stream = 4, + release_au = 6, + flush_es = 8, + close = 10, + reset_stream = 12, + reset_es = 14, + resume = 16, +}; + +struct alignas(0x80) DmuxPamfCommand +{ + be_t type; + + union + { + struct + { + be_t stream_id; + be_t private_stream_id; + be_t is_avc; + vm::bptr au_queue_buffer; + be_t au_queue_buffer_size; + be_t au_max_size; + be_t au_specific_info_size; + be_t is_raw_es; + be_t user_data; + } + enable_es; + + struct + { + be_t stream_id; + be_t private_stream_id; + } + disable_flush_es; + + struct + { + vm::ptr> au_addr; + be_t au_size; + be_t stream_id; + be_t private_stream_id; + } + release_au; + + struct + { + be_t stream_id; + be_t private_stream_id; + vm::ptr> au_addr; + } + reset_es; + }; + + DmuxPamfCommand() = default; + + DmuxPamfCommand(be_t&& type) + : type(type) + { + } + + DmuxPamfCommand(be_t&& type, const be_t& stream_id, const be_t& private_stream_id) + : type(type), disable_flush_es{ stream_id, private_stream_id } + { + } + + DmuxPamfCommand(be_t&& type, const be_t& stream_id, const be_t& private_stream_id, const vm::ptr>& au_addr) + : type(type), reset_es{ stream_id, private_stream_id, au_addr } + { + } + + DmuxPamfCommand(be_t&& type, const vm::ptr>& au_addr, const be_t& au_size, const be_t& stream_id, const be_t& private_stream_id) + : type(type), release_au{ au_addr, au_size, stream_id, private_stream_id } + { + } + + DmuxPamfCommand(be_t&& type, const be_t& stream_id, const be_t& private_stream_id, const be_t& is_avc, const vm::bptr& au_queue_buffer, + const be_t& au_queue_buffer_size, const be_t& au_max_size, const be_t& au_specific_info_size, const be_t& is_raw_es, const be_t& user_data) + : type(type), enable_es{ stream_id, private_stream_id, is_avc, au_queue_buffer, au_queue_buffer_size, au_max_size, au_specific_info_size, is_raw_es, user_data } + { + } +}; + +CHECK_SIZE_ALIGN(DmuxPamfCommand, 0x80, 0x80); + +enum class DmuxPamfEventType : u32 +{ + au_found, + demux_done, + fatal_error, + close, + flush_done, + prog_end_code, +}; + +struct alignas(0x80) DmuxPamfEvent +{ + be_t type; + + union + { + u8 pad[0x78]; + + struct + { + be_t stream_id; + be_t private_stream_id; + vm::ptr> au_addr; + CellCodecTimeStamp pts; + CellCodecTimeStamp dts; + be_t unk; + u8 reserved[4]; + be_t au_size; + be_t stream_header_size; + std::array stream_header_buf; + be_t user_data; + be_t is_rap; + } + au_found; + + struct + { + be_t stream_id; + be_t private_stream_id; + be_t user_data; + } + flush_done; + }; + + be_t event_queue_was_too_full; + + DmuxPamfEvent() = default; + + DmuxPamfEvent(be_t&& type, const be_t& event_queue_was_too_full) + : type(type), event_queue_was_too_full(event_queue_was_too_full) + { + } + + DmuxPamfEvent(be_t&& type, const be_t& stream_id, const be_t& private_stream_id, const be_t& user_data, const be_t& event_queue_was_too_full) + : type(type), flush_done{ stream_id, private_stream_id, user_data }, event_queue_was_too_full(event_queue_was_too_full) + { + } + + DmuxPamfEvent(be_t&& type, const be_t& stream_id, const be_t& private_stream_id, const vm::ptr>& au_addr, const CellCodecTimeStamp& pts, const CellCodecTimeStamp& dts, const be_t& unk, + const be_t& au_size, const be_t& au_specific_info_size, const std::array& au_specific_info, const be_t& user_data, const be_t& is_rap, const be_t& event_queue_was_too_full) + : type(type) + , au_found{ stream_id, private_stream_id, au_addr, pts, dts, static_cast>(unk), {}, au_size, au_specific_info_size, au_specific_info, user_data, is_rap } + , event_queue_was_too_full(event_queue_was_too_full) + { + } +}; + +CHECK_SIZE_ALIGN(DmuxPamfEvent, 0x80, 0x80); + +struct alignas(0x80) DmuxPamfStreamInfo +{ + vm::bcptr stream_addr; + be_t stream_size; + be_t user_data; + be_t continuity; + be_t is_raw_es; +}; + +CHECK_SIZE_ALIGN(DmuxPamfStreamInfo, 0x80, 0x80); + +enum DmuxPamfStreamTypeIndex +{ + DMUX_PAMF_STREAM_TYPE_INDEX_INVALID = -1, + DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO, + DMUX_PAMF_STREAM_TYPE_INDEX_LPCM, + DMUX_PAMF_STREAM_TYPE_INDEX_AC3, + DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX, + DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA, +}; + + +// SPU thread + +class dmux_pamf_base +{ + // Event handlers for the demuxer. These correspond to the events that the SPU thread sends to the PPU thread on LLE (except for au_queue_full(): the SPU thread just sets a global bool, + // but it is never notified to the PPU thread or the user). + + virtual bool on_au_found(u8 stream_id, u8 private_stream_id, u32 user_data, std::span au, u64 pts, u64 dts, bool rap, u8 au_specific_info_size, std::array au_specific_info_buf) = 0; + virtual bool on_demux_done() = 0; + virtual void on_fatal_error() = 0; + virtual bool on_flush_done(u8 stream_id, u8 private_stream_id, u32 user_data) = 0; + virtual bool on_prog_end() = 0; + virtual void on_au_queue_full() = 0; + +public: + virtual ~dmux_pamf_base() = default; + + bool enable_es(u32 stream_id, u32 private_stream_id, bool is_avc, std::span au_queue_buffer, u32 au_max_size, bool raw_es, u32 user_data); + bool disable_es(u32 stream_id, u32 private_stream_id); + bool release_au(u32 stream_id, u32 private_stream_id, u32 au_size) const; + bool flush_es(u32 stream_id, u32 private_stream_id); + void set_stream(std::span stream, bool continuity); + void reset_stream(); + bool reset_es(u32 stream_id, u32 private_stream_id, u8* au_addr); + bool process_next_pack(); + +protected: + void save_base(utils::serial& ar); + [[nodiscard]] bool has_work() const { return !!stream || !demux_done_notified; } + [[nodiscard]] u32 get_enabled_es_count() const; + +private: + static constexpr u16 PACK_SIZE = 0x800; + static constexpr s8 PACK_STUFFING_LENGTH_OFFSET = 0xd; + static constexpr s8 PES_PACKET_LENGTH_OFFSET = 0x4; + static constexpr s8 PES_HEADER_DATA_LENGTH_OFFSET = 0x8; + static constexpr s8 PTS_DTS_FLAG_OFFSET = 0x7; + static constexpr u8 PACKET_START_CODE_PREFIX = 1; + + static constexpr be_t M2V_PIC_START = 0x100; + static constexpr be_t AVC_AU_DELIMITER = 0x109; + static constexpr be_t M2V_SEQUENCE_HEADER = 0x1b3; + static constexpr be_t M2V_SEQUENCE_END = 0x1b7; + static constexpr be_t PACK_START = 0x1ba; + static constexpr be_t SYSTEM_HEADER = 0x1bb; + static constexpr be_t PRIVATE_STREAM_1 = 0x1bd; + static constexpr be_t PRIVATE_STREAM_2 = 0x1bf; + static constexpr be_t PROG_END = 0x1b9; + static constexpr be_t VIDEO_STREAM_BASE = 0x1e0; // The lower 4 bits indicate the channel + + // Partial access unit that will be written to the output queue + struct access_unit_chunk + { + std::vector cached_data; // Up to three bytes of data from the previous PES packet (copied into this vector, since it might not be in memory anymore) + std::span data; // Data of the current PES packet + }; + + // Output queue for access units + // The queue doesn't keep track of where access units are in the buffer (only which parts are used and which are free), this has to be done extenally + class output_queue + { + public: + explicit output_queue(std::span buffer) : buffer(buffer) {} + + explicit output_queue(utils::serial& ar) + : buffer{vm::_ptr(ar.pop()), ar.pop()} + , back(vm::_ptr(ar.pop())) + , front(vm::_ptr(ar.pop())) + , wrap_pos(vm::_ptr(ar.pop())) + { + } + + void save(utils::serial& ar) const { ar(vm::get_addr(buffer.data()), static_cast(buffer.size()), vm::get_addr(back), vm::get_addr(front), vm::get_addr(wrap_pos)); } + + // The queue itself doesn't keep track of the location of each access unit, so the pop and access operations need the size or address of the access unit to remove/return + void pop_back(u32 au_size); + void pop_back(u8* au_addr); + void pop_front(u32 au_size); + [[nodiscard]] const u8* peek_back(u32 au_size) const { return back - au_size; } + + void clear() { wrap_pos = front = back = buffer.data(); } + + void push_unchecked(const access_unit_chunk& au_chunk); + bool push(const access_unit_chunk& au_chunk, const std::function& on_fatal_error); + + [[nodiscard]] bool prepare_next_au(u32 au_max_size); + + [[nodiscard]] usz get_free_size() const { return wrap_pos != buffer.data() ? front - back : std::to_address(buffer.end()) - back; } + + private: + const std::span buffer; + + // Since access units have a variable size, uses pointers instead of indices + u8* back = buffer.data(); + const u8* front = buffer.data(); + const u8* wrap_pos = buffer.data(); // The address where the back pointer wrapped around to the beginning of the queue + }; + + // Base class for elementary streams and subclasses for each stream type + // Responsible for processing the data section of PES packets and splitting it into access units with the stream parsers of each subclass + class elementary_stream + { + public: + elementary_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, u8 au_specific_info_size, std::span au_queue_buffer) + : channel(channel) + , au_max_size(au_max_size == umax || au_max_size > au_queue_buffer.size() ? 0x800 : au_max_size) + , ctx(ctx) + , au_specific_info_size(au_specific_info_size) + , user_data(user_data) + , au_queue(au_queue_buffer) + { + // The cache sizes will never exceed three bytes + cache.reserve(3); + au_chunk.cached_data.reserve(3); + } + + elementary_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx, u8 au_specific_info_size) + : channel(channel) + , au_max_size(ar.pop()) + , ctx(ctx) + , au_specific_info_size(au_specific_info_size) + , user_data(ar.pop()) + , au_queue(ar) + { + save(ar); + } + + virtual ~elementary_stream() = default; + void save(utils::serial& ar); + + static bool is_enabled(const std::unique_ptr& es) { return !!es; } + + [[nodiscard]] virtual std::pair get_stream_id() const = 0; + + void set_pes_packet_data(std::span pes_packet_data) { ensure(!this->pes_packet_data); this->pes_packet_data = this->stream_chunk = pes_packet_data; } + void set_pts(u64 pts) { this->pts = pts; } + void set_dts(u64 dts) { this->dts = dts; } + void set_rap() { rap = true; } + + // Parses the proprietary header of private streams. Returns the size of the header or umax if the stream is invalid + virtual u32 parse_stream_header(std::span elementary_stream, s8 pts_dts_flag) = 0; + + // Processes the current PES packet. Returns true if it has been entirely consumed + bool process_pes_packet_data(); + + void release_au(u32 au_size) { au_queue.pop_front(au_size); } + void flush_es(); + void reset_es(u8* au_addr); + void discard_access_unit(); + + protected: + const u8 channel : 4; + const u32 au_max_size; // Maximum possible size of an access unit + u32 au_size_unk = 0; // For user data streams, used to store the size of the current access unit. For other private streams, used as a bool for some reason + alignas(0x10) std::array au_specific_info_buf{}; // For LPCM streams, stores the first 0x10 bytes of the current PES packet data, contains info like the number of channels + + // The access unit that is currently being cut out + struct access_unit + { + ENABLE_BITWISE_SERIALIZATION + + enum class state : u8 + { + none, // An access unit is not currently being cut out + incomplete, // An access unit is currently being cut out + commenced, // The current PES packet contains the beginning of an access unit + complete, // The current PES packet contains the end of an access unit + size_mismatch, // The distance between sync words and size indicated in the access unit's info header does not match + m2v_sequence, // Special case for M2V, access unit commenced, but the next start code does not complete the access unit + } + state = state::none; + + bool rap = false; + bool timestamps_rap_set = false; + + // Since the delimiters of compressed audio streams are allowed to appear anywhere in the stream (instead of just the beginning of an access unit), we need to parse the size of the access unit from the stream + u8 size_info_offset = 0; + u16 parsed_size = 0; + + u32 accumulated_size = 0; // Incremented after every access unit chunk cut out from the stream + + u64 pts = umax; + u64 dts = umax; + + alignas(0x10) std::array au_specific_info_buf{}; + } + current_au; + + access_unit_chunk au_chunk; // A partial access unit that will be written to the access unit queue. Set by the stream parsers + std::vector cache; // The last three bytes of the current PES packet need to be saved, since they could contain part of an access unit delimiter + + // Returns the stream header size of audio streams. The only difference between LPCM and compressed streams is the extra_header_size_unk_mask + template + u32 parse_audio_stream_header(std::span pes_packet_data); + + private: + dmux_pamf_base& ctx; // For access to event handlers + + enum class state : u8 + { + initial, + pushing_au_queue, + notifying_au_found, + preparing_for_next_au + } + state = state::initial; + + // Size of the "CellDmuxPamfAuSpecificInfo..." struct for the type of this stream ("reserved" fields are not counted, so for all stream types other than LPCM this will be 0) + // This does NOT correspond to the amount of data in au_specific_info_buf, the info in the buffer gets unpacked by the PPU thread + const u8 au_specific_info_size; + + const u32 user_data; + + // Data section of the current PES packet. Needs to be remembered separately from the span we're working with below + std::optional> pes_packet_data; + + std::span stream_chunk; // The current section of the PES packet data to be processed + u64 pts = umax; // Presentation time stamp of the current PES packet + u64 dts = umax; // Decoding time stamp of the current PES packet + bool rap = false; // Random access point indicator + + output_queue au_queue; + + // Extracts access units from the stream by searching for the access unit delimiter and setting au_chunk accordingly. Returns the number of bytes that were parsed + virtual u32 parse_stream(std::span stream) = 0; + + void reset() + { + state = state::initial; + pes_packet_data.reset(); + au_size_unk = 0; + pts = + dts = umax; + rap = false; + au_chunk.data = {}; + au_chunk.cached_data.clear(); + current_au = {}; + } + + void set_au_timestamps_rap() + { + current_au.pts = pts; + current_au.dts = dts; + current_au.rap = rap; + pts = + dts = umax; + rap = false; + current_au.timestamps_rap_set = true; + } + }; + + template + class video_stream final : public elementary_stream + { + public: + video_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, std::span au_queue_buffer) : elementary_stream(channel, au_max_size, ctx, user_data, 0, au_queue_buffer) {} + video_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx) : elementary_stream(ar, channel, ctx, 0) {} + + private: + u32 parse_stream(std::span stream) override; + u32 parse_stream_header([[maybe_unused]] std::span pes_packet_data, [[maybe_unused]] s8 pts_dts_flag) override { return 0; } + [[nodiscard]] std::pair get_stream_id() const override { return { 0xe0 | channel, 0 }; } + }; + + class lpcm_stream final : public elementary_stream + { + public: + lpcm_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, std::span au_queue_buffer) : elementary_stream(channel, au_max_size, ctx, user_data, 3, au_queue_buffer) {} + lpcm_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx) : elementary_stream(ar, channel, ctx, 3) {} + + private: + u32 parse_stream(std::span stream) override; + u32 parse_stream_header(std::span pes_packet_data, [[maybe_unused]] s8 pts_dts_flag) override; + [[nodiscard]] std::pair get_stream_id() const override { return { 0xbd, 0x40 | channel }; } + }; + + template + class audio_stream final : public elementary_stream + { + public: + audio_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, std::span au_queue_buffer) : elementary_stream(channel, au_max_size, ctx, user_data, 0, au_queue_buffer) {} + audio_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx) : elementary_stream(ar, channel, ctx, 0) {} + + private: + static constexpr be_t SYNC_WORD = ac3 ? 0x0b77 : 0x0fd0; + static constexpr u8 ATRACX_ATS_HEADER_SIZE = 8; + static constexpr u16 AC3_FRMSIZE_TABLE[3][38] = + { + { 0x40, 0x40, 0x50, 0x50, 0x60, 0x60, 0x70, 0x70, 0x80, 0x80, 0xa0, 0xa0, 0xc0, 0xc0, 0xe0, 0xe0, 0x100, 0x100, 0x140, 0x140, 0x180, 0x180, 0x1c0, 0x1c0, 0x200, 0x200, 0x280, 0x280, 0x300, 0x300, 0x380, 0x380, 0x400, 0x400, 0x480, 0x480, 0x500, 0x500 }, + { 0x45, 0x46, 0x57, 0x58, 0x68, 0x69, 0x79, 0x7a, 0x8b, 0x8c, 0xae, 0xaf, 0xd0, 0xd1, 0xf3, 0xf4, 0x116, 0x117, 0x15c, 0x15d, 0x1a1, 0x1a2, 0x1e7, 0x1e8, 0x22d, 0x22e, 0x2b8, 0x2b9, 0x343, 0x344, 0x3cf, 0x3d0, 0x45a, 0x45b, 0x4e5, 0x4e6, 0x571, 0x572 }, + { 0x60, 0x60, 0x78, 0x78, 0x90, 0x90, 0xa8, 0xa8, 0xc0, 0xc0, 0xf0, 0xf0, 0x120, 0x120, 0x150, 0x150, 0x180, 0x180, 0x1e0, 0x1e0, 0x240, 0x240, 0x2a0, 0x2a0, 0x300, 0x300, 0x3c0, 0x3c0, 0x480, 0x480, 0x540, 0x540, 0x600, 0x600, 0x6c0, 0x6c0, 0x780, 0x780 } + }; + + u32 parse_stream(std::span stream) override; + u32 parse_stream_header(std::span pes_packet_data, [[maybe_unused]] s8 pts_dts_flag) override { return parse_audio_stream_header<0xffff>(pes_packet_data); } + [[nodiscard]] std::pair get_stream_id() const override { return { 0xbd, (ac3 ? 0x30 : 0x00) | channel }; } + }; + + class user_data_stream final : public elementary_stream + { + public: + user_data_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, std::span au_queue_buffer) : elementary_stream(channel, au_max_size, ctx, user_data, 0, au_queue_buffer) {} + user_data_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx) : elementary_stream(ar, channel, ctx, 0) {} + + private: + u32 parse_stream(std::span stream) override; + u32 parse_stream_header(std::span pes_packet_data, s8 pts_dts_flag) override; + [[nodiscard]] std::pair get_stream_id() const override { return { 0xbd, 0x20 | channel }; } + }; + + + enum class state : u8 + { + initial, + elementary_stream, + prog_end + } + state = state::initial; + + bool demux_done_notified = true; // User was successfully notified that the stream has been consumed + + u8 pack_es_type_idx = umax; // Elementary stream type in the current pack + u8 pack_es_channel = 0; // Elementary stream channel in the current pack + + bool raw_es = false; // Indicates that the input stream is a raw elementary stream instead of a multiplexed MPEG program stream. If set to true, MPEG-PS related parsing will be skipped + + std::optional> stream; // The stream to be demultiplexed, provided by the user + + std::unique_ptr elementary_streams[5][0x10]; // One for each possible type and channel +}; + +// Implementation of the SPU thread +class dmux_pamf_spu_context : dmux_pamf_base +{ +public: + static constexpr u32 id_base = 0; + static constexpr u32 id_step = 1; + static constexpr u32 id_count = 0x400; + SAVESTATE_INIT_POS(std::numeric_limits::max()); // Doesn't depend on or is a dependency of anything + + dmux_pamf_spu_context(vm::ptr> cmd_queue, vm::ptr, 1>> cmd_result_queue, + vm::ptr> stream_info_queue, vm::ptr> event_queue) + : cmd_queue(cmd_queue), cmd_result_queue(cmd_result_queue), stream_info_queue(stream_info_queue), event_queue(event_queue) + { + } + + explicit dmux_pamf_spu_context(utils::serial& ar) + : cmd_queue(ar.pop>>()) + , cmd_result_queue(vm::ptr, 1>>::make(cmd_queue.addr() + sizeof(dmux_pamf_hle_spurs_queue))) + , stream_info_queue(vm::ptr>::make(cmd_result_queue.addr() + sizeof(dmux_pamf_hle_spurs_queue, 1>))) + , event_queue(vm::ptr>::make(stream_info_queue.addr() + sizeof(dmux_pamf_hle_spurs_queue))) + , new_stream(ar.pop()) + { + save_base(ar); + max_enqueued_events += 2 * get_enabled_es_count(); + } + + void save(utils::serial& ar); + + void operator()(); // cellSpursMain() + static constexpr auto thread_name = "HLE PAMF demuxer SPU thread"sv; + +private: + // These are globals in the SPU thread + const vm::ptr> cmd_queue; + const vm::ptr, 1>> cmd_result_queue; + const vm::ptr> stream_info_queue; + const vm::ptr> event_queue; + bool wait_for_au_queue = false; + bool wait_for_event_queue = false; + bool event_queue_was_too_full = false; // Sent to the PPU thread + u8 max_enqueued_events = 4; // 4 + 2 * number of enabled elementary streams + + // This is a local variable in cellSpursMain(), needs to be saved for savestates + bool new_stream = false; + + bool get_next_cmd(DmuxPamfCommand& lhs, bool new_stream) const; + bool send_event(auto&&... args) const; + + // The events are sent to the PPU thread via the event_queue + bool on_au_found(u8 stream_id, u8 private_stream_id, u32 user_data, std::span au, u64 pts, u64 dts, bool rap, u8 au_specific_info_size, std::array au_specific_info_buf) override + { + return !((wait_for_event_queue = !send_event(DmuxPamfEventType::au_found, stream_id, private_stream_id, vm::get_addr(au.data()), std::bit_cast(static_cast>(pts)), + std::bit_cast(static_cast>(dts)), 0, static_cast(au.size()), au_specific_info_size, au_specific_info_buf, user_data, rap))); + } + bool on_demux_done() override { return !((wait_for_event_queue = !send_event(DmuxPamfEventType::demux_done))); } + void on_fatal_error() override { send_event(DmuxPamfEventType::fatal_error); } + bool on_flush_done(u8 stream_id, u8 private_stream_id, u32 user_data) override { return send_event(DmuxPamfEventType::flush_done, stream_id, private_stream_id, user_data); } // The "flush done" event does not set wait_for_event_queue if the queue is full + bool on_prog_end() override { return !((wait_for_event_queue = !send_event(DmuxPamfEventType::prog_end_code))); } + void on_au_queue_full() override { wait_for_au_queue = true; } +}; + +using dmux_pamf_spu_thread = named_thread; + + +// PPU thread + struct CellDmuxPamfAttr { be_t maxEnabledEsNum; diff --git a/rpcs3/Emu/Cell/Modules/cellPamf.h b/rpcs3/Emu/Cell/Modules/cellPamf.h index e42acf60f4..abd89f8852 100644 --- a/rpcs3/Emu/Cell/Modules/cellPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellPamf.h @@ -1,5 +1,6 @@ #pragma once +#include "Emu/Cell/ErrorCodes.h" #include "Emu/Memory/vm_ptr.h" // Error Codes diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index 5add3e8c6b..167a060262 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -23,7 +23,7 @@ struct serial_ver_t std::set compatible_versions; }; -static std::array s_serial_versions; +static std::array s_serial_versions; #define SERIALIZATION_VER(name, identifier, ...) \ \ @@ -85,6 +85,7 @@ SERIALIZATION_VER(LLE, 24, 1) SERIALIZATION_VER(HLE, 25, 1) SERIALIZATION_VER(cellSysutil, 26, 1, 2/*AVC2 Muting,Volume*/) +SERIALIZATION_VER(cellDmuxPamf, 27, 1) template <> void fmt_class_string>::format(std::string& out, u64 arg) From a3d09a7427efe193efba099f4cdffbdb9a4506cb Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 19 Jul 2025 21:11:56 +0200 Subject: [PATCH 359/630] tests: cellDmuxPamf --- rpcs3/tests/test_dmux_pamf.cpp | 630 +++++++++++++++++++++++++++++++++ rpcs3/tests/test_dmux_pamf.h | 123 +++++++ 2 files changed, 753 insertions(+) create mode 100644 rpcs3/tests/test_dmux_pamf.cpp create mode 100644 rpcs3/tests/test_dmux_pamf.h diff --git a/rpcs3/tests/test_dmux_pamf.cpp b/rpcs3/tests/test_dmux_pamf.cpp new file mode 100644 index 0000000000..40a8a02b32 --- /dev/null +++ b/rpcs3/tests/test_dmux_pamf.cpp @@ -0,0 +1,630 @@ +#include "stdafx.h" +#include +#include "Emu/Cell/Modules/cellDmuxPamf.h" +#include "Crypto/sha1.h" +#include "test_dmux_pamf.h" + +using namespace testing; + +struct DmuxPamfMock : dmux_pamf_base +{ + MOCK_METHOD(bool, on_au_found, (u8 stream_id, u8 private_stream_id, u32 user_data, std::span au, u64 pts, u64 dts, bool rap, u8 au_specific_info_size, (std::array) au_specific_info_buf), (override)); + MOCK_METHOD(bool, on_demux_done, (), (override)); + MOCK_METHOD(void, on_fatal_error, (), (override)); + MOCK_METHOD(bool, on_flush_done, (u8 stream_id, u8 private_stream_id, u32 user_data), (override)); + MOCK_METHOD(bool, on_prog_end, (), (override)); + MOCK_METHOD(void, on_au_queue_full, (), (override)); +}; + +struct DmuxPamfTest : Test +{ + StrictMock demuxer; + MockFunction check_point; + std::array au_queue_buffer{}; + InSequence seq; +}; + +MATCHER_P(Sha1Is, expected_sha1, "") { std::array sha1_buf{}; sha1(arg.data(), arg.size(), sha1_buf.data()); return sha1_buf == expected_sha1; } + +struct DmuxPamfSinglePack : DmuxPamfTest, WithParamInterface, AccessUnit, std::optional>> {}; + +TEST_P(DmuxPamfSinglePack, Test) +{ + const auto& [stream_id, private_stream_id, is_avc, au_max_size, stream, au_1, au_2] = GetParam(); + + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_1.data_sha1), au_1.pts, au_1.dts, au_1.rap, au_1.specific_info_size, au_1.specific_info_buf)).WillOnce(Return(true)); + + if (au_2) + { + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_2->data_sha1), au_2->pts, au_2->dts, au_2->rap, au_2->specific_info_size, au_2->specific_info_buf)); + } + + demuxer.enable_es(stream_id, private_stream_id, is_avc, au_queue_buffer, au_max_size, false, 0x12345678); + demuxer.set_stream(stream, false); + check_point.Call(0); + demuxer.process_next_pack(); +} + +// These streams are made of a single pack that contains two access units (one for the user data stream) +INSTANTIATE_TEST_SUITE_P(Basic, DmuxPamfSinglePack, Values +( + std::tuple{ 0xe0, 0x00, true, 0x800, AVC_SINGLE_PACK_STREAM, AVC_SINGLE_PACK_EXPECTED_AU_1, AVC_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xe0, 0x00, false, 0x800, M2V_SINGLE_PACK_STREAM, M2V_SINGLE_PACK_EXPECTED_AU_1, M2V_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xbd, 0x00, false, 0x800, ATRACX_SINGLE_PACK_STREAM, ATRACX_SINGLE_PACK_EXPECTED_AU_1, ATRACX_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xbd, 0x30, false, 0x800, AC3_SINGLE_PACK_STREAM, AC3_SINGLE_PACK_EXPECTED_AU_1, AC3_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xbd, 0x40, false, 0x369, LPCM_SINGLE_PACK_STREAM, LPCM_SINGLE_PACK_EXPECTED_AU_1, LPCM_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xbd, 0x20, false, 0x800, USER_DATA_SINGLE_PACK_STREAM, USER_DATA_SINGLE_PACK_EXPECTED_AU, std::nullopt } // There can be at most one user data access unit in a single pack +)); + +// Tests buggy behavior: timestamps should be unsigned, but get sign-extended from s32 to u64 on LLE. They probably forgot about integer promotion +INSTANTIATE_TEST_SUITE_P(TimeStampSignExtended, DmuxPamfSinglePack, Values +( + std::tuple{ 0xbd, 0x20, false, 0x800, TIME_STAMP_SIGN_EXTENDED_STREAM, TIME_STAMP_SIGN_EXTENDED_EXPECTED_AU, std::nullopt } +)); + +// Tests buggy behavior: if there is no Pack Start Code at the beginning of the current stream section, LLE will search for the code. +// However, if it finds one, it will not set the reading position to where the code was found. It continues reading from the beginning of the stream section instead. +// Test disabled since this is not currently implemented +INSTANTIATE_TEST_SUITE_P(DISABLED_PackStartCodeNotAtBeginning, DmuxPamfSinglePack, Values +( + std::tuple{ 0xe0, 0x00, true, 0x800, []() { auto pack = AVC_SINGLE_PACK_STREAM; std::copy_n(pack.begin(), 4, pack.begin() + 0x93); std::fill_n(pack.begin(), 4, 0); return pack; }(), AVC_SINGLE_PACK_EXPECTED_AU_1, AVC_SINGLE_PACK_EXPECTED_AU_2 } +)); + +struct DmuxPamfMultiplePackSingleAu : DmuxPamfTest, WithParamInterface, AccessUnit>> {}; + +TEST_P(DmuxPamfMultiplePackSingleAu, Test) +{ + const auto& [stream_id, private_stream_id, is_avc, au_max_size, stream, au] = GetParam(); + + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au.data_sha1), au.pts, au.dts, au.rap, au.specific_info_size, au.specific_info_buf)).WillOnce(Return(true)); + + demuxer.enable_es(stream_id, private_stream_id, is_avc, au_queue_buffer, au_max_size, false, 0x12345678); + demuxer.set_stream(stream, false); + + // Demultiplex all packs until the last one + for (u32 i = 0; i < stream.size() - 0x800; i += 0x800) + { + demuxer.process_next_pack(); + } + + // The next call to process_next_pack() should produce an access unit + check_point.Call(0); + demuxer.process_next_pack(); +} + +// These streams contain a single access unit that is split across four packs +INSTANTIATE_TEST_SUITE_P(Basic, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xe0, 0x00, true, 0x1800, AVC_LARGE_AU_STREAM, AVC_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xe0, 0x00, false, 0x1800, M2V_LARGE_AU_STREAM, M2V_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xbd, 0x00, false, 0x1800, ATRACX_LARGE_AU_STREAM, ATRACX_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xbd, 0x30, false, 0x1800, AC3_LARGE_AU_STREAM, AC3_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xbd, 0x40, false, 0x1400, LPCM_LARGE_AU_STREAM, LPCM_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xbd, 0x20, false, 0x1800, USER_DATA_LARGE_AU_STREAM, USER_DATA_LARGE_AU_EXPECTED_AU } +)); + +// PES packets with audio streams contain a proprietary header before the actual stream. +// The last two bytes of the header indicate how much of the stream should be skipped +// (note that I have not found a single PAMF stream in any game where this is not 0). +// These streams test if this is implemented properly, the first access unit should not be output +INSTANTIATE_TEST_SUITE_P(SkipByes, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xbd, 0x00, false, 0x1800, ATRACX_SKIP_BYTES_STREAM, ATRACX_SKIP_BYTES_EXPECTED_AU }, + std::tuple{ 0xbd, 0x30, false, 0x1800, AC3_SKIP_BYTES_STREAM, AC3_SKIP_BYTES_EXPECTED_AU }, + std::tuple{ 0xbd, 0x40, false, 0xb40, LPCM_SKIP_BYTES_STREAM, LPCM_SKIP_BYTES_EXPECTED_AU } +)); + +// Tests buggy behavior: if the start of an access unit in the last three bytes of the previous PES packet and the demuxer was not cutting out an access unit before that, +// LLE will always output all three bytes, even if the access unit starts at the second last or last byte +INSTANTIATE_TEST_SUITE_P(FirstDilimiterSplit, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xe0, 0x00, true, 0x1800, AVC_BEGIN_OF_AU_SPLIT_STREAM, AVC_BEGIN_OF_AU_SPLIT_EXPECTED_AU }, + std::tuple{ 0xe0, 0x00, false, 0x1800, M2V_BEGIN_OF_AU_SPLIT_STREAM, M2V_BEGIN_OF_AU_SPLIT_EXPECTED_AU }, + std::tuple{ 0xbd, 0x00, false, 0x1800, ATRACX_BEGIN_OF_AU_SPLIT_STREAM, ATRACX_BEGIN_OF_AU_SPLIT_EXPECTED_AU }, + std::tuple{ 0xbd, 0x30, false, 0x1800, AC3_BEGIN_OF_AU_SPLIT_STREAM, AC3_BEGIN_OF_AU_SPLIT_EXPECTED_AU } +)); + +// The distance of the access units in these streams do not match the size indicated in the ATRAC3plus ATS header/AC3 frmsizecod + fscod fields +// LLE repeatedly cuts off one byte at the beginning of the PES packet until the sizes match and clears the current access unit +INSTANTIATE_TEST_SUITE_P(SizeMismatch, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xbd, 0x00, false, 0x608, ATRACX_SIZE_MISMATCH_STREAM, ATRACX_SIZE_MISMATCH_EXPECTED_AU }, + std::tuple{ 0xbd, 0x30, false, 0x600, AC3_SIZE_MISMATCH_STREAM, AC3_SIZE_MISMATCH_EXPECTED_AU } +)); + +// Tests buggy behavior: if an M2V sequence end code is found, it should be included in the current access unit, unlike all other delimiters. +// If the sequence end code is split across two packs, LLE isn't properly including it in the access unit. +// Disabled because this behavior isn't properly implemented currently +INSTANTIATE_TEST_SUITE_P(DISABLED_M2vSequenceEndSplit, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xe0, 0x00, false, 0x1000, M2V_SEQUENCE_END_SPLIT_STREAM, M2V_SEQUENCE_END_SPLIT_EXPECTED_AU } +)); + +struct DmuxPamfSplitDelimiter : DmuxPamfTest, WithParamInterface, AccessUnit, AccessUnit, AccessUnit, AccessUnit>> {}; + +TEST_P(DmuxPamfSplitDelimiter, Test) +{ + const auto& [stream_id, private_stream_id, is_avc, au_max_size, stream, au_1, au_2, au_3, au_4] = GetParam(); + + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_1.data_sha1), au_1.pts, au_1.dts, au_1.rap, au_1.specific_info_size, au_1.specific_info_buf)).WillOnce(Return(true)); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_2.data_sha1), au_2.pts, au_2.dts, au_2.rap, au_2.specific_info_size, au_2.specific_info_buf)).WillOnce(Return(true)); + EXPECT_CALL(check_point, Call(2)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_3.data_sha1), au_3.pts, au_3.dts, au_3.rap, au_3.specific_info_size, au_3.specific_info_buf)).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_4.data_sha1), au_4.pts, au_4.dts, au_4.rap, au_4.specific_info_size, au_4.specific_info_buf)).WillOnce(Return(true)); + + demuxer.enable_es(stream_id, private_stream_id, is_avc, au_queue_buffer, au_max_size, false, 0x12345678); + demuxer.set_stream(stream, false); + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.process_next_pack(); + check_point.Call(1); + demuxer.process_next_pack(); + check_point.Call(2); + demuxer.process_next_pack(); +} + +// The delimiters of each stream is split across two packs. Tests, if it is still found and the access units are extracted properly +INSTANTIATE_TEST_SUITE_P(Basic, DmuxPamfSplitDelimiter, Values +( + std::tuple{ 0xe0, 0x00, true, 0x800, AVC_MULTIPLE_PACK_STREAM, AVC_MULTIPLE_PACK_EXPECTED_AU_1, AVC_MULTIPLE_PACK_EXPECTED_AU_2, AVC_MULTIPLE_PACK_EXPECTED_AU_3, AVC_MULTIPLE_PACK_EXPECTED_AU_4 }, + std::tuple{ 0xe0, 0x00, false, 0x800, M2V_MULTIPLE_PACK_STREAM, M2V_MULTIPLE_PACK_EXPECTED_AU_1, M2V_MULTIPLE_PACK_EXPECTED_AU_2, M2V_MULTIPLE_PACK_EXPECTED_AU_3, M2V_MULTIPLE_PACK_EXPECTED_AU_4 }, + std::tuple{ 0xbd, 0x00, false, 0x800, ATRACX_MULTIPLE_PACK_STREAM, ATRACX_MULTIPLE_PACK_EXPECTED_AU_1, ATRACX_MULTIPLE_PACK_EXPECTED_AU_2, ATRACX_MULTIPLE_PACK_EXPECTED_AU_3, ATRACX_MULTIPLE_PACK_EXPECTED_AU_4 }, + std::tuple{ 0xbd, 0x30, false, 0x800, AC3_MULTIPLE_PACK_STREAM, AC3_MULTIPLE_PACK_EXPECTED_AU_1, AC3_MULTIPLE_PACK_EXPECTED_AU_2, AC3_MULTIPLE_PACK_EXPECTED_AU_3, AC3_MULTIPLE_PACK_EXPECTED_AU_4 } +)); + +struct DmuxPamfNoAccessUnits : DmuxPamfTest, WithParamInterface>> {}; + +TEST_P(DmuxPamfNoAccessUnits, Test) +{ + const auto& [stream_id, private_stream_id, is_avc, stream] = GetParam(); + + demuxer.enable_es(stream_id, private_stream_id, is_avc, au_queue_buffer, 0x1000, false, 0x12345678); + demuxer.set_stream(stream, false); + demuxer.process_next_pack(); + demuxer.process_next_pack(); + demuxer.process_next_pack(); + demuxer.process_next_pack(); +} + +// Tests buggy behavior: LLE doesn't handle multiple consecutive PES packets with less than three bytes correctly. +// These streams contain access units, but they are not found on LLE +INSTANTIATE_TEST_SUITE_P(TinyPackets, DmuxPamfNoAccessUnits, Values +( + std::tuple{ 0xe0, 0x00, true, AVC_TINY_PACKETS_STREAM }, + std::tuple{ 0xe0, 0x00, false, M2V_TINY_PACKETS_STREAM } +)); + +struct DmuxPamfInvalidStream : DmuxPamfTest, WithParamInterface> {}; + +TEST_P(DmuxPamfInvalidStream, Test) +{ + demuxer.set_stream(GetParam(), false); + demuxer.enable_es(0xbd, 0x00, false, au_queue_buffer, 0x800, false, 0); + demuxer.enable_es(0xbd, 0x20, false, au_queue_buffer, 0x800, false, 0); + demuxer.enable_es(0xbd, 0x40, false, au_queue_buffer, 0x800, false, 0); + EXPECT_FALSE(demuxer.process_next_pack()); +} + +// Tests if invalid streams are handled correctly. +// Each of these should fail a different check in process_next_pack() +// (LLE doesn't actually check anything, it would just read random things in the SPU local store) +INSTANTIATE_TEST_SUITE_P(Instance, DmuxPamfInvalidStream, Values +( + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0xe] = 0x01; return pack; }(), // Invalid code after pack header + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x12] = 0x07; pack[0x13] = 0xe7; return pack; }(), // System header size too large + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x20] = 0x01; return pack; }(), // Invalid code after system header + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x24] = 0x07; pack[0x25] = 0xd2; return pack; }(), // Private stream 2 size too large + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x114] = 0x01; return pack; }(), // Invalid code after private stream 2 + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x117] = 0xbe; return pack; }(), // Invalid stream type + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x119] = 0xe7; return pack; }(), // PES packet size too large + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x03; pack[0x11c] = 0x00; return pack; }(), // PES packet header size too large + []() consteval { auto pack = USER_DATA_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x15; return pack; }(), // User data stream too small + []() consteval { auto pack = LPCM_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x20; pack[0x12c] = 0x00; pack[0x12d] = 0x00; return pack; }(), // LPCM stream too small + []() consteval { auto pack = ATRACX_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x13; pack[0x12c] = 0x00; pack[0x12d] = 0x00; return pack; }(), // Stream header too small + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x03; pack[0x11c] = 0x00; return pack; }() // PES packet header size too large +)); + +// Tests if the program end code is properly detected and the corresponding event is fired +TEST_F(DmuxPamfTest, ProgEnd) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_prog_end).WillOnce(Return(false)); // Since this returns false, the event should be fired again immediately after the next process_next_pack() call + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_prog_end).WillOnce(Return(true)); + + constexpr std::array stream = { 0x00, 0x00, 0x01, 0xb9 }; + + demuxer.set_stream(stream, false); + check_point.Call(0); + demuxer.process_next_pack(); + check_point.Call(1); + demuxer.process_next_pack(); +} + +// Tests if the output queue properly checks whether there is enough space to write an au_chunk to the queue +TEST_F(DmuxPamfTest, QueueNoSpaceForAuChunk) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_queue_full); + + // Set a large au_max_size, this causes the back pointer of the queue to wrap around to the beginning after the first access units + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x2c14, false, 0); + + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + + // Since the first access unit is behind the back pointer and there is no space to write the next au_chunk to the queue, this should cause the au_queue_full event to be fired + check_point.Call(0); + demuxer.process_next_pack(); + + // Since we didn't release the first access unit to remove it from the queue, this should result in au_queue_full again + check_point.Call(1); + demuxer.process_next_pack(); +} + +// Tests if access units are properly removed from the queue +TEST_F(DmuxPamfTest, QueueReleaseAu) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x2c14, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.release_au(0xe0, 0x00, 0x3ed); // Should remove the first access unit from the queue + check_point.Call(1); + demuxer.process_next_pack(); // Since there is space again in the queue, the second access unit should now be found +} + +// LLE adds 0x10 bytes to the size of the au_chunk when checking whether there is enough space. +TEST_F(DmuxPamfTest, QueueNoSpaceSPUShenanigans) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).Times(2).WillRepeatedly(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_queue_full); + + std::array small_au_queue_buffer{}; + + demuxer.enable_es(0xe0, 0x00, true, small_au_queue_buffer, 0x400, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.release_au(0xe0, 0x00, 0x3fc); // 0xf bytes more than needed, but this should still result in au_queue_full + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(1); + demuxer.process_next_pack(); +} + +// After completing an access unit, it should be checked whether au_max_size fits into the queue. +TEST_F(DmuxPamfTest, QueueNoSpaceForMaxAu) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + + std::array small_au_queue_buffer{}; + + demuxer.enable_es(0xe0, 0x00, true, small_au_queue_buffer, 0x400, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.release_au(0xe0, 0x00, 0x300); // This does not remove the entire access unit from the queue + + // Since there is still data behind the back pointer of the queue, it can't wrap around again. + // Because au_max_size won't fit between the back pointer and the end of the queue buffer after finding the next access unit, + // this should cause au_queue_full before starting to extract the next access unit + check_point.Call(1); + demuxer.process_next_pack(); +} + +// Tests if a fatal error is produced if an access unit in the stream is larger than au_max_size +TEST_F(DmuxPamfTest, QueueAuLargerThanMaxSize) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_fatal_error); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_fatal_error); + EXPECT_CALL(demuxer, on_au_queue_full); + + std::array small_au_queue_buffer{}; + + demuxer.enable_es(0xe0, 0x00, true, small_au_queue_buffer, 0x800, false, 0); // au_max_size is smaller than the access unit in the stream + demuxer.set_stream(AVC_LARGE_AU_STREAM, false); + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.process_next_pack(); + check_point.Call(1); + demuxer.process_next_pack(); +} + +// LLE sets au_max_size to 0x800 if it is too large (no fatal error or anything else) +TEST_F(DmuxPamfTest, EnableEsAuMaxSizeTooLarge) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).Times(2).WillRepeatedly(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, std::numeric_limits::max(), false, 0); // The access unit max size will be set to 0x800 if it is larger than the queue buffer size or UINT32_MAX + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + + // Normally, this would cause the event au_queue_full because au_max_size wouldn't fit in the queue. + // However, since au_max_size gets set to 0x800, this doesn't occur + check_point.Call(0); + demuxer.process_next_pack(); +} + +// Tests if the demux_done event is fired when process_next_pack() is called after the end of the stream has been reached +TEST_F(DmuxPamfTest, DemuxDone) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream({ AVC_MULTIPLE_PACK_STREAM.begin(), 0x800 }, false); + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.process_next_pack(); // Since on_demux_done was already called and returned true, it should not produce another demux_done event +} + +// process_next_pack() should skip through the stream until it finds a start code or the end of the stream is reached +TEST_F(DmuxPamfTest, DemuxDoneEmptyStream) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(true)); + + constexpr std::array stream{}; + + demuxer.set_stream(stream, false); + + // Should immediately cause demux_done since there is no start code in the stream + check_point.Call(0); + demuxer.process_next_pack(); +} + +// Tests if the demuxer handles an input stream that is a continuation of the previous one correctly +TEST_F(DmuxPamfTest, StreamContinuity) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream({ AVC_MULTIPLE_PACK_STREAM.begin(), 0x800 }, false); + demuxer.process_next_pack(); + demuxer.set_stream({ AVC_MULTIPLE_PACK_STREAM.begin() + 0x800, AVC_MULTIPLE_PACK_STREAM.end() }, true); + check_point.Call(0); + demuxer.process_next_pack(); +} + +// Flushing an elementary stream manually produces an au_found event +TEST_F(DmuxPamfTest, Flush) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_FLUSH_EXPECTED_AU_SHA1), 0x15f90, 0x159b2, true, 0, Each(0))).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_flush_done).Times(10).WillRepeatedly(Return(false)); // The flush_done event is fired repeatedly in a loop until it returns true + EXPECT_CALL(demuxer, on_flush_done).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x800, false, 0); + demuxer.set_stream(AVC_MULTIPLE_PACK_STREAM, false); + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.flush_es(0xe0, 0x00); + demuxer.process_next_pack(); // The elementary stream should be reset after a flush, so this should not find the next access unit +} + +// Tests resetting the stream +// On LLE, it is necessary to reset the stream before setting a new one, if the current stream has not been entirely consumed yet +TEST_F(DmuxPamfTest, ResetStream) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream(AVC_MULTIPLE_PACK_STREAM, false); + demuxer.reset_stream(); + check_point.Call(0); + demuxer.process_next_pack(); // Should produce a demux_done event and shouldn't find an access unit since the stream was reset + demuxer.process_next_pack(); +} + +// Disabling an elementary stream should clear the access unit queue and internal state, and the disabled stream should not be demultiplexed anymore +TEST_F(DmuxPamfTest, DisableEs) +{ + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream(AVC_MULTIPLE_PACK_STREAM, false); + demuxer.process_next_pack(); + demuxer.disable_es(0xe0, 0x00); + + // Should not find an access unit since the elementary stream was disabled + demuxer.process_next_pack(); + demuxer.process_next_pack(); + demuxer.process_next_pack(); +} + +// Resetting an elementary stream should clear the queue and internal state, like disabling, except the elementary stream remains enabled +TEST_F(DmuxPamfTest, ResetEs) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(0)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream(AVC_MULTIPLE_PACK_STREAM, false); + demuxer.process_next_pack(); + demuxer.reset_es(0xe0, 0x00, nullptr); + demuxer.process_next_pack(); // Should not find an access unit since the output queue and the current access unit state was cleared + check_point.Call(0); + demuxer.process_next_pack(); +} + +// If reset_es is called with an address, only the most recent access unit should be removed from the queue. Nothing else should be reset +TEST_F(DmuxPamfTest, ResetEsSingleAu) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).Times(2).WillRepeatedly(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + + std::array small_au_queue_buffer{}; + + demuxer.enable_es(0xe0, 0x00, true, small_au_queue_buffer, 0x400, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + demuxer.reset_es(0xe0, 0x00, small_au_queue_buffer.data() + 0x400); + check_point.Call(1); + demuxer.process_next_pack(); +} + +// Tests the raw elementary stream mode, which skips all MPEG program stream related parsing +// (this isn't actually available through the abstraction layer cellDmux/libdmux.sprx, but the related PPU functions are exported in libdmuxpamf.sprx) +TEST_F(DmuxPamfTest, RawEs) +{ + // Zero out MPEG-PS related stuff from the stream, so that only the elementary stream remains + constexpr std::array stream = []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; std::fill_n(pack.begin(), 0x12a, 0); return pack; }(); + + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_1.data_sha1), std::numeric_limits::max(), std::numeric_limits::max(), false, _, _)).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_2.data_sha1), std::numeric_limits::max(), std::numeric_limits::max(), false, _, _)).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x400, true, 0); + demuxer.set_stream(stream, false); + + // In raw elementary stream mode, the demuxer still processes the stream in chunks of 0x800 bytes. + // The first call to process_next_pack() each chunk does nothing, it only sets the internal state to elementary stream parsing + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.process_next_pack(); +} + +// If any of the event handlers return false (on LLE this happens if the event queue is full), the state of process_next_pack() should be saved and return immediately. +// The next time process_next_pack() is called, it should resume where it left off +TEST_F(DmuxPamfTest, EventHandlersReturnFalse) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_1.data_sha1), AVC_SINGLE_PACK_EXPECTED_AU_1.pts, AVC_SINGLE_PACK_EXPECTED_AU_1.dts, AVC_SINGLE_PACK_EXPECTED_AU_1.rap, _, _)).WillOnce(Return(false)); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_1.data_sha1), AVC_SINGLE_PACK_EXPECTED_AU_1.pts, AVC_SINGLE_PACK_EXPECTED_AU_1.dts, AVC_SINGLE_PACK_EXPECTED_AU_1.rap, _, _)).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_2.data_sha1), AVC_SINGLE_PACK_EXPECTED_AU_2.pts, AVC_SINGLE_PACK_EXPECTED_AU_2.dts, AVC_SINGLE_PACK_EXPECTED_AU_2.rap, _, _)).WillOnce(Return(false)); + EXPECT_CALL(check_point, Call(2)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_2.data_sha1), AVC_SINGLE_PACK_EXPECTED_AU_2.pts, AVC_SINGLE_PACK_EXPECTED_AU_2.dts, AVC_SINGLE_PACK_EXPECTED_AU_2.rap, _, _)).WillOnce(Return(true)); + + EXPECT_CALL(check_point, Call(3)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(false)); + EXPECT_CALL(check_point, Call(4)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x800, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + check_point.Call(1); + demuxer.process_next_pack(); + check_point.Call(2); + demuxer.process_next_pack(); + + check_point.Call(3); + demuxer.process_next_pack(); + check_point.Call(4); + demuxer.process_next_pack(); + demuxer.process_next_pack(); + demuxer.process_next_pack(); +} + +// Tests if invalid stream ids are handled properly +TEST_F(DmuxPamfTest, InvalidStreamIds) +{ + const auto test = [&](u8 stream_id, u8 private_stream_id) + { + EXPECT_FALSE(demuxer.release_au(stream_id, private_stream_id, 0x800)); + EXPECT_FALSE(demuxer.disable_es(stream_id, private_stream_id)); + EXPECT_FALSE(demuxer.reset_es(stream_id, private_stream_id, nullptr)); + EXPECT_FALSE(demuxer.flush_es(stream_id, private_stream_id)); + }; + + // Trying to use or disable already disabled elementary streams should result in failures + for (u32 stream_id = 0xe0; stream_id < 0xf0; stream_id++) + { + test(stream_id, 0x00); + } + for (u32 private_stream_id = 0x00; private_stream_id < 0x10; private_stream_id++) + { + test(0xbd, private_stream_id); + } + for (u32 private_stream_id = 0x20; private_stream_id < 0x50; private_stream_id++) + { + test(0xbd, private_stream_id); + } + + // Enabling all possible elementary streams + for (u32 stream_id = 0xe0; stream_id < 0xf0; stream_id++) + { + EXPECT_TRUE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + } + for (u32 private_stream_id = 0x00; private_stream_id < 0x10; private_stream_id++) + { + EXPECT_TRUE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + } + for (u32 private_stream_id = 0x20; private_stream_id < 0x50; private_stream_id++) + { + EXPECT_TRUE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + } + + // Attempting to enable them again should result in failures + for (u32 stream_id = 0xe0; stream_id < 0xf0; stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + } + for (u32 private_stream_id = 0x00; private_stream_id < 0x10; private_stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + } + for (u32 private_stream_id = 0x20; private_stream_id < 0x50; private_stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + } + + // Testing all possible invalid IDs + for (u32 stream_id = 0; stream_id < 0xbd; stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + test(stream_id, 0x00); + } + for (u32 stream_id = 0xbe; stream_id < 0xe0; stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + test(stream_id, 0x00); + } + for (u32 stream_id = 0xf0; stream_id <= 0xff; stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + test(stream_id, 0x00); + } + for (u32 private_stream_id = 0x10; private_stream_id < 0x20; private_stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + test(0xbd, private_stream_id); + } + for (u32 private_stream_id = 0x50; private_stream_id <= 0xff; private_stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + test(0xbd, private_stream_id); + } +} diff --git a/rpcs3/tests/test_dmux_pamf.h b/rpcs3/tests/test_dmux_pamf.h new file mode 100644 index 0000000000..841051a4e0 --- /dev/null +++ b/rpcs3/tests/test_dmux_pamf.h @@ -0,0 +1,123 @@ +#pragma once + +struct AccessUnit +{ + u64 pts; + u64 dts; + bool rap; + u8 specific_info_size; + std::array specific_info_buf; + std::array data_sha1; +}; + +constexpr std::array AVC_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x01, 0x09, 0x36, 0x2c, 0xe0, 0x95, 0x35, 0x29, 0xce, 0xf6, 0xc8, 0xc9, 0xc1, 0x2b, 0xa1, 0xc5, 0xae, 0xfd, 0xa6, 0x0d, 0x98, 0xa7, 0x39, 0x66, 0xe2, 0xd9, 0xbc, 0x1a, 0xbe, 0xba, 0x03, 0xcc, 0x80, 0x90, 0x3a, 0xe9, 0x5b, 0xa7, 0xa0, 0x31, 0x21, 0xbf, 0xee, 0xd2, 0x90, 0x1e, 0x9c, 0x79, 0xbf, 0x15, 0xce, 0xac, 0x02, 0xcf, 0x85, 0xe1, 0xf9, 0x9a, 0xcb, 0x97, 0x2f, 0xd9, 0x97, 0x67, 0x63, 0xed, 0xa3, 0x6d, 0x1b, 0xa3, 0x8b, 0xef, 0x0d, 0x54, 0xd6, 0xb6, 0x4b, 0x42, 0x9b, 0x5e, 0xc4, 0x47, 0xbc, 0x21, 0x02, 0x83, 0xa0, 0x00, 0x08, 0x27, 0x83, 0x2f, 0x5a, 0x02, 0x54, 0xda, 0xe6, 0x16, 0x57, 0x93, 0x09, 0xd6, 0xe4, 0x4a, 0xd9, 0x90, 0xc0, 0x8f, 0x3e, 0xe2, 0xcc, 0xc6, 0xec, 0x8b, 0x4e, 0xf3, 0x96, 0xa7, 0x86, 0x06, 0xca, 0xae, 0xf7, 0xb5, 0xde, 0xe6, 0xcd, 0x41, 0x6e, 0x3e, 0x8e, 0x33, 0xb5, 0x2b, 0xf4, 0xbb, 0xd4, 0x5b, 0xad, 0x1d, 0xfe, 0x5e, 0xc8, 0x03, 0xdd, 0x9d, 0x7e, 0xb9, 0x55, 0xd3, 0x41, 0x76, 0xa0, 0xf1, 0xca, 0x00, 0xe5, 0x80, 0x93, 0x4f, 0x30, 0x15, 0x8c, 0x4b, 0xa6, 0xda, 0xc1, 0xac, 0x1d, 0xe5, 0x96, 0xc4, 0x88, 0x6a, 0x64, 0x4a, 0x10, 0x18, 0x94, 0xe3, 0x18, 0xc2, 0x4d, 0xe7, 0xa0, 0x5e, 0xa3, 0x7c, 0x4a, 0x47, 0x7f, 0xd6, 0x22, 0xc9, 0x44, 0xc2, 0xd1, 0x99, 0xba, 0xdf, 0xa7, 0xfd, 0x24, 0xc6, 0x4c, 0x3c, 0x32, 0xf6, 0xb1, 0x98, 0x30, 0xd1, 0x51, 0x00, 0x18, 0x76, 0xe6, 0xe5, 0x86, 0xdc, 0x4a, 0x6d, 0x28, 0x18, 0x3e, 0x0f, 0x5c, 0xb9, 0x65, 0x2b, 0x48, 0x3c, 0x90, 0x20, 0xe7, 0x88, 0x3f, 0x65, 0x6d, 0x64, 0x83, 0x7d, 0xf6, 0xd3, 0xb0, 0xc7, 0x21, 0xc0, 0xf0, 0x9a, 0xad, 0xc8, 0x53, 0x6d, 0x05, 0xa4, 0x66, 0x2d, 0x87, 0x3f, 0x03, 0x3c, 0x76, 0xd9, 0xa7, 0x6c, 0x25, 0x34, 0xe7, 0x36, 0x46, 0xf9, 0x56, 0xf4, 0x37, 0xe7, 0xa3, 0x8c, 0x32, 0xfc, 0x3f, 0x1b, 0xb6, 0x93, 0xc9, 0x4c, 0x10, 0xaa, 0xba, 0xde, 0xed, 0x3e, 0x98, 0x5f, 0x38, 0x1b, 0xe0, 0xee, 0x48, 0xab, 0xeb, 0x18, 0x1f, 0xa0, 0xc5, 0x08, 0x97, 0x00, 0x85, 0xdf, 0xd4, 0x0a, 0x96, 0xb1, 0x59, 0xeb, 0xce, 0x35, 0xc9, 0x97, 0x83, 0x15, 0xc7, 0xef, 0x01, 0xce, 0x4f, 0xb2, 0x48, 0x36, 0xef, 0xd6, 0x46, 0x54, 0x4f, 0x47, 0xa3, 0x62, 0xf0, 0xd3, 0xbd, 0xd6, 0xe5, 0xec, 0x12, 0x63, 0x60, 0xe5, 0xe7, 0x2c, 0xc1, 0xeb, 0x72, 0xb5, 0x96, 0x50, 0x34, 0x8a, 0x48, 0xc0, 0x6c, 0x48, 0xfe, 0xb0, 0x04, 0xa7, 0x1a, 0xac, 0x3a, 0x08, 0x96, 0xae, 0x9b, 0x93, 0x66, 0x56, 0x9c, 0x22, 0x6a, 0x5a, 0x57, 0x2e, 0xc7, 0xef, 0x6e, 0x54, 0xdb, 0x7f, 0x7d, 0xf1, 0x88, 0x9c, 0x01, 0x95, 0x5d, 0xa1, 0x5a, 0xbb, 0x00, 0xc1, 0xe0, 0x88, 0x9a, 0x17, 0x3f, 0x6b, 0xab, 0x96, 0x95, 0x01, 0x6e, 0x79, 0xa4, 0x54, 0x34, 0xa2, 0x79, 0xdc, 0x53, 0xf5, 0xfa, 0x4a, 0xee, 0x3f, 0x3f, 0xeb, 0xe0, 0x0b, 0x06, 0x64, 0xa5, 0x1a, 0xae, 0x92, 0xd6, 0xdc, 0x1c, 0x3e, 0x8b, 0x1c, 0x72, 0x8f, 0x1d, 0x0b, 0xac, 0xe5, 0x0a, 0x57, 0x65, 0xa9, 0x1e, 0xae, 0x6c, 0x42, 0x63, 0x4a, 0x54, 0x55, 0xa3, 0x34, 0xcd, 0x29, 0x9a, 0xcb, 0xb0, 0x26, 0xf9, 0xc7, 0x55, 0x9c, 0xe1, 0x38, 0x81, 0x3e, 0x8a, 0x72, 0x2c, 0x7f, 0xff, 0xcb, 0x66, 0x75, 0x11, 0xda, 0xe6, 0xb0, 0x12, 0xa8, 0x4c, 0x22, 0x50, 0x6a, 0x69, 0x9e, 0x3d, 0xdc, 0x46, 0x68, 0x2f, 0x9d, 0x27, 0x03, 0x70, 0xe8, 0x46, 0xa2, 0x12, 0x2d, 0x3f, 0x57, 0x45, 0x2a, 0x8f, 0x5a, 0xb9, 0x0d, 0xf0, 0x61, 0x41, 0x7b, 0x51, 0x6c, 0x2d, 0xc5, 0x93, 0x5e, 0x50, 0xcd, 0x98, 0x20, 0xdb, 0x95, 0x3e, 0xf9, 0x80, 0x7d, 0xfd, 0xae, 0xd1, 0xec, 0xa2, 0x96, 0x2b, 0xd5, 0xd5, 0x29, 0x71, 0xd1, 0xb2, 0xbd, 0x4e, 0x03, 0xb2, 0xa3, 0x30, 0x54, 0xbe, 0xbc, 0x08, 0x7b, 0x05, 0xa3, 0x86, 0x8d, 0x7f, 0xa3, 0x6e, 0x9b, 0xad, 0xbd, 0xc8, 0x59, 0xe4, 0xcf, 0x9e, 0x3e, 0x19, 0x6f, 0xcf, 0xda, 0x2b, 0x9b, 0x6b, 0x9d, 0xb7, 0xc5, 0xbc, 0x9a, 0x67, 0x4c, 0x08, 0x0e, 0xa1, 0xa2, 0x19, 0xc6, 0x3c, 0x0d, 0x87, 0xcb, 0x11, 0x0f, 0x53, 0x85, 0x9b, 0xa9, 0x97, 0xa0, 0xba, 0x04, 0x98, 0x66, 0x57, 0xa5, 0xb9, 0x09, 0x31, 0xfe, 0xa9, 0xd2, 0xb4, 0x30, 0xa9, 0x9c, 0x0e, 0x6c, 0x62, 0x3a, 0x04, 0xcd, 0x2a, 0x64, 0x91, 0xfe, 0xee, 0x19, 0xa6, 0xa8, 0x6d, 0x87, 0xa2, 0x1a, 0xda, 0xb6, 0xf1, 0x27, 0x35, 0x95, 0x47, 0x64, 0xfa, 0x1f, 0xed, 0xcf, 0x7b, 0xdc, 0x9a, 0x18, 0x2e, 0xfe, 0xf3, 0x56, 0x6d, 0x28, 0xce, 0xcd, 0x16, 0x03, 0x59, 0x14, 0x4a, 0x90, 0xc2, 0xe3, 0x20, 0x6b, 0x96, 0xd5, 0x30, 0x20, 0x3f, 0xc4, 0xeb, 0x48, 0xe5, 0x9c, 0x34, 0xdf, 0x8d, 0x46, 0x73, 0x1d, 0x54, 0x11, 0x65, 0x5b, 0xe4, 0xab, 0xb3, 0xa6, 0x1e, 0x40, 0x43, 0xb5, 0x84, 0x61, 0x94, 0x01, 0xea, 0x92, 0xd4, 0x9f, 0xb9, 0xc6, 0x26, 0x2d, 0x56, 0xda, 0xa4, 0x11, 0x5f, 0xf6, 0x3f, 0xa2, 0xd8, 0xcb, 0xda, 0xb7, 0x0e, 0xc6, 0x0e, 0x6d, 0xbe, 0x0d, 0x9a, 0x46, 0xc2, 0x77, 0x7d, 0x3a, 0x0d, 0x67, 0xf9, 0x58, 0xf4, 0xba, 0x65, 0xb2, 0xe0, 0x39, 0x60, 0xcf, 0x76, 0xd4, 0x15, 0x73, 0x46, 0xdf, 0x14, 0x22, 0xa7, 0x25, 0x6f, 0xd3, 0x9f, 0x8f, 0xa9, 0x60, 0x1f, 0xbb, 0x13, 0x71, 0x1b, 0x43, 0x4f, 0x9f, 0x66, 0x17, 0x4a, 0xd7, 0x56, 0xd6, 0x84, 0xec, 0x65, 0xd1, 0xb1, 0x64, 0x48, 0x65, 0x18, 0x61, 0x8f, 0x7e, 0xef, 0xdf, 0x5d, 0xea, 0x7d, 0x67, 0xb2, 0x66, 0x95, 0xfe, 0xf3, 0x6c, 0xf4, 0xaa, 0x1d, 0x14, 0x0e, 0x73, 0x0e, 0xca, 0x32, 0xc1, 0x52, 0x23, 0x77, 0xba, 0x94, 0x31, 0x4b, 0x26, 0x44, 0xce, 0x34, 0xe6, 0xd0, 0x6a, 0xa9, 0x5c, 0x58, 0xbd, 0xf8, 0xc6, 0xf4, 0x0b, 0xac, 0xab, 0x1e, 0x5a, 0x81, 0xee, 0x4a, 0xe4, 0x7a, 0x4b, 0xf0, 0x92, 0xad, 0xad, 0x75, 0xd3, 0x0a, 0xa1, 0x71, 0xab, 0x1f, 0x90, 0xbd, 0x8c, 0x80, 0xcd, 0x09, 0x7f, 0x9a, 0x46, 0xbd, 0xd5, 0x92, 0x66, 0x8b, 0xc9, 0xc0, 0x3b, 0xbc, 0xdb, 0xff, 0xa6, 0x99, 0x08, 0xb6, 0x73, 0xf9, 0x79, 0x6e, 0x8d, 0xee, 0x51, 0xdd, 0xd7, 0xe5, 0xec, 0xb4, 0xa1, 0x92, 0x58, 0xab, 0xdc, 0x79, 0xfe, 0xc9, 0xad, 0x55, 0xf3, 0x07, 0x86, 0x56, 0x81, 0x4d, 0x90, 0x52, 0x48, 0x15, 0xbf, 0x56, 0xa1, 0xd4, 0x96, 0xae, 0x44, 0x3c, 0x35, 0x25, 0x06, 0x39, 0xde, 0x60, 0x86, 0x88, 0xb0, 0xc6, 0xcc, 0x98, 0x8f, 0x06, 0x14, 0xb7, 0xed, 0x5b, 0x92, 0x7f, 0x64, 0xc4, 0xd0, 0xf1, 0x2a, 0x89, 0x08, 0x32, 0xab, 0x26, 0x28, 0x55, 0xff, 0xd7, 0xca, 0xf0, 0x41, 0xfe, 0x7d, 0x90, 0xd3, 0x52, 0xcb, 0x6b, 0x1b, 0x2d, 0xfa, 0x05, 0x01, 0x2f, 0xf1, 0xda, 0x84, 0xbe, 0x5c, 0x86, 0xcd, 0x41, 0x09, 0xfe, 0x92, 0xbf, 0x74, 0xc9, 0x75, 0x21, 0x89, 0x70, 0xac, 0x1c, 0x70, 0xdd, 0x56, 0xcb, 0xb0, 0xe1, 0xb9, 0xb4, 0xf8, 0x1c, 0x00, 0x00, 0x01, 0x09, 0x22, 0x6d, 0x07, 0x49, 0x80, 0xdb, 0x25, 0x5c, 0xeb, 0xa5, 0x99, 0x4a, 0xb0, 0x12, 0x9c, 0xc1, 0xce, 0x89, 0xca, 0xc8, 0x57, 0x99, 0x56, 0x40, 0x18, 0xe7, 0xb1, 0xe7, 0x47, 0x97, 0x47, 0xc2, 0xa4, 0x7a, 0xae, 0x3e, 0xe2, 0xb3, 0xec, 0xc2, 0x69, 0x43, 0xd9, 0xe3, 0x9c, 0x95, 0xde, 0x01, 0x95, 0xb7, 0xb4, 0x08, 0x8d, 0x7f, 0x1d, 0x2e, 0x95, 0x0f, 0x3c, 0xdd, 0x9e, 0x64, 0xd6, 0xf3, 0xe6, 0xa0, 0x24, 0xe5, 0x19, 0xf0, 0x96, 0x92, 0x0a, 0xde, 0xc5, 0x12, 0xf7, 0x3a, 0xa3, 0x26, 0x12, 0x84, 0x7b, 0x73, 0x1d, 0xd5, 0xbc, 0xf4, 0x47, 0xfd, 0x81, 0xf7, 0xd9, 0x03, 0xc4, 0x34, 0x06, 0x2b, 0x05, 0x40, 0xa7, 0x2e, 0x1d, 0xbd, 0x5c, 0x85, 0x27, 0x77, 0xf7, 0x75, 0xca, 0xd5, 0x34, 0x5b, 0xf5, 0x40, 0x7e, 0x06, 0x92, 0x5c, 0x94, 0x89, 0x0a, 0xa3, 0x0e, 0x63, 0x95, 0x5d, 0x54, 0x28, 0x86, 0x68, 0x17, 0x2d, 0xd3, 0xc3, 0x46, 0x93, 0xbb, 0x9c, 0xae, 0xea, 0x35, 0xdd, 0xda, 0xc4, 0x1b, 0xa3, 0xba, 0xee, 0x1e, 0x7e, 0xab, 0xb9, 0xba, 0xe4, 0x8d, 0x5e, 0x98, 0x9f, 0x84, 0xba, 0x0c, 0x7c, 0x29, 0x63, 0xed, 0xae, 0x90, 0x54, 0x9c, 0x74, 0x2a, 0x80, 0xe4, 0x4d, 0xbc, 0x5b, 0xaa, 0xd5, 0xbe, 0x64, 0xae, 0xab, 0xc1, 0x45, 0xb7, 0xfd, 0xc1, 0x48, 0xd3, 0x48, 0x32, 0x82, 0xea, 0x3f, 0x93, 0x3c, 0xa5, 0xef, 0xf1, 0x45, 0x73, 0xae, 0x60, 0x98, 0x36, 0x5e, 0xb1, 0xaa, 0x7c, 0x1b, 0x23, 0x68, 0xaa, 0x7f, 0x5c, 0x6a, 0x2d, 0xad, 0x23, 0xa5, 0x82, 0x9a, 0x0e, 0x65, 0x62, 0xca, 0x91, 0x61, 0x39, 0xfd, 0xd1, 0x3f, 0x6f, 0xc0, 0xf0, 0xa2, 0x2d, 0xcc, 0x99, 0x96, 0xd3, 0x6b, 0xe3, 0x51, 0x5c, 0x12, 0x3c, 0x23, 0x88, 0xc3, 0x8d, 0x42, 0x7c, 0xf3, 0xec, 0x9e, 0x5c, 0x69, 0xb7, 0xb6, 0xf7, 0xa7, 0x07, 0xd5, 0x56, 0x8b, 0x8b, 0x2c, 0x3f, 0x29, 0x02, 0x03, 0xb1, 0xde, 0xe6, 0xeb, 0xbd, 0x52, 0x4c, 0xf3, 0x4e, 0x03, 0xf9, 0x9f, 0x4a, 0x2d, 0x23, 0x10, 0x57, 0xf5, 0x96, 0xd2, 0x0e, 0x8c, 0x72, 0xd2, 0x56, 0xdf, 0x44, 0x1a, 0xcb, 0x36, 0xe9, 0x03, 0x67, 0xca, 0xa9, 0xbf, 0x38, 0x43, 0x73, 0x49, 0xb8, 0x9a, 0x13, 0x4c, 0x78, 0x89, 0xac, 0xc7, 0xb9, 0x8c, 0x2c, 0xee, 0x80, 0x04, 0xf7, 0x75, 0x4f, 0xd2, 0x7c, 0xb5, 0x20, 0xe2, 0x3b, 0xb8, 0xc5, 0x57, 0x2e, 0xc8, 0x9f, 0xcb, 0xd1, 0xee, 0xcf, 0x59, 0x6c, 0xc1, 0x85, 0xe6, 0x34, 0x42, 0xe2, 0x65, 0x7b, 0xbb, 0xae, 0x2e, 0x97, 0x0b, 0x3f, 0x1b, 0xfb, 0xd3, 0xcc, 0x5d, 0x01, 0xba, 0xf9, 0x30, 0x62, 0xa5, 0xd6, 0xe0, 0xca, 0xce, 0xde, 0x52, 0x68, 0x90, 0x76, 0xa3, 0x82, 0x88, 0x52, 0xa2, 0xb0, 0x9c, 0xa1, 0x3d, 0xf8, 0x95, 0x35, 0x31, 0x8d, 0x0a, 0x9c, 0xaa, 0xac, 0xb7, 0x2f, 0x30, 0x4e, 0xda, 0x0b, 0x56, 0x32, 0x8d, 0xda, 0xd5, 0xc2, 0xd3, 0x1b, 0x7f, 0xc1, 0xf6, 0xd1, 0xde, 0x07, 0xe4, 0x94, 0x34, 0xb9, 0x00, 0x40, 0x05, 0xa3, 0x6a, 0x0d, 0x8f, 0xd8, 0x44, 0x0b, 0xc3, 0x64, 0xd0, 0x53, 0x70, 0x5c, 0xc9, 0x99, 0x13, 0xac, 0xc8, 0x09, 0x85, 0x44, 0x3c, 0x1d, 0x99, 0x26, 0x52, 0x3c, 0xce, 0x50, 0xe4, 0x44, 0xd0, 0xd0, 0xa5, 0xa8, 0xad, 0x6b, 0xae, 0xf0, 0xca, 0x58, 0x22, 0x9f, 0x61, 0xf6, 0xb3, 0x6b, 0xd0, 0x34, 0x9b, 0x3b, 0x45, 0x25, 0x5e, 0x0e, 0xac, 0xf6, 0x82, 0x2b, 0x01, 0xa4, 0x49, 0x72, 0x23, 0xd7, 0xd3, 0x31, 0xb9, 0x36, 0xb2, 0x3e, 0x06, 0xcc, 0xfc, 0x82, 0xee, 0x12, 0x97, 0x26, 0xae, 0xe5, 0x03, 0xb5, 0x54, 0x3f, 0x45, 0xde, 0x94, 0xb1, 0x39, 0xbd, 0xd7, 0xe3, 0x20, 0xca, 0x85, 0xa1, 0x83, 0x04, 0xfc, 0x93, 0x8d, 0xbf, 0x2d, 0x49, 0x36, 0x8e, 0xf2, 0x82, 0x3f, 0xcf, 0xcf, 0xfb, 0xae, 0x31, 0x35, 0x45, 0xa4, 0xde, 0xd7, 0xc7, 0x07, 0xdd, 0xdc, 0x12, 0x68, 0x6f, 0x93, 0x44, 0xef, 0xd5, 0x96, 0x00, 0x04, 0x1a, 0xc7, 0x46, 0xe7, 0x51, 0x76, 0xd4, 0x3a, 0x50, 0x40, 0xce, 0x9a, 0x55, 0x1e, 0xd6, 0x9a, 0x8d, 0xd9, 0xc8, 0x34, 0xea, 0xda, 0xdc, 0x5f, 0x51, 0x88, 0x80, 0xcf, 0xf9, 0xb9, 0x20, 0x8b, 0x60, 0xf9, 0xbf, 0x2a, 0x24, 0x18, 0x8f, 0x86, 0xc8, 0xaa, 0x00, 0xf9, 0x05, 0xef, 0x38, 0x59, 0xa2, 0xe9, 0x36, 0xac, 0x01, 0xd5, 0xa6, 0x09, 0x22, 0x5c, 0xd7, 0xca, 0xc3, 0x15, 0xb4, 0x8f, 0x6f, 0x1e, 0xe9, 0xca, 0xe4, 0xad, 0x77, 0x28, 0x99, 0x8f, 0xdd, 0x8a, 0x5d, 0x82, 0x17, 0xa7, 0x58, 0x6f, 0x71, 0x66, 0x8f, 0x74, 0x69, 0xc9, 0x0e, 0x58, 0xf3, 0xc6, 0x37, 0x93, 0xf9, 0xff, 0xf6, 0x6b, 0x51, 0xa7, 0x5c, 0x61, 0x12, 0x92, 0x0d, 0xc9, 0x3b, 0x59, 0xe9, 0xea, 0x14, 0x25, 0x29, 0x28, 0xd1, 0x51, 0xc6, 0x1c, 0x39, 0x80, 0x2f, 0x99, 0xbd, 0xd0, 0xcd, 0x03, 0x71, 0xba, 0xb4, 0x1c, 0xd3, 0x2f, 0xa9, 0xaf, 0xc6, 0x24, 0x24, 0xb9, 0xd5, 0xc7, 0xe3, 0xda, 0xf1, 0xd2, 0x4d, 0xc2, 0x69, 0x31, 0x64, 0xc6, 0xfd, 0xb5, 0xce, 0x00, 0x3a, 0xc7, 0x9c, 0x95, 0xfd, 0x88, 0xb5, 0x58, 0xc5, 0x7d, 0x52, 0xf4, 0x58, 0x83, 0x4a, 0xc8, 0x07, 0xd3, 0x45, 0x53, 0x66, 0x00, 0x00, 0x01, 0x09 }; +constexpr AccessUnit AVC_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, true, 0, {}, { 0xdb, 0x46, 0x52, 0xf7, 0x3e, 0x38, 0x99, 0x16, 0xe6, 0x60, 0x20, 0x01, 0x4d, 0xce, 0x65, 0x8f, 0xfa, 0xb5, 0x8f, 0x3a } }; +constexpr AccessUnit AVC_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xd2, 0x40, 0xa9, 0x31, 0x5a, 0x2f, 0x92, 0xb0, 0x3c, 0x26, 0xa9, 0xd0, 0xdf, 0xfb, 0x97, 0x2d, 0xb3, 0xf1, 0x4d, 0x78 } }; + +constexpr std::array M2V_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x01, 0xb3, 0x5f, 0x55, 0xe4, 0xf8, 0x98, 0x9f, 0x07, 0x15, 0x3e, 0x0f, 0x8d, 0x16, 0xed, 0xcd, 0x0a, 0xa8, 0x39, 0xbf, 0xb5, 0xba, 0x30, 0xf0, 0x64, 0x37, 0x31, 0xba, 0xec, 0x8e, 0xa0, 0x68, 0xcc, 0xa1, 0xfd, 0x1f, 0x93, 0xff, 0xc3, 0xd1, 0xbf, 0x05, 0x6f, 0x8f, 0x71, 0x78, 0x90, 0xeb, 0xc1, 0x9e, 0xe6, 0x63, 0xad, 0x00, 0x07, 0xcb, 0x8f, 0x60, 0x57, 0xc6, 0x3c, 0xbb, 0x4b, 0x47, 0xe8, 0xc9, 0x8c, 0x58, 0x5c, 0x78, 0x12, 0x21, 0x20, 0xc8, 0x54, 0xa7, 0x85, 0x65, 0x2d, 0x4a, 0x86, 0xb3, 0x66, 0x5e, 0x89, 0x8e, 0xeb, 0xd6, 0x37, 0xaa, 0xcb, 0xab, 0xb0, 0x42, 0x94, 0xe6, 0x77, 0x86, 0xfd, 0x21, 0x8e, 0xb8, 0xe5, 0x4d, 0x5f, 0x94, 0x38, 0xc1, 0x0c, 0xaa, 0x92, 0xb4, 0xf4, 0x20, 0x75, 0x2d, 0x60, 0xa8, 0x83, 0x7b, 0x1d, 0xa1, 0x91, 0x7c, 0xf9, 0x82, 0xfb, 0x89, 0x19, 0x8e, 0x3b, 0xb2, 0x8b, 0xb9, 0x61, 0x3e, 0x62, 0x29, 0x96, 0xe6, 0x64, 0x91, 0xce, 0x61, 0x11, 0xb9, 0x69, 0x4d, 0xcb, 0xcb, 0x9c, 0xe2, 0xca, 0xa4, 0x97, 0x3a, 0x3a, 0xc5, 0xea, 0xeb, 0x2b, 0xf1, 0x08, 0xad, 0x68, 0xe3, 0xd2, 0xd0, 0xff, 0x49, 0x34, 0xb6, 0x09, 0x91, 0xa3, 0xfe, 0xc2, 0x4f, 0x69, 0x7e, 0xaf, 0xf5, 0x15, 0x42, 0x47, 0xc2, 0x8e, 0x14, 0xc6, 0x99, 0x80, 0x2f, 0x57, 0xbe, 0x39, 0x6e, 0x5e, 0xb2, 0x7f, 0x96, 0x21, 0xe5, 0x96, 0x6b, 0x4c, 0x99, 0xb5, 0x18, 0xcf, 0x87, 0x28, 0x5a, 0x66, 0x03, 0xaa, 0xcc, 0xd5, 0xce, 0x1d, 0x42, 0x99, 0xb4, 0x58, 0xf8, 0xf8, 0x82, 0x58, 0x8a, 0x94, 0x4a, 0xce, 0x92, 0x53, 0xec, 0xeb, 0x00, 0x00, 0x01, 0x00, 0xdd, 0xdc, 0xcc, 0xa9, 0x9d, 0x30, 0xfa, 0x65, 0xff, 0xd5, 0xc6, 0xb5, 0x2f, 0x5a, 0x14, 0xab, 0x0a, 0x86, 0x18, 0x98, 0x8c, 0x02, 0x49, 0x11, 0x05, 0x78, 0xf7, 0xae, 0x21, 0x7a, 0x5e, 0xa8, 0x1d, 0x5e, 0x1c, 0x1b, 0x7f, 0x8d, 0xe9, 0x05, 0x0b, 0x93, 0x4f, 0x98, 0xaa, 0x11, 0x71, 0x91, 0x0f, 0x8b, 0x47, 0x43, 0x69, 0x12, 0x1b, 0x30, 0x31, 0x3b, 0x8d, 0x5a, 0x09, 0x91, 0x19, 0x83, 0xd8, 0x68, 0x0d, 0xc9, 0x25, 0xf6, 0xdf, 0x42, 0xb2, 0x49, 0x76, 0xcf, 0x98, 0x6a, 0x54, 0xfa, 0x10, 0xd8, 0x5b, 0x51, 0x75, 0xb8, 0x80, 0x7e, 0xfd, 0x92, 0x7f, 0x57, 0xcf, 0x9c, 0xad, 0xb4, 0x90, 0xb1, 0x42, 0x3e, 0xa0, 0xea, 0xde, 0xea, 0x66, 0x7b, 0xd6, 0xa0, 0xf3, 0xc3, 0xa6, 0xe0, 0x4b, 0x3c, 0x97, 0xf0, 0x11, 0x95, 0xb7, 0xb7, 0xd1, 0x94, 0x0a, 0x32, 0x11, 0x4d, 0x34, 0x8d, 0x72, 0xc5, 0xfd, 0x96, 0xfc, 0x44, 0xd7, 0x59, 0xcf, 0xa5, 0xd7, 0x2d, 0x3a, 0xd0, 0x7d, 0x1c, 0x88, 0xac, 0x7d, 0x63, 0xad, 0xcd, 0x35, 0xd1, 0xba, 0x66, 0xc5, 0x20, 0xb7, 0x65, 0x41, 0xe3, 0x41, 0x39, 0xfe, 0xdd, 0x90, 0x40, 0x52, 0xe8, 0x51, 0x86, 0x2c, 0xb0, 0x1f, 0x36, 0x57, 0x77, 0x8c, 0xe7, 0xf6, 0x8f, 0xc6, 0x5d, 0xfe, 0xa4, 0x4c, 0x65, 0x01, 0x53, 0x0b, 0xe6, 0x8a, 0xc5, 0x6b, 0x17, 0xa0, 0xe7, 0x31, 0xe1, 0xce, 0x1e, 0xc8, 0xc8, 0xb3, 0x8d, 0x04, 0x0e, 0x7f, 0x6a, 0xaa, 0x32, 0x4e, 0x24, 0xe8, 0xc8, 0xbf, 0x8c, 0xec, 0xea, 0xcd, 0xb2, 0xd4, 0xdc, 0x0c, 0xb6, 0xc9, 0xac, 0x6e, 0x66, 0xa7, 0x22, 0xa5, 0x26, 0xe0, 0x90, 0xad, 0x6f, 0xef, 0x96, 0x85, 0xee, 0x53, 0xfb, 0xdd, 0xd6, 0x6a, 0xa7, 0x45, 0xb9, 0x64, 0x3b, 0x4d, 0xfc, 0xce, 0x21, 0x7d, 0x33, 0x70, 0xb4, 0xb6, 0x43, 0x97, 0x77, 0xcc, 0x8e, 0x38, 0xee, 0x82, 0x54, 0x26, 0x1e, 0xc1, 0x6e, 0x86, 0x1c, 0x39, 0x62, 0x46, 0xf5, 0x11, 0x95, 0xbf, 0x64, 0xa0, 0xf9, 0x1d, 0x1a, 0x23, 0x34, 0x42, 0x0b, 0x11, 0x6b, 0x55, 0x19, 0x37, 0xb8, 0x43, 0xa2, 0x24, 0x22, 0x08, 0xca, 0xa0, 0xb9, 0x90, 0xae, 0x74, 0x57, 0xb3, 0x7b, 0x31, 0x1a, 0x50, 0xc3, 0xe6, 0xb9, 0xaa, 0xb1, 0xc9, 0x41, 0xcd, 0x7f, 0x11, 0xac, 0xf2, 0x4f, 0x92, 0xeb, 0xe7, 0xd1, 0xd5, 0x58, 0x6a, 0xdd, 0x15, 0x1c, 0xd6, 0x9f, 0x4e, 0xb3, 0xa5, 0x7a, 0xdc, 0xde, 0x33, 0x25, 0x14, 0x59, 0x58, 0x21, 0x96, 0x8f, 0x5c, 0x78, 0x08, 0x5b, 0xe6, 0xa0, 0xca, 0x75, 0x83, 0x2a, 0x76, 0x16, 0x10, 0x34, 0x1f, 0x6f, 0x4b, 0x60, 0x8d, 0x8e, 0xf8, 0xb1, 0xe2, 0xac, 0xe5, 0xe3, 0x48, 0xcb, 0x99, 0xdb, 0x5e, 0xc8, 0xad, 0x15, 0x35, 0x44, 0xac, 0x92, 0x83, 0x95, 0x19, 0x91, 0x0c, 0x7f, 0x0a, 0xf2, 0x17, 0xc7, 0xff, 0x95, 0xd2, 0xee, 0x10, 0xad, 0xde, 0x03, 0xe2, 0x20, 0x1e, 0xd9, 0x4f, 0xda, 0x80, 0xf8, 0xba, 0x7e, 0x6d, 0x0c, 0x9e, 0xce, 0xbe, 0x61, 0x89, 0x16, 0x2a, 0x2f, 0xf6, 0x58, 0xce, 0x50, 0x4d, 0x23, 0x02, 0x5a, 0xf4, 0x11, 0xf3, 0xd7, 0x5a, 0x15, 0xaa, 0xd2, 0x74, 0xa1, 0x9b, 0x87, 0x40, 0xec, 0x37, 0x9f, 0x36, 0x05, 0x36, 0xd6, 0xf1, 0x7d, 0x2d, 0xd4, 0x16, 0x38, 0xf1, 0xe3, 0x64, 0xeb, 0x8d, 0x69, 0xa5, 0x6e, 0xac, 0xd6, 0x1c, 0x8b, 0x3d, 0x7a, 0x52, 0xb5, 0x50, 0xe4, 0x57, 0x61, 0xb8, 0xf2, 0xde, 0x77, 0x5c, 0x4b, 0x4a, 0x5a, 0x76, 0x97, 0x0d, 0x82, 0x50, 0xb6, 0x8a, 0x72, 0x64, 0x9f, 0xc2, 0x14, 0xbf, 0xbb, 0x4f, 0xe9, 0x5b, 0x34, 0x41, 0x27, 0xf3, 0x04, 0x8e, 0x9e, 0xd2, 0xc4, 0xc0, 0x56, 0xd5, 0x91, 0x99, 0x18, 0xbb, 0xd4, 0x41, 0xb3, 0xe4, 0x0a, 0xaf, 0x3f, 0xc2, 0xde, 0x4c, 0x97, 0x00, 0x4d, 0xc2, 0x83, 0x1c, 0x1c, 0xd9, 0x49, 0xd5, 0x24, 0x25, 0xab, 0x90, 0x8b, 0xac, 0x39, 0x58, 0x55, 0x1b, 0x17, 0xc3, 0x41, 0x66, 0x91, 0xa1, 0x78, 0x6e, 0x01, 0x20, 0x82, 0x54, 0x7e, 0xad, 0x0b, 0x6d, 0x05, 0x51, 0x00, 0x00, 0x01, 0x00, 0x12, 0xb7, 0x73, 0x59, 0x4c, 0x73, 0x73, 0x28, 0xdb, 0x82, 0x34, 0xcf, 0x9a, 0xa1, 0x13, 0xe9, 0xdf, 0x22, 0x5c, 0x02, 0xf7, 0x43, 0x86, 0x56, 0x99, 0x20, 0x4c, 0x74, 0x5b, 0x39, 0xe7, 0x55, 0x28, 0x06, 0x7e, 0x18, 0x1e, 0xbf, 0xaf, 0xbd, 0x73, 0xa5, 0x15, 0xb5, 0xc7, 0x8c, 0x1a, 0x07, 0x78, 0x78, 0xed, 0x02, 0x10, 0xe7, 0x34, 0xbd, 0x09, 0x14, 0xb9, 0xb3, 0xf8, 0x15, 0xe9, 0xd4, 0xa0, 0x41, 0x93, 0x69, 0x97, 0x46, 0xd1, 0x41, 0x0c, 0x3f, 0xa3, 0x2d, 0x24, 0xda, 0x2f, 0x2b, 0x04, 0xad, 0x07, 0x61, 0x91, 0xf0, 0x8f, 0x55, 0xa6, 0x70, 0x51, 0x5c, 0x2d, 0xfc, 0x30, 0xad, 0xc6, 0x47, 0xc4, 0x35, 0x6e, 0x47, 0xe0, 0x25, 0x02, 0x51, 0x2f, 0xed, 0xf5, 0x34, 0xe0, 0xe8, 0x4e, 0x9f, 0xc0, 0x43, 0x68, 0x05, 0x5c, 0x66, 0x54, 0x7d, 0x19, 0x19, 0xba, 0xf3, 0x12, 0xf1, 0xa6, 0xb1, 0xe3, 0x22, 0x2d, 0x71, 0x55, 0xe6, 0xce, 0x91, 0x0d, 0x92, 0x0d, 0x94, 0x1d, 0x7a, 0xc4, 0xa5, 0x53, 0x1c, 0x9b, 0xa7, 0x7f, 0xaa, 0xd2, 0x3b, 0xdd, 0x0f, 0x92, 0xc5, 0xef, 0x5f, 0xbd, 0x1a, 0xc4, 0xa1, 0x7b, 0x9a, 0xc6, 0xc2, 0x51, 0x8a, 0x8f, 0x02, 0x26, 0x0d, 0x49, 0x4b, 0x36, 0xfa, 0x1c, 0xfe, 0x62, 0xcd, 0x81, 0x95, 0x7c, 0x98, 0x7a, 0x45, 0x0d, 0xc5, 0x84, 0x75, 0x7e, 0x14, 0xaf, 0x11, 0x06, 0x23, 0x90, 0x8b, 0x50, 0x27, 0x8c, 0x57, 0xcc, 0x55, 0xa0, 0xa9, 0x52, 0x1a, 0x94, 0x9e, 0x96, 0x52, 0xdf, 0x7f, 0x6d, 0xcf, 0x37, 0x87, 0xae, 0x01, 0x28, 0x41, 0xde, 0x29, 0x70, 0x0c, 0x90, 0xf8, 0xcc, 0x7c, 0x2e, 0x6a, 0x37, 0x12, 0x9d, 0x49, 0xfe, 0x3f, 0xec, 0x6d, 0x21, 0xce, 0x67, 0x8b, 0xc9, 0xab, 0x20, 0x38, 0x80, 0x8b, 0x93, 0x24, 0x3f, 0x62, 0x03, 0x57, 0x59, 0x83, 0xb4, 0x6c, 0xdd, 0x68, 0xdd, 0x4c, 0x89, 0xfc, 0x79, 0x64, 0x47, 0x0e, 0x44, 0x96, 0xb7, 0x0b, 0x0a, 0xab, 0x9a, 0x1e, 0xc5, 0x24, 0x92, 0x3c, 0xf5, 0x91, 0x77, 0x39, 0x67, 0x41, 0x5a, 0xdd, 0x62, 0x91, 0x95, 0xe5, 0x64, 0x56, 0x0a, 0x2d, 0xee, 0xf4, 0x65, 0x98, 0xa6, 0x73, 0x28, 0x71, 0xb8, 0xa0, 0x9b, 0xa8, 0x95, 0x6e, 0xa6, 0xec, 0xb3, 0xf7, 0x19, 0xf5, 0xcd, 0x60, 0xf2, 0x5d, 0x1e, 0x23, 0x4c, 0xeb, 0x53, 0xad, 0x28, 0xd1, 0x7e, 0xa2, 0xbb, 0x83, 0xf8, 0x55, 0x9e, 0x08, 0x85, 0xfb, 0x47, 0x3c, 0x9e, 0x3b, 0xbb, 0x81, 0xa2, 0x13, 0xc0, 0x8e, 0x18, 0x37, 0x2e, 0x98, 0x61, 0x88, 0x3e, 0x13, 0x06, 0x67, 0x1e, 0x03, 0xea, 0x7a, 0xb1, 0x3e, 0x6b, 0xef, 0x68, 0x09, 0x11, 0xfb, 0x80, 0x16, 0x12, 0x34, 0xc3, 0xb1, 0x14, 0x13, 0x64, 0x64, 0xc6, 0x6d, 0xf9, 0x43, 0x2c, 0xc2, 0x08, 0xac, 0xb5, 0x72, 0xe2, 0xf6, 0x44, 0x65, 0x90, 0x0a, 0xdc, 0x80, 0xab, 0x69, 0xdf, 0x63, 0x22, 0x57, 0x9d, 0x8e, 0xd7, 0x7d, 0x8d, 0xd5, 0x10, 0xd1, 0xc8, 0xd1, 0xbd, 0x39, 0xd9, 0x71, 0x7b, 0x0f, 0x10, 0x7f, 0x9a, 0x35, 0xdb, 0x1f, 0x3e, 0x69, 0x7c, 0x79, 0x6c, 0x5e, 0x2f, 0x5e, 0x97, 0xd4, 0xfc, 0xff, 0x7f, 0xf3, 0x5c, 0x68, 0xa7, 0xd6, 0x3d, 0xce, 0x5c, 0x90, 0x98, 0x61, 0x0e, 0x13, 0xe6, 0x3d, 0xa0, 0x24, 0xae, 0x75, 0x0d, 0x2d, 0xfc, 0xd7, 0x93, 0xae, 0x17, 0xf6, 0x9a, 0x27, 0xb8, 0x78, 0xca, 0xfa, 0x5d, 0x54, 0x10, 0x12, 0xf2, 0x54, 0x71, 0x46, 0xf3, 0xf7, 0x32, 0xe4, 0xb6, 0xb7, 0xab, 0x9a, 0xe5, 0xd4, 0x12, 0xd8, 0x09, 0xdc, 0x35, 0xa1, 0xe9, 0x5e, 0x39, 0x47, 0xe2, 0x9d, 0x79, 0xf7, 0x56, 0x34, 0x73, 0x51, 0x48, 0x3d, 0xce, 0xef, 0x3c, 0xbd, 0xe8, 0xd5, 0xd5, 0x5b, 0x95, 0x64, 0xf0, 0x12, 0x57, 0xac, 0x66, 0xa0, 0x73, 0x43, 0xd9, 0x35, 0x40, 0x0e, 0x98, 0x1d, 0x3e, 0x7b, 0x35, 0xa6, 0xaa, 0xfe, 0xad, 0x7d, 0x5a, 0xe6, 0x10, 0x0b, 0xc8, 0x27, 0x7a, 0x1c, 0xb2, 0x72, 0x78, 0x16, 0xbf, 0x87, 0x3e, 0xc9, 0xe3, 0xf2, 0xea, 0x44, 0x4a, 0x4c, 0x65, 0x5c, 0x2e, 0xe1, 0xfc, 0xb8, 0x69, 0xfe, 0xf2, 0xdd, 0xe6, 0x96, 0x45, 0x84, 0xf8, 0xd2, 0xc2, 0x8b, 0xe3, 0x05, 0x9b, 0x32, 0x59, 0xf8, 0xba, 0xcf, 0x2d, 0xa8, 0x05, 0x26, 0x03, 0x5a, 0x1d, 0x9e, 0xc5, 0x1a, 0xdb, 0xb8, 0x9a, 0x9d, 0xab, 0x05, 0x3a, 0x15, 0x45, 0x20, 0x88, 0xe4, 0xd4, 0x89, 0x3b, 0x2d, 0xf8, 0x91, 0x21, 0x4f, 0xed, 0x30, 0xfd, 0xc7, 0x0c, 0x6b, 0x94, 0xb3, 0xa8, 0x56, 0x9b, 0x05, 0x94, 0x96, 0x4c, 0x06, 0xdf, 0x1b, 0xf6, 0xc8, 0xc8, 0x5c, 0xe6, 0x51, 0x4c, 0x93, 0xf0, 0x92, 0x1b, 0x9f, 0x89, 0xf9, 0xe7, 0x0d, 0xbd, 0x17, 0x8f, 0xc1, 0x27, 0x77, 0x8a, 0xde, 0xb4, 0xb3, 0x2b, 0xe3, 0x6a, 0xcb, 0xe7, 0xf2, 0x42, 0x3f, 0x7c, 0x3d, 0xa6, 0xa5, 0xcf, 0x82, 0x52, 0x99, 0x69, 0xbd, 0xee, 0xf1, 0xbf, 0xcd, 0x64, 0x03, 0x37, 0x64, 0xf3, 0x24, 0x8a, 0x57, 0x49, 0x6c, 0x20, 0xfd, 0x09, 0x69, 0xd8, 0x65, 0x04, 0x7d, 0xbe, 0x35, 0x5a, 0xd3, 0x4b, 0xe2, 0x4e, 0xa7, 0x0c, 0xee, 0x7b, 0xac, 0x7f, 0xb5, 0x02, 0x4f, 0x84, 0x87, 0xf7, 0x17, 0x22, 0xa2, 0x6f, 0x33, 0x94, 0x79, 0xc1, 0xb9, 0xc1, 0x14, 0xd6, 0x7a, 0x11, 0x70, 0xa8, 0xb7, 0x08, 0x3e, 0x7a, 0x36, 0x00, 0x26, 0x9d, 0x82, 0x08, 0x7f, 0x65, 0x81, 0x11, 0x2d, 0xf7, 0x63, 0xa1, 0xf0, 0x2c, 0x66, 0x7e, 0xf3, 0x35, 0xf8, 0x49, 0x5c, 0x17, 0xd0, 0x56, 0xc5, 0xbb, 0x78, 0x1c, 0xe8, 0x77, 0xde, 0xd9, 0x20, 0x82, 0xad, 0xc3, 0x0d, 0x2e, 0x7c, 0xc6, 0x9c, 0x7f, 0x6f, 0xb8, 0xc6, 0x20, 0x6c, 0x93, 0x62, 0x32, 0x1d, 0x1d, 0x79, 0xba, 0xaa, 0x59, 0x44, 0xfb, 0xcd, 0x66, 0xa5, 0x49, 0xae, 0xab, 0x0d, 0xa3, 0xcf, 0x29, 0x8b, 0xb4, 0x3a, 0x90, 0xc0, 0x2e, 0x64, 0x91, 0x78, 0x86, 0xfc, 0x75, 0x81, 0xed, 0xa8, 0x7d, 0x58, 0x65, 0xc4, 0x72, 0xf8, 0x3b, 0x6b, 0xbd, 0xe6, 0x09, 0x3d, 0x63, 0x87, 0x39, 0xbc, 0xf2, 0xbf, 0xe6, 0x75, 0x66, 0x2e, 0x50, 0x06, 0xe5, 0xf7, 0xab, 0x5a, 0xb5, 0x88, 0x91, 0x04, 0x81, 0x7f, 0xb7, 0x7b, 0xfa, 0x37, 0xa6, 0x6b, 0x7d, 0x8e, 0x96, 0x17, 0xcc, 0xf1, 0x9e, 0xb3, 0x5a, 0xd6, 0xf9, 0xa1, 0x70, 0x15, 0x63, 0x22, 0xaf, 0xe2, 0x0f, 0x6d, 0xb3, 0x34, 0x0c, 0x86, 0xb5, 0x48, 0x91, 0x1e, 0x70, 0x63, 0xb3, 0xa6, 0x14, 0x8f, 0xfe, 0x54, 0xaa, 0x5d, 0x26, 0xdb, 0x78, 0x24, 0xc1, 0xfe, 0x2b, 0x83, 0x7e, 0x1f, 0xd1, 0xf5, 0x50, 0x30, 0x1a, 0x3a, 0xf0, 0x3c, 0x58, 0xa5, 0x00, 0x00, 0x01, 0xb7 }; +constexpr AccessUnit M2V_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, true, 0, {}, { 0xcc, 0xde, 0x79, 0xd3, 0x4e, 0x18, 0x1d, 0xe1, 0xd9, 0xb6, 0x96, 0x08, 0x89, 0x4d, 0x21, 0xc9, 0x3c, 0x69, 0xf0, 0x97 } }; +constexpr AccessUnit M2V_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x62, 0xee, 0x39, 0x77, 0xee, 0xb9, 0x4b, 0xa8, 0x02, 0x81, 0xb1, 0x65, 0x11, 0x6b, 0xa8, 0x40, 0xd8, 0x80, 0xff, 0xf3 } }; + +constexpr std::array ATRACX_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xf9, 0x59, 0xfb, 0xc5, 0x0f, 0xd0, 0x00, 0xd6, 0xa6, 0x43, 0x65, 0x4e, 0x0f, 0xd0, 0x00, 0xd5, 0x0b, 0xf0, 0x8b, 0x9a, 0x6b, 0x02, 0xf9, 0xe8, 0xc3, 0x80, 0x7f, 0x21, 0xad, 0xe3, 0x55, 0xe4, 0x2b, 0xb3, 0x50, 0xad, 0x7d, 0xb8, 0x7b, 0x69, 0xaa, 0x09, 0xf6, 0x6f, 0xb1, 0x31, 0x57, 0x04, 0x1b, 0x22, 0x91, 0x9a, 0xc0, 0x05, 0xe6, 0x27, 0x6a, 0x65, 0xee, 0xac, 0xc9, 0x56, 0xa3, 0x4e, 0xcf, 0xef, 0xcb, 0xff, 0x5a, 0x4d, 0x31, 0xed, 0x72, 0xa4, 0xb0, 0x26, 0x8a, 0x7e, 0xd6, 0x28, 0x8a, 0x51, 0x77, 0x4a, 0x51, 0x9f, 0x38, 0x7a, 0xa5, 0xac, 0x69, 0xcf, 0x7b, 0x22, 0xbb, 0xc1, 0x0d, 0x1b, 0x7b, 0x50, 0x1e, 0x66, 0xce, 0xc0, 0x98, 0x33, 0x4f, 0x04, 0xcb, 0xd3, 0x44, 0x89, 0x54, 0xe4, 0xb9, 0x0d, 0x05, 0x86, 0xfd, 0x21, 0xf1, 0x5f, 0xda, 0xcb, 0x19, 0x74, 0xb9, 0x90, 0xa8, 0x10, 0xe4, 0xf8, 0xbc, 0x9b, 0x04, 0xc1, 0x67, 0x11, 0x6b, 0x13, 0x82, 0xec, 0x62, 0x48, 0x3b, 0x44, 0xa7, 0xf1, 0x45, 0x54, 0x2f, 0x51, 0x77, 0xfc, 0xa5, 0xed, 0xd3, 0x24, 0x2e, 0xf6, 0xfa, 0x8d, 0xff, 0x06, 0x13, 0x66, 0xda, 0x5f, 0x70, 0x4e, 0x3e, 0xcf, 0xe2, 0xd1, 0x03, 0x8e, 0xa2, 0xec, 0x22, 0x50, 0x81, 0x0f, 0xdf, 0x3f, 0x8e, 0x99, 0x0f, 0xb9, 0x5c, 0x05, 0x32, 0xa9, 0x0a, 0x0d, 0xd1, 0xfb, 0xcb, 0xdf, 0x21, 0x13, 0xf1, 0x35, 0xcc, 0x39, 0xb8, 0xb2, 0x09, 0xc7, 0xa8, 0x01, 0x33, 0xb4, 0x0d, 0x15, 0x59, 0x0f, 0xca, 0x36, 0x3c, 0x64, 0xb7, 0x91, 0x35, 0xe9, 0x0d, 0x40, 0x1a, 0xd3, 0xe0, 0xe9, 0x00, 0xd0, 0x9d, 0x98, 0x0b, 0x1a, 0x54, 0xf6, 0x9a, 0x1b, 0x46, 0x66, 0x87, 0xea, 0x21, 0xc6, 0x30, 0xb3, 0x32, 0xaa, 0xd0, 0xb3, 0x4e, 0x70, 0x36, 0xc5, 0xfd, 0xae, 0x35, 0xb1, 0x65, 0x6c, 0xfd, 0xa8, 0xe4, 0xe6, 0x00, 0x7a, 0x51, 0x0d, 0xcf, 0x99, 0x62, 0x16, 0xc6, 0xde, 0x7f, 0x79, 0xc4, 0xe7, 0x0f, 0xed, 0xc5, 0x6e, 0xaa, 0xd2, 0x98, 0xef, 0xb4, 0x34, 0x76, 0x58, 0x1b, 0x74, 0x62, 0xa4, 0x87, 0x3a, 0x37, 0x45, 0x1f, 0x48, 0xc0, 0xe5, 0xb7, 0xd5, 0x15, 0xe7, 0x4b, 0xc6, 0xef, 0x39, 0x19, 0x49, 0x89, 0x85, 0x41, 0xa3, 0xd3, 0x6f, 0x2f, 0xb1, 0x00, 0x8b, 0xa4, 0xf0, 0xcd, 0x40, 0x73, 0xfa, 0xf8, 0x46, 0x95, 0x75, 0xe0, 0xb1, 0x63, 0x74, 0xf1, 0x5c, 0xd7, 0xf0, 0x38, 0x21, 0xc7, 0xad, 0xa4, 0xa6, 0xbd, 0x47, 0x13, 0xc2, 0x6f, 0x2f, 0xbe, 0x87, 0x05, 0x36, 0x3e, 0x00, 0xe7, 0x8d, 0xb7, 0x00, 0xcd, 0xc1, 0xb7, 0xbc, 0x94, 0x5b, 0x45, 0x8f, 0xf3, 0x05, 0x35, 0xa1, 0xc9, 0x84, 0xde, 0x52, 0x5b, 0xc9, 0xe8, 0xc0, 0x60, 0x14, 0x7f, 0x81, 0xe6, 0xb2, 0xdb, 0x5a, 0xd1, 0xfd, 0x38, 0xe8, 0x3d, 0x63, 0x55, 0x00, 0x0c, 0xae, 0xf0, 0x7f, 0xb2, 0x39, 0x9b, 0xff, 0x25, 0x87, 0xc9, 0x2a, 0x94, 0xf3, 0xfc, 0x11, 0xcd, 0x3f, 0x8b, 0x1a, 0xca, 0x14, 0xe5, 0x26, 0x5f, 0xed, 0xc5, 0xe4, 0x4d, 0xb9, 0x20, 0x04, 0x24, 0x0e, 0xeb, 0x2e, 0x8e, 0x0e, 0x9e, 0xa4, 0xea, 0x1a, 0x92, 0xb3, 0x37, 0xe9, 0x08, 0x39, 0x8c, 0xe0, 0x96, 0x3d, 0x4c, 0xa3, 0xb5, 0xd9, 0xb1, 0x24, 0xea, 0x40, 0xeb, 0x99, 0x21, 0x7d, 0x91, 0xc7, 0xae, 0x36, 0x7a, 0x95, 0xd0, 0x79, 0x65, 0xa8, 0x6f, 0xf7, 0x87, 0xf3, 0x99, 0x95, 0xfd, 0xe6, 0x35, 0x1e, 0xf9, 0x8d, 0xd1, 0xdb, 0x3d, 0x46, 0xe0, 0xd4, 0x5c, 0x94, 0x59, 0x86, 0x34, 0x47, 0xae, 0x63, 0xb0, 0x4c, 0xea, 0xa0, 0x99, 0x03, 0x71, 0x2d, 0xd3, 0x92, 0xea, 0x5a, 0x8e, 0x82, 0x06, 0x27, 0xd7, 0xce, 0xc1, 0x3c, 0xbc, 0xa7, 0xb6, 0x5a, 0xfc, 0x5c, 0x58, 0x1e, 0x5a, 0x66, 0x77, 0xae, 0x20, 0xa7, 0x8e, 0xb9, 0x3a, 0x96, 0xef, 0x1f, 0xfc, 0x6c, 0x89, 0x36, 0xae, 0x75, 0xac, 0xff, 0x40, 0xca, 0x95, 0x5d, 0xa0, 0x61, 0x65, 0x33, 0x3a, 0xae, 0x67, 0x0f, 0x2e, 0x12, 0x69, 0x9f, 0x8c, 0x21, 0x2b, 0x6a, 0x74, 0xe2, 0xbc, 0xf3, 0xfc, 0xe9, 0xa5, 0x19, 0xf7, 0xb5, 0x0f, 0x69, 0x0f, 0x5f, 0x06, 0xc2, 0xac, 0x06, 0x2d, 0xea, 0x1a, 0x49, 0x02, 0x01, 0x50, 0xd1, 0xa7, 0xbf, 0x6a, 0xbf, 0x15, 0x21, 0xcf, 0xf1, 0x21, 0xae, 0x1e, 0x25, 0x48, 0x34, 0x30, 0x77, 0x65, 0xca, 0x91, 0x9d, 0xa1, 0xff, 0xb0, 0xd7, 0xdd, 0x9e, 0xd2, 0x8a, 0x7e, 0x8f, 0x95, 0x16, 0xae, 0x1e, 0x37, 0xc4, 0x43, 0x29, 0x35, 0x4d, 0x8f, 0xe0, 0xbe, 0x0a, 0x42, 0x9c, 0x16, 0x32, 0x65, 0x1a, 0x8e, 0xea, 0xb6, 0xda, 0x90, 0xb3, 0x18, 0x5b, 0x26, 0xcb, 0x95, 0xfd, 0xaf, 0x59, 0x4b, 0x74, 0xc7, 0xbe, 0x26, 0xa2, 0x27, 0x85, 0x64, 0xd7, 0x45, 0xe7, 0x90, 0x4f, 0x25, 0xa3, 0x47, 0x5c, 0xbe, 0x24, 0xa8, 0x20, 0xb9, 0xda, 0x42, 0x4e, 0xea, 0x71, 0x02, 0x9e, 0xb0, 0x64, 0x18, 0x38, 0xb0, 0x53, 0x2f, 0x5c, 0x4f, 0x10, 0x91, 0x31, 0x66, 0xa3, 0x51, 0xa0, 0xf4, 0x75, 0x9f, 0x3f, 0xd6, 0xaf, 0x5e, 0x42, 0xde, 0xd1, 0x7d, 0xa8, 0x46, 0x1d, 0xf8, 0xe6, 0xb8, 0x34, 0x50, 0xc7, 0x8d, 0xa5, 0x56, 0x8a, 0xce, 0xec, 0x03, 0xc8, 0xb1, 0xa1, 0x7e, 0xb6, 0x40, 0xf4, 0x0b, 0x6b, 0x17, 0x4d, 0xbe, 0x87, 0x2a, 0xe4, 0xe5, 0xc0, 0x1a, 0x05, 0x40, 0xe8, 0x3b, 0xbe, 0x97, 0x1d, 0xca, 0xee, 0xfb, 0xc7, 0x8f, 0xf5, 0x96, 0xa4, 0xbb, 0xc7, 0x1e, 0x79, 0x5a, 0x95, 0x6f, 0x12, 0x6d, 0x46, 0x37, 0xa5, 0x9a, 0xbb, 0xe4, 0xb6, 0xbe, 0x82, 0xb0, 0x7f, 0xe5, 0x63, 0xa4, 0xbd, 0x73, 0x41, 0x5c, 0xbf, 0xd5, 0x59, 0x44, 0x83, 0x1a, 0x26, 0xf9, 0xaa, 0x03, 0xa0, 0xaf, 0x72, 0xb1, 0x3a, 0x17, 0x01, 0x80, 0xf1, 0xca, 0x4e, 0x18, 0x00, 0x0c, 0x1b, 0xd9, 0xaa, 0xce, 0x2e, 0xe9, 0x89, 0xf0, 0x42, 0x32, 0x19, 0x4f, 0x74, 0x5f, 0x2f, 0x04, 0x6f, 0xe7, 0x8a, 0x03, 0x81, 0x6f, 0x76, 0x74, 0xc0, 0xfc, 0xba, 0x92, 0x73, 0xbe, 0x95, 0xc5, 0x4b, 0x78, 0xcd, 0x30, 0x7a, 0x0f, 0xca, 0x1c, 0x36, 0x85, 0xfb, 0xc7, 0xd9, 0xc4, 0xb0, 0xd5, 0xb9, 0xf4, 0x23, 0x70, 0x6a, 0x9a, 0x27, 0x86, 0x24, 0xa6, 0xb0, 0x96, 0xfb, 0xaa, 0xe7, 0xf0, 0x5d, 0x80, 0xb6, 0x19, 0x80, 0x01, 0xf5, 0x9c, 0x0f, 0x08, 0x49, 0x82, 0x58, 0x59, 0x16, 0x99, 0xbb, 0x78, 0x65, 0xe0, 0x2c, 0x6c, 0x1c, 0xf3, 0xda, 0x67, 0xb9, 0xf3, 0xb1, 0xa2, 0x19, 0x4f, 0x9b, 0x30, 0x2e, 0xc3, 0xc0, 0x01, 0x90, 0x7d, 0x4e, 0x05, 0xda, 0xde, 0x49, 0x40, 0xe5, 0x53, 0xf1, 0x0b, 0x66, 0x3b, 0x7f, 0x5d, 0xda, 0xcd, 0x28, 0x38, 0xfa, 0x44, 0x3f, 0xe6, 0x27, 0x06, 0x58, 0x27, 0x96, 0xaa, 0xe1, 0x1a, 0xe5, 0x1c, 0xc4, 0xa6, 0xc7, 0xbe, 0x27, 0xd3, 0xb8, 0x53, 0xc6, 0x71, 0xd8, 0x44, 0x2f, 0xe9, 0x6d, 0xae, 0xe8, 0x06, 0x62, 0xad, 0xfc, 0x7d, 0x1e, 0xc0, 0x67, 0x8a, 0xb3, 0x18, 0xd6, 0xb5, 0x14, 0xe7, 0xc9, 0x99, 0xeb, 0x3d, 0xab, 0x1c, 0x4f, 0xda, 0x56, 0xde, 0xba, 0x5b, 0xe6, 0xed, 0x58, 0x22, 0x3a, 0xc9, 0x89, 0xef, 0x4e, 0xf1, 0xaa, 0xdf, 0xae, 0x81, 0xbe, 0x34, 0x29, 0x5e, 0x18, 0x90, 0xe9, 0x7c, 0x89, 0xa4, 0xeb, 0x11, 0x33, 0x39, 0x3b, 0x36, 0x18, 0x00, 0x43, 0xac, 0xa3, 0x02, 0xe6, 0xd9, 0x6b, 0x0d, 0xa9, 0xea, 0x31, 0x6f, 0x66, 0xc8, 0xab, 0x3d, 0x9f, 0x11, 0x8a, 0x17, 0x13, 0x43, 0x13, 0xd2, 0xc1, 0x37, 0x90, 0x9f, 0x57, 0xc7, 0x03, 0xcf, 0x05, 0x9c, 0x74, 0x8d, 0xd5, 0xe1, 0xd9, 0x75, 0xe2, 0x12, 0x04, 0x41, 0x30, 0x24, 0x6e, 0x52, 0xf3, 0xf8, 0xbc, 0xa4, 0xba, 0x39, 0x39, 0xff, 0xea, 0x71, 0x78, 0x9f, 0x38, 0xbe, 0xbd, 0xcd, 0x74, 0xc5, 0x56, 0xb8, 0x35, 0x5c, 0xf5, 0x01, 0x9e, 0xbf, 0x8a, 0xc4, 0x2c, 0x3c, 0x7c, 0xb5, 0x78, 0x36, 0x27, 0xc3, 0x19, 0xb8, 0x37, 0x6e, 0xa2, 0x02, 0xc0, 0x1f, 0x09, 0x6c, 0x2e, 0xf6, 0xcc, 0xcf, 0x05, 0xbf, 0xdb, 0xa3, 0x23, 0xe4, 0x6f, 0xb2, 0x33, 0xd8, 0xc5, 0xa1, 0x83, 0x04, 0x15, 0x45, 0xcc, 0xf9, 0xc5, 0xba, 0x98, 0xc5, 0x82, 0xf5, 0xda, 0x08, 0x64, 0xf0, 0xb9, 0x54, 0x5f, 0x34, 0x2c, 0x23, 0x57, 0x22, 0x81, 0xf5, 0xb7, 0x01, 0xdb, 0x41, 0x29, 0x78, 0xbb, 0x93, 0xe7, 0x08, 0x85, 0x86, 0x84, 0xf1, 0x6d, 0x9e, 0xc4, 0x91, 0x18, 0x74, 0xd8, 0xd3, 0x5f, 0xb5, 0x33, 0x56, 0x76, 0xc1, 0xd2, 0x39, 0x83, 0x29, 0x44, 0xf8, 0x1d, 0xf6, 0xd0, 0xd2, 0x4b, 0x50, 0x01, 0xc0, 0xf4, 0xa2, 0xac, 0x1a, 0x04, 0x77, 0xce, 0xf1, 0x3e, 0x53, 0xea, 0xe0, 0xfb, 0xc8, 0xe6, 0xe0, 0xda, 0x23, 0xa9, 0xcc, 0x88, 0x50, 0x95, 0x5c, 0x0f, 0x48, 0x31, 0x4d, 0x6a, 0x46, 0xc8, 0xad, 0xa3, 0xbe, 0xb0, 0x8a, 0x70, 0x3e, 0x4a, 0x79, 0x77, 0x07, 0xb1, 0xfc, 0x8f, 0xdd, 0x2d, 0x2e, 0x1d, 0x10, 0x33, 0xcf, 0x62, 0x35, 0x55, 0x12, 0x40, 0x50, 0x24, 0xc2, 0x0f, 0xb6, 0x59, 0x88, 0x1e, 0x87, 0xbf, 0x77, 0x1c, 0x78, 0x77, 0x7e, 0xad, 0x8d, 0x43, 0xf4, 0xe4, 0xe4, 0x00, 0x7a, 0x71, 0xff, 0x3b, 0x3f, 0x3e, 0x17, 0x4f, 0x19, 0xa1, 0x4d, 0x6f, 0xa8, 0xec, 0x30, 0x87, 0xd7, 0xff, 0x46, 0x9d, 0x4d, 0x2e, 0xa8, 0x61, 0x45, 0x06, 0x51, 0xd0, 0x7b, 0x2e, 0xbe, 0x5e, 0x7d, 0x45, 0x3e, 0x95, 0x52, 0xff, 0x64, 0xb6, 0x28, 0x7e, 0x2a, 0x7b, 0x33, 0xb4, 0x80, 0x17, 0x57, 0xc6, 0x80, 0xde, 0xfc, 0x3f, 0x25, 0xe4, 0x35, 0x85, 0xd1, 0xce, 0xa1, 0x2a, 0xd7, 0x6e, 0x83, 0x6c, 0x61, 0x5d, 0xa8, 0xaf, 0xa0, 0x1e, 0x15, 0x51, 0x57, 0x93, 0xd0, 0x51, 0x21, 0x68, 0x79, 0x99, 0x25, 0xbe, 0x51, 0xc2, 0xf4, 0x72, 0x5c, 0x05, 0x60, 0x05, 0x81, 0xff, 0x20, 0x81, 0x28, 0xb7, 0x38, 0xb4, 0xb2, 0x1a, 0xdd, 0xe9, 0xab, 0xc7, 0x29, 0x4f, 0x24, 0xef, 0x99, 0xae, 0x0c, 0xcc, 0xe7, 0x24, 0xca, 0xa8, 0x71, 0x15, 0xef, 0x58, 0xb2, 0x58, 0x4b, 0xbe, 0x64, 0xbe, 0x68, 0xcc, 0x9f, 0xbf, 0x31, 0xa5, 0x0c, 0x44, 0x71, 0xec, 0x47, 0xa0, 0xda, 0xa5, 0xde, 0x54, 0x19, 0x30, 0xa9, 0x1c, 0x19, 0xbc, 0x18, 0x65, 0x71, 0x70, 0xbc, 0x53, 0x95, 0xe3, 0x44, 0x3f, 0x02, 0x24, 0x15, 0xc9, 0xe0, 0x7e, 0xb2, 0x29, 0xc9, 0x8b, 0x73, 0x28, 0xab, 0xc5, 0xde, 0x37, 0x0f, 0x44, 0x0d, 0x3e, 0x80, 0x52, 0x44, 0xe2, 0xe2, 0x0d, 0xe2, 0x6e, 0xd5, 0xc6, 0xa0, 0xb5, 0xe9, 0x70, 0x0d, 0xcc, 0x52, 0x1f, 0xc3, 0xaa, 0x64, 0x0e, 0xbe, 0x83, 0x0e, 0xfe, 0xb6, 0xee, 0xe0, 0xee, 0xb9, 0x50, 0x47, 0xe3, 0xa1, 0x8d, 0xff, 0x33, 0x8c, 0x6b, 0x45, 0xfb, 0xa0, 0x2c, 0xb6, 0xae, 0xf3, 0x93, 0xb3, 0xca, 0x27, 0xf2, 0x43, 0x83, 0x15, 0x26, 0xa5, 0xe8, 0x48, 0xc4, 0x91, 0x43, 0x42, 0xa2, 0x59, 0x38, 0xff, 0x55, 0x08, 0x0c, 0xf2, 0x22, 0x56, 0x25, 0xda, 0xf9, 0x33, 0xa9, 0xff, 0x0a, 0xbb, 0x83, 0x68, 0xee, 0xc1, 0xa0, 0xde, 0x2d, 0x75, 0x67, 0x3d, 0xa2, 0x4a, 0xef, 0xf5, 0x05, 0x62, 0x6a, 0x5e, 0x3c, 0x26, 0x86, 0xb6, 0xed, 0x22, 0xea, 0x96, 0xbb, 0x91, 0xa7, 0xee, 0x20, 0x77, 0x3a, 0x59, 0x97, 0x31, 0x47, 0x07, 0xad, 0xcd, 0xe3, 0x96, 0x27, 0x43, 0xab, 0xc2, 0xa4, 0xb7, 0x69, 0xef, 0x25, 0xb1, 0x97, 0xa4, 0x79, 0x17, 0x81, 0xbd, 0x68, 0xb5, 0x97, 0x60, 0x66, 0xb1, 0x97, 0x2b, 0x7a, 0x50, 0xf3, 0xc2, 0x10, 0xec, 0xd4, 0xf1, 0x38, 0x1c, 0xdf, 0xa0, 0x08, 0xb8, 0xb8, 0x9f, 0x46, 0x0e, 0x57, 0x53, 0x34, 0xf8, 0x14, 0xa5, 0xdc, 0x69, 0xef, 0x96, 0xe3, 0x54, 0xcf, 0x13, 0xcb, 0x02, 0xb7, 0x24, 0x77, 0xb5, 0xd6, 0xc0, 0x74, 0x65, 0x65, 0xb4, 0x97, 0x0d, 0x15, 0x2e, 0xa9, 0xc7, 0x24, 0x22, 0x13, 0xf7, 0x50, 0x5f, 0xf5, 0xb1, 0x79, 0xce, 0xf6, 0x15, 0xcf, 0x47, 0x1c, 0x4c, 0x40, 0x61, 0x84, 0x74, 0x23, 0x6e, 0xae, 0xaa, 0x00, 0x3a, 0x34, 0x26, 0x8e, 0x92, 0xa2, 0x55, 0xae, 0x89, 0xc1, 0xbc, 0xb9, 0x13, 0xe1, 0x22, 0x8b, 0x52, 0x62, 0x45, 0xa1, 0x01, 0x4f, 0x97, 0x4e, 0xc7, 0xc3, 0xfd, 0xc9, 0x9e, 0x92, 0x67, 0xbb, 0x21, 0x31, 0x5d, 0x10, 0xbc, 0x3a, 0x27, 0xe8, 0x55, 0x48, 0x46, 0x21, 0x56, 0x8a, 0x0f, 0xd0, 0x62, 0x9a, 0xe1, 0xd0, 0xe1, 0x77, 0x53, 0x0b }; +constexpr AccessUnit ATRACX_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 0, {}, { 0xca, 0x9d, 0x63, 0xb7, 0xda, 0xcd, 0xd6, 0xb1, 0xa0, 0x27, 0xf2, 0x61, 0xc1, 0x56, 0x3e, 0x3e, 0xb1, 0x1c, 0x5e, 0x76 } }; +constexpr AccessUnit ATRACX_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xeb, 0x30, 0x7d, 0xad, 0x5f, 0xcb, 0xc1, 0x17, 0xc1, 0x10, 0x19, 0xef, 0xd5, 0xd3, 0xaa, 0x72, 0x6f, 0xd2, 0x5d, 0x5b } }; + +constexpr std::array AC3_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x0b, 0x77, 0x59, 0x66, 0x00, 0x87, 0x05, 0xf4, 0xa8, 0x09, 0x93, 0x66, 0x9e, 0xcf, 0x4e, 0x3e, 0x1e, 0xc6, 0x10, 0x6b, 0xaa, 0x2b, 0x3d, 0x5c, 0xec, 0x4b, 0x2e, 0xd1, 0x47, 0x6f, 0x9c, 0x77, 0x35, 0x7a, 0x6a, 0xcf, 0x95, 0x42, 0x66, 0xca, 0x6c, 0x31, 0xae, 0x53, 0xc3, 0x84, 0xf1, 0x00, 0x1a, 0x5a, 0x11, 0xb4, 0xd0, 0x32, 0x15, 0xaa, 0x97, 0x7e, 0xb8, 0x2f, 0xc6, 0x5e, 0x79, 0xd8, 0xf5, 0x85, 0x8b, 0x2a, 0x4b, 0x8c, 0xfd, 0x0b, 0xb0, 0x5a, 0x05, 0x0b, 0x77, 0x76, 0xd7, 0x69, 0x3c, 0xf2, 0xad, 0x10, 0x4f, 0xc7, 0x20, 0x30, 0x68, 0xb3, 0x72, 0x47, 0x58, 0x13, 0xcb, 0x17, 0x94, 0xe0, 0x13, 0xd8, 0xa2, 0xf7, 0xf2, 0x71, 0xbe, 0xdc, 0x9f, 0x15, 0x23, 0xfd, 0x98, 0x1c, 0x5b, 0x79, 0xca, 0xe0, 0x6f, 0x8e, 0xa2, 0x7a, 0xce, 0xa6, 0xc5, 0x41, 0xd5, 0x30, 0x83, 0x22, 0x0b, 0x77, 0x99, 0x0a, 0x99, 0x5c, 0xaa, 0xc6, 0x49, 0x3c, 0x95, 0x33, 0x0a, 0x9f, 0x5c, 0x73, 0xfb, 0x0e, 0xa9, 0xaf, 0x4e, 0x0d, 0xec, 0xfc, 0xbb, 0x0f, 0x61, 0x9a, 0x9f, 0xa0, 0x5b, 0x14, 0x88, 0x6b, 0x76, 0x43, 0x7a, 0x0d, 0x2d, 0x1b, 0x6d, 0xea, 0x84, 0x13, 0x0f, 0xe2, 0x89, 0xb3, 0xef, 0xe2, 0xe7, 0x2b, 0xbd, 0xde, 0x20, 0x07, 0x61, 0x99, 0xbd, 0x24, 0x94, 0xd5, 0x0c, 0xa8, 0x69, 0x99, 0xb9, 0xf3, 0x7d, 0x9c, 0x5b, 0xbd, 0x76, 0x6f, 0x1f, 0x8b, 0x61, 0x20, 0x83, 0x53, 0xb0, 0xd5, 0x86, 0xd9, 0xd9, 0xcf, 0x49, 0x4a, 0x3a, 0xd6, 0x51, 0xf6, 0x09, 0x4a, 0x09, 0x1b, 0xc5, 0xce, 0xbf, 0x35, 0xfa, 0x93, 0x75, 0x5f, 0x7c, 0x04, 0xc3, 0xd2, 0x17, 0xd8, 0x76, 0x0d, 0xc0, 0x86, 0xc3, 0x7e, 0xfc, 0x7c, 0x2a, 0xe3, 0xc9, 0x13, 0x74, 0xec, 0x5b, 0x8d, 0x9b, 0x45, 0x6b, 0x12, 0xa5, 0x1f, 0xeb, 0xf5, 0x75, 0x24, 0x22, 0xa8, 0xbf, 0xc6, 0xb8, 0x35, 0xe5, 0x95, 0x69, 0xaf, 0xfc, 0xc1, 0xe6, 0x49, 0x01, 0x0d, 0x4b, 0xc8, 0xf0, 0x02, 0x9e, 0x4a, 0xb2, 0x43, 0xb4, 0x4f, 0xb2, 0xd6, 0x6a, 0x38, 0xfe, 0xe8, 0x80, 0x6e, 0x73, 0x51, 0x2f, 0xd4, 0x9e, 0x56, 0xd8, 0xa0, 0x40, 0x9b, 0x65, 0xb5, 0xc2, 0x04, 0x86, 0x15, 0x92, 0xe0, 0x7a, 0x26, 0x0c, 0xc9, 0x6a, 0x27, 0xd9, 0xfc, 0x4e, 0x50, 0xc5, 0xac, 0xe5, 0x45, 0xec, 0x2a, 0x13, 0x95, 0xaf, 0xf3, 0x81, 0xe1, 0x5b, 0xc7, 0x87, 0x50, 0x67, 0xdb, 0xc2, 0x79, 0xd5, 0x2e, 0xdd, 0x42, 0x51, 0x3b, 0x14, 0x1d, 0x83, 0x3c, 0x25, 0x4b, 0xe7, 0x77, 0x48, 0xa8, 0xed, 0x1d, 0x55, 0x75, 0xf1, 0x65, 0xca, 0x6d, 0x5a, 0x13, 0x7c, 0x9b, 0xdb, 0x95, 0x7d, 0xf3, 0x42, 0xcf, 0x49, 0x17, 0xe5, 0x07, 0xbb, 0x7d, 0xf0, 0x6f, 0x9d, 0xcb, 0x9e, 0x07, 0x11, 0x5a, 0x51, 0x9b, 0x80, 0x5e, 0x77, 0xc6, 0x3c, 0xa8, 0xa5, 0x22, 0xa8, 0xb2, 0x83, 0x97, 0x8a, 0xdf, 0x75, 0x49, 0x43, 0x59, 0x5d, 0x5c, 0x32, 0x14, 0x6c, 0xc3, 0xb4, 0xf5, 0x25, 0xe7, 0xdf, 0xb0, 0xb3, 0xc6, 0xb7, 0x1f, 0x3f, 0x7c, 0xfd, 0xe4, 0xf5, 0x0c, 0xbe, 0x92, 0xcb, 0xb6, 0x72, 0xa0, 0x8a, 0x9f, 0x3b, 0xfd, 0x76, 0x5d, 0xb2, 0xdf, 0xee, 0x21, 0x19, 0xd4, 0x5a, 0x05, 0x6a, 0xb9, 0x9f, 0xdb, 0x9c, 0xe1, 0xc0, 0xd4, 0x14, 0xb4, 0x5e, 0x4d, 0x2e, 0x3d, 0xca, 0x73, 0xc6, 0x01, 0xd6, 0x73, 0x01, 0x24, 0xef, 0x2b, 0x6c, 0xfc, 0xa0, 0xea, 0xb4, 0x54, 0x57, 0x70, 0xfb, 0x31, 0x0d, 0xc9, 0xcb, 0xef, 0x49, 0x64, 0x2e, 0x9b, 0xea, 0x6d, 0x68, 0x09, 0x5c, 0x86, 0xb8, 0xc5, 0x03, 0xd5, 0x34, 0x62, 0x9f, 0xf7, 0x38, 0x0d, 0x2b, 0x9f, 0x54, 0x90, 0x14, 0x48, 0xd9, 0xaf, 0xa7, 0x9e, 0x20, 0x4e, 0x4a, 0x68, 0x60, 0x95, 0x7b, 0x53, 0x96, 0x9e, 0x05, 0x70, 0x7c, 0xbc, 0xe8, 0x95, 0xfd, 0xa7, 0x16, 0x1e, 0x98, 0x5d, 0x45, 0xda, 0x3b, 0x93, 0x21, 0xc3, 0xc3, 0x22, 0xe6, 0x55, 0x99, 0xcb, 0x9a, 0x57, 0xcf, 0x34, 0x5d, 0x52, 0xf8, 0xce, 0x28, 0xe6, 0xcf, 0xac, 0x4e, 0x34, 0x82, 0x81, 0x1f, 0x99, 0x63, 0xcc, 0xcc, 0x07, 0x5d, 0xcc, 0x7e, 0x7b, 0x33, 0x5e, 0xba, 0x7d, 0xc3, 0xa7, 0xc7, 0x4b, 0x23, 0xb4, 0x64, 0x80, 0x6e, 0x5b, 0x79, 0x0d, 0xc0, 0x54, 0x03, 0x96, 0x5d, 0x63, 0xe7, 0x4b, 0xd9, 0x86, 0x65, 0xcf, 0xfb, 0x3e, 0x29, 0xdf, 0x3c, 0xd4, 0xcf, 0xdd, 0x96, 0x4a, 0x27, 0x73, 0x69, 0xd2, 0x40, 0xb6, 0xb7, 0xa5, 0xe0, 0x56, 0x37, 0x1f, 0xc2, 0x95, 0xe2, 0xb8, 0x4d, 0x42, 0x22, 0xc1, 0xbd, 0xd2, 0x57, 0x11, 0x27, 0x49, 0x6a, 0x88, 0x3d, 0x8e, 0x09, 0x87, 0x87, 0xd0, 0xf2, 0xf6, 0x05, 0xac, 0x47, 0xab, 0xf7, 0x5c, 0xa0, 0xa1, 0xb0, 0x0a, 0x74, 0x01, 0xd5, 0xeb, 0x04, 0xa6, 0x53, 0x2e, 0x8f, 0xc3, 0x68, 0xe1, 0x0a, 0x59, 0xcb, 0xee, 0xf3, 0xde, 0x94, 0x35, 0xe8, 0x78, 0x44, 0x73, 0x87, 0x0b, 0xe2, 0x87, 0xa3, 0xd1, 0xa2, 0x87, 0x8d, 0x64, 0x3a, 0x53, 0xd8, 0x09, 0xba, 0xae, 0x04, 0x7e, 0x07, 0xc2, 0x07, 0x98, 0xc0, 0x87, 0x56, 0x12, 0x86, 0x14, 0xdb, 0x4c, 0xc4, 0xed, 0x84, 0xad, 0xca, 0xf3, 0x2e, 0x1a, 0x28, 0x64, 0x76, 0x0c, 0x4c, 0x27, 0x9d, 0xab, 0x12, 0x7d, 0xb3, 0xfa, 0xed, 0x5c, 0xf0, 0x77, 0xdc, 0xf3, 0x45, 0x5d, 0x31, 0x27, 0x5f, 0x4c, 0xe2, 0x96, 0x98, 0x25, 0xab, 0xcd, 0x3d, 0x22, 0x64, 0xc6, 0x00, 0x47, 0xbd, 0xb8, 0xde, 0x65, 0xdb, 0x54, 0xd5, 0xc6, 0x62, 0x1b, 0x45, 0x6b, 0xd8, 0x9d, 0x00, 0xb7, 0xe3, 0xfc, 0x84, 0x03, 0xf0, 0x6c, 0xf8, 0x23, 0x14, 0xf6, 0x92, 0x73, 0xc6, 0x42, 0xcc, 0x67, 0xd3, 0x3e, 0xaa, 0xc4, 0x3d, 0x81, 0x13, 0xfb, 0x13, 0x22, 0xd3, 0x9b, 0xc8, 0xf5, 0x0b, 0x78, 0x47, 0x9b, 0x83, 0xb5, 0xd7, 0x98, 0xe9, 0x3f, 0x7c, 0x8f, 0x42, 0xa3, 0xef, 0x1f, 0x94, 0x99, 0x75, 0x21, 0x95, 0xd1, 0xcf, 0x74, 0xfd, 0x5f, 0x80, 0xec, 0x40, 0x22, 0x28, 0x92, 0x9e, 0x65, 0x73, 0x8b, 0xc5, 0x30, 0xe5, 0xb0, 0xb6, 0xf2, 0x03, 0x24, 0x00, 0x2e, 0x6a, 0xa3, 0x74, 0x62, 0xad, 0xbe, 0x11, 0x80, 0x61, 0xcf, 0x23, 0x3f, 0xd8, 0x0a, 0xf0, 0x2d, 0x4a, 0x58, 0x49, 0xf4, 0x63, 0xf3, 0x05, 0x9b, 0x78, 0xc7, 0xf7, 0xb7, 0x31, 0x02, 0x16, 0x63, 0x87, 0x08, 0x3b, 0x7b, 0x7b, 0xd1, 0xb1, 0xb8, 0x99, 0x39, 0xfe, 0x71, 0x49, 0xac, 0xb7, 0x79, 0x84, 0x47, 0x15, 0x74, 0x5e, 0x29, 0x01, 0xb7, 0x93, 0x9a, 0x87, 0xbd, 0x1a, 0x59, 0xff, 0xec, 0xe5, 0xb8, 0xb9, 0x30, 0x8c, 0x29, 0xd6, 0x0d, 0x32, 0x22, 0x28, 0xd4, 0x4d, 0x25, 0x06, 0x9f, 0x6a, 0xf7, 0x92, 0x16, 0x4b, 0xb6, 0x17, 0xbc, 0xa7, 0xca, 0x17, 0xa6, 0x76, 0x48, 0x46, 0x51, 0xd9, 0xed, 0xc1, 0x69, 0x60, 0xf4, 0x00, 0x64, 0x17, 0x5c, 0x76, 0x18, 0xc4, 0xd1, 0x74, 0x06, 0x67, 0x34, 0xa5, 0xd4, 0x77, 0x1c, 0x62, 0x6d, 0xbb, 0x76, 0x5d, 0x49, 0x5b, 0x08, 0x60, 0x5a, 0x29, 0x4c, 0xec, 0x92, 0x99, 0x55, 0xc0, 0xcc, 0x64, 0xdc, 0x4c, 0x22, 0x37, 0x3d, 0xdb, 0x3b, 0xb0, 0x3f, 0x19, 0x95, 0x6a, 0x04, 0x47, 0x09, 0xf4, 0xd7, 0xe4, 0xf7, 0x28, 0x4f, 0xef, 0xf7, 0x30, 0x37, 0x28, 0xa6, 0xdc, 0x82, 0xfe, 0x2c, 0x7c, 0x67, 0xf8, 0x73, 0x0a, 0x0d, 0x5c, 0xaa, 0x4e, 0x09, 0x0b, 0x47, 0x45, 0x07, 0x44, 0x49, 0x21, 0xe8, 0x12, 0xd1, 0x3e, 0x29, 0x6d, 0xe5, 0x2f, 0xe6, 0x52, 0xd6, 0xa2, 0x76, 0x0f, 0x8c, 0xbb, 0x87, 0xd4, 0x72, 0x49, 0xba, 0xa4, 0x1b, 0x9b, 0x52, 0xe2, 0xa0, 0x82, 0x72, 0x8d, 0x4a, 0x25, 0xf2, 0xe5, 0xb7, 0x59, 0xff, 0x47, 0x69, 0xb5, 0x26, 0x8b, 0x35, 0x76, 0xd7, 0xd3, 0xf4, 0xab, 0x8d, 0x4b, 0x5b, 0x3d, 0xda, 0xec, 0xb6, 0xb8, 0x9c, 0x4a, 0xd1, 0x2d, 0x9d, 0x0c, 0x39, 0x89, 0x58, 0xa6, 0x37, 0x96, 0x2e, 0x7e, 0x21, 0xe4, 0x05, 0xad, 0xdd, 0xf7, 0x5c, 0xf0, 0x7d, 0x79, 0x0a, 0x66, 0x11, 0xcf, 0x46, 0x8a, 0x28, 0xbc, 0x62, 0xbe, 0x4b, 0xf4, 0xb3, 0x4f, 0xba, 0x9c, 0xf7, 0xc2, 0xc4, 0xa0, 0xb3, 0x0e, 0x5c, 0x30, 0x25, 0x3e, 0x94, 0x03, 0x73, 0x81, 0x98, 0xfa, 0x2e, 0xa6, 0xad, 0x6b, 0xf5, 0x6a, 0x08, 0xf9, 0x75, 0xde, 0xb4, 0xdc, 0xf9, 0xad, 0xb2, 0x31, 0xe5, 0x9f, 0xba, 0x86, 0xb6, 0x59, 0x4e, 0xae, 0xcf, 0xf9, 0xef, 0xf9, 0x16, 0xc3, 0x5f, 0xce, 0x90, 0xbe, 0xce, 0xd0, 0xf3, 0x49, 0x1f, 0x44, 0xae, 0xce, 0x5d, 0x8e, 0xcd, 0x12, 0x07, 0x19, 0xf9, 0x0a, 0x3e, 0x29, 0xbb, 0x97, 0x8d, 0x56, 0x48, 0x69, 0x62, 0xf7, 0x68, 0xe8, 0xbc, 0x41, 0x90, 0xd6, 0x26, 0x26, 0xa5, 0x0d, 0xd9, 0x4c, 0x52, 0x0c, 0x4f, 0x20, 0xc7, 0x6e, 0x62, 0xfd, 0x91, 0xc2, 0x57, 0xef, 0x8e, 0x43, 0xc1, 0x48, 0x82, 0x73, 0x16, 0xed, 0x1e, 0x10, 0x66, 0x49, 0xda, 0xaf, 0x83, 0xc1, 0x48, 0xb4, 0x41, 0xd5, 0xa5, 0x9e, 0xa1, 0x44, 0x41, 0x75, 0x5c, 0x50, 0xd0, 0x7a, 0x5a, 0x0d, 0xd2, 0x32, 0xe8, 0x0c, 0x88, 0x4c, 0xb8, 0x72, 0x07, 0xbf, 0xe2, 0x85, 0xef, 0xb4, 0x20, 0xb5, 0x24, 0x00, 0x9d, 0x23, 0xca, 0x6e, 0x53, 0xf8, 0x62, 0xe4, 0x21, 0xbe, 0x79, 0x21, 0x8e, 0x5d, 0xde, 0x91, 0x0b, 0x8a, 0xcd, 0x0c, 0x89, 0xa0, 0x5b, 0xd5, 0xbe, 0x91, 0xdb, 0xa1, 0x71, 0x79, 0xfb, 0xbf, 0xc8, 0x22, 0x19, 0x7e, 0x66, 0x13, 0x9c, 0x94, 0xf2, 0xbc, 0xc1, 0x1a, 0x8a, 0xf6, 0xc2, 0x62, 0xcd, 0x11, 0xda, 0xc0, 0xa5, 0x34, 0x6c, 0x0c, 0x24, 0x60, 0xda, 0x5c, 0x71, 0x0d, 0x77, 0xbc, 0x0e, 0x59, 0xb7, 0xea, 0xa7, 0x81, 0x32, 0x27, 0xf8, 0x9c, 0xdf, 0x75, 0x41, 0x59, 0xdf, 0xb2, 0x56, 0x13, 0x93, 0x22, 0x2c, 0x30, 0x27, 0xc6, 0xa3, 0x29, 0x34, 0x17, 0xf1, 0xe3, 0xc1, 0xa0, 0x38, 0x53, 0x0c, 0xe5, 0x2e, 0xaf, 0x4e, 0x8f, 0xca, 0x9b, 0x9c, 0xe1, 0xc6, 0x6f, 0x9e, 0x8c, 0x91, 0xa2, 0xc9, 0x39, 0xa9, 0x20, 0xd3, 0x61, 0x4e, 0x7c, 0x33, 0xc8, 0x6f, 0x13, 0xbd, 0x74, 0xdd, 0xcd, 0xca, 0xa7, 0x0b, 0x00, 0x74, 0xa2, 0xbe, 0x55, 0x6e, 0xe8, 0x72, 0x57, 0x9c, 0x30, 0x19, 0xe0, 0x4a, 0xb2, 0xa3, 0xdd, 0xb9, 0xb9, 0x6a, 0x30, 0xea, 0xc3, 0xd4, 0xb8, 0x8b, 0x32, 0xdf, 0x5c, 0x04, 0x8c, 0x82, 0x0a, 0x19, 0x9a, 0x78, 0xa9, 0xd2, 0xc2, 0x3c, 0xaf, 0xcd, 0x5d, 0xc7, 0x9a, 0x9f, 0x51, 0x8b, 0x72, 0xee, 0x26, 0xe7, 0xba, 0x24, 0xfb, 0xef, 0xf2, 0x9f, 0x73, 0x51, 0xb3, 0x6a, 0xe6, 0x1f, 0x26, 0xa6, 0x93, 0xde, 0xe3, 0xaf, 0x06, 0x96, 0x25, 0x61, 0x98, 0x9d, 0xc8, 0x0e, 0x5b, 0xb3, 0x3f, 0x60, 0xb3, 0xdf, 0xe2, 0xfb, 0xd7, 0x11, 0x52, 0x40, 0xdd, 0x90, 0x93, 0xbd, 0xbf, 0xd5, 0x76, 0x40, 0x27, 0xb2, 0xe7, 0xe8, 0x16, 0xfa, 0x89, 0xca, 0xdf, 0xfa, 0xbd, 0x5a, 0x38, 0xba, 0x58, 0x5a, 0xd8, 0xc4, 0xd5, 0x53, 0x2c, 0x5a, 0x2d, 0x65, 0xe7, 0xce, 0x8d, 0xe1, 0x9b, 0x29, 0x2f, 0xa4, 0x70, 0xa2, 0x3c, 0xa3, 0x69, 0x89, 0x11, 0x01, 0x90, 0x6f, 0xa2, 0x3d, 0x0e, 0xac, 0xeb, 0x6e, 0x2a, 0x5e, 0x19, 0x28, 0x21, 0x95, 0xa1, 0xf1, 0x63, 0x16, 0x68, 0x5a, 0x2f, 0xf0, 0xc4, 0xe2, 0xca, 0xc8, 0xe3, 0xee, 0xcd, 0x23, 0x19, 0xf9, 0x38, 0x90, 0x6f, 0x8c, 0x23, 0x8f, 0x71, 0x8b, 0x3e, 0xa9, 0xee, 0x0e, 0x37, 0xca, 0xbb, 0x44, 0x06, 0xbe, 0x07, 0x81, 0xd0, 0x22, 0x1f, 0x3c, 0x20, 0x02, 0x34, 0x16, 0xd8, 0x28, 0x99, 0x46, 0x3f, 0x0a, 0xbe, 0x24, 0x30, 0xb3, 0xba, 0x8b, 0xfa, 0x11, 0xed, 0x47, 0xe2, 0xf5, 0x36, 0x27, 0x7d, 0x9b, 0x36, 0xb3, 0x33, 0x62, 0x1c, 0x4d, 0xd4, 0x38, 0x30, 0x0b, 0xb4, 0x92, 0xe4, 0x1e, 0xf4, 0xd2, 0x17, 0x3d, 0x36, 0xba, 0x28, 0x39, 0x0b, 0x77, 0x93, 0xb8, 0x91, 0x4f, 0x44, 0xb3, 0x3d, 0xef, 0x72, 0xdc, 0x39, 0xd3, 0x90, 0x9a, 0x27, 0xcd, 0xdb, 0x47, 0xde, 0xe0, 0x5e, 0x14, 0x76, 0x81, 0x09, 0xd6, 0x00, 0x37, 0xb8, 0x97, 0x1b, 0xc1, 0x0f, 0xbe, 0x0d, 0xcd, 0xe6, 0x33, 0x3a, 0x52, 0xe9, 0x40, 0x8e, 0x18, 0xfa, 0xbe, 0xd6, 0xd7, 0x6a, 0xa9, 0x49, 0xbd, 0x49, 0xe9, 0x0d, 0x57, 0xee, 0xb0, 0x31, 0xa1, 0x18, 0xbb, 0xb8, 0x4f, 0x31, 0xc5, 0x63, 0xa5, 0x74, 0xb4, 0x26, 0x67, 0x67, 0x70, 0x66, 0x39, 0x2b, 0x96, 0xde, 0x26 }; +constexpr AccessUnit AC3_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 0, {}, { 0xe4, 0x34, 0x28, 0xe9, 0x7e, 0x1b, 0xa0, 0xea, 0x42, 0x2c, 0xd7, 0x21, 0x26, 0x44, 0x70, 0x9f, 0x0e, 0x3d, 0x4f, 0x23 } }; +constexpr AccessUnit AC3_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xf9, 0x27, 0xd1, 0x79, 0x4b, 0x94, 0xd7, 0x63, 0x4c, 0x57, 0x74, 0x46, 0xa3, 0xc2, 0x9d, 0xf0, 0x99, 0x18, 0x78, 0x3c } }; + +constexpr std::array LPCM_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x40, 0xb1, 0x40, 0x00, 0xda, 0x2c, 0xae, 0xd8, 0xf8, 0x31, 0x4d, 0x58, 0x96, 0x3f, 0x03, 0x7e, 0x2e, 0x5d, 0xb9, 0x16, 0xf9, 0x14, 0x26, 0x07, 0x3f, 0x85, 0xc1, 0x78, 0xcb, 0xf1, 0x73, 0xc1, 0xd6, 0xc2, 0x80, 0x8d, 0xaf, 0xa9, 0x76, 0xb1, 0xb2, 0x83, 0xcf, 0xce, 0x89, 0x25, 0xe4, 0x78, 0xe7, 0x06, 0x10, 0x18, 0xdd, 0x52, 0xf6, 0x17, 0x36, 0xe0, 0xba, 0x91, 0xc5, 0x0b, 0x07, 0xca, 0x35, 0x6b, 0xe0, 0x1c, 0xbf, 0xdf, 0x36, 0xfb, 0xca, 0x06, 0x73, 0x67, 0x8d, 0xcf, 0xb0, 0xf8, 0x8d, 0x34, 0xef, 0x73, 0x07, 0x1b, 0x74, 0x31, 0x13, 0xf4, 0x5a, 0x45, 0x77, 0xf9, 0xc2, 0x7e, 0x0c, 0x9b, 0xb1, 0x3a, 0xf9, 0x48, 0xbb, 0x8e, 0xda, 0xc6, 0x9f, 0x68, 0xfd, 0x4a, 0x39, 0xcd, 0x81, 0xa1, 0x4e, 0xcc, 0x6e, 0x2a, 0x49, 0x32, 0xc4, 0xb2, 0xee, 0xb9, 0xcd, 0x5d, 0x92, 0x07, 0x53, 0x9e, 0xca, 0x7f, 0xfc, 0x6c, 0xe0, 0xa5, 0xc8, 0xed, 0xba, 0x5d, 0x35, 0xc9, 0x4d, 0x1a, 0x86, 0x1b, 0xaf, 0xfc, 0x44, 0xb4, 0xec, 0xf8, 0xeb, 0xdc, 0x22, 0x08, 0x5f, 0x29, 0x85, 0x81, 0xdb, 0xe9, 0x8f, 0x4e, 0xf2, 0xb9, 0xd9, 0x09, 0x58, 0x11, 0xd4, 0xfa, 0x2a, 0x01, 0x5d, 0xf1, 0x07, 0x6f, 0xe8, 0x75, 0x66, 0x39, 0xac, 0x1b, 0x28, 0x57, 0x6b, 0xd3, 0xd4, 0x06, 0xee, 0xd0, 0x86, 0xde, 0xc4, 0x88, 0x99, 0x62, 0x52, 0x37, 0xd9, 0xed, 0x44, 0x3d, 0xc7, 0xa4, 0x2c, 0x2f, 0x96, 0xed, 0xfd, 0xba, 0xd8, 0xd1, 0x72, 0xf6, 0xbb, 0xf3, 0x5f, 0x3b, 0x3e, 0xc3, 0x2c, 0x23, 0xca, 0xb2, 0x72, 0x69, 0xb7, 0x14, 0xcc, 0x81, 0x1a, 0x24, 0x9b, 0x95, 0xd4, 0xc7, 0x97, 0x9f, 0xd3, 0x5b, 0x22, 0xa6, 0x57, 0x63, 0xec, 0x27, 0x20, 0xc4, 0x76, 0x6e, 0xd9, 0xf0, 0x56, 0xaa, 0x0d, 0x54, 0xb7, 0x49, 0x39, 0xf2, 0x19, 0x7d, 0x56, 0xa2, 0x70, 0x7e, 0xce, 0x89, 0x46, 0x08, 0xb2, 0x7f, 0xba, 0x73, 0x9a, 0x2d, 0x11, 0xdd, 0x74, 0x90, 0x70, 0x36, 0xd6, 0x97, 0x62, 0xf0, 0xf7, 0x39, 0x99, 0xf6, 0x50, 0xb2, 0xd4, 0xff, 0x42, 0x8e, 0xbe, 0xf1, 0x57, 0x0e, 0xc8, 0x29, 0x6f, 0x16, 0xa7, 0x86, 0xdb, 0xd9, 0x81, 0x43, 0x9b, 0x95, 0x24, 0xbd, 0x9a, 0x0c, 0x54, 0x2e, 0x71, 0x72, 0x42, 0xe6, 0x25, 0x41, 0xa9, 0x6e, 0x1c, 0x2e, 0x74, 0xb1, 0xe0, 0x4e, 0x66, 0xc3, 0xda, 0xb6, 0x16, 0xb2, 0x84, 0xc5, 0x1f, 0x1f, 0x65, 0xf2, 0xc8, 0x3d, 0x9c, 0xb4, 0x28, 0xed, 0xd3, 0xe2, 0xa2, 0xf8, 0x24, 0xd8, 0x84, 0x16, 0x9f, 0x72, 0x57, 0xa0, 0xfd, 0x28, 0x81, 0x97, 0xb3, 0x7b, 0x5d, 0x29, 0x37, 0xa3, 0x81, 0x2a, 0x5f, 0x45, 0x6b, 0xd3, 0xbd, 0x13, 0x78, 0x4a, 0x63, 0x9f, 0x7a, 0x34, 0x3c, 0xf4, 0x45, 0x7f, 0x51, 0xe9, 0x58, 0xdc, 0xcb, 0x39, 0x38, 0x87, 0xab, 0xb4, 0x0d, 0xaf, 0x4d, 0x63, 0x4b, 0x0f, 0x2e, 0xac, 0xc6, 0xd6, 0x04, 0x1b, 0x3a, 0xda, 0x9d, 0x3b, 0x20, 0x90, 0x3b, 0x19, 0x4f, 0x6e, 0x82, 0x93, 0x85, 0x53, 0x18, 0xf7, 0xa6, 0x1a, 0x2f, 0x98, 0xc8, 0x1f, 0xe3, 0x59, 0x5b, 0x43, 0x76, 0xc4, 0xd4, 0x37, 0xef, 0x0e, 0xce, 0xa3, 0x35, 0xc9, 0x4d, 0x43, 0x13, 0x24, 0xe3, 0x6c, 0x5a, 0xc8, 0x8d, 0xb2, 0x68, 0x5d, 0xc0, 0xd2, 0xd0, 0x06, 0x1d, 0x77, 0x80, 0x65, 0xcd, 0x0a, 0xc0, 0x93, 0xb1, 0x8c, 0xf8, 0x1b, 0xf6, 0x8c, 0x59, 0xf5, 0x99, 0x7f, 0xec, 0x34, 0x0e, 0x16, 0x4e, 0x6a, 0x0c, 0x86, 0xba, 0x1b, 0xd8, 0x53, 0x66, 0x1e, 0xdc, 0x66, 0x8d, 0x91, 0x1b, 0x2b, 0xb4, 0xdd, 0xe2, 0x54, 0x1e, 0xea, 0xc2, 0x5b, 0x6b, 0x56, 0x96, 0x8c, 0xfb, 0xf8, 0x21, 0x22, 0x8f, 0x1e, 0xbb, 0xd7, 0xe7, 0x7b, 0xd7, 0xbf, 0x0c, 0xbb, 0x9e, 0xe2, 0x6c, 0x31, 0x3a, 0xaa, 0xcd, 0xd3, 0xfb, 0xcb, 0x6e, 0xc6, 0x82, 0x7f, 0x01, 0xda, 0x0e, 0x0b, 0xc8, 0x21, 0xc4, 0x6c, 0x2b, 0xe3, 0x88, 0xcd, 0x0c, 0xb3, 0x3d, 0x89, 0xf6, 0xd9, 0x75, 0x16, 0xf8, 0x0e, 0x6d, 0xee, 0x5a, 0xd6, 0xaf, 0xe1, 0x63, 0xe0, 0x77, 0x55, 0x78, 0x39, 0xf9, 0xc4, 0xa2, 0xa7, 0x96, 0x34, 0x17, 0xe0, 0x4f, 0x79, 0xcc, 0x0c, 0x3f, 0x67, 0x31, 0x55, 0xc9, 0xe0, 0x3b, 0x2c, 0x45, 0xaf, 0xbb, 0xbc, 0x73, 0x7c, 0x13, 0xe6, 0x0a, 0x5b, 0x87, 0xd5, 0x91, 0x35, 0xbc, 0x63, 0xd2, 0x31, 0x41, 0x4f, 0x17, 0xb2, 0xf3, 0x44, 0x33, 0xbf, 0x41, 0x7f, 0x49, 0x2f, 0xab, 0x38, 0xd4, 0x9e, 0xf8, 0x9d, 0xb7, 0xe4, 0x97, 0x0f, 0x0e, 0xec, 0xa3, 0xe8, 0xda, 0x9a, 0x4f, 0x23, 0xab, 0x2f, 0xa8, 0x0f, 0x7e, 0x17, 0xed, 0x56, 0xc8, 0x69, 0x5b, 0xe6, 0xc1, 0xbd, 0x01, 0x19, 0xe5, 0xc3, 0xa6, 0x96, 0x91, 0x84, 0x36, 0x9e, 0xb1, 0x25, 0x72, 0xc5, 0x60, 0x3a, 0xcb, 0x77, 0xf9, 0x9b, 0x70, 0x78, 0x6a, 0x67, 0xd4, 0x9e, 0x7b, 0x48, 0x59, 0xa9, 0x6a, 0xed, 0x72, 0x70, 0x22, 0x5a, 0xfe, 0x07, 0x66, 0x1a, 0xb2, 0x3a, 0x7a, 0x1e, 0xcf, 0x3c, 0xc8, 0x94, 0xe0, 0x97, 0xcb, 0xba, 0x4b, 0x1c, 0xb9, 0xab, 0x5f, 0xa5, 0xeb, 0xf7, 0x25, 0x94, 0xce, 0x66, 0x5a, 0xf3, 0xdb, 0xf7, 0x3e, 0xca, 0xb2, 0x64, 0xf2, 0x04, 0xb3, 0xc5, 0x44, 0xf1, 0x6d, 0x2e, 0xfe, 0x16, 0xfa, 0xcc, 0x49, 0x6a, 0x61, 0x6f, 0x27, 0x4f, 0x0b, 0x85, 0x92, 0x17, 0xcc, 0x07, 0xe1, 0x93, 0x9e, 0x5f, 0x34, 0x6f, 0x9d, 0x65, 0xae, 0x03, 0x6a, 0x55, 0xa5, 0x45, 0x9f, 0x41, 0x0f, 0x29, 0xee, 0x87, 0xf5, 0x2d, 0x1e, 0xf3, 0x78, 0xa7, 0x4b, 0xb7, 0x80, 0x62, 0x5f, 0x90, 0x22, 0x80, 0x22, 0x44, 0xaa, 0xb2, 0x41, 0x33, 0xcd, 0x7c, 0xa7, 0x2b, 0x44, 0x5c, 0x3d, 0x54, 0x25, 0xfd, 0x6e, 0x47, 0xcb, 0x81, 0x46, 0x77, 0x8b, 0x75, 0x84, 0xe6, 0x94, 0x58, 0xa3, 0xd9, 0xbe, 0x54, 0x11, 0x25, 0xd7, 0x43, 0x53, 0xba, 0x43, 0x85, 0xfd, 0xec, 0x5b, 0x59, 0xe0, 0x03, 0x0e, 0x57, 0x80, 0x97, 0x7a, 0x0f, 0xf3, 0x17, 0x27, 0x50, 0x88, 0x72, 0x85, 0xb0, 0x14, 0x9d, 0x28, 0xec, 0x09, 0xb1, 0xb4, 0x56, 0x9b, 0x36, 0x4f, 0xa9, 0x8f, 0xb9, 0x66, 0x1f, 0xac, 0xea, 0xc3, 0x9f, 0xfe, 0x5a, 0xb8, 0xe8, 0xde, 0x63, 0xeb, 0x6f, 0xb8, 0x26, 0xdf, 0x42, 0x4b, 0x46, 0x94, 0xe0, 0xdb, 0x61, 0xae, 0x0a, 0x6f, 0xd6, 0xbf, 0xb3, 0x3b, 0x13, 0x82, 0xd6, 0x3e, 0xaf, 0x18, 0x2e, 0x4b, 0x03, 0xca, 0xf9, 0xa8, 0x83, 0x61, 0x2f, 0x04, 0x0b, 0x6e, 0xf0, 0x0e, 0x8c, 0xc2, 0x19, 0x9b, 0x10, 0x78, 0x3b, 0x36, 0xf6, 0x54, 0x12, 0x9b, 0xa1, 0xad, 0xf8, 0x02, 0x3b, 0x7b, 0x51, 0x53, 0x56, 0x8b, 0xc7, 0xeb, 0xaa, 0x5c, 0xfe, 0x38, 0x80, 0x59, 0x6c, 0x37, 0x79, 0x5e, 0x33, 0x77, 0xc7, 0x8b, 0x6b, 0x78, 0x1b, 0x9b, 0xd9, 0x91, 0x2f, 0xfb, 0x9b, 0x42, 0xca, 0x9b, 0xfe, 0xc8, 0x8f, 0x6a, 0xba, 0x47, 0x04, 0x94, 0xfd, 0xa2, 0x1a, 0x07, 0xb3, 0xc2, 0xb8, 0xaf, 0x0d, 0x9f, 0x7e, 0x2a, 0x6b, 0x1e, 0x82, 0x91, 0xe1, 0x17, 0xc0, 0x51, 0xf3, 0xc9, 0x14, 0xef, 0xf4, 0xbe, 0xe3, 0xa8, 0x57, 0xec, 0x2d, 0xb3, 0x1d, 0x26, 0x62, 0xd1, 0xb4, 0xad, 0x89, 0x58, 0x72, 0xc3, 0x87, 0x6a, 0xfb, 0x0f, 0x89, 0xa7, 0x1e, 0x34, 0x89, 0x3a, 0x3b, 0x96, 0x85, 0xa3, 0x91, 0x64, 0xf1, 0x59, 0x66, 0x66, 0x91, 0xa1, 0x76, 0x3a, 0x73, 0xc2, 0x93, 0x43, 0x07, 0xc3, 0xed, 0xb7, 0xf0, 0x9d, 0x6a, 0x48, 0x6c, 0xc8, 0xb4, 0x56, 0x12, 0xa6, 0xc2, 0x52, 0x50, 0x25, 0xf9, 0xd4, 0x1d, 0xfc, 0x4d, 0xbe, 0x0e, 0x48, 0x02, 0x31, 0xa9, 0xea, 0xce, 0xcb, 0x9a, 0xe9, 0x31, 0x9b, 0xd2, 0x8d, 0xdc, 0x37, 0x52, 0x95, 0x85, 0xdb, 0x36, 0x05, 0x1f, 0x1a, 0x6a, 0xbd, 0xc5, 0x73, 0x61, 0xdb, 0x27, 0xbf, 0x2a, 0x13, 0x47, 0x16, 0xde, 0x29, 0xa7, 0xc1, 0x24, 0xe4, 0x85, 0x23, 0x78, 0x13, 0x3a, 0x31, 0xc4, 0x32, 0x37, 0xbc, 0x30, 0x67, 0xd3, 0xdc, 0x47, 0x5c, 0xa6, 0x34, 0x8a, 0xd4, 0xb3, 0x7c, 0x5f, 0x5f, 0xb2, 0x14, 0x53, 0x50, 0xd8, 0xc4, 0x9d, 0xf0, 0xe5, 0x0d, 0x37, 0xa0, 0xd4, 0x43, 0x18, 0x05, 0xbc, 0x91, 0x33, 0x3a, 0x39, 0x06, 0x21, 0x53, 0x35, 0xd5, 0x15, 0xc0, 0x19, 0xac, 0x4d, 0xf0, 0x89, 0x8d, 0x0a, 0x07, 0x44, 0x43, 0xb7, 0xe0, 0x66, 0x1f, 0xc3, 0xcd, 0x30, 0x8b, 0x01, 0xd0, 0x8a, 0xa4, 0x21, 0x06, 0x25, 0xef, 0x3d, 0x19, 0xd0, 0xa3, 0x6c, 0x15, 0x7a, 0x32, 0x12, 0xad, 0xce, 0xfa, 0xba, 0xa2, 0xc9, 0x0d, 0xe0, 0x84, 0x56, 0x7e, 0xc8, 0x6b, 0x59, 0xbe, 0x86, 0xc8, 0xa4, 0xdc, 0x65, 0xac, 0xf1, 0x80, 0x44, 0x5d, 0x6b, 0x3c, 0x13, 0x11, 0x47, 0xf6, 0x16, 0x35, 0x4e, 0xa3, 0xbf, 0xf2, 0x2a, 0x31, 0xee, 0x38, 0x47, 0xf4, 0x78, 0x42, 0x61, 0x6d, 0x4a, 0xab, 0xc0, 0x58, 0x04, 0xb2, 0x96, 0xb6, 0x30, 0xed, 0xec, 0x9a, 0x85, 0x09, 0x21, 0xfc, 0xbe, 0x5c, 0xbd, 0xec, 0xa4, 0x1e, 0xa4, 0x3d, 0xb1, 0x4e, 0xf8, 0x5e, 0xfb, 0x3a, 0x0f, 0xf8, 0xdc, 0x45, 0xda, 0xd3, 0x78, 0x82, 0x4f, 0x99, 0x8a, 0x42, 0x1a, 0xd7, 0x73, 0x55, 0x79, 0x42, 0xb9, 0x05, 0x19, 0xba, 0x57, 0x7f, 0xb1, 0x58, 0xc5, 0x55, 0x61, 0x4c, 0xed, 0x0d, 0x3e, 0x24, 0xf1, 0x04, 0x5e, 0xf3, 0xe7, 0x3e, 0x02, 0x36, 0x38, 0xdc, 0xca, 0x3b, 0x9f, 0xe1, 0x25, 0xf5, 0xa8, 0xc6, 0xc4, 0xdc, 0x39, 0xb0, 0xc0, 0xd8, 0x61, 0x84, 0xcd, 0xcf, 0xbe, 0xb7, 0x07, 0x08, 0x12, 0xef, 0x53, 0x37, 0xd7, 0xf8, 0x3e, 0x41, 0xde, 0x12, 0x1f, 0xe3, 0xa7, 0x90, 0x01, 0xce, 0x91, 0x87, 0x62, 0xdd, 0x7a, 0x9f, 0xde, 0xdf, 0xb0, 0x62, 0x96, 0x66, 0x6e, 0x9c, 0xd4, 0x82, 0x43, 0xa1, 0xa7, 0xde, 0x03, 0x7a, 0x49, 0xc8, 0x8a, 0x72, 0x2d, 0xee, 0x42, 0x7f, 0x6b, 0x1e, 0x81, 0x31, 0xee, 0x61, 0xe5, 0x97, 0x38, 0xe4, 0x6f, 0xf3, 0x42, 0x5e, 0x38, 0xb3, 0x37, 0xe5, 0x53, 0x5c, 0xeb, 0x7d, 0x86, 0xcf, 0xfa, 0xe2, 0x8d, 0xb5, 0x57, 0x44, 0x59, 0x48, 0x30, 0x51, 0xe6, 0x7b, 0x9a, 0xc4, 0x25, 0x61, 0x51, 0x68, 0xf9, 0x42, 0x28, 0x8c, 0x6c, 0xba, 0x70, 0x3d, 0x0d, 0xa2, 0x8d, 0xcd, 0xcf, 0xf2, 0x4b, 0x85, 0xd6, 0xd6, 0x14, 0xe6, 0x1a, 0x9b, 0x18, 0x22, 0x67, 0x22, 0xa5, 0xb8, 0x7c, 0xec, 0x6d, 0x66, 0xf5, 0xa4, 0x29, 0x13, 0x5c, 0x1c, 0x4f, 0xcd, 0x8b, 0xbc, 0x0f, 0x27, 0x75, 0xda, 0xc6, 0x77, 0xd2, 0x5f, 0x37, 0xee, 0x46, 0xd4, 0xb1, 0x18, 0x72, 0xfb, 0xb7, 0x5f, 0x62, 0x08, 0xff, 0x7f, 0x2e, 0x50, 0x36, 0x29, 0x53, 0x0b, 0x62, 0x38, 0xc6, 0x5a, 0x3e, 0xe9, 0xba, 0x36, 0xe2, 0xcb, 0x7d, 0xf4, 0x67, 0xd8, 0x98, 0x88, 0xf6, 0x39, 0xf9, 0x85, 0x64, 0xeb, 0xc4, 0x7f, 0xb6, 0xc9, 0xf8, 0x03, 0x1a, 0xca, 0x0d, 0x35, 0x94, 0xe2, 0xc3, 0xcc, 0xef, 0x5d, 0x5a, 0x83, 0x28, 0x50, 0x8e, 0x88, 0x67, 0x31, 0xd3, 0xa0, 0x5c, 0x69, 0x83, 0x6d, 0x21, 0x0e, 0x2a, 0x67, 0x35, 0x68, 0x9a, 0xb2, 0x41, 0x67, 0x87, 0x8b, 0x1a, 0x84, 0x53, 0x78, 0xa3, 0x26, 0x1b, 0xc3, 0x0f, 0x24, 0x5f, 0x76, 0xbf, 0x0c, 0x50, 0xff, 0x40, 0x38, 0x98, 0x55, 0x6d, 0x24, 0x44, 0x84, 0x05, 0x79, 0x20, 0x36, 0xe0, 0xb8, 0x04, 0xcb, 0x69, 0x63, 0x91, 0x81, 0xb9, 0x07, 0xa9, 0xa6, 0x28, 0x91, 0xf3, 0xe6, 0xf9, 0xa0, 0xbb, 0x77, 0xaa, 0xe1, 0xe9, 0x90, 0xe8, 0x36, 0x60, 0x15, 0x5b, 0xb3, 0x9b, 0x72, 0x7b, 0x1c, 0x17, 0xcb, 0xd5, 0xf0, 0x1b, 0x2f, 0xce, 0x76, 0xf9, 0xae, 0x50, 0x7b, 0x70, 0xc5, 0xe8, 0x3a, 0x08, 0x96, 0x08, 0xa2, 0x9f, 0x22, 0xbb, 0x39, 0x4f, 0x37, 0x3c, 0x72, 0x36, 0x71, 0x1b, 0x4b, 0x09, 0x25, 0x71, 0x6e, 0xcf, 0xc1, 0x09, 0x42, 0x7f, 0x5c, 0xa4, 0xc8, 0xf2, 0x8e, 0xa7, 0x21, 0xc7, 0x89, 0xa7, 0x51, 0xbc, 0xf3, 0x87, 0x3d, 0x57, 0xd0, 0x38, 0x0e, 0xde, 0x3c, 0x28, 0x02, 0x1b, 0x75, 0x5c, 0x01, 0x90, 0xa2, 0xd7, 0x5a, 0x39, 0x0a, 0xe6, 0x01, 0x16, 0x80, 0xad, 0x98, 0x21, 0x82, 0xf4, 0x31, 0xca, 0x50, 0x76, 0x98, 0xd1, 0xd7, 0x62, 0xd2, 0xfb, 0xf4, 0x94, 0x61, 0x34, 0x30, 0x5b, 0x90, 0xe0, 0x98, 0x66, 0xf3, 0xba, 0x10, 0xa4, 0x3f, 0x30, 0x06, 0x0e, 0xcc, 0x2b, 0x61, 0xa3, 0xaa, 0x3b, 0xef, 0x8a, 0x26, 0x59, 0xdf, 0x6b, 0xd2, 0xc5, 0x8e, 0x8d }; +constexpr AccessUnit LPCM_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 3, { 0xb1, 0x40, 0x00, 0xda, 0x2c, 0xae, 0xd8, 0xf8, 0x31, 0x4d, 0x58, 0x96, 0x3f, 0x03, 0x7e, 0x2e }, { 0xec, 0x7a, 0x1d, 0x5c, 0xa0, 0xca, 0x0e, 0xdc, 0x52, 0x1a, 0x9c, 0xc1, 0x52, 0xdc, 0xcd, 0xa6, 0x9e, 0x28, 0x97, 0xde } }; +constexpr AccessUnit LPCM_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 3, { 0xb1, 0x40, 0x00, 0xda, 0x2c, 0xae, 0xd8, 0xf8, 0x31, 0x4d, 0x58, 0x96, 0x3f, 0x03, 0x7e, 0x2e }, { 0x09, 0xa0, 0xb5, 0x46, 0xd8, 0x95, 0xf7, 0x34, 0x86, 0xc9, 0x2c, 0x8f, 0xe0, 0xb6, 0x69, 0x72, 0x75, 0x0b, 0xa9, 0x59 } }; + +constexpr std::array USER_DATA_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x20, 0xb1, 0x00, 0x00, 0x04, 0x29, 0xae, 0xd8, 0xf8, 0x31, 0x4d, 0x58, 0x96, 0x3f, 0x03, 0x7e, 0x2e, 0x5d, 0xb9, 0x16, 0xf9, 0x14, 0x26, 0x07, 0x3f, 0x85, 0xc1, 0x78, 0xcb, 0xf1, 0x73, 0xc1, 0xd6, 0xc2, 0x80, 0x8d, 0xaf, 0xa9, 0x76, 0xb1, 0xb2, 0x83, 0xcf, 0xce, 0x89, 0x25, 0xe4, 0x78, 0xe7, 0x06, 0x10, 0x18, 0xdd, 0x52, 0xf6, 0x17, 0x36, 0xe0, 0xba, 0x91, 0xc5, 0x0b, 0x07, 0xca, 0x35, 0x6b, 0xe0, 0x1c, 0xbf, 0xdf, 0x36, 0xfb, 0xca, 0x06, 0x73, 0x67, 0x8d, 0xcf, 0xb0, 0xf8, 0x8d, 0x34, 0xef, 0x73, 0x07, 0x1b, 0x74, 0x31, 0x13, 0xf4, 0x5a, 0x45, 0x77, 0xf9, 0xc2, 0x7e, 0x0c, 0x9b, 0xb1, 0x3a, 0xf9, 0x48, 0xbb, 0x8e, 0xda, 0xc6, 0x9f, 0x68, 0xfd, 0x4a, 0x39, 0xcd, 0x81, 0xa1, 0x4e, 0xcc, 0x6e, 0x2a, 0x49, 0x32, 0xc4, 0xb2, 0xee, 0xb9, 0xcd, 0x5d, 0x92, 0x07, 0x53, 0x9e, 0xca, 0x7f, 0xfc, 0x6c, 0xe0, 0xa5, 0xc8, 0xed, 0xba, 0x5d, 0x35, 0xc9, 0x4d, 0x1a, 0x86, 0x1b, 0xaf, 0xfc, 0x44, 0xb4, 0xec, 0xf8, 0xeb, 0xdc, 0x22, 0x08, 0x5f, 0x29, 0x85, 0x81, 0xdb, 0xe9, 0x8f, 0x4e, 0xf2, 0xb9, 0xd9, 0x09, 0x58, 0x11, 0xd4, 0xfa, 0x2a, 0x01, 0x5d, 0xf1, 0x07, 0x6f, 0xe8, 0x75, 0x66, 0x39, 0xac, 0x1b, 0x28, 0x57, 0x6b, 0xd3, 0xd4, 0x06, 0xee, 0xd0, 0x86, 0xde, 0xc4, 0x88, 0x99, 0x62, 0x52, 0x37, 0xd9, 0xed, 0x44, 0x3d, 0xc7, 0xa4, 0x2c, 0x2f, 0x96, 0xed, 0xfd, 0xba, 0xd8, 0xd1, 0x72, 0xf6, 0xbb, 0xf3, 0x5f, 0x3b, 0x3e, 0xc3, 0x2c, 0x23, 0xca, 0xb2, 0x72, 0x69, 0xb7, 0x14, 0xcc, 0x81, 0x1a, 0x24, 0x9b, 0x95, 0xd4, 0xc7, 0x97, 0x9f, 0xd3, 0x5b, 0x22, 0xa6, 0x57, 0x63, 0xec, 0x27, 0x20, 0xc4, 0x76, 0x6e, 0xd9, 0xf0, 0x56, 0xaa, 0x0d, 0x54, 0xb7, 0x49, 0x39, 0xf2, 0x19, 0x7d, 0x56, 0xa2, 0x70, 0x7e, 0xce, 0x89, 0x46, 0x08, 0xb2, 0x7f, 0xba, 0x73, 0x9a, 0x2d, 0x11, 0xdd, 0x74, 0x90, 0x70, 0x36, 0xd6, 0x97, 0x62, 0xf0, 0xf7, 0x39, 0x99, 0xf6, 0x50, 0xb2, 0xd4, 0xff, 0x42, 0x8e, 0xbe, 0xf1, 0x57, 0x0e, 0xc8, 0x29, 0x6f, 0x16, 0xa7, 0x86, 0xdb, 0xd9, 0x81, 0x43, 0x9b, 0x95, 0x24, 0xbd, 0x9a, 0x0c, 0x54, 0x2e, 0x71, 0x72, 0x42, 0xe6, 0x25, 0x41, 0xa9, 0x6e, 0x1c, 0x2e, 0x74, 0xb1, 0xe0, 0x4e, 0x66, 0xc3, 0xda, 0xb6, 0x16, 0xb2, 0x84, 0xc5, 0x1f, 0x1f, 0x65, 0xf2, 0xc8, 0x3d, 0x9c, 0xb4, 0x28, 0xed, 0xd3, 0xe2, 0xa2, 0xf8, 0x24, 0xd8, 0x84, 0x16, 0x9f, 0x72, 0x57, 0xa0, 0xfd, 0x28, 0x81, 0x97, 0xb3, 0x7b, 0x5d, 0x29, 0x37, 0xa3, 0x81, 0x2a, 0x5f, 0x45, 0x6b, 0xd3, 0xbd, 0x13, 0x78, 0x4a, 0x63, 0x9f, 0x7a, 0x34, 0x3c, 0xf4, 0x45, 0x7f, 0x51, 0xe9, 0x58, 0xdc, 0xcb, 0x39, 0x38, 0x87, 0xab, 0xb4, 0x0d, 0xaf, 0x4d, 0x63, 0x4b, 0x0f, 0x2e, 0xac, 0xc6, 0xd6, 0x04, 0x1b, 0x3a, 0xda, 0x9d, 0x3b, 0x20, 0x90, 0x3b, 0x19, 0x4f, 0x6e, 0x82, 0x93, 0x85, 0x53, 0x18, 0xf7, 0xa6, 0x1a, 0x2f, 0x98, 0xc8, 0x1f, 0xe3, 0x59, 0x5b, 0x43, 0x76, 0xc4, 0xd4, 0x37, 0xef, 0x0e, 0xce, 0xa3, 0x35, 0xc9, 0x4d, 0x43, 0x13, 0x24, 0xe3, 0x6c, 0x5a, 0xc8, 0x8d, 0xb2, 0x68, 0x5d, 0xc0, 0xd2, 0xd0, 0x06, 0x1d, 0x77, 0x80, 0x65, 0xcd, 0x0a, 0xc0, 0x93, 0xb1, 0x8c, 0xf8, 0x1b, 0xf6, 0x8c, 0x59, 0xf5, 0x99, 0x7f, 0xec, 0x34, 0x0e, 0x16, 0x4e, 0x6a, 0x0c, 0x86, 0xba, 0x1b, 0xd8, 0x53, 0x66, 0x1e, 0xdc, 0x66, 0x8d, 0x91, 0x1b, 0x2b, 0xb4, 0xdd, 0xe2, 0x54, 0x1e, 0xea, 0xc2, 0x5b, 0x6b, 0x56, 0x96, 0x8c, 0xfb, 0xf8, 0x21, 0x22, 0x8f, 0x1e, 0xbb, 0xd7, 0xe7, 0x7b, 0xd7, 0xbf, 0x0c, 0xbb, 0x9e, 0xe2, 0x6c, 0x31, 0x3a, 0xaa, 0xcd, 0xd3, 0xfb, 0xcb, 0x6e, 0xc6, 0x82, 0x7f, 0x01, 0xda, 0x0e, 0x0b, 0xc8, 0x21, 0xc4, 0x6c, 0x2b, 0xe3, 0x88, 0xcd, 0x0c, 0xb3, 0x3d, 0x89, 0xf6, 0xd9, 0x75, 0x16, 0xf8, 0x0e, 0x6d, 0xee, 0x5a, 0xd6, 0xaf, 0xe1, 0x63, 0xe0, 0x77, 0x55, 0x78, 0x39, 0xf9, 0xc4, 0xa2, 0xa7, 0x96, 0x34, 0x17, 0xe0, 0x4f, 0x79, 0xcc, 0x0c, 0x3f, 0x67, 0x31, 0x55, 0xc9, 0xe0, 0x3b, 0x2c, 0x45, 0xaf, 0xbb, 0xbc, 0x73, 0x7c, 0x13, 0xe6, 0x0a, 0x5b, 0x87, 0xd5, 0x91, 0x35, 0xbc, 0x63, 0xd2, 0x31, 0x41, 0x4f, 0x17, 0xb2, 0xf3, 0x44, 0x33, 0xbf, 0x41, 0x7f, 0x49, 0x2f, 0xab, 0x38, 0xd4, 0x9e, 0xf8, 0x9d, 0xb7, 0xe4, 0x97, 0x0f, 0x0e, 0xec, 0xa3, 0xe8, 0xda, 0x9a, 0x4f, 0x23, 0xab, 0x2f, 0xa8, 0x0f, 0x7e, 0x17, 0xed, 0x56, 0xc8, 0x69, 0x5b, 0xe6, 0xc1, 0xbd, 0x01, 0x19, 0xe5, 0xc3, 0xa6, 0x96, 0x91, 0x84, 0x36, 0x9e, 0xb1, 0x25, 0x72, 0xc5, 0x60, 0x3a, 0xcb, 0x77, 0xf9, 0x9b, 0x70, 0x78, 0x6a, 0x67, 0xd4, 0x9e, 0x7b, 0x48, 0x59, 0xa9, 0x6a, 0xed, 0x72, 0x70, 0x22, 0x5a, 0xfe, 0x07, 0x66, 0x1a, 0xb2, 0x3a, 0x7a, 0x1e, 0xcf, 0x3c, 0xc8, 0x94, 0xe0, 0x97, 0xcb, 0xba, 0x4b, 0x1c, 0xb9, 0xab, 0x5f, 0xa5, 0xeb, 0xf7, 0x25, 0x94, 0xce, 0x66, 0x5a, 0xf3, 0xdb, 0xf7, 0x3e, 0xca, 0xb2, 0x64, 0xf2, 0x04, 0xb3, 0xc5, 0x44, 0xf1, 0x6d, 0x2e, 0xfe, 0x16, 0xfa, 0xcc, 0x49, 0x6a, 0x61, 0x6f, 0x27, 0x4f, 0x0b, 0x85, 0x92, 0x17, 0xcc, 0x07, 0xe1, 0x93, 0x9e, 0x5f, 0x34, 0x6f, 0x9d, 0x65, 0xae, 0x03, 0x6a, 0x55, 0xa5, 0x45, 0x9f, 0x41, 0x0f, 0x29, 0xee, 0x87, 0xf5, 0x2d, 0x1e, 0xf3, 0x78, 0xa7, 0x4b, 0xb7, 0x80, 0x62, 0x5f, 0x90, 0x22, 0x80, 0x22, 0x44, 0xaa, 0xb2, 0x41, 0x33, 0xcd, 0x7c, 0xa7, 0x2b, 0x44, 0x5c, 0x3d, 0x54, 0x25, 0xfd, 0x6e, 0x47, 0xcb, 0x81, 0x46, 0x77, 0x8b, 0x75, 0x84, 0xe6, 0x94, 0x58, 0xa3, 0xd9, 0xbe, 0x54, 0x11, 0x25, 0xd7, 0x43, 0x53, 0xba, 0x43, 0x85, 0xfd, 0xec, 0x5b, 0x59, 0xe0, 0x03, 0x0e, 0x57, 0x80, 0x97, 0x7a, 0x0f, 0xf3, 0x17, 0x27, 0x50, 0x88, 0x72, 0x85, 0xb0, 0x14, 0x9d, 0x28, 0xec, 0x09, 0xb1, 0xb4, 0x56, 0x9b, 0x36, 0x4f, 0xa9, 0x8f, 0xb9, 0x66, 0x1f, 0xac, 0xea, 0xc3, 0x9f, 0xfe, 0x5a, 0xb8, 0xe8, 0xde, 0x63, 0xeb, 0x6f, 0xb8, 0x26, 0xdf, 0x42, 0x4b, 0x46, 0x94, 0xe0, 0xdb, 0x61, 0xae, 0x0a, 0x6f, 0xd6, 0xbf, 0xb3, 0x3b, 0x13, 0x82, 0xd6, 0x3e, 0xaf, 0x18, 0x2e, 0x4b, 0x03, 0xca, 0xf9, 0xa8, 0x83, 0x61, 0x2f, 0x04, 0x0b, 0x6e, 0xf0, 0x0e, 0x8c, 0xc2, 0x19, 0x9b, 0x10, 0x78, 0x3b, 0x36, 0xf6, 0x54, 0x12, 0x9b, 0xa1, 0xad, 0xf8, 0x02, 0x3b, 0x7b, 0x51, 0x53, 0x56, 0x8b, 0xc7, 0xeb, 0xaa, 0x5c, 0xfe, 0x38, 0x80, 0x59, 0x6c, 0x37, 0x79, 0x5e, 0x33, 0x77, 0xc7, 0x8b, 0x6b, 0x78, 0x1b, 0x9b, 0xd9, 0x91, 0x2f, 0xfb, 0x9b, 0x42, 0xca, 0x9b, 0xfe, 0xc8, 0x8f, 0x6a, 0xba, 0x47, 0x04, 0x94, 0xfd, 0xa2, 0x1a, 0x07, 0xb3, 0xc2, 0xb8, 0xaf, 0x0d, 0x9f, 0x7e, 0x2a, 0x6b, 0x1e, 0x82, 0x91, 0xe1, 0x17, 0xc0, 0x51, 0xf3, 0xc9, 0x14, 0xef, 0xf4, 0xbe, 0xe3, 0xa8, 0x57, 0xec, 0x2d, 0xb3, 0x1d, 0x26, 0x62, 0xd1, 0xb4, 0xad, 0x89, 0x58, 0x72, 0xc3, 0x87, 0x6a, 0xfb, 0x0f, 0x89, 0xa7, 0x1e, 0x34, 0x89, 0x3a, 0x3b, 0x96, 0x85, 0xa3, 0x91, 0x64, 0xf1, 0x59, 0x66, 0x66, 0x91, 0xa1, 0x76, 0x3a, 0x73, 0xc2, 0x93, 0x43, 0x07, 0xc3, 0xed, 0xb7, 0xf0, 0x9d, 0x6a, 0x48, 0x6c, 0xc8, 0xb4, 0x56, 0x12, 0xa6, 0xc2, 0x52, 0x50, 0x25, 0xf9, 0xd4, 0x1d, 0xfc, 0x4d, 0xbe, 0x0e, 0x48, 0x02, 0x31, 0xa9, 0xea, 0xce, 0xcb, 0x9a, 0xe9, 0x31, 0x9b, 0xd2, 0x8d, 0xdc, 0x37, 0x52, 0x95, 0x85, 0xdb, 0x36, 0x05, 0x1f, 0x1a, 0x6a, 0xbd, 0xc5, 0x73, 0x61, 0xdb, 0x27, 0xbf, 0x2a, 0x13, 0x47, 0x16, 0xde, 0x29, 0xa7, 0xc1, 0x24, 0xe4, 0x85, 0x23, 0x78, 0x13, 0x3a, 0x31, 0xc4, 0x32, 0x37, 0xbc, 0x30, 0x67, 0xd3, 0xdc, 0x47, 0x5c, 0xa6, 0x34, 0x8a, 0xd4, 0xb3, 0x7c, 0x5f, 0x5f, 0xb2, 0x14, 0x53, 0x50, 0xd8, 0xc4, 0x9d, 0xf0, 0xe5, 0x0d, 0x37, 0xa0, 0xd4, 0x43, 0x18, 0x05, 0xbc, 0x91, 0x33, 0x3a, 0x39, 0x06, 0x21, 0x53, 0x35, 0xd5, 0x15, 0xc0, 0x19, 0xac, 0x4d, 0xf0, 0x89, 0x8d, 0x0a, 0x07, 0x44, 0x43, 0xb7, 0xe0, 0x66, 0x1f, 0xc3, 0xcd, 0x30, 0x8b, 0x01, 0xd0, 0x8a, 0xa4, 0x21, 0x06, 0x25, 0xef, 0x3d, 0x19, 0xd0, 0xa3, 0x6c, 0x15, 0x7a, 0x32, 0x12, 0xad, 0xce, 0xfa, 0xba, 0xa2, 0xc9, 0x0d, 0xe0, 0x84, 0x56, 0x7e, 0xc8, 0x6b, 0x59, 0xbe, 0x86, 0xc8, 0xa4, 0xdc, 0x65, 0xac, 0xf1, 0x80, 0x44, 0x5d, 0x6b, 0x3c, 0x13, 0x11, 0x47, 0xf6, 0x16, 0x35, 0x4e, 0xa3, 0xbf, 0xf2, 0x2a, 0x31, 0xee, 0x38, 0x47, 0xf4, 0x78, 0x42, 0x61, 0x6d, 0x4a, 0xab, 0xc0, 0x58, 0x04, 0xb2, 0x96, 0xb6, 0x30, 0xed, 0xec, 0x9a, 0x85, 0x09, 0x21, 0xfc, 0xbe, 0x5c, 0xbd, 0xec, 0xa4, 0x1e, 0xa4, 0x3d, 0xb1, 0x4e, 0xf8, 0x5e, 0xfb, 0x3a, 0x0f, 0xf8, 0xdc, 0x45, 0xda, 0xd3, 0x78, 0x82, 0x4f, 0x99, 0x8a, 0x42, 0x1a, 0xd7, 0x73, 0x55, 0x79, 0x42, 0xb9, 0x05, 0x19, 0xba, 0x57, 0x7f, 0xb1, 0x58, 0xc5, 0x55, 0x61, 0x4c, 0xed, 0x0d, 0x3e, 0x24, 0xf1, 0x04, 0x5e, 0xf3, 0xe7, 0x3e, 0x02, 0x36, 0x38, 0xdc, 0xca, 0x3b, 0x9f, 0xe1, 0x25, 0xf5, 0xa8, 0xc6, 0xc4, 0xdc, 0x39, 0xb0, 0xc0, 0xd8, 0x61, 0x84, 0xcd, 0xcf, 0xbe, 0xb7, 0x07, 0x08, 0x12, 0xef, 0x53, 0x37, 0xd7, 0xf8, 0x3e, 0x41, 0xde, 0x12, 0x1f, 0xe3, 0xa7, 0x90, 0x01, 0xce, 0x91, 0x87, 0x62, 0xdd, 0x7a, 0x9f, 0xde, 0xdf, 0xb0, 0x62, 0x96, 0x66, 0x6e, 0x9c, 0xd4, 0x82, 0x43, 0xa1, 0xa7, 0xde, 0x03, 0x7a, 0x49, 0xc8, 0x8a, 0x72, 0x2d, 0xee, 0x42, 0x7f, 0x6b, 0x1e, 0x81, 0x31, 0xee, 0x61, 0xe5, 0x97, 0x38, 0xe4, 0x6f, 0xf3, 0x42, 0x5e, 0x38, 0xb3, 0x37, 0xe5, 0x53, 0x5c, 0xeb, 0x7d, 0x86, 0xcf, 0xfa, 0xe2, 0x8d, 0xb5, 0x57, 0x44, 0x59, 0x48, 0x30, 0x51, 0xe6, 0x7b, 0x9a, 0xc4, 0x25, 0x61, 0x51, 0x68, 0xf9, 0x42, 0x28, 0x8c, 0x6c, 0xba, 0x70, 0x3d, 0x0d, 0xa2, 0x8d, 0xcd, 0xcf, 0xf2, 0x4b, 0x85, 0xd6, 0xd6, 0x14, 0xe6, 0x1a, 0x9b, 0x18, 0x22, 0x67, 0x22, 0xa5, 0xb8, 0x7c, 0xec, 0x6d, 0x66, 0xf5, 0xa4, 0x29, 0x13, 0x5c, 0x1c, 0x4f, 0xcd, 0x8b, 0xbc, 0x0f, 0x27, 0x75, 0xda, 0xc6, 0x77, 0xd2, 0x5f, 0x37, 0xee, 0x46, 0xd4, 0xb1, 0x18, 0x72, 0xfb, 0xb7, 0x5f, 0x62, 0x08, 0xff, 0x7f, 0x2e, 0x50, 0x36, 0x29, 0x53, 0x0b, 0x62, 0x38, 0xc6, 0x5a, 0x3e, 0xe9, 0xba, 0x36, 0xe2, 0xcb, 0x7d, 0xf4, 0x67, 0xd8, 0x98, 0x88, 0xf6, 0x39, 0xf9, 0x85, 0x64, 0xeb, 0xc4, 0x7f, 0xb6, 0xc9, 0xf8, 0x03, 0x1a, 0xca, 0x0d, 0x35, 0x94, 0xe2, 0xc3, 0xcc, 0xef, 0x5d, 0x5a, 0x83, 0x28, 0x50, 0x8e, 0x88, 0x67, 0x31, 0xd3, 0xa0, 0x5c, 0x69, 0x83, 0x6d, 0x21, 0x0e, 0x2a, 0x67, 0x35, 0x68, 0x9a, 0xb2, 0x41, 0x67, 0x87, 0x8b, 0x1a, 0x84, 0x53, 0x78, 0xa3, 0x26, 0x1b, 0xc3, 0x0f, 0x24, 0x5f, 0x76, 0xbf, 0x0c, 0x50, 0xff, 0x40, 0x38, 0x98, 0x55, 0x6d, 0x24, 0x44, 0x84, 0x05, 0x79, 0x20, 0x36, 0xe0, 0xb8, 0x04, 0xcb, 0x69, 0x63, 0x91, 0x81, 0xb9, 0x07, 0xa9, 0xa6, 0x28, 0x91, 0xf3, 0xe6, 0xf9, 0xa0, 0xbb, 0x77, 0xaa, 0xe1, 0xe9, 0x90, 0xe8, 0x36, 0x60, 0x15, 0x5b, 0xb3, 0x9b, 0x72, 0x7b, 0x1c, 0x17, 0xcb, 0xd5, 0xf0, 0x1b, 0x2f, 0xce, 0x76, 0xf9, 0xae, 0x50, 0x7b, 0x70, 0xc5, 0xe8, 0x3a, 0x08, 0x96, 0x08, 0xa2, 0x9f, 0x22, 0xbb, 0x39, 0x4f, 0x37, 0x3c, 0x72, 0x36, 0x71, 0x1b, 0x4b, 0x09, 0x25, 0x71, 0x6e, 0xcf, 0xc1, 0x09, 0x42, 0x7f, 0x5c, 0xa4, 0xc8, 0xf2, 0x8e, 0xa7, 0x21, 0xc7, 0x89, 0xa7, 0x51, 0xbc, 0xf3, 0x87, 0x3d, 0x57, 0xd0, 0x38, 0x0e, 0xde, 0x3c, 0x28, 0x02, 0x1b, 0x75, 0x5c, 0x01, 0x90, 0xa2, 0xd7, 0x5a, 0x39, 0x0a, 0xe6, 0x01, 0x16, 0x80, 0xad, 0x98, 0x21, 0x82, 0xf4, 0x31, 0xca, 0x50, 0x76, 0x98, 0xd1, 0xd7, 0x62, 0xd2, 0xfb, 0xf4, 0x94, 0x61, 0x34, 0x30, 0x5b, 0x90, 0xe0, 0x98, 0x66, 0xf3, 0xba, 0x10, 0xa4, 0x3f, 0x30, 0x06, 0x0e, 0xcc, 0x2b, 0x61, 0xa3, 0xaa, 0x3b, 0xef, 0x8a, 0x26, 0x59, 0xdf, 0x6b, 0xd2, 0xc5, 0x8e, 0x8d }; +constexpr AccessUnit USER_DATA_SINGLE_PACK_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x65, 0x94, 0x4b, 0xa5, 0x88, 0x59, 0x24, 0xa3, 0x5a, 0x30, 0x33, 0x6d, 0xaf, 0xb2, 0x95, 0x4b, 0x84, 0x08, 0x72, 0xd6 } }; + + +constexpr std::array TIME_STAMP_SIGN_EXTENDED_STREAM = []() constexpr { auto pack = USER_DATA_SINGLE_PACK_STREAM; pack[0x11d] |= 0x4; pack[0x122] |= 0x4; return pack; }(); // Set 31st bits of the timestamps +constexpr AccessUnit TIME_STAMP_SIGN_EXTENDED_EXPECTED_AU = { 0xffffffff'80015f90ull, 0xffffffff'800159b2ull, false, 0, {}, { 0x65, 0x94, 0x4b, 0xa5, 0x88, 0x59, 0x24, 0xa3, 0x5a, 0x30, 0x33, 0x6d, 0xaf, 0xb2, 0x95, 0x4b, 0x84, 0x08, 0x72, 0xd6 } }; + + +const std::vector AVC_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x09, 0xf6, 0xc0, 0x00, 0x4f, 0x57, 0x7f, 0xb7, 0xec, 0x51, 0xfa, 0xd4, 0x23, 0xdf, 0x05, 0x0a, 0x7a, 0x74, 0x3b, 0xbc, 0x91, 0xb6, 0xc8, 0x73, 0x6b, 0xe4, 0x1d, 0x28, 0xe9, 0xf2, 0x5f, 0xf8, 0x91, 0x13, 0xe6, 0xdb, 0x83, 0x92, 0x7f, 0x24, 0x04, 0x68, 0x57, 0x5c, 0x20, 0x6a, 0x4d, 0xfe, 0x93, 0x47, 0xe9, 0xf0, 0xf0, 0x18, 0xe2, 0xef, 0x2a, 0x94, 0xa9, 0xe4, 0xac, 0xc7, 0x1b, 0x62, 0x71, 0x96, 0xc8, 0x9e, 0xf6, 0x91, 0x44, 0x83, 0x34, 0x23, 0xf8, 0xb7, 0x35, 0x15, 0x1d, 0xe9, 0xc5, 0x1a, 0x61, 0xbd, 0x48, 0x21, 0x6b, 0xff, 0xd6, 0x2d, 0x85, 0xc8, 0x37, 0xf5, 0x6b, 0xaa, 0x59, 0x24, 0xf8, 0x33, 0xb5, 0xc8, 0xbc, 0x0a, 0x43, 0x3f, 0x82, 0xea, 0xd8, 0x8c, 0xdc, 0xd0, 0x6e, 0x92, 0x20, 0x3e, 0xce, 0x6c, 0x36, 0x3c, 0x43, 0xbf, 0x6e, 0x47, 0x92, 0xaa, 0xa3, 0x2a, 0x21, 0x95, 0x4c, 0x2e, 0x06, 0xbd, 0x64, 0x07, 0xf7, 0xdd, 0x15, 0x58, 0xf4, 0x15, 0xde, 0x47, 0x02, 0xe5, 0x2b, 0x9a, 0xce, 0x25, 0x2a, 0x85, 0x48, 0x3e, 0x05, 0xc2, 0xd2, 0xc6, 0x5a, 0x6d, 0xfe, 0xe8, 0x8b, 0xda, 0xe4, 0x4a, 0x6e, 0xc7, 0xc4, 0xff, 0x94, 0xe4, 0x46, 0xac, 0xf1, 0xa1, 0x8b, 0xdd, 0x54, 0xe0, 0xac, 0xd7, 0x1f, 0x76, 0x3c, 0xa6, 0x8f, 0x24, 0x37, 0xc1, 0xd2, 0xa6, 0xa4, 0x95, 0xdd, 0x53, 0x28, 0x5d, 0xb4, 0x89, 0xfd, 0x8f, 0x16, 0xa1, 0x9d, 0x5a, 0x1a, 0x7c, 0xda, 0x50, 0xa0, 0x33, 0x3e, 0x9b, 0x1a, 0x33, 0xa6, 0x4a, 0xc0, 0xfa, 0x14, 0xbf, 0xb9, 0x24, 0xa0, 0x99, 0x64, 0xb8, 0x9d, 0xb1, 0xfb, 0x98, 0xc9, 0xcf, 0xac, 0x7b, 0xcb, 0x9e, 0x85, 0x6f, 0x1e, 0xb3, 0x56, 0x33, 0xaf, 0x68, 0x42, 0xd9, 0xf7, 0x0c, 0x79, 0x2b, 0xfe, 0x61, 0x14, 0xa6, 0x59, 0x8c, 0x72, 0x97, 0xb3, 0x5e, 0x4e, 0xce, 0x25, 0xea, 0x1c, 0x09, 0x40, 0x1e, 0xfc, 0x6b, 0x31, 0xf1, 0xe3, 0x43, 0x10, 0xe4, 0x3b, 0x66, 0xa3, 0xde, 0x3b, 0xcc, 0x94, 0x5f, 0x97, 0xfd, 0xb6, 0x5a, 0x69, 0x9d, 0x28, 0xc9, 0xf0, 0xc9, 0x19, 0xd0, 0xe5, 0x52, 0xb9, 0x2b, 0x2d, 0xac, 0x15, 0xe3, 0x14, 0x3d, 0xea, 0x32, 0xc5, 0x49, 0x8e, 0x7f, 0xfc, 0x26, 0xe8, 0xc9, 0xbc, 0x60, 0x2f, 0x7c, 0xc9, 0x42, 0xca, 0xfe, 0x81, 0xe1, 0x02, 0x08, 0x91, 0x03, 0xe4, 0xe6, 0xca, 0x00, 0xef, 0x06, 0x5b, 0x3e, 0x8a, 0x91, 0xc8, 0x0e, 0x3c, 0xa7, 0x94, 0x08, 0x4f, 0x09, 0x92, 0x98, 0xc8, 0x48, 0xb0, 0x2d, 0xf3, 0x95, 0xe7, 0x01, 0x83, 0xee, 0x90, 0xb0, 0xc7, 0xbf, 0x27, 0x77, 0xfc, 0x19, 0xaf, 0xb4, 0xc2, 0x36, 0xad, 0x95, 0xca, 0xab, 0xa9, 0xf1, 0x1a, 0xaa, 0xfc, 0x2e, 0x56, 0x8a, 0xd8, 0x97, 0x8e, 0x91, 0xd7, 0xee, 0x80, 0x85, 0x9d, 0x33, 0x6d, 0xa6, 0x3d, 0xcd, 0x78, 0xb1, 0xcb, 0x58, 0xdd, 0x43, 0x59, 0xd3, 0x6b, 0xaa, 0x34, 0xcc, 0x56, 0xd5, 0x09, 0x5f, 0x0c, 0x62, 0x53, 0xb2, 0x69, 0x3d, 0xcd, 0xe2, 0x5e, 0x21, 0xfa, 0x34, 0x1e, 0xa7, 0x35, 0x04, 0x8b, 0xfc, 0x45, 0x3b, 0x9a, 0x56, 0x61, 0x2d, 0x09, 0xe3, 0xdc, 0xa4, 0xf1, 0xb2, 0xb0, 0xdc, 0x48, 0xdb, 0x41, 0xb0, 0x9b, 0xef, 0x0e, 0x55, 0x02, 0x83, 0x5c, 0x97, 0xe3, 0x90, 0x4b, 0xdb, 0x81, 0x03, 0xc5, 0x60, 0x91, 0x9e, 0xf6, 0x80, 0x7c, 0x7e, 0xe4, 0xdf, 0x91, 0x1b, 0xcd, 0x71, 0x2d, 0xe5, 0xa6, 0x19, 0x95, 0x09, 0xfc, 0x9b, 0x82, 0x8e, 0x99, 0xde, 0x4c, 0x4d, 0x11, 0x87, 0x2b, 0x9a, 0x3d, 0xdc, 0xc8, 0xd3, 0x23, 0x35, 0x7d, 0x87, 0xbb, 0xcb, 0xbe, 0x89, 0x7a, 0x8e, 0xa8, 0x84, 0x6e, 0xcf, 0x4d, 0x2f, 0x1f, 0xd1, 0xfb, 0x65, 0x4f, 0x58, 0xc1, 0xa3, 0xa7, 0x5c, 0x71, 0x8a, 0x01, 0x98, 0xee, 0x99, 0xd1, 0xde, 0xac, 0xd9, 0x1c, 0x23, 0x70, 0x88, 0x28, 0x83, 0x3b, 0x13, 0xd1, 0xc8, 0x87, 0x31, 0xe5, 0xdf, 0x56, 0x71, 0xa7, 0x81, 0xe7, 0x82, 0x25, 0x9e, 0x95, 0xb8, 0xc9, 0x8c, 0x82, 0xc6, 0xc7, 0x29, 0x80, 0xa1, 0xa6, 0x90, 0x5e, 0xbc, 0x2e, 0x13, 0x49, 0x51, 0x94, 0x67, 0x48, 0xd8, 0x54, 0x05, 0xe9, 0xe5, 0x0b, 0x48, 0xcf, 0x7e, 0x7e, 0x17, 0x7e, 0x05, 0xa0, 0x2f, 0x92, 0xbe, 0xd0, 0x28, 0xae, 0xac, 0x65, 0xae, 0x4b, 0x61, 0x6f, 0x37, 0x2e, 0xd8, 0xb2, 0x54, 0xe6, 0xfd, 0x9d, 0x03, 0x70, 0xcf, 0xb9, 0x29, 0xe7, 0x8c, 0xef, 0x4a, 0xf2, 0xcf, 0xd9, 0x85, 0xfe, 0xf1, 0x69, 0x60, 0x98, 0xe0, 0x0d, 0x87, 0xe0, 0x04, 0x70, 0x53, 0xeb, 0x90, 0x26, 0x7a, 0xa5, 0x57, 0x3a, 0x96, 0x84, 0x0e, 0x60, 0x73, 0x9f, 0x37, 0x0c, 0xb1, 0x4e, 0xc5, 0x29, 0xbe, 0x32, 0x1b, 0x6e, 0xed, 0xdc, 0x28, 0xa2, 0x48, 0x57, 0x3b, 0x78, 0x10, 0xbf, 0x98, 0x39, 0x91, 0x58, 0x35, 0xc4, 0x21, 0x48, 0x13, 0xf1, 0xc3, 0x63, 0xa4, 0x63, 0x97, 0x66, 0x49, 0x6b, 0x32, 0x4c, 0xe5, 0x1b, 0xd8, 0x50, 0xd2, 0x44, 0x91, 0x26, 0xe2, 0x2d, 0x04, 0xab, 0x52, 0x67, 0xe3, 0x8f, 0x29, 0x1c, 0x04, 0x4f, 0xc7, 0xc0, 0xa2, 0x19, 0xb0, 0x87, 0xdd, 0x50, 0xe7, 0xa8, 0xdb, 0x86, 0x78, 0xa4, 0x78, 0x6d, 0xc9, 0xd0, 0x88, 0x69, 0x87, 0xaf, 0xa4, 0x95, 0x61, 0x61, 0xdb, 0x83, 0x94, 0x53, 0xa6, 0xb4, 0xb2, 0x52, 0x24, 0xca, 0x83, 0x5f, 0x14, 0x16, 0xc7, 0x98, 0x51, 0xb5, 0x20, 0xb0, 0xc8, 0xb7, 0xdb, 0xd3, 0xd0, 0x95, 0xce, 0x0d, 0xef, 0xd4, 0x1e, 0x10, 0x8d, 0x8d, 0x8f, 0xb1, 0x12, 0x55, 0x03, 0xd8, 0x64, 0x0b, 0x14, 0xa8, 0xc8, 0x6f, 0x48, 0x47, 0x69, 0x46, 0x96, 0x81, 0xbe, 0xed, 0xf2, 0x39, 0x87, 0x71, 0xc7, 0x95, 0xf8, 0xb1, 0x4c, 0xd9, 0x07, 0xfa, 0x35, 0x93, 0xba, 0x09, 0x70, 0x79, 0xdf, 0x1f, 0x78, 0x8b, 0x12, 0x26, 0x06, 0x1d, 0x8e, 0xf0, 0x16, 0x8a, 0x18, 0xd9, 0xd8, 0xd3, 0x9a, 0x50, 0x76, 0x61, 0x22, 0xdd, 0x87, 0x3d, 0x4c, 0x5a, 0xdf, 0xe3, 0xe9, 0x47, 0x98, 0x5c, 0xac, 0x7a, 0x65, 0x55, 0xb5, 0xd7, 0xd5, 0xe3, 0x2b, 0x7b, 0x26, 0xa9, 0xce, 0xcc, 0x7c, 0x21, 0x8f, 0x7c, 0xcf, 0x28, 0x7e, 0x59, 0xfa, 0x8e, 0xb7, 0xee, 0x60, 0xda, 0x7b, 0xae, 0x73, 0xbe, 0x03, 0xb8, 0x8d, 0xab, 0xa2, 0x0a, 0x55, 0x27, 0xaf, 0x59, 0x96, 0xa0, 0xa5, 0xb4, 0xf0, 0xbc, 0xf8, 0xbe, 0xa6, 0x9d, 0x9b, 0x12, 0xd5, 0x03, 0xfa, 0x38, 0x4b, 0x00, 0x14, 0x4f, 0xe0, 0xe7, 0x49, 0x06, 0x83, 0x96, 0x60, 0x53, 0xe9, 0x08, 0x66, 0xb2, 0x3d, 0x4d, 0xf1, 0x65, 0x51, 0x09, 0x1c, 0x0c, 0x2a, 0x6f, 0xc8, 0x76, 0x3a, 0x4c, 0x98, 0x08, 0x3b, 0x1e, 0xd3, 0x8d, 0x6c, 0x2e, 0xd4, 0xf6, 0x4b, 0x1c, 0xba, 0xfc, 0x75, 0x94, 0xee, 0x1b, 0xa1, 0xa3, 0x9a, 0xa5, 0x57, 0xbc, 0x7e, 0xdb, 0xef, 0x81, 0x65, 0x39, 0x2f, 0x5f, 0x1e, 0x42, 0x5b, 0xb4, 0xe4, 0xf1, 0x46, 0x92, 0x3f, 0x86, 0x89, 0x24, 0xdd, 0x4b, 0x18, 0x49, 0x76, 0xfc, 0x65, 0xbf, 0xe7, 0x11, 0x8a, 0xb8, 0x78, 0xd6, 0x40, 0xe4, 0xd4, 0xc1, 0x8e, 0xa9, 0xe2, 0xb4, 0x9c, 0x8e, 0x7a, 0xcb, 0xca, 0x39, 0x2a, 0xf6, 0x17, 0x0e, 0x69, 0x91, 0xc1, 0x83, 0x1a, 0xe3, 0xfd, 0x49, 0xc1, 0x1f, 0x17, 0xc6, 0xf6, 0x6b, 0x20, 0x86, 0xea, 0xf2, 0x35, 0xaf, 0xf5, 0x3e, 0xd9, 0x11, 0x14, 0xf9, 0x3f, 0x46, 0x71, 0x2a, 0x47, 0x7b, 0xeb, 0xf3, 0xd5, 0xe6, 0x3e, 0xd0, 0xdc, 0xd3, 0x3e, 0x32, 0x82, 0x3d, 0xf2, 0xb8, 0x91, 0xfc, 0xa9, 0x54, 0x43, 0x6a, 0x6f, 0x68, 0xb4, 0x75, 0x49, 0x7f, 0x3e, 0xb9, 0x4e, 0x88, 0x4e, 0xb3, 0xf5, 0xd3, 0x91, 0x21, 0xde, 0xf8, 0x75, 0xd6, 0xed, 0x6c, 0xa0, 0x2c, 0x3a, 0x26, 0x5c, 0xea, 0x82, 0x9d, 0x6c, 0x25, 0x1b, 0x93, 0x64, 0x74, 0x8e, 0xca, 0x8e, 0x1f, 0xba, 0x6d, 0x6c, 0x08, 0xae, 0x42, 0xba, 0x1f, 0x0a, 0x8c, 0xa0, 0x66, 0xd4, 0xda, 0x44, 0x48, 0x29, 0x78, 0x6b, 0xdb, 0x2a, 0x2b, 0xbf, 0x32, 0xd9, 0xb5, 0xf1, 0xf9, 0xc0, 0x78, 0x7b, 0x4a, 0x1f, 0xd8, 0xff, 0xa7, 0xdc, 0x20, 0x1a, 0x69, 0x1c, 0x97, 0x77, 0x49, 0x21, 0x83, 0xf1, 0xb2, 0x5b, 0xfb, 0x4b, 0xb0, 0x7e, 0x32, 0xae, 0x47, 0xb5, 0x2b, 0x3e, 0x34, 0x62, 0xce, 0x5c, 0x37, 0x85, 0x3f, 0x51, 0x4b, 0xa9, 0x98, 0x1f, 0x18, 0x8d, 0xfa, 0x7f, 0x81, 0x70, 0x50, 0x97, 0x48, 0xa7, 0xec, 0x6b, 0xd4, 0xf0, 0x1c, 0x16, 0xfd, 0x54, 0xdc, 0x5d, 0x39, 0x2a, 0x6f, 0x6b, 0x02, 0x75, 0xbb, 0x7b, 0x24, 0xe9, 0xa7, 0xc4, 0xd8, 0xd4, 0x00, 0xbb, 0x8f, 0x17, 0x82, 0x87, 0x06, 0x55, 0x11, 0xd4, 0xd9, 0x95, 0x03, 0x84, 0x13, 0xec, 0xf7, 0x60, 0x30, 0xb5, 0xf1, 0xcb, 0x4b, 0xa7, 0x60, 0xd4, 0x4f, 0x4c, 0xfd, 0x37, 0x3b, 0x13, 0x89, 0xc2, 0x95, 0xbe, 0x90, 0xf8, 0x00, 0x7e, 0xcb, 0x24, 0x1e, 0xd9, 0x54, 0x73, 0x7f, 0x1e, 0xdc, 0x6c, 0x27, 0x57, 0x39, 0x2b, 0x94, 0x03, 0x41, 0x4b, 0xeb, 0xa7, 0x2b, 0x03, 0xd6, 0xf4, 0xb2, 0xc4, 0x3f, 0xa1, 0x60, 0x2d, 0x76, 0xa3, 0x43, 0x1f, 0x7c, 0xfe, 0x0e, 0x2f, 0x07, 0xb0, 0x4f, 0x7e, 0xd8, 0xca, 0x9f, 0xcb, 0xec, 0x32, 0x77, 0xce, 0x67, 0xcf, 0x06, 0xbd, 0xd1, 0xe4, 0x3c, 0x24, 0x6e, 0x9e, 0x82, 0x7a, 0x4c, 0xa9, 0xa2, 0xd5, 0xe5, 0xe7, 0x8c, 0x94, 0x1f, 0x6b, 0x1a, 0xf8, 0x2b, 0x31, 0xb1, 0x87, 0xbd, 0xd3, 0x76, 0x0d, 0x41, 0xeb, 0x72, 0x0a, 0xd0, 0x15, 0xad, 0x74, 0x16, 0xb8, 0x53, 0x79, 0xd6, 0xf9, 0xa7, 0x67, 0x6d, 0x0d, 0x22, 0xc2, 0xe2, 0x7c, 0xb6, 0xbc, 0x06, 0x77, 0xe9, 0x1e, 0xcb, 0xd2, 0xfa, 0xfd, 0x68, 0x57, 0x3e, 0x22, 0x5c, 0xe9, 0xe4, 0x61, 0x12, 0xd0, 0x9f, 0xfa, 0x38, 0x31, 0x5f, 0x40, 0xe2, 0x3d, 0xbe, 0x39, 0xff, 0x02, 0x78, 0x31, 0xa4, 0x39, 0xc4, 0xe2, 0xcc, 0x3c, 0xde, 0x8b, 0x24, 0x89, 0x8c, 0xba, 0x3f, 0x2f, 0x1a, 0x23, 0x1c, 0x27, 0x38, 0x34, 0xeb, 0x7a, 0x99, 0x0b, 0x61, 0x2c, 0x6a, 0xd8, 0xe8, 0xcd, 0x64, 0xce, 0x9d, 0x63, 0x31, 0xb0, 0xad, 0xdf, 0x0b, 0x81, 0xcc, 0x78, 0x5b, 0x3f, 0xa7, 0x52, 0x92, 0x5d, 0xf0, 0xd4, 0xed, 0x6f, 0xb1, 0xc3, 0x37, 0xde, 0x57, 0x05, 0xd6, 0xdd, 0x10, 0x14, 0x7c, 0x00, 0xde, 0x08, 0x54, 0x8f, 0x07, 0xb5, 0xd7, 0x8d, 0x1f, 0x5f, 0x6f, 0x5f, 0x27, 0x3c, 0x80, 0xd5, 0xfa, 0xdb, 0x26, 0x0f, 0x63, 0xda, 0x1c, 0xf4, 0xb7, 0x36, 0xc1, 0x1c, 0x79, 0x9d, 0xe3, 0xbd, 0xae, 0x3f, 0xfb, 0x41, 0xe2, 0x41, 0xe8, 0xa9, 0x6e, 0x01, 0x16, 0x59, 0xf0, 0x1c, 0x2b, 0x25, 0xc7, 0x05, 0xc6, 0x72, 0x51, 0x40, 0x4d, 0xa1, 0x2e, 0x31, 0xbf, 0xd9, 0x13, 0x4f, 0x9d, 0x6b, 0xce, 0xfb, 0x4a, 0xb1, 0xb5, 0xfa, 0x1f, 0x94, 0x88, 0x07, 0x43, 0x48, 0x12, 0x63, 0x40, 0x24, 0xaf, 0xfd, 0x67, 0x50, 0x21, 0xc9, 0xf0, 0x3f, 0xaa, 0xeb, 0xb1, 0xcf, 0x48, 0x2d, 0x93, 0x92, 0xfd, 0xdf, 0x21, 0xb1, 0xda, 0xa1, 0x26, 0xca, 0x9d, 0x76, 0xc1, 0xab, 0x01, 0x76, 0x7b, 0x5e, 0x08, 0xa7, 0xd1, 0x1f, 0x1c, 0x89, 0x50, 0x25, 0x39, 0x0e, 0xa5, 0x04, 0x1c, 0x13, 0xf6, 0x21, 0x6e, 0xbe, 0x6f, 0xc9, 0x6e, 0x6c, 0x84, 0xa1, 0x41, 0xdd, 0xa3, 0x95, 0x65, 0x50, 0xcf, 0xca, 0xac, 0x1a, 0xa3, 0x4d, 0x86, 0x12, 0x23, 0x5b, 0x3a, 0xaa, 0x43, 0xac, 0x04, 0x43, 0x81, 0x77, 0xa8, 0x59, 0xf8, 0x0f, 0xb9, 0x33, 0xd9, 0x24, 0x18, 0x3b, 0x53, 0xea, 0x97, 0x88, 0x30, 0x84, 0xb0, 0x72, 0x5b, 0x49, 0x6d, 0x27, 0xbe, 0x14, 0x71, 0x5a, 0xf2, 0x9d, 0x21, 0xae, 0xc2, 0xf6, 0x37, 0x31, 0xd1, 0xba, 0x66, 0x58, 0xfe, 0xf9, 0x31, 0x3e, 0x51, 0x95, 0xd4, 0x8f, 0x27, 0x7f, 0x91, 0xeb, 0xe6, 0x94, 0x16, 0xb6, 0x0e, 0x2e, 0x28, 0x9f, 0x8d, 0x2e, 0x47, 0x37, 0x01, 0x9c, 0x60, 0x16, 0xc1, 0xd6, 0x06, 0xfc, 0x59, 0x55, 0x1d, 0x2e, 0xbf, 0x62, 0x72, 0xc3, 0xaa, 0x18, 0x5e, 0x97, 0x33, 0x61, 0x8a, 0x8a, 0xa0, 0xdd, 0x4a, 0x41, 0x4e, 0x72, 0xf9, 0x98, 0xbf, 0xc7, 0x06, 0xbb, 0x35, 0x61, 0x48, 0x60, 0xdf, 0xa1, 0xba, 0xcf, 0x25, 0x4a, 0x09, 0x3b, 0xff, 0xd6, 0xf1, 0xc0, 0xc7, 0xa3, 0x2e, 0x50, 0x3e, 0x07, 0xb7, 0x02, 0x29, 0xbd, 0x69, 0x70, 0xd7, 0xa5, 0xc4, 0xda, 0x7a, 0xc5, 0xdb, 0x0c, 0x2e, 0xde, 0xc7, 0x4d, 0x57, 0x93, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x07, 0xec, 0x81, 0x00, 0x00, 0x48, 0x7d, 0x43, 0xe1, 0xdb, 0x54, 0x90, 0x90, 0x65, 0x1f, 0xe2, 0xac, 0x42, 0x11, 0xbc, 0x94, 0x4c, 0xa0, 0x08, 0x07, 0x9e, 0x23, 0x7d, 0x4f, 0x8b, 0xe8, 0x12, 0x1c, 0x18, 0xbb, 0x03, 0x67, 0x80, 0x32, 0x88, 0x98, 0x45, 0x91, 0xb1, 0x4a, 0x0f, 0xca, 0x75, 0xf8, 0x03, 0x59, 0x88, 0x96, 0x5a, 0x37, 0xf3, 0xd1, 0xe0, 0x0d, 0x27, 0x07, 0x66, 0x0c, 0xe5, 0x75, 0x2d, 0x29, 0x88, 0xfc, 0xc4, 0x71, 0x0a, 0xd0, 0x78, 0xab, 0xb1, 0x96, 0xca, 0x3f, 0xa5, 0x71, 0x15, 0xc7, 0x16, 0x2e, 0xd6, 0xf4, 0x10, 0x42, 0xf0, 0x28, 0x8d, 0xba, 0xae, 0x36, 0xcc, 0x72, 0xe1, 0x78, 0x40, 0xb1, 0x6d, 0xc9, 0x4b, 0x21, 0x8d, 0xc1, 0xa6, 0x66, 0x4d, 0xa3, 0x4e, 0x4e, 0xc1, 0x0c, 0x6f, 0x54, 0xe3, 0xb8, 0xab, 0x1b, 0xc5, 0xe3, 0x58, 0x9c, 0xbd, 0x89, 0xfb, 0xca, 0xaa, 0x65, 0x2b, 0xf9, 0x7e, 0x59, 0x08, 0xde, 0xb9, 0xc9, 0xde, 0x56, 0x72, 0x61, 0xba, 0xe2, 0x9f, 0x4a, 0x02, 0x03, 0x86, 0xa2, 0x96, 0x33, 0xf8, 0x52, 0xc6, 0xf3, 0x05, 0xb7, 0x80, 0x74, 0xeb, 0x05, 0x6d, 0x07, 0x07, 0x44, 0x2f, 0xf7, 0xc2, 0xf5, 0xd7, 0x20, 0x3a, 0xbb, 0x07, 0x13, 0x70, 0xcc, 0xb1, 0x76, 0x51, 0x4d, 0xfc, 0x33, 0xf4, 0x60, 0x09, 0xf8, 0x47, 0xc8, 0xde, 0x4e, 0x7c, 0x2b, 0x0a, 0x59, 0x9a, 0x89, 0x9c, 0x56, 0x6c, 0xd8, 0x3d, 0x85, 0x8e, 0xa3, 0xe4, 0x20, 0x13, 0xf9, 0xf0, 0x84, 0x4b, 0x51, 0x4e, 0x75, 0xbd, 0xac, 0xd8, 0x5b, 0x04, 0x4b, 0x2e, 0xbe, 0xf3, 0xb7, 0xa3, 0x0a, 0xe2, 0x14, 0x4e, 0xc5, 0xc7, 0x30, 0xc0, 0xe1, 0xab, 0x2c, 0x9d, 0xec, 0x74, 0x64, 0x83, 0x19, 0x6c, 0x05, 0x81, 0x5c, 0x89, 0xf5, 0x99, 0xa2, 0x8b, 0x8b, 0x86, 0x9f, 0xcf, 0xb3, 0x3f, 0xcf, 0x1a, 0x12, 0x49, 0xc6, 0xa6, 0xaa, 0x5c, 0x60, 0x06, 0x99, 0x97, 0x1e, 0x6f, 0x65, 0xe6, 0x91, 0x51, 0x0b, 0x76, 0xca, 0x14, 0x05, 0x37, 0x77, 0x7f, 0x9c, 0x0e, 0xc9, 0x15, 0x05, 0xd7, 0xd9, 0x52, 0x16, 0x68, 0x41, 0x27, 0xb4, 0x95, 0xe1, 0xf1, 0xe6, 0x35, 0x66, 0x0f, 0x26, 0xc5, 0x42, 0xde, 0xab, 0xa8, 0x34, 0x16, 0xb1, 0x4e, 0x7c, 0x5a, 0xc1, 0xe7, 0x29, 0x5b, 0x32, 0x44, 0x3d, 0xea, 0xa0, 0x59, 0xf6, 0xa9, 0x7a, 0x94, 0x9f, 0x14, 0x0c, 0xc5, 0x75, 0xc7, 0x94, 0xfc, 0xcf, 0xd7, 0x0c, 0xe6, 0x1b, 0x79, 0x9b, 0x9e, 0x25, 0xfd, 0x0e, 0xa1, 0xe3, 0xb7, 0xf4, 0x35, 0x71, 0x7e, 0xd0, 0x18, 0x50, 0x07, 0xf6, 0xe8, 0xf5, 0x82, 0x29, 0xd6, 0x47, 0xa8, 0x4f, 0xa7, 0xd0, 0xcb, 0x87, 0x60, 0xdb, 0x7a, 0xe8, 0x7b, 0x30, 0xbc, 0xeb, 0x43, 0x81, 0x9f, 0x1e, 0x1b, 0xec, 0xef, 0x0e, 0x52, 0x9b, 0xd8, 0x5d, 0xb5, 0x45, 0x3e, 0x35, 0x33, 0xc7, 0x99, 0x7b, 0xdb, 0x12, 0xb9, 0x92, 0xa7, 0xd6, 0xb3, 0xf1, 0x7e, 0x53, 0x61, 0x40, 0x1f, 0xf2, 0x48, 0x45, 0xc3, 0x9f, 0xbe, 0x1f, 0xb8, 0x24, 0x2b, 0xa3, 0xcb, 0x0d, 0xbf, 0xe5, 0xb0, 0x1a, 0x0a, 0xc0, 0xd8, 0x68, 0x51, 0x1e, 0x06, 0xfe, 0xad, 0x88, 0x0f, 0xd3, 0xe5, 0x49, 0x9e, 0xf6, 0x79, 0x21, 0x68, 0x98, 0xda, 0x23, 0x5b, 0x55, 0xd9, 0xba, 0xd9, 0xa4, 0x6a, 0x47, 0x46, 0x3d, 0xbc, 0xd7, 0xdb, 0xa6, 0x95, 0x8a, 0x24, 0xc8, 0x52, 0x95, 0xfd, 0xcd, 0xf2, 0x71, 0x8c, 0x60, 0x7e, 0x60, 0xa4, 0xe4, 0xe0, 0x42, 0x25, 0x2c, 0x33, 0x5a, 0x94, 0x87, 0xd0, 0x95, 0x00, 0xd8, 0xd1, 0xa2, 0x85, 0xa5, 0x04, 0xd6, 0x61, 0xb3, 0x3b, 0xa1, 0x01, 0xb1, 0xe8, 0x1d, 0xd0, 0x1b, 0xf1, 0xbc, 0xda, 0xe7, 0xa9, 0x07, 0x58, 0xd5, 0x82, 0x68, 0x09, 0x1a, 0xe3, 0xb4, 0x1e, 0x98, 0x8b, 0xce, 0xe1, 0x73, 0xf2, 0x5e, 0xa8, 0xe7, 0xa3, 0x66, 0xb1, 0x47, 0x61, 0x56, 0x70, 0x90, 0xb2, 0xe0, 0x39, 0x24, 0x7f, 0x02, 0x73, 0x65, 0x0d, 0x0f, 0x51, 0x93, 0x22, 0x82, 0x20, 0xd1, 0xdd, 0x4c, 0x3e, 0xe8, 0xf6, 0xe1, 0x16, 0x58, 0xaf, 0x1f, 0x03, 0xd5, 0x8b, 0x28, 0x2d, 0x19, 0x74, 0x28, 0xe5, 0xbc, 0x76, 0xb2, 0x0e, 0xb5, 0xb4, 0x69, 0x5b, 0xf4, 0x87, 0x5a, 0xd9, 0xcd, 0x9f, 0xf4, 0xe0, 0xfc, 0x92, 0xf2, 0x16, 0x34, 0x9a, 0xc7, 0x36, 0x62, 0xff, 0x47, 0x19, 0x11, 0x02, 0x45, 0x67, 0xfa, 0xec, 0x45, 0xf0, 0xaf, 0x5b, 0x85, 0x21, 0x10, 0x49, 0xcc, 0x1b, 0xeb, 0x60, 0x02, 0x89, 0x52, 0x06, 0xf7, 0x72, 0xeb, 0xd2, 0xf6, 0x69, 0x44, 0xe4, 0xbe, 0xc0, 0x46, 0x16, 0xf7, 0x61, 0x55, 0x0b, 0x15, 0x61, 0x37, 0x4a, 0x7e, 0x1e, 0xa5, 0xd3, 0xe7, 0xab, 0x13, 0xca, 0xab, 0x33, 0x13, 0x77, 0x25, 0x9e, 0x2e, 0xf1, 0xe2, 0x00, 0x9c, 0x17, 0x38, 0x65, 0xb1, 0x49, 0x34, 0xea, 0xd8, 0x28, 0x3d, 0x6f, 0xc3, 0x6d, 0xc6, 0x9e, 0xdc, 0xe3, 0x28, 0xae, 0xe4, 0xf2, 0x2b, 0x6e, 0x78, 0x0b, 0x78, 0x09, 0xdb, 0x76, 0x56, 0x98, 0x8e, 0x71, 0xb4, 0x09, 0x76, 0x72, 0xd0, 0xfe, 0x3a, 0x5c, 0x6f, 0x0f, 0x30, 0x68, 0xb5, 0x14, 0x84, 0x83, 0xfc, 0xd4, 0x65, 0x92, 0x35, 0xec, 0x32, 0xbd, 0xb7, 0x76, 0x5f, 0xa9, 0x51, 0x61, 0x54, 0x00, 0x69, 0x67, 0x2f, 0x74, 0x2c, 0x42, 0xf6, 0xed, 0x17, 0x0d, 0x40, 0x43, 0x68, 0xcf, 0x66, 0xb2, 0x98, 0x36, 0x99, 0x2a, 0x72, 0x69, 0xff, 0x4c, 0xa4, 0x71, 0x69, 0xf3, 0x62, 0xb5, 0x21, 0xac, 0x9f, 0x7c, 0x5e, 0x15, 0x95, 0xd4, 0xbb, 0xa1, 0x5b, 0xc8, 0x73, 0x9a, 0x1f, 0xdb, 0x57, 0x7e, 0x3e, 0x9e, 0x80, 0x99, 0xab, 0xb6, 0xd4, 0x9f, 0xf0, 0xaf, 0x95, 0x2b, 0xf6, 0x39, 0x41, 0xb1, 0x77, 0x53, 0x45, 0xc7, 0x66, 0x17, 0xa9, 0xce, 0xac, 0xd5, 0xa9, 0xcf, 0xc3, 0x9e, 0x51, 0xe0, 0x5b, 0x1a, 0x84, 0xbe, 0xcd, 0xc7, 0xa6, 0x56, 0x29, 0x05, 0x57, 0x3a, 0xfe, 0xf1, 0x6f, 0x3e, 0xc6, 0x02, 0x2b, 0xbe, 0xd9, 0xa8, 0xa3, 0x6e, 0x0e, 0xe1, 0x86, 0x3a, 0xdc, 0x9a, 0x81, 0x71, 0xd8, 0x1d, 0xb4, 0xd7, 0xf0, 0xd7, 0x20, 0x45, 0x41, 0x79, 0xe3, 0x1c, 0xe1, 0x80, 0xb4, 0xb1, 0x11, 0xab, 0x25, 0xdd, 0xb5, 0x4e, 0x75, 0x29, 0x40, 0xcf, 0x83, 0x81, 0xd8, 0x28, 0x07, 0x36, 0x9c, 0xa8, 0x9c, 0x77, 0x6d, 0x77, 0x5f, 0xc6, 0x70, 0xf3, 0x5a, 0x95, 0x04, 0x1f, 0x13, 0x1d, 0x14, 0xad, 0xa5, 0xb9, 0x9c, 0xcb, 0xdf, 0xda, 0xe1, 0x71, 0xb4, 0x08, 0x26, 0x2b, 0x4e, 0x44, 0xd7, 0x0d, 0x7c, 0xfb, 0xb9, 0x1a, 0xab, 0xb3, 0xab, 0x03, 0x01, 0xda, 0xb1, 0x99, 0x15, 0x23, 0x8e, 0xaa, 0x46, 0x3f, 0x93, 0x36, 0xb6, 0x94, 0x96, 0x0e, 0x6e, 0x92, 0x70, 0x3c, 0x27, 0xf8, 0x7e, 0x89, 0xfa, 0xcd, 0x2d, 0xa8, 0xf0, 0xb7, 0x81, 0x38, 0x54, 0xac, 0xca, 0xec, 0xc0, 0x3b, 0x51, 0x7f, 0x86, 0xb7, 0xa3, 0x03, 0x0c, 0x71, 0xf4, 0xa3, 0x8d, 0x4a, 0x73, 0x03, 0x81, 0xe8, 0x5c, 0x20, 0x39, 0x97, 0xbd, 0x1b, 0x05, 0xcc, 0xe0, 0x9d, 0x7e, 0x7b, 0x48, 0x7e, 0xdb, 0x39, 0xdf, 0xe6, 0xf2, 0xc4, 0x45, 0xf5, 0xe2, 0xc7, 0xb7, 0xe8, 0xb8, 0x1b, 0x50, 0xa3, 0xf5, 0xf4, 0xb1, 0x81, 0x60, 0xbd, 0x69, 0x20, 0x6e, 0x63, 0xa3, 0x80, 0xe6, 0x54, 0x4b, 0x57, 0x93, 0x9d, 0x9e, 0xa2, 0x6a, 0xb4, 0x43, 0x6b, 0x02, 0xdd, 0x1d, 0xa0, 0xec, 0xe3, 0xa1, 0x3c, 0x64, 0x4d, 0xec, 0xf4, 0x33, 0x37, 0x5e, 0x24, 0x1e, 0x96, 0x42, 0x89, 0x86, 0x0b, 0x47, 0x88, 0xf1, 0x8a, 0xa9, 0x30, 0xb3, 0x54, 0xc1, 0xa7, 0x1f, 0x88, 0xb5, 0xac, 0xf7, 0x70, 0xfc, 0x00, 0x14, 0xd7, 0xdc, 0x43, 0x4e, 0xbd, 0x20, 0x1f, 0x55, 0x63, 0xb3, 0x04, 0xff, 0x01, 0x83, 0xcb, 0x37, 0x6b, 0xf7, 0x18, 0x81, 0x0c, 0xf3, 0x95, 0x0e, 0xe2, 0x1e, 0x2b, 0x55, 0x69, 0xbe, 0x05, 0x66, 0xe0, 0x8e, 0x67, 0x90, 0xe6, 0xcf, 0xb9, 0x1b, 0xa3, 0x83, 0x17, 0x43, 0xdb, 0x06, 0xe7, 0x38, 0x38, 0x69, 0x08, 0x8f, 0x82, 0xc0, 0xa7, 0x33, 0xdf, 0xf4, 0x84, 0xe0, 0x43, 0xd2, 0x20, 0x0d, 0xcf, 0x15, 0x63, 0x67, 0xa9, 0xe1, 0xb3, 0x9d, 0xe5, 0x5c, 0x90, 0xc3, 0x11, 0xfc, 0x4d, 0x88, 0x3c, 0x5e, 0x26, 0x57, 0x15, 0x3e, 0xcd, 0xce, 0x7b, 0xd3, 0xfd, 0x2d, 0x5e, 0x0c, 0x9e, 0x48, 0x9b, 0xb9, 0x20, 0x0f, 0x7a, 0xce, 0x92, 0x86, 0xc8, 0x50, 0xef, 0xa5, 0xe8, 0x84, 0x9a, 0xb5, 0x2b, 0xa5, 0x0e, 0xdc, 0x2c, 0x2c, 0x47, 0x68, 0x2a, 0x1c, 0xb9, 0x3c, 0x91, 0x24, 0x60, 0x24, 0xe7, 0xfd, 0x22, 0x78, 0xcd, 0x64, 0x3e, 0x05, 0xb9, 0x4f, 0x28, 0x98, 0x4b, 0x83, 0x73, 0x81, 0x21, 0x00, 0xea, 0x33, 0x03, 0x7e, 0xe2, 0x6c, 0x22, 0xac, 0x71, 0xcc, 0x38, 0x6f, 0xdd, 0x93, 0xd0, 0xef, 0x27, 0x6e, 0xb8, 0xf9, 0x15, 0x60, 0xfe, 0x59, 0x76, 0xb7, 0x30, 0x65, 0xaf, 0xdd, 0xc7, 0x89, 0x06, 0x15, 0x89, 0x82, 0x49, 0x2a, 0xcb, 0x9a, 0xda, 0xbe, 0x98, 0x74, 0xa4, 0x38, 0x41, 0xd0, 0x8e, 0x37, 0x59, 0x00, 0x82, 0x12, 0xec, 0xe1, 0x98, 0x6a, 0x7e, 0xc8, 0x19, 0xee, 0xba, 0xd2, 0xb3, 0xf3, 0x66, 0x75, 0xc4, 0xf6, 0x35, 0x80, 0xc2, 0x39, 0x04, 0xc2, 0x78, 0xde, 0xd9, 0xa7, 0x19, 0x4e, 0xb8, 0xc0, 0xf1, 0xda, 0x29, 0x01, 0xee, 0xd1, 0xda, 0xa4, 0xb0, 0xdd, 0x1e, 0x15, 0x90, 0x0d, 0x0d, 0x86, 0xd3, 0xb4, 0xf2, 0xf4, 0x3b, 0x05, 0x67, 0x8c, 0x39, 0x6f, 0xfe, 0x4b, 0xa5, 0xa1, 0x21, 0x24, 0x0f, 0x81, 0xf4, 0x3c, 0x38, 0xff, 0xd6, 0x0d, 0x26, 0xb5, 0x3f, 0xd8, 0x2b, 0xcd, 0x77, 0xe2, 0xab, 0xd0, 0xa6, 0xa4, 0x70, 0xfb, 0x2a, 0x8a, 0xbe, 0x07, 0x4e, 0x91, 0x6f, 0x3b, 0x1e, 0xe8, 0x13, 0xfa, 0xd3, 0xd6, 0xf6, 0x74, 0x67, 0xc9, 0xb1, 0xf1, 0x7f, 0x9a, 0xe8, 0xae, 0x0c, 0x1f, 0xa8, 0xf9, 0xcc, 0x34, 0x39, 0x04, 0x96, 0x28, 0x6b, 0x5e, 0xa9, 0x11, 0x37, 0xe1, 0xf5, 0x53, 0x40, 0x17, 0x40, 0xea, 0x99, 0x81, 0x93, 0x99, 0x4c, 0x6a, 0x78, 0x4d, 0x54, 0x4c, 0x6a, 0x66, 0x93, 0xf3, 0xe8, 0x8f, 0x8e, 0xfa, 0xd7, 0x13, 0x0f, 0xe8, 0xcc, 0x46, 0x3c, 0x92, 0x1a, 0xb3, 0x66, 0x15, 0x3b, 0x9d, 0xab, 0x81, 0x34, 0x6f, 0xac, 0x15, 0x62, 0x44, 0xa3, 0x67, 0x50, 0xa9, 0x77, 0x1d, 0x1e, 0x0f, 0xac, 0xb4, 0xcb, 0xaf, 0x29, 0xbc, 0x36, 0xfb, 0xdb, 0x5c, 0x83, 0x4b, 0x35, 0xd5, 0x77, 0x59, 0x0e, 0x21, 0x46, 0x57, 0x21, 0xb6, 0x1a, 0x10, 0xcb, 0xc1, 0x7a, 0x7f, 0x58, 0xfd, 0xe7, 0xaa, 0x5b, 0xcb, 0xa4, 0xdd, 0x2c, 0x12, 0x2d, 0xd2, 0xf3, 0x62, 0xda, 0xe7, 0x4e, 0x57, 0x34, 0xcf, 0x76, 0xf7, 0x01, 0x2f, 0x7b, 0xa1, 0x65, 0x02, 0x98, 0xad, 0xe2, 0xa2, 0x60, 0xf0, 0xf6, 0xed, 0x98, 0xcc, 0xc3, 0x33, 0x4f, 0x19, 0xf7, 0xee, 0x85, 0xd4, 0x26, 0x2c, 0x22, 0xb8, 0x34, 0xe6, 0xfe, 0xce, 0xec, 0x4d, 0x96, 0x87, 0x58, 0x83, 0xd5, 0x36, 0x04, 0x6d, 0x52, 0x60, 0x65, 0x0e, 0x31, 0x59, 0x53, 0xb7, 0x12, 0x06, 0x6b, 0x0a, 0xf6, 0x45, 0x56, 0x5e, 0xaf, 0x86, 0x17, 0xbc, 0x1b, 0x10, 0xc8, 0x04, 0x63, 0xe6, 0xf2, 0xa9, 0x55, 0xe5, 0x00, 0x16, 0xc8, 0x7c, 0x0e, 0xa2, 0x1a, 0x60, 0x94, 0xf8, 0x75, 0x5e, 0x08, 0x67, 0xcd, 0x3a, 0x84, 0x45, 0x88, 0x71, 0x45, 0x82, 0x93, 0x01, 0xd0, 0x80, 0x12, 0x02, 0x2c, 0x55, 0xe2, 0x70, 0x0c, 0x05, 0xdf, 0xff, 0xa3, 0x8e, 0x57, 0x1f, 0xbe, 0x01, 0x6b, 0x98, 0x40, 0xde, 0x60, 0xdb, 0x18, 0xa3, 0xe6, 0xfc, 0x79, 0x4e, 0xac, 0x04, 0x99, 0x8c, 0xca, 0xb2, 0x32, 0xc9, 0x51, 0x7c, 0x6f, 0x97, 0xca, 0x42, 0x4c, 0xd4, 0x07, 0x2b, 0x0c, 0x19, 0x69, 0x32, 0x1c, 0x86, 0xa2, 0x57, 0x6d, 0xbd, 0x0c, 0x6c, 0xd7, 0xb4, 0x24, 0xff, 0x63, 0x88, 0xe8, 0xef, 0x2b, 0x66, 0x63, 0xa8, 0xea, 0x4b, 0x27, 0x02, 0xac, 0x5b, 0x01, 0xa8, 0xdf, 0x9f, 0x5b, 0x8a, 0xf0, 0xaf, 0x60, 0x9b, 0xe4, 0x90, 0xd0, 0x90, 0x92, 0x6c, 0x5b, 0x9a, 0x0c, 0x03, 0x9f, 0xd7, 0x5d, 0x28, 0xfa, 0x27, 0xcb, 0x1d, 0x6b, 0x2b, 0x43, 0x50, 0x6b, 0xca, 0xd5, 0x1b, 0x41, 0x35, 0x59, 0x28, 0x97, 0x56, 0x2f, 0xa8, 0x03, 0x9a, 0xd9, 0x91, 0xff, 0x17, 0x32, 0x0b, 0x28, 0x49, 0x11, 0x37, 0x07, 0x05, 0xb3, 0x21, 0x51, 0xf3, 0x08, 0x81, 0x7a, 0xc1, 0x5d, 0x37, 0x40, 0xa5, 0xe8, 0x31, 0xcf, 0x85, 0x01, 0x3f, 0xa6, 0xff, 0xa4, 0x06, 0xcb, 0x8a, 0x8b, 0xd8, 0x18, 0xa7, 0x90, 0xaf, 0x81, 0x36, 0x4d, 0xdf, 0x81, 0xd9, 0xd0, 0x63, 0x61, 0x9e, 0xc8, 0x33, 0x5a, 0xd5, 0xc9, 0xaa, 0x66, 0xcb, 0x56, 0x57, 0xc5, 0x06, 0x71, 0x68, 0xbf, 0xe0, 0x1a, 0x8e, 0xf7, 0x7a, 0x02, 0xa9, 0x62, 0x43, 0xc0, 0xe7, 0x31, 0x7d, 0x27, 0xfe, 0xc6, 0xd9, 0xd5, 0xb4, 0xee, 0x0d, 0x50, 0x8a, 0x2a, 0xf4, 0xac, 0x9b, 0x78, 0x10, 0x0d, 0xc9, 0xef, 0x01, 0x84, 0x34, 0xd4, 0x0e, 0x7a, 0xfb, 0xc9, 0x1c, 0x13, 0x4e, 0xd6, 0x44, 0xd1, 0xed, 0x3c, 0xf4, 0x04, 0x15, 0xd0, 0x7a, 0xbc, 0x0f, 0x5c, 0x2d, 0xa6, 0x42, 0xaa, 0xdf, 0xfc, 0xde, 0x35, 0xf4, 0x7b, 0x38, 0x7f, 0xe3, 0x99, 0x72, 0x5f, 0x07, 0x33, 0x9f, 0x71, 0x73, 0x02, 0x2f, 0x5a, 0xba, 0x5a, 0xd3, 0x21, 0x42, 0x56, 0xf4, 0x52, 0x7d, 0x2a, 0xe7, 0x00, 0x23, 0xea, 0x76, 0xea, 0x2e, 0xb4, 0x89, 0xc5, 0x5a, 0x0d, 0x69, 0xa0, 0x0b, 0xad, 0x8e, 0xd5, 0x20, 0x23, 0x2d, 0xb0, 0xf8, 0x8e, 0xa2, 0x78, 0xc3, 0xea, 0xd4, 0x48, 0x4d, 0x66, 0x88, 0x83, 0xc1, 0xa6, 0x9f, 0xf7, 0x6d, 0x3d, 0x44, 0xce, 0x22, 0x4d, 0x4a, 0x43, 0xcd, 0x81, 0xa1, 0x06, 0xa9, 0x32, 0xfc, 0x47, 0x0c, 0x41, 0x5c, 0xa1, 0x74, 0x0e, 0x36, 0xd5, 0x9c, 0x93, 0x23, 0x0a, 0xdb, 0x15, 0x33, 0x6c, 0xa3, 0xa1, 0xa1, 0xf6, 0x7a, 0xbc, 0xe9, 0xa3, 0x5e, 0x83, 0x0a, 0xa1, 0x9a, 0xd7, 0xb5, 0x70, 0x78, 0xc5, 0xb1, 0xdf, 0x94, 0xf6, 0x16, 0xa4, 0x5e, 0xe6, 0x4b, 0xa6, 0x2e, 0x89, 0x7f, 0xb2, 0xde, 0x40, 0x50, 0x39, 0x8e, 0xf5, 0x52, 0x80, 0xbe, 0x56, 0x8f, 0x5e, 0x3e, 0xd0, 0x91, 0x82, 0x73, 0xf7, 0x9a, 0xe9, 0xef, 0x2a, 0x70, 0xe1, 0x5d, 0xbf, 0xf8, 0xca, 0x05, 0x0c, 0x20, 0xd8, 0xf9, 0xb7, 0x1f, 0xf9, 0xdf, 0xc8, 0x38, 0xd2, 0x21, 0x77, 0xd8, 0x2e, 0x6b, 0xda, 0x11, 0x7d, 0x01, 0xfa, 0x5d, 0x95, 0x44, 0x86, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x07, 0xec, 0x81, 0x00, 0x00, 0xc4, 0x7a, 0x33, 0xf0, 0xf1, 0x4a, 0x5d, 0x7b, 0xe7, 0x1a, 0x12, 0xf2, 0x08, 0x12, 0xe6, 0x62, 0x45, 0x6b, 0x2e, 0x93, 0x7b, 0x50, 0x92, 0x1f, 0x9a, 0x78, 0x3c, 0x07, 0x79, 0xb9, 0x82, 0x19, 0xd8, 0x11, 0xfe, 0x50, 0x92, 0x8d, 0x73, 0x56, 0xea, 0xc3, 0x5c, 0xa3, 0x91, 0x81, 0x82, 0x45, 0xc7, 0x40, 0x35, 0xcf, 0xe3, 0x65, 0xa3, 0xbc, 0xf5, 0xe2, 0xc6, 0xc2, 0x05, 0xc0, 0xe3, 0x4d, 0x44, 0xc5, 0xa3, 0xd7, 0xea, 0x96, 0x0f, 0x34, 0xb2, 0x87, 0x35, 0xaa, 0x76, 0xb8, 0xe3, 0x3e, 0x97, 0x71, 0x5f, 0xbc, 0xc8, 0x27, 0x9e, 0x78, 0xbd, 0x1c, 0x0f, 0x04, 0x19, 0x0f, 0x1e, 0x42, 0x25, 0x98, 0xea, 0x68, 0x09, 0x1c, 0x6a, 0xb9, 0xb6, 0xe2, 0xec, 0x1d, 0x7d, 0xf7, 0xca, 0x9f, 0x24, 0xe1, 0x97, 0x2b, 0xb5, 0x1e, 0xc8, 0x2e, 0x8f, 0x98, 0x5f, 0xc2, 0x32, 0xe0, 0x39, 0xc7, 0xd9, 0xf9, 0x8d, 0x58, 0xae, 0xb5, 0x2e, 0xee, 0xda, 0xf7, 0x85, 0x28, 0x9b, 0x49, 0xb9, 0xd4, 0x62, 0x72, 0x54, 0x9a, 0xac, 0x78, 0x42, 0x58, 0xdd, 0x00, 0x42, 0x77, 0xd1, 0xc0, 0xdc, 0xc2, 0xdd, 0xe8, 0x43, 0x35, 0x5a, 0x69, 0xa8, 0x58, 0xe0, 0xe1, 0x11, 0xe7, 0x8a, 0xa8, 0x37, 0x4a, 0xbd, 0x79, 0x03, 0x17, 0x9e, 0xd8, 0xa5, 0x3f, 0x0d, 0x7e, 0x78, 0xf8, 0xa2, 0x50, 0x40, 0x82, 0x34, 0xf2, 0x95, 0x89, 0x72, 0x61, 0xd3, 0x2b, 0x33, 0x25, 0x90, 0x7f, 0xba, 0x74, 0xde, 0xed, 0x69, 0x71, 0x01, 0xad, 0x0a, 0x9b, 0x89, 0x03, 0xcc, 0x2a, 0x87, 0xfb, 0x55, 0x5c, 0xc3, 0xce, 0xd9, 0x3b, 0x59, 0x26, 0xa3, 0x57, 0x00, 0xb2, 0x81, 0x90, 0x26, 0x2f, 0x24, 0x8b, 0x83, 0xa7, 0x85, 0x76, 0xb8, 0xcd, 0xe1, 0x5c, 0xd4, 0xac, 0x38, 0x78, 0x19, 0x9a, 0xff, 0x3b, 0xa5, 0x68, 0x2c, 0x04, 0xed, 0xfd, 0x11, 0x28, 0xda, 0xdc, 0xf3, 0xf9, 0x43, 0x06, 0x8b, 0x76, 0xb4, 0xd2, 0xaf, 0xb2, 0x4f, 0x52, 0xa9, 0x40, 0xaf, 0x53, 0x1c, 0xac, 0xdb, 0x51, 0x82, 0xda, 0x7b, 0xba, 0x11, 0xef, 0x4f, 0xa3, 0x9c, 0x71, 0x7c, 0xd8, 0x9c, 0x22, 0x5c, 0x1f, 0x21, 0xbf, 0x42, 0xce, 0xce, 0x4b, 0x2a, 0xdb, 0x37, 0xaa, 0x6d, 0x71, 0x75, 0xf2, 0x84, 0x39, 0x3f, 0xac, 0x2e, 0xcd, 0xa2, 0x8e, 0xde, 0x90, 0x0d, 0xcb, 0x3c, 0x7b, 0x40, 0xa9, 0xc8, 0x2c, 0x1f, 0x45, 0x77, 0x04, 0xef, 0x7d, 0xfd, 0x42, 0x37, 0x06, 0x22, 0xc7, 0x13, 0x55, 0x17, 0x0b, 0xd7, 0xeb, 0xea, 0x29, 0x6e, 0x83, 0xa8, 0x09, 0xc8, 0x97, 0x27, 0x11, 0x4a, 0xd0, 0x92, 0xcf, 0x96, 0xf7, 0x38, 0x0f, 0x05, 0xe4, 0xe2, 0x8f, 0xc5, 0x4e, 0x26, 0xf6, 0x97, 0xf0, 0x49, 0x47, 0xe6, 0xf6, 0x38, 0x47, 0xc4, 0xf8, 0x33, 0x6b, 0x78, 0xca, 0x83, 0x4d, 0xbc, 0xaf, 0xf2, 0x08, 0xde, 0x9d, 0xcf, 0xb4, 0xe3, 0xc1, 0x8b, 0x17, 0x37, 0x3e, 0x08, 0x9f, 0x9b, 0x8b, 0xc7, 0x07, 0x84, 0x26, 0x04, 0xb6, 0x9d, 0x3d, 0x43, 0x7a, 0xf1, 0x4a, 0x92, 0xec, 0x21, 0xcc, 0x0c, 0xe5, 0x77, 0x29, 0xf1, 0x68, 0xd6, 0x5d, 0x19, 0x3f, 0x4f, 0xa3, 0x4c, 0x66, 0x60, 0x8f, 0xf4, 0x6e, 0x66, 0x87, 0xdd, 0x75, 0x80, 0x95, 0x77, 0xf1, 0xb7, 0x95, 0x82, 0xc1, 0xab, 0x3d, 0xa0, 0x65, 0xbb, 0xc3, 0xeb, 0xa2, 0x84, 0xa6, 0x6e, 0x4a, 0xf5, 0x52, 0x92, 0x35, 0x7b, 0xb1, 0x7d, 0xb0, 0x28, 0x34, 0xa1, 0x4e, 0x91, 0xcf, 0x9d, 0xea, 0x5c, 0x4e, 0xa5, 0xa8, 0xe1, 0x80, 0x35, 0x33, 0x0c, 0x15, 0x9a, 0x6a, 0xf3, 0x28, 0x14, 0x4d, 0x31, 0x52, 0x62, 0x70, 0x89, 0x8a, 0x78, 0x7a, 0x99, 0xa8, 0x64, 0x33, 0x24, 0xb5, 0xe1, 0x51, 0x78, 0x05, 0xb4, 0x27, 0xb4, 0xec, 0xe6, 0x53, 0x4d, 0x1f, 0x3b, 0x41, 0xb5, 0x04, 0x49, 0xe6, 0x1e, 0x1b, 0x2a, 0x7b, 0x88, 0x46, 0xf7, 0xc2, 0x57, 0xa2, 0x6a, 0x8b, 0xca, 0x95, 0x56, 0xf9, 0xf1, 0x27, 0x96, 0x57, 0xf1, 0x30, 0x41, 0x5e, 0x8e, 0x95, 0x5b, 0xc8, 0xd2, 0xbd, 0xe7, 0x2b, 0x39, 0x0a, 0xf3, 0xd9, 0xd0, 0xb0, 0xd7, 0x98, 0x24, 0xf5, 0xeb, 0x1d, 0xde, 0x1c, 0x89, 0xb9, 0x39, 0x0c, 0xd0, 0x54, 0xc8, 0xc2, 0x9d, 0x6c, 0x58, 0xb5, 0xcc, 0xc9, 0xfb, 0x43, 0x82, 0x70, 0x87, 0xe5, 0xae, 0xb3, 0x84, 0x21, 0x1e, 0x16, 0xce, 0xb2, 0xed, 0x08, 0xee, 0xee, 0xd1, 0x97, 0x8d, 0xd7, 0x27, 0x20, 0xe9, 0x61, 0x8d, 0x7a, 0x7e, 0xc8, 0x4c, 0xa8, 0x91, 0xfc, 0x7e, 0x8b, 0x44, 0xa1, 0xdd, 0x87, 0x61, 0x39, 0xc6, 0x85, 0x5d, 0xff, 0x32, 0x65, 0x23, 0x46, 0x8b, 0xe6, 0xaa, 0x62, 0x7c, 0x71, 0xca, 0x6e, 0xf5, 0xeb, 0xde, 0xb8, 0x98, 0x1f, 0x21, 0x6b, 0xe2, 0xe4, 0x1b, 0x2c, 0x25, 0x4b, 0x07, 0xae, 0x2d, 0x32, 0xf2, 0x53, 0x24, 0x11, 0xd5, 0xfd, 0x52, 0x49, 0x56, 0x6e, 0x60, 0xd0, 0x17, 0x3a, 0xa4, 0x5c, 0xda, 0x12, 0x49, 0x7c, 0x0d, 0xed, 0x0f, 0xce, 0xc0, 0x42, 0x01, 0xe9, 0x12, 0x13, 0x06, 0x62, 0x36, 0x69, 0x8a, 0xca, 0xdf, 0xda, 0x1a, 0xac, 0xc1, 0x4b, 0x12, 0xb2, 0xbd, 0xbd, 0x75, 0x60, 0x64, 0x83, 0x7d, 0xfb, 0x4c, 0xad, 0xad, 0x03, 0x7b, 0x01, 0x3e, 0x27, 0x26, 0x30, 0xb3, 0x22, 0x27, 0x44, 0x95, 0xe6, 0x82, 0xd0, 0xcd, 0x49, 0xfd, 0x6e, 0x0b, 0x8b, 0x24, 0xd7, 0x14, 0xf4, 0xc2, 0xf3, 0xb1, 0x2d, 0x66, 0xa6, 0x51, 0x4e, 0x12, 0xd6, 0x4f, 0x7e, 0xa8, 0x4d, 0x73, 0x5d, 0x9d, 0xe9, 0x29, 0xfe, 0xc2, 0xcb, 0x83, 0x1a, 0x03, 0x19, 0x91, 0xd8, 0x3d, 0x88, 0x5e, 0x35, 0xb9, 0x9a, 0x96, 0x0b, 0x3d, 0x3a, 0x1a, 0xc9, 0xa9, 0x03, 0x61, 0x18, 0xfd, 0xcf, 0x5c, 0x1c, 0x6d, 0xa5, 0x59, 0xe0, 0xcf, 0x1a, 0x08, 0x5a, 0xbf, 0xd7, 0x7d, 0x55, 0xc9, 0xd9, 0x50, 0x72, 0x2b, 0xad, 0xc6, 0xc5, 0x05, 0xb4, 0xad, 0x06, 0xf7, 0xda, 0xb0, 0xc0, 0xa2, 0x9b, 0xc2, 0xfd, 0xf9, 0x4a, 0xdf, 0x3f, 0x67, 0xde, 0x18, 0x2f, 0xe5, 0xc9, 0x62, 0x26, 0x5e, 0x69, 0xf4, 0x1b, 0x1d, 0x74, 0xa2, 0xcb, 0x9f, 0xde, 0xa8, 0xbb, 0xa9, 0xaa, 0xe5, 0xa8, 0x80, 0x5b, 0x16, 0x60, 0xaf, 0xe8, 0xee, 0x21, 0x5c, 0x17, 0x61, 0xa2, 0x1b, 0x1e, 0x63, 0xc7, 0x01, 0x71, 0x4c, 0x73, 0xd8, 0xed, 0x74, 0xf8, 0xa5, 0x3e, 0x8c, 0xec, 0x6e, 0xd5, 0x54, 0xb6, 0x59, 0x91, 0xf9, 0x28, 0xb8, 0xb4, 0x50, 0x28, 0x1c, 0xf9, 0x5e, 0x0e, 0x60, 0x1b, 0xb4, 0x9d, 0xad, 0x1e, 0x6e, 0xa3, 0x8e, 0xfd, 0xfb, 0x4e, 0x28, 0xd2, 0x3f, 0x51, 0x5f, 0xc0, 0xb4, 0x52, 0xa1, 0x29, 0xf1, 0x25, 0xa0, 0x84, 0x14, 0xc9, 0x87, 0xc7, 0xda, 0xc1, 0xad, 0x5c, 0xf8, 0x9c, 0x53, 0x11, 0xa8, 0x76, 0xba, 0xeb, 0x50, 0x33, 0x66, 0xf5, 0xab, 0xdc, 0xb8, 0xab, 0x57, 0x57, 0x5d, 0xc9, 0x54, 0x8a, 0x9f, 0x97, 0x3b, 0x51, 0x07, 0xdb, 0xc6, 0xa8, 0xaf, 0x6c, 0x86, 0x16, 0x04, 0x0f, 0x48, 0x97, 0xa9, 0xab, 0x17, 0x8b, 0x08, 0x35, 0xc7, 0xba, 0x6a, 0xa9, 0xe0, 0xed, 0x58, 0x80, 0x24, 0xe8, 0x37, 0xb3, 0x04, 0x8f, 0x96, 0xa0, 0x57, 0x63, 0xfb, 0xe3, 0x47, 0xd5, 0x42, 0x98, 0x6a, 0xda, 0x20, 0xef, 0xa1, 0xfb, 0x0c, 0xcb, 0x97, 0x86, 0xe6, 0x17, 0x0f, 0xda, 0x30, 0x0c, 0x79, 0xd2, 0xec, 0x51, 0x7d, 0x3f, 0x6b, 0x52, 0x62, 0x23, 0xbf, 0x73, 0x00, 0xa4, 0x00, 0xb4, 0x8a, 0xd5, 0x42, 0x88, 0x36, 0x86, 0x86, 0xb6, 0x6f, 0xbe, 0x69, 0x16, 0x65, 0x7d, 0x3d, 0x33, 0x34, 0xa0, 0x06, 0x4f, 0xa8, 0x6d, 0xd7, 0x96, 0xb5, 0x98, 0xd3, 0xe6, 0xda, 0xb8, 0xd1, 0x7e, 0x4f, 0x2c, 0x97, 0xa7, 0x2e, 0xf2, 0x08, 0xc7, 0xac, 0x32, 0x67, 0x45, 0xbf, 0x47, 0xb7, 0xe1, 0x55, 0x3a, 0x07, 0x0c, 0xb8, 0xb4, 0x51, 0x00, 0xfd, 0x81, 0x33, 0x4a, 0xb8, 0xde, 0x16, 0x38, 0xfd, 0x74, 0x4f, 0x3d, 0xad, 0xf5, 0x0f, 0x5f, 0x0c, 0x53, 0xd2, 0x0b, 0xa5, 0x49, 0xb6, 0xd0, 0x6e, 0x88, 0x0f, 0x0e, 0x9b, 0x4d, 0x26, 0xf3, 0xff, 0x59, 0x95, 0x93, 0x69, 0x85, 0xc2, 0xf5, 0x41, 0xc8, 0x35, 0x5c, 0x31, 0x02, 0xd8, 0x6c, 0x0c, 0x8e, 0xae, 0xb7, 0x54, 0x3c, 0x29, 0xa3, 0xae, 0x58, 0x70, 0xe6, 0x4c, 0xf7, 0x61, 0xdd, 0xc6, 0x25, 0xd4, 0xb0, 0x37, 0x37, 0xb5, 0xff, 0x27, 0x58, 0x08, 0xae, 0x79, 0x1b, 0xc5, 0xf5, 0x28, 0x8a, 0x37, 0x15, 0x40, 0x95, 0x6f, 0x5a, 0x6e, 0x3f, 0x94, 0xf3, 0xfc, 0x09, 0x3d, 0xfd, 0x40, 0xc8, 0x21, 0xd4, 0x37, 0x4b, 0x89, 0xf3, 0x81, 0x6d, 0xf5, 0xa1, 0x96, 0x68, 0xa3, 0xbf, 0xb6, 0x8e, 0xd2, 0xba, 0x4f, 0x1c, 0x91, 0x8d, 0x07, 0xa5, 0x05, 0xb7, 0x20, 0x9f, 0xe3, 0x88, 0x92, 0x62, 0xc9, 0x73, 0xed, 0x43, 0x3f, 0x9d, 0x59, 0x5b, 0xd8, 0xd5, 0x3d, 0x62, 0xde, 0x56, 0x3d, 0x63, 0x85, 0x7d, 0x58, 0x90, 0xd2, 0xb9, 0x70, 0xad, 0x13, 0xf3, 0xde, 0xc9, 0x5c, 0xd1, 0x89, 0x04, 0x50, 0x05, 0xf7, 0xf2, 0xbe, 0x1c, 0x6d, 0xa9, 0x04, 0x7d, 0x0e, 0xcf, 0x17, 0x51, 0x57, 0xbc, 0x0a, 0xc6, 0xa7, 0x0f, 0x9e, 0xbb, 0x88, 0xa8, 0x7a, 0xa9, 0x8c, 0x42, 0xb9, 0x19, 0x89, 0xee, 0x62, 0xda, 0x10, 0xd9, 0x90, 0xc9, 0x66, 0x23, 0x45, 0x36, 0xc9, 0x25, 0xb4, 0x45, 0x30, 0x9b, 0x34, 0x81, 0xa5, 0x70, 0xfc, 0xc3, 0xed, 0xb5, 0xfa, 0xf3, 0xeb, 0xfe, 0xc8, 0x49, 0xc7, 0x9c, 0x05, 0x23, 0x7f, 0x4c, 0x9f, 0x5a, 0xf8, 0x71, 0xce, 0xc0, 0xe1, 0xb6, 0x6f, 0x8e, 0xfd, 0xd5, 0x20, 0xbf, 0x18, 0x1e, 0x5a, 0x47, 0x29, 0xc5, 0x61, 0x89, 0x9b, 0x97, 0x4c, 0x2e, 0x88, 0x33, 0xf5, 0xcb, 0x08, 0xe4, 0x6a, 0x10, 0x3b, 0x22, 0x32, 0x2b, 0x8f, 0x52, 0x7b, 0xa2, 0xe7, 0x50, 0xb9, 0x39, 0x77, 0x63, 0x2f, 0x78, 0x91, 0x56, 0x03, 0xb3, 0x69, 0x2e, 0xbb, 0x71, 0x00, 0xc2, 0x53, 0x11, 0xdb, 0x3f, 0xc6, 0x49, 0x4c, 0xdc, 0xb0, 0x02, 0x36, 0x12, 0x05, 0x6b, 0x50, 0x5c, 0xa6, 0xad, 0x7f, 0xd6, 0x5b, 0xd3, 0x39, 0xe6, 0x9a, 0xd1, 0xbc, 0x75, 0xd3, 0x0a, 0xbc, 0x9a, 0x2e, 0x95, 0x2a, 0xa0, 0xc0, 0x33, 0x83, 0x4a, 0x5e, 0x10, 0x9a, 0x03, 0x99, 0xbc, 0xec, 0x71, 0xcb, 0xb7, 0xed, 0xbd, 0xd7, 0xa3, 0xa7, 0xfa, 0xa5, 0xb5, 0xf5, 0x1a, 0xd8, 0xed, 0x9f, 0x2b, 0xcc, 0x75, 0x7c, 0x7d, 0x4e, 0x1a, 0xcc, 0x6e, 0x21, 0xa6, 0x00, 0x51, 0xee, 0xf4, 0xf2, 0x01, 0xcd, 0x6a, 0x35, 0x3f, 0x43, 0xa5, 0xf7, 0x43, 0x86, 0xbb, 0x0f, 0xbd, 0x96, 0x6c, 0x26, 0x1f, 0x6f, 0xc2, 0xaa, 0x20, 0x9e, 0x81, 0x9c, 0x53, 0x57, 0xce, 0xf7, 0x33, 0x4e, 0xe7, 0x12, 0xe9, 0xeb, 0x56, 0x14, 0x22, 0x0a, 0x29, 0xe8, 0xf6, 0x45, 0x01, 0x4b, 0x40, 0xab, 0x83, 0x31, 0x33, 0x87, 0xb6, 0xa2, 0x57, 0xa8, 0xa7, 0x3a, 0x2a, 0xd2, 0x35, 0xe1, 0x69, 0x94, 0xde, 0x75, 0xdb, 0x8d, 0x1e, 0x34, 0x78, 0x79, 0x07, 0x93, 0xea, 0x7b, 0x20, 0x14, 0xf8, 0xba, 0x5f, 0xb1, 0xbc, 0x15, 0x7f, 0xa6, 0x42, 0x04, 0x9d, 0xfe, 0x8c, 0xd2, 0x22, 0xe8, 0x39, 0x1f, 0x8a, 0x44, 0xcf, 0x8e, 0x58, 0x19, 0x33, 0x4b, 0xc8, 0x44, 0x20, 0x40, 0xba, 0x57, 0x3c, 0xd0, 0x55, 0xb2, 0x73, 0xea, 0x95, 0x32, 0x3d, 0xb1, 0xae, 0xe0, 0xb0, 0x04, 0xe9, 0x74, 0xff, 0xcb, 0xba, 0xe1, 0xed, 0x6d, 0x35, 0x10, 0xaf, 0x3e, 0xc3, 0xca, 0xbb, 0x6b, 0xdc, 0xfe, 0x65, 0x81, 0xa1, 0x2e, 0x1a, 0x5e, 0x15, 0x3e, 0xe8, 0x56, 0x8f, 0x90, 0x6b, 0xd8, 0x1a, 0xae, 0x2a, 0xc2, 0xbd, 0xff, 0xb5, 0xf2, 0x36, 0xd0, 0x2d, 0x0d, 0x1e, 0x4f, 0x0c, 0xa6, 0xcc, 0x5d, 0x57, 0xac, 0x1e, 0x8f, 0x92, 0x0f, 0x7c, 0x04, 0xeb, 0x79, 0x54, 0x41, 0x6f, 0x2c, 0x9c, 0xeb, 0x56, 0x8b, 0x19, 0x5f, 0x7b, 0x79, 0xa1, 0xff, 0x68, 0xe2, 0xe3, 0x3e, 0x0d, 0x75, 0xe3, 0x92, 0x54, 0x06, 0x57, 0x25, 0x52, 0x9e, 0x0a, 0xb9, 0xdf, 0x88, 0x19, 0x85, 0x1a, 0x81, 0xb9, 0x3f, 0x3d, 0x42, 0x59, 0x7c, 0xb5, 0x74, 0xd8, 0xfa, 0x29, 0x96, 0x66, 0x7e, 0xf6, 0xad, 0x49, 0x93, 0x38, 0x17, 0x3c, 0x3f, 0x73, 0xb0, 0x33, 0x70, 0x5c, 0xee, 0x8d, 0xbc, 0xf1, 0x74, 0x45, 0x7f, 0x46, 0xa2, 0x91, 0x1a, 0xab, 0x00, 0x34, 0x3c, 0xb9, 0x25, 0xc3, 0x5c, 0x76, 0x07, 0xd5, 0xb4, 0x8b, 0x2d, 0xf0, 0x6b, 0xa8, 0x11, 0x77, 0xa9, 0xc6, 0xf8, 0x6c, 0x75, 0x57, 0xaa, 0xd4, 0x94, 0x9d, 0x7e, 0xb8, 0xfa, 0x5b, 0xee, 0xb7, 0xaa, 0x47, 0x6e, 0x28, 0x30, 0xb4, 0x84, 0x52, 0x49, 0x8c, 0x39, 0x41, 0x07, 0x5c, 0x24, 0x4f, 0xe4, 0x5e, 0xab, 0xfa, 0x69, 0xcd, 0x90, 0x6c, 0x81, 0x55, 0x62, 0x23, 0x3b, 0x81, 0x76, 0x14, 0x3c, 0x3e, 0x56, 0x89, 0x19, 0x30, 0xa2, 0x2f, 0x34, 0x23, 0x3a, 0x07, 0xf2, 0x6b, 0x9f, 0x03, 0x62, 0x47, 0x97, 0x5a, 0xc4, 0xda, 0x3d, 0xaa, 0x79, 0x35, 0x03, 0x41, 0xf9, 0x7d, 0x61, 0xd5, 0x2b, 0x23, 0xc0, 0xb1, 0x72, 0xfe, 0x2a, 0x38, 0x93, 0x32, 0x8a, 0xe1, 0x87, 0xaf, 0xb2, 0x0c, 0xaf, 0xf3, 0x98, 0xf3, 0x01, 0x00, 0x7b, 0x12, 0x48, 0x48, 0x72, 0xfc, 0xc8, 0xcf, 0xc1, 0xf9, 0x88, 0x87, 0x92, 0x22, 0x3b, 0x4b, 0xf8, 0x67, 0x1d, 0xb5, 0x5f, 0x87, 0x0a, 0x57, 0x9c, 0x7e, 0x91, 0x4f, 0xac, 0xc8, 0x1b, 0xc5, 0x1e, 0xba, 0xb8, 0xb4, 0x4c, 0x4b, 0x46, 0x7f, 0x18, 0xb6, 0x09, 0x4f, 0x43, 0xb8, 0x87, 0xd3, 0x4f, 0x51, 0xef, 0x50, 0xcc, 0xa0, 0x7f, 0x30, 0xbd, 0xcd, 0x80, 0x80, 0x96, 0x13, 0xf8, 0x95, 0xc4, 0xeb, 0xb3, 0xca, 0x60, 0x99, 0xc0, 0x76, 0x44, 0x51, 0x9a, 0x20, 0xef, 0x54, 0x8d, 0xeb, 0xea, 0xd1, 0xb6, 0x55, 0xc4, 0x4e, 0xfd, 0x9f, 0xf9, 0x6e, 0xe1, 0xbd, 0xbc, 0x6e, 0x6f, 0x9b, 0x24, 0x36, 0xaf, 0x23, 0x27, 0x39, 0xf6, 0x4a, 0xf3, 0xde, 0x58, 0x9d, 0xcb, 0xea, 0xcf, 0x63, 0xdf, 0xbe, 0xe2, 0x02, 0x4d, 0x51, 0xed, 0x06, 0x83, 0xb3, 0xee, 0x06, 0x2f, 0xb1, 0xb1, 0x46, 0x55, 0x61, 0xdf, 0xa8, 0xcb, 0x77, 0x3a, 0x81, 0xac, 0x27, 0x53, 0xd8, 0xaa, 0xbe, 0xae, 0xab, 0x16, 0xe6, 0x85, 0xda, 0xec, 0xc0, 0xa3, 0xdd, 0x60, 0xcf, 0x96, 0x2f, 0x10, 0xb8, 0x6b, 0x8d, 0x81, 0x34, 0x74, 0x9b, 0xc7, 0x37, 0xde, 0x1c, 0x04, 0x41, 0xd5, 0x26, 0x8e, 0xfb, 0x38, 0x7e, 0x72, 0xe3, 0x7a, 0xf8, 0x68, 0x8b, 0x81, 0x1e, 0xd3, 0x00, 0x00, 0x01, 0x09 }; +constexpr AccessUnit AVC_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, true, 0, {}, { 0x59, 0x01, 0x7a, 0x65, 0x04, 0xcc, 0xfb, 0xf8, 0x14, 0x0a, 0x82, 0xb6, 0xa0, 0xb8, 0xe9, 0x55, 0x47, 0x35, 0x9c, 0x90 } }; + +const std::vector M2V_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x01, 0xb3, 0xad, 0x05, 0x26, 0xaa, 0xe6, 0x35, 0x3c, 0xd3, 0x39, 0xd0, 0x8e, 0x3e, 0x56, 0x34, 0x97, 0x50, 0xf0, 0x75, 0x62, 0x8f, 0x4f, 0x2e, 0x75, 0x9c, 0x56, 0xc5, 0xcb, 0x1f, 0xa9, 0x84, 0xd5, 0xe2, 0x85, 0xec, 0xcf, 0x29, 0xcc, 0xbd, 0xc6, 0x77, 0xff, 0x7d, 0x1b, 0xec, 0x2c, 0x85, 0x65, 0x1f, 0xeb, 0x71, 0x26, 0x0d, 0x71, 0x01, 0x09, 0x7a, 0xb2, 0xed, 0x0b, 0x50, 0x39, 0x71, 0x96, 0xc9, 0x38, 0x98, 0x7b, 0x43, 0x4c, 0xa1, 0x7f, 0xac, 0xe2, 0x26, 0x30, 0xfc, 0xc0, 0x89, 0xb2, 0x6b, 0x09, 0xbf, 0x39, 0x02, 0x2f, 0x9f, 0x40, 0x3d, 0x17, 0xd3, 0x29, 0x03, 0xa4, 0x28, 0x30, 0x55, 0xa9, 0x36, 0x87, 0x10, 0xf3, 0x31, 0x88, 0x89, 0xda, 0x33, 0x88, 0x04, 0x49, 0x00, 0x81, 0x49, 0x5c, 0xe3, 0x8c, 0x83, 0x11, 0xc0, 0x84, 0xcd, 0xb5, 0x95, 0x29, 0x91, 0x83, 0x4b, 0xc8, 0x50, 0xf4, 0x5d, 0xb5, 0xeb, 0x28, 0xdc, 0x3a, 0x79, 0x68, 0x6e, 0x2b, 0x78, 0x06, 0x67, 0x83, 0x3b, 0x10, 0x7e, 0xba, 0x58, 0x72, 0x06, 0xce, 0x41, 0xed, 0xe1, 0xb7, 0x4d, 0x0e, 0x3d, 0x4a, 0xc2, 0x0b, 0xb7, 0xb1, 0x3b, 0x9a, 0x23, 0x6e, 0x1c, 0xaf, 0x02, 0xfa, 0x73, 0x0d, 0x58, 0x15, 0x33, 0x4f, 0x2f, 0x6b, 0x91, 0x82, 0x1a, 0x8d, 0xb6, 0xc2, 0x44, 0x96, 0x08, 0x9e, 0x69, 0x53, 0xb1, 0x5b, 0x2d, 0x3d, 0xa4, 0xac, 0xac, 0xf1, 0x54, 0xb3, 0xfe, 0x6a, 0x21, 0x67, 0x19, 0xfa, 0x37, 0x99, 0x41, 0x08, 0x81, 0xf6, 0xac, 0x12, 0x1d, 0x98, 0xef, 0x7a, 0x4b, 0xcc, 0xb2, 0xea, 0xdb, 0x08, 0x5e, 0xad, 0x02, 0xe6, 0x6e, 0x83, 0x10, 0x12, 0x3b, 0x7e, 0xc7, 0xdc, 0xc0, 0xd7, 0x26, 0x48, 0x6a, 0x66, 0x01, 0x11, 0x35, 0xc3, 0x4a, 0xce, 0xd6, 0x03, 0xe7, 0x29, 0x6a, 0x22, 0x3a, 0x8e, 0x55, 0x8c, 0x8a, 0xc8, 0xad, 0x3b, 0x22, 0xb9, 0xfa, 0xc1, 0x05, 0x4e, 0xd2, 0x9e, 0x84, 0xdf, 0x6f, 0xec, 0x2a, 0x75, 0x9b, 0x7f, 0xcc, 0x3b, 0xeb, 0x59, 0xb9, 0xf3, 0x02, 0x99, 0x50, 0x79, 0x41, 0x1e, 0x58, 0x8b, 0x6c, 0x39, 0x08, 0xce, 0x90, 0xb6, 0x5c, 0x59, 0x2c, 0x0b, 0xd2, 0xa0, 0xae, 0x47, 0xa9, 0x01, 0x81, 0xe4, 0xda, 0x5c, 0xdb, 0x68, 0xac, 0xda, 0xa5, 0xcf, 0xfe, 0x71, 0xed, 0xab, 0x00, 0x4a, 0xcf, 0x62, 0x95, 0xce, 0x74, 0xf4, 0x48, 0x18, 0xab, 0x00, 0xe2, 0x43, 0x5a, 0x9f, 0xff, 0x03, 0xdd, 0xd5, 0xd3, 0xd4, 0x22, 0xcb, 0x83, 0x9d, 0x25, 0xc0, 0x43, 0x1f, 0x3d, 0xfa, 0x0c, 0x39, 0x89, 0x33, 0x4f, 0x6c, 0xdd, 0x40, 0x8e, 0xb8, 0x4d, 0x75, 0x38, 0x3d, 0x1e, 0x6c, 0x0a, 0x8f, 0xd4, 0x07, 0x71, 0xcf, 0x8b, 0xa8, 0x65, 0x4a, 0xb4, 0xc9, 0x9f, 0x4a, 0x6f, 0xee, 0xab, 0x2a, 0xee, 0xc1, 0x5b, 0x88, 0xe6, 0x93, 0x7c, 0x7b, 0x23, 0xee, 0x1a, 0xab, 0xb6, 0x82, 0x03, 0x63, 0x24, 0x8e, 0xea, 0xd3, 0xdc, 0x1f, 0x8e, 0x3d, 0x6a, 0xb9, 0x96, 0x79, 0xd2, 0x8f, 0x37, 0x23, 0x9d, 0x1b, 0x58, 0x38, 0xb4, 0x9e, 0x50, 0x8e, 0x13, 0x00, 0xcc, 0x22, 0x17, 0x25, 0x04, 0xde, 0x29, 0xea, 0x36, 0xac, 0x1a, 0x70, 0x7a, 0x15, 0x22, 0xbd, 0x14, 0x70, 0x08, 0x62, 0xfa, 0x1d, 0xeb, 0x37, 0xe1, 0xcd, 0x16, 0x8b, 0x3b, 0x24, 0x39, 0xec, 0xe8, 0x76, 0x4e, 0x50, 0x4a, 0x9f, 0x83, 0xc2, 0xb5, 0x9d, 0x1d, 0x71, 0xb3, 0x7f, 0xcd, 0x8d, 0x5d, 0x3e, 0x75, 0x6d, 0x3e, 0xd9, 0x2d, 0xfb, 0x3e, 0x0d, 0x95, 0x63, 0x3b, 0xe0, 0x34, 0x85, 0x91, 0xb3, 0x88, 0x6c, 0x87, 0x58, 0x60, 0x1c, 0x10, 0x4e, 0xd0, 0x18, 0x10, 0x77, 0x9f, 0xe1, 0x73, 0x05, 0x69, 0xd0, 0xc3, 0xe0, 0xa9, 0x7d, 0x11, 0x5f, 0xe8, 0xee, 0x05, 0xc3, 0x97, 0x19, 0x5b, 0x6f, 0xa9, 0x9f, 0xb8, 0x1c, 0x6c, 0x43, 0x40, 0x88, 0x7b, 0xc1, 0xf0, 0x5a, 0x2e, 0x5e, 0x2c, 0xf9, 0xd4, 0xbb, 0xef, 0x4a, 0x84, 0xe3, 0x3e, 0x9b, 0xbf, 0x62, 0x99, 0x8d, 0x5f, 0x26, 0x76, 0x39, 0x13, 0xc7, 0x8d, 0x36, 0xff, 0xa1, 0xf1, 0xd7, 0x47, 0xf7, 0x73, 0x10, 0x6e, 0x24, 0x1a, 0x44, 0xad, 0xca, 0xbd, 0xbc, 0xa6, 0xa8, 0xb4, 0x56, 0x26, 0xfc, 0x1f, 0x57, 0xe0, 0xca, 0x6e, 0x67, 0x33, 0x3e, 0x5f, 0x39, 0x47, 0x82, 0xb6, 0x54, 0xde, 0xc5, 0x92, 0xa8, 0xb7, 0xbc, 0x82, 0x03, 0xa7, 0x3d, 0x7b, 0x13, 0x70, 0x64, 0x57, 0x29, 0xa5, 0x33, 0x27, 0x63, 0xc1, 0xaa, 0x60, 0x3b, 0xe1, 0x91, 0xfd, 0x6c, 0x01, 0x88, 0x34, 0xc0, 0x07, 0xc3, 0x85, 0xfb, 0x1f, 0x12, 0xd7, 0x31, 0xfe, 0x78, 0xb8, 0x15, 0xe5, 0xc7, 0xf2, 0x97, 0x60, 0x05, 0xd1, 0x35, 0x34, 0x1b, 0x25, 0x4f, 0x35, 0xc6, 0x98, 0x12, 0x17, 0xc1, 0xe6, 0x42, 0xd0, 0xa3, 0xd7, 0xc8, 0xef, 0xed, 0x01, 0x7c, 0x3e, 0xc5, 0xc1, 0xf5, 0x02, 0xd7, 0x92, 0xea, 0x53, 0xfc, 0x65, 0xc4, 0x84, 0x85, 0x08, 0x1a, 0xbc, 0x07, 0xd2, 0xbc, 0xc4, 0x28, 0xf6, 0xab, 0xb0, 0x22, 0x9e, 0x05, 0x9b, 0xc6, 0xb4, 0x5e, 0x5f, 0xb5, 0xf5, 0x1f, 0x6c, 0xe0, 0xc8, 0xdb, 0x17, 0xd8, 0xe3, 0xdb, 0x50, 0x65, 0xef, 0x2a, 0xda, 0x40, 0x34, 0xc3, 0x21, 0x21, 0x13, 0x79, 0x12, 0x04, 0x84, 0x35, 0x34, 0x7f, 0x82, 0x37, 0xe8, 0x14, 0x29, 0x61, 0x2f, 0x19, 0xd2, 0xa2, 0x42, 0x93, 0x6f, 0x6d, 0x85, 0x38, 0x30, 0x6e, 0x25, 0x45, 0x78, 0xd5, 0x2a, 0xc4, 0x0e, 0xfd, 0xa0, 0xab, 0xa6, 0xae, 0xdc, 0x93, 0xa7, 0x72, 0x2a, 0x09, 0x04, 0xb4, 0x4e, 0xf2, 0x56, 0x00, 0x15, 0x98, 0x7f, 0x3b, 0x4f, 0x43, 0x90, 0x08, 0x42, 0xd0, 0x11, 0x93, 0x58, 0xd1, 0x23, 0xd4, 0x9a, 0x9a, 0x80, 0x0b, 0xf6, 0xa8, 0xe4, 0x17, 0x1a, 0xa8, 0xe3, 0x3d, 0x5a, 0x05, 0xf4, 0x73, 0xa7, 0x2d, 0xe6, 0xee, 0xa9, 0x78, 0xa2, 0x6e, 0x1b, 0xc2, 0x07, 0x04, 0xb8, 0x31, 0xb2, 0x01, 0x76, 0xba, 0x19, 0x0c, 0x0f, 0x4f, 0xce, 0xbe, 0x63, 0xa2, 0xb8, 0x80, 0xf2, 0x22, 0x8d, 0x0c, 0xdb, 0x25, 0x66, 0x7a, 0x40, 0xa3, 0x0b, 0xe2, 0x2f, 0x47, 0x4a, 0xfe, 0xd4, 0xd6, 0x12, 0x0f, 0x26, 0x5b, 0x04, 0xf4, 0x8c, 0xdf, 0x6b, 0x67, 0x45, 0x67, 0xe9, 0x62, 0xf3, 0x1d, 0x2c, 0x2e, 0x1a, 0xd6, 0x58, 0x43, 0x62, 0x03, 0x0a, 0xf1, 0xe6, 0x2d, 0xf8, 0xe0, 0x1a, 0x77, 0xbf, 0xe6, 0x39, 0x4c, 0x45, 0xaa, 0xce, 0xbf, 0x6c, 0x6c, 0xbb, 0x55, 0x91, 0x51, 0xd5, 0x49, 0x05, 0x1d, 0x39, 0xe4, 0xf6, 0x22, 0x20, 0x24, 0xc4, 0xb2, 0x83, 0xda, 0xb7, 0xb3, 0x86, 0xdf, 0x37, 0xe0, 0x01, 0xe1, 0x5b, 0x55, 0xd9, 0x60, 0x8b, 0x55, 0xcb, 0x28, 0x7f, 0xf9, 0xfa, 0x50, 0x0b, 0x4c, 0xc0, 0x18, 0x1d, 0x2e, 0x92, 0x19, 0x05, 0xa4, 0xd7, 0xde, 0xc7, 0x3e, 0xc4, 0x3f, 0x27, 0x56, 0x35, 0x00, 0xf5, 0xe3, 0x32, 0x71, 0xcb, 0xa0, 0x34, 0xa2, 0xbd, 0x3c, 0x6b, 0x17, 0x1e, 0x94, 0xb9, 0x7b, 0x62, 0xb8, 0xcb, 0xa4, 0xa2, 0x8a, 0x90, 0xb0, 0xc0, 0xb6, 0xc3, 0xfa, 0x9e, 0x1f, 0xa3, 0x75, 0x09, 0x71, 0x5d, 0x9c, 0x23, 0xdd, 0xf6, 0x6d, 0x4f, 0x42, 0xd2, 0xaf, 0x8d, 0x89, 0x54, 0xc1, 0xfd, 0x36, 0x25, 0x2c, 0x06, 0x2e, 0x4a, 0xea, 0x41, 0x63, 0x0e, 0x3d, 0xfc, 0x40, 0xa7, 0x71, 0x1c, 0x3c, 0x9c, 0x75, 0x02, 0xcb, 0xb3, 0x32, 0x6e, 0x33, 0xf5, 0x30, 0xb9, 0x63, 0x40, 0xd2, 0xb4, 0xff, 0xd5, 0x9e, 0xcd, 0x44, 0x9b, 0xeb, 0x4a, 0x43, 0x1d, 0x20, 0xf1, 0x60, 0xa6, 0xad, 0x0a, 0xb7, 0x6d, 0xef, 0x82, 0x15, 0x02, 0x35, 0xd8, 0x4d, 0xdc, 0x1b, 0xdf, 0x1f, 0x69, 0x2c, 0x86, 0xdd, 0x11, 0x91, 0x22, 0x70, 0x74, 0x3e, 0x64, 0xef, 0x3f, 0xb2, 0xb1, 0xc3, 0xbe, 0x6e, 0x9d, 0x13, 0x8c, 0x8f, 0xff, 0xd6, 0x74, 0x0b, 0xc0, 0x89, 0x6a, 0x87, 0xd0, 0xe5, 0x4b, 0x3c, 0x30, 0xd7, 0x27, 0xad, 0xf1, 0xc8, 0x0c, 0x07, 0x1d, 0xea, 0x31, 0xfe, 0x37, 0x5b, 0x0b, 0xeb, 0xfe, 0xc2, 0x43, 0x55, 0xa4, 0xf6, 0x92, 0x11, 0x38, 0xa4, 0x71, 0xbc, 0x77, 0x59, 0x8e, 0x38, 0x24, 0xe3, 0xd3, 0xb0, 0x61, 0x5f, 0xe5, 0x76, 0x20, 0x93, 0x81, 0xba, 0x0f, 0x8d, 0xc4, 0x86, 0x73, 0x78, 0x74, 0xdf, 0x7a, 0xb4, 0x93, 0x58, 0xf2, 0x02, 0x40, 0x4e, 0x10, 0x93, 0xe4, 0xdd, 0xeb, 0x1e, 0x8d, 0x96, 0xa2, 0x32, 0x0a, 0x4b, 0xfe, 0xa7, 0x48, 0x2d, 0x72, 0x1e, 0x89, 0xa7, 0x50, 0x5c, 0x10, 0xe8, 0x52, 0x49, 0x4a, 0x13, 0xcc, 0x51, 0xba, 0x22, 0x7c, 0xa3, 0xca, 0xc8, 0xcf, 0x31, 0x79, 0x40, 0x2a, 0x6f, 0xf6, 0x6d, 0x82, 0x5c, 0x6c, 0xb5, 0x3a, 0x6c, 0xa7, 0x4f, 0xdf, 0x52, 0x94, 0xe0, 0x1a, 0xaa, 0xe6, 0x43, 0x20, 0x2f, 0xa6, 0x27, 0x67, 0x08, 0xbb, 0x31, 0x5c, 0x3d, 0xfd, 0x9a, 0xf9, 0x2e, 0x42, 0x95, 0x56, 0x8f, 0xad, 0x86, 0x20, 0xae, 0xd4, 0x04, 0x74, 0x1f, 0xfe, 0xe2, 0x0d, 0x0f, 0x69, 0xb3, 0x73, 0x2a, 0x57, 0x26, 0xca, 0x2f, 0xdd, 0xa5, 0xdd, 0x4d, 0x77, 0x44, 0x43, 0x54, 0x37, 0xf5, 0xda, 0x70, 0x36, 0x59, 0x89, 0x3d, 0x91, 0x3f, 0x6b, 0xff, 0x8f, 0x29, 0x3d, 0x8f, 0x4b, 0x07, 0xb8, 0x70, 0x7f, 0x13, 0x89, 0x9d, 0x03, 0xe9, 0x81, 0xcb, 0x19, 0xc5, 0x98, 0xde, 0xcd, 0x32, 0xdf, 0x33, 0x14, 0x69, 0xbf, 0x9b, 0xb1, 0x39, 0xdc, 0xec, 0x29, 0xf2, 0x3a, 0x88, 0x1d, 0x23, 0x1b, 0xec, 0xd1, 0x0f, 0xc4, 0x82, 0x94, 0xf7, 0xc1, 0x55, 0x3f, 0x98, 0xc9, 0xd8, 0x34, 0xd9, 0x80, 0x05, 0x59, 0xb7, 0xca, 0x24, 0x85, 0xbe, 0xf1, 0xfc, 0xb7, 0x42, 0xa0, 0x1b, 0xd5, 0x1c, 0x10, 0x6b, 0x1c, 0x99, 0x20, 0x4c, 0x7e, 0xa8, 0x8d, 0xf6, 0x27, 0x07, 0x48, 0xf3, 0x18, 0x99, 0x73, 0x42, 0x37, 0x96, 0x4e, 0x34, 0x1d, 0x38, 0x91, 0x5a, 0x0e, 0x61, 0x6b, 0x9f, 0xfa, 0xe0, 0x39, 0x3a, 0x54, 0x87, 0xfc, 0x5d, 0xcf, 0x13, 0xba, 0x74, 0x8c, 0xc3, 0xa2, 0xa3, 0x89, 0x91, 0x7c, 0x97, 0xbe, 0xf8, 0x26, 0x0f, 0x54, 0x5c, 0x40, 0xb4, 0x61, 0x3f, 0xbb, 0x87, 0xa1, 0xdd, 0x62, 0x5d, 0x5c, 0x49, 0x93, 0x85, 0x50, 0x30, 0x32, 0x8a, 0xd7, 0x2c, 0x83, 0xf0, 0x4b, 0x76, 0x4a, 0xac, 0x87, 0x0e, 0x6e, 0xff, 0x7a, 0x11, 0xbd, 0x49, 0x71, 0xaf, 0x2d, 0xa7, 0x44, 0x7b, 0xcc, 0x71, 0xc3, 0xb8, 0x13, 0x28, 0xe9, 0x62, 0x1a, 0xa5, 0x67, 0x78, 0xb6, 0x19, 0x83, 0xc5, 0xa7, 0x15, 0xd2, 0x3d, 0xf9, 0x85, 0xb1, 0x99, 0xd8, 0x18, 0x4d, 0x16, 0x1d, 0x17, 0x3e, 0x29, 0x63, 0x8f, 0x07, 0x86, 0x03, 0x9f, 0x0f, 0xc5, 0xcf, 0x76, 0x9d, 0xef, 0xe3, 0xaa, 0x0a, 0xac, 0x37, 0xa4, 0xfc, 0x49, 0x25, 0xa5, 0x8f, 0x1c, 0x4e, 0xab, 0x2b, 0x68, 0x3f, 0x59, 0xbb, 0x9f, 0x80, 0x47, 0x82, 0x31, 0x92, 0x64, 0xf3, 0xab, 0x6b, 0xd3, 0xd1, 0x42, 0xe7, 0x26, 0xb4, 0x73, 0x5e, 0xac, 0x08, 0xdd, 0x48, 0x89, 0xbd, 0xd3, 0x68, 0xa1, 0xfa, 0x20, 0x05, 0xe3, 0x39, 0x37, 0x84, 0x78, 0x52, 0x3d, 0x0f, 0xe8, 0x2b, 0xa2, 0x8c, 0x3c, 0xd3, 0x5b, 0x60, 0x31, 0xf1, 0x60, 0x20, 0xd6, 0x64, 0xb2, 0x9c, 0xa4, 0x99, 0xf5, 0x90, 0xd9, 0xca, 0x5f, 0xf2, 0x39, 0x1c, 0x6e, 0xd2, 0x0d, 0x65, 0xda, 0x0c, 0x2a, 0x67, 0x16, 0x6f, 0x63, 0x88, 0x6f, 0x66, 0xc7, 0x39, 0x4b, 0xf6, 0x5b, 0xaa, 0x30, 0x2b, 0xc2, 0xb9, 0x40, 0x88, 0xda, 0x10, 0xb4, 0x2d, 0x5f, 0x9b, 0x16, 0xc1, 0xb5, 0x19, 0x2f, 0x70, 0xa7, 0x22, 0xdf, 0x2d, 0xe8, 0x7b, 0x1c, 0x6d, 0xa8, 0xce, 0x75, 0xb9, 0x5b, 0x68, 0x01, 0xb3, 0x36, 0x95, 0xcd, 0x0c, 0x98, 0x5b, 0xf1, 0x1d, 0xfe, 0xaa, 0x20, 0xf2, 0xd8, 0x9b, 0xdd, 0xeb, 0x5b, 0x98, 0x6d, 0x59, 0xd1, 0xd4, 0xe8, 0x83, 0x05, 0xf1, 0x15, 0x9d, 0x56, 0xb2, 0x5a, 0xd6, 0xfd, 0x05, 0x7e, 0x7b, 0x89, 0xf6, 0x53, 0xcf, 0x5a, 0x43, 0xef, 0x49, 0x99, 0xf5, 0xee, 0xa0, 0x36, 0x5f, 0x07, 0x02, 0x3d, 0x08, 0xd9, 0xb1, 0xfc, 0xd2, 0xb5, 0x72, 0x60, 0xee, 0xa9, 0xaf, 0x27, 0x48, 0x96, 0x86, 0x97, 0xf5, 0x37, 0x74, 0x56, 0x2e, 0x80, 0x02, 0xc5, 0xf1, 0x80, 0x2e, 0xa8, 0xc1, 0x20, 0xcf, 0x60, 0x78, 0xcc, 0xa6, 0x48, 0xea, 0xf1, 0x72, 0xce, 0xb7, 0x23, 0xeb, 0x58, 0x51, 0x9f, 0xfa, 0xf6, 0x3d, 0x13, 0x5b, 0x82, 0xa6, 0x1c, 0x25, 0xac, 0x71, 0x94, 0xe9, 0x86, 0x60, 0xf7, 0x86, 0xe3, 0xab, 0x11, 0x0a, 0xbf, 0x23, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x07, 0xec, 0x81, 0x00, 0x00, 0x3d, 0x4f, 0xe8, 0x8a, 0x84, 0x70, 0xd4, 0x47, 0x10, 0x56, 0xdf, 0x21, 0xf4, 0xb6, 0x51, 0xed, 0x6a, 0xba, 0xf6, 0x41, 0x64, 0xac, 0x13, 0xd8, 0x9e, 0xee, 0xeb, 0xc1, 0xc1, 0xc5, 0xd5, 0x88, 0x4e, 0xa9, 0x5a, 0x51, 0x4d, 0xd6, 0xbc, 0x4e, 0xa1, 0x0d, 0x56, 0x46, 0xed, 0x11, 0xba, 0xe2, 0xa8, 0x7a, 0xd8, 0xd6, 0x42, 0x13, 0x27, 0x53, 0xc6, 0x42, 0x41, 0x1f, 0xed, 0x44, 0x76, 0x11, 0x1d, 0x89, 0xcb, 0x39, 0x99, 0x03, 0xa8, 0x6e, 0x6a, 0x89, 0x13, 0xfc, 0xa3, 0x40, 0x1c, 0x08, 0x40, 0x19, 0x68, 0xc2, 0x4e, 0xc2, 0x7d, 0x03, 0x33, 0xa6, 0x04, 0xf1, 0x78, 0xac, 0xc1, 0xdb, 0x78, 0x38, 0xfc, 0x01, 0x3a, 0x81, 0xed, 0xc6, 0xa1, 0x42, 0xd3, 0x22, 0x0c, 0x41, 0x7a, 0x8a, 0x30, 0x99, 0x12, 0x4d, 0xab, 0x94, 0xe7, 0xb4, 0xba, 0x1f, 0x9c, 0xbd, 0xfd, 0x49, 0xef, 0x93, 0x74, 0xf4, 0x88, 0x72, 0xc4, 0x75, 0xc2, 0x95, 0x76, 0x21, 0x86, 0xf8, 0x24, 0xc3, 0x4c, 0x22, 0x8d, 0x60, 0xd2, 0x8f, 0xec, 0xca, 0x20, 0x99, 0x87, 0x4b, 0x69, 0xc2, 0x45, 0xff, 0x89, 0xab, 0xe8, 0x9b, 0x7e, 0x51, 0x00, 0xf2, 0x0b, 0xc7, 0x7e, 0xe2, 0xdd, 0x16, 0x94, 0xb3, 0x76, 0x24, 0xf9, 0xe5, 0x0a, 0x3e, 0xc1, 0x7b, 0xd7, 0x1a, 0x40, 0x23, 0x99, 0x3d, 0x16, 0x8e, 0xe0, 0x7b, 0xcc, 0x67, 0xeb, 0xeb, 0xab, 0xee, 0xab, 0x17, 0xca, 0xd6, 0xca, 0xb3, 0x37, 0xe4, 0x4b, 0x93, 0x85, 0x0c, 0x65, 0xe0, 0x7e, 0x16, 0xd4, 0x5f, 0x5b, 0x3c, 0x57, 0x3d, 0x1f, 0x6a, 0x7a, 0x81, 0xf3, 0x94, 0x93, 0x52, 0xf4, 0x7f, 0xac, 0x56, 0xdf, 0xf1, 0xa9, 0xed, 0xca, 0xb3, 0x2b, 0x6b, 0x23, 0x2d, 0x12, 0x40, 0x6f, 0xfe, 0x07, 0x8a, 0x53, 0x19, 0x1d, 0x42, 0x65, 0x2d, 0x3d, 0x99, 0xf6, 0x39, 0xb5, 0x01, 0x7f, 0xca, 0x30, 0x88, 0x0a, 0x4a, 0xe6, 0x3e, 0xc2, 0x50, 0xd0, 0x2a, 0x8e, 0xe7, 0xdd, 0xcb, 0xfc, 0x4e, 0xdd, 0xb2, 0x7a, 0x21, 0x79, 0xbc, 0x7c, 0xfc, 0x96, 0xe1, 0x71, 0xfa, 0xf0, 0x28, 0x05, 0x18, 0x8c, 0x8f, 0x41, 0x00, 0x9f, 0x6d, 0xe4, 0xd2, 0x82, 0xb9, 0xe5, 0x21, 0xdf, 0xc0, 0xfc, 0x73, 0x38, 0xd4, 0x11, 0x38, 0x88, 0x06, 0x16, 0x59, 0x14, 0x92, 0xbe, 0x13, 0xa2, 0xc7, 0x53, 0xf2, 0xe2, 0xe6, 0x01, 0x51, 0x30, 0x12, 0x3f, 0xf2, 0x1e, 0xe1, 0x78, 0xe9, 0x9d, 0xac, 0xfe, 0x47, 0x6a, 0x96, 0x85, 0x08, 0xe3, 0x11, 0x34, 0x7c, 0xfe, 0xe8, 0x9d, 0x2d, 0x36, 0x58, 0x22, 0x03, 0xaf, 0x9f, 0x10, 0x5e, 0xb7, 0x04, 0xed, 0x47, 0xbb, 0xcb, 0x96, 0xed, 0xca, 0xde, 0x1f, 0xf5, 0xe6, 0x84, 0x12, 0xa3, 0x31, 0x06, 0xd9, 0xb2, 0x32, 0xe2, 0xc5, 0x32, 0xa4, 0x8a, 0x7e, 0x56, 0xcd, 0x17, 0x4b, 0xc8, 0x20, 0xd9, 0xa4, 0xc3, 0x23, 0xda, 0x0c, 0x62, 0x56, 0xa2, 0xaf, 0xf5, 0xcd, 0x1a, 0xdf, 0x9b, 0xcd, 0x63, 0xf9, 0xdc, 0xae, 0xf5, 0x43, 0xb1, 0x83, 0x21, 0x33, 0xb2, 0x75, 0x2a, 0xd7, 0xa8, 0x4f, 0x70, 0x37, 0x61, 0xd5, 0xa6, 0x6c, 0xec, 0x98, 0x89, 0x0c, 0xfc, 0x2b, 0x0e, 0x35, 0x0f, 0xca, 0xa0, 0x1d, 0x03, 0xd8, 0x4f, 0xc2, 0x11, 0x4d, 0x7e, 0x72, 0xd3, 0xa9, 0xb9, 0x04, 0xee, 0x4e, 0xd0, 0xa2, 0xb6, 0xbb, 0x70, 0x9d, 0xd5, 0x25, 0x3e, 0x92, 0xab, 0xe1, 0x10, 0x7d, 0xe4, 0x75, 0xe9, 0xd7, 0x44, 0x6e, 0xa5, 0x60, 0x88, 0xc3, 0x14, 0x67, 0x89, 0x65, 0xb5, 0x52, 0xf5, 0x97, 0x9c, 0xf7, 0x2d, 0xa7, 0xa4, 0xda, 0xb6, 0x63, 0x93, 0x28, 0x6c, 0x81, 0xb4, 0x8a, 0x36, 0x8c, 0x2d, 0xa1, 0xa4, 0xde, 0xac, 0x7e, 0xee, 0x91, 0xe5, 0xb9, 0x68, 0x4f, 0x6d, 0x56, 0xbb, 0x81, 0xf9, 0xa1, 0xdb, 0x39, 0xb6, 0x6b, 0xf9, 0xd6, 0x3d, 0x5e, 0x7d, 0x4f, 0x14, 0x97, 0xae, 0x83, 0xf7, 0x56, 0xe1, 0xa6, 0x78, 0x49, 0x69, 0x81, 0x44, 0x29, 0x99, 0xf4, 0xbb, 0x49, 0xaa, 0x9b, 0x7c, 0x73, 0xdf, 0xe8, 0x6c, 0xd2, 0x3c, 0x8c, 0xb4, 0xcc, 0xde, 0xea, 0x55, 0x70, 0x58, 0xca, 0x72, 0x47, 0x49, 0xe2, 0x36, 0xb0, 0x90, 0x6e, 0x40, 0xd8, 0xb6, 0x8d, 0x0c, 0xcd, 0xab, 0xa8, 0x3c, 0x25, 0x6f, 0x37, 0xc5, 0x01, 0xf0, 0xa5, 0x11, 0x0a, 0xa0, 0x77, 0x9b, 0x02, 0xd5, 0x20, 0xfa, 0x06, 0x37, 0x4e, 0x6c, 0xa7, 0x44, 0xdd, 0x84, 0x77, 0x3e, 0xe6, 0x59, 0x65, 0x33, 0xb3, 0x66, 0x79, 0x4f, 0x1a, 0xd3, 0x2f, 0x7d, 0xd2, 0xde, 0x29, 0x10, 0x41, 0xa5, 0x1b, 0x06, 0xe7, 0x99, 0xfd, 0x07, 0x55, 0x98, 0xfe, 0x61, 0xdd, 0x90, 0xc4, 0x85, 0x46, 0xcb, 0x09, 0x39, 0xf3, 0xd2, 0x29, 0xf2, 0x52, 0x15, 0xc3, 0xb3, 0xad, 0x65, 0x3d, 0xa4, 0xb3, 0x73, 0x9f, 0x2f, 0xd7, 0xc7, 0x3f, 0xc4, 0x06, 0xa9, 0x40, 0xcd, 0x1a, 0xb0, 0xb1, 0x22, 0x32, 0x80, 0xe8, 0x58, 0xc2, 0x79, 0x9e, 0x5a, 0xf0, 0x2d, 0xad, 0xa0, 0x8a, 0xcc, 0x65, 0x30, 0x91, 0xa9, 0xe9, 0xae, 0xce, 0xe9, 0xf6, 0x30, 0x44, 0x6f, 0x7f, 0xc2, 0x60, 0xa6, 0xa6, 0x16, 0xd3, 0x4b, 0x92, 0x4f, 0xa1, 0xd9, 0x7a, 0xbe, 0x14, 0x24, 0xac, 0xa8, 0xc4, 0xed, 0xd9, 0x01, 0xde, 0xea, 0x45, 0x83, 0x92, 0x52, 0xfa, 0xc1, 0xdd, 0xc7, 0xf3, 0x62, 0x8e, 0x2b, 0x0e, 0x1d, 0x6e, 0xcc, 0x00, 0xe6, 0x0d, 0xba, 0xb2, 0x4c, 0x98, 0x81, 0xab, 0x12, 0x42, 0x8b, 0x05, 0x66, 0x9a, 0xfe, 0xa5, 0xc4, 0xc5, 0x16, 0xc4, 0xa9, 0xb7, 0x97, 0x6c, 0x5d, 0x92, 0x45, 0xf6, 0xf9, 0xe9, 0x38, 0x8f, 0xec, 0x0e, 0x14, 0xb3, 0x97, 0x26, 0x66, 0x4c, 0xeb, 0x14, 0x01, 0x18, 0xb1, 0xc8, 0x1e, 0x83, 0x49, 0x54, 0x98, 0x30, 0xf3, 0xa7, 0x03, 0x08, 0x98, 0x2b, 0x5e, 0x63, 0xbf, 0x79, 0xe1, 0x8e, 0xf9, 0xbd, 0x85, 0xc8, 0xdb, 0x79, 0xd8, 0x14, 0x93, 0xc5, 0x78, 0xf7, 0x67, 0xe1, 0xa9, 0xeb, 0xab, 0xf2, 0xa9, 0x16, 0x2b, 0xfa, 0x65, 0x45, 0x0b, 0x6e, 0xa8, 0xcd, 0x9c, 0x43, 0x3c, 0xb7, 0x24, 0xe5, 0x68, 0x92, 0x96, 0x50, 0xd5, 0x8b, 0xf2, 0x32, 0xf7, 0x49, 0xe3, 0x4c, 0xbb, 0xb1, 0xaa, 0x39, 0xfe, 0xc4, 0xa1, 0xf3, 0xf2, 0x1e, 0x77, 0xd4, 0x4f, 0x7f, 0x7c, 0x61, 0x28, 0x05, 0x55, 0xb3, 0xd2, 0xd6, 0x05, 0xbb, 0x38, 0x4c, 0x82, 0xc5, 0x19, 0x58, 0x53, 0xd8, 0xdb, 0xf3, 0x85, 0xb3, 0x12, 0x5e, 0xe6, 0x03, 0xa8, 0x2a, 0x9e, 0xc0, 0xfd, 0xcf, 0x87, 0x87, 0xe5, 0x64, 0x98, 0xf2, 0x44, 0x2e, 0x27, 0x3d, 0x7a, 0x91, 0x02, 0x2e, 0x4f, 0xac, 0xa1, 0x86, 0xc5, 0x64, 0x8e, 0xb9, 0x75, 0xf5, 0x94, 0xfe, 0x01, 0xfd, 0x73, 0xc2, 0xd6, 0xfb, 0x39, 0xda, 0xae, 0x91, 0x3b, 0xae, 0xb7, 0x70, 0x6c, 0x87, 0xfe, 0x89, 0x31, 0x8d, 0x1a, 0xdb, 0x95, 0x1c, 0x8d, 0xdf, 0x86, 0x27, 0x0b, 0x00, 0x7d, 0x9a, 0xfc, 0xb5, 0xaa, 0xf0, 0x79, 0x30, 0xf8, 0xab, 0xc1, 0xac, 0x2f, 0xdf, 0x8a, 0x36, 0x63, 0x59, 0xca, 0x77, 0x98, 0x00, 0x00, 0x01, 0x00, 0xca, 0xc7, 0x4a, 0x81, 0xaf, 0xcb, 0x45, 0x6a, 0xe9, 0x9d, 0xa3, 0x03, 0x70, 0xb3, 0x07, 0xd0, 0xca, 0x3d, 0xac, 0xad, 0xca, 0x8c, 0x63, 0xbd, 0x65, 0x83, 0x99, 0x84, 0x62, 0xb4, 0xe0, 0x9d, 0xdd, 0x1f, 0x41, 0x1e, 0x53, 0x28, 0x0c, 0xd3, 0x15, 0x7d, 0xd3, 0x69, 0x5c, 0xbe, 0xcc, 0xeb, 0xf0, 0xe7, 0xb7, 0xf2, 0x54, 0xd6, 0x8b, 0xee, 0x2c, 0xcb, 0x5c, 0x02, 0x17, 0x34, 0x07, 0xb3, 0x42, 0x41, 0xaf, 0x2a, 0x1d, 0xdc, 0x40, 0x50, 0x10, 0x6d, 0x2e, 0x00, 0xff, 0xe9, 0x8b, 0x9b, 0x8f, 0xc2, 0x9c, 0x74, 0x33, 0xd3, 0x69, 0x3f, 0x22, 0x34, 0xc5, 0x2f, 0xcd, 0x3a, 0x66, 0xc7, 0x7d, 0x23, 0x15, 0x8d, 0x1e, 0x26, 0x4b, 0x09, 0xf0, 0x10, 0x5d, 0x4a, 0x87, 0x8b, 0xf2, 0x94, 0xda, 0x9e, 0x98, 0x69, 0x28, 0x7c, 0x01, 0x04, 0x26, 0xb1, 0xea, 0x16, 0x4e, 0x6a, 0x88, 0x58, 0x1f, 0xb2, 0x44, 0xf2, 0x65, 0xe3, 0x75, 0x53, 0x1c, 0x34, 0x67, 0x47, 0x34, 0x2f, 0x61, 0x28, 0x5a, 0x70, 0x00, 0x4f, 0xb6, 0x47, 0x25, 0x8a, 0x34, 0x1f, 0xa8, 0x68, 0xcb, 0x05, 0x92, 0x5e, 0xf0, 0x6f, 0xa0, 0x41, 0x3c, 0x68, 0xf1, 0xb3, 0x9e, 0x11, 0x2a, 0xe5, 0xc9, 0xff, 0xa0, 0x79, 0x8e, 0x1c, 0xf2, 0x86, 0xbe, 0xd2, 0x7a, 0xf4, 0xaa, 0xd9, 0x2b, 0x7b, 0x6f, 0xfc, 0x97, 0x1b, 0x02, 0x98, 0x6b, 0x28, 0x43, 0x79, 0x2c, 0x49, 0x0c, 0x7c, 0x12, 0x02, 0x91, 0xf6, 0x7e, 0xf9, 0xfe, 0x13, 0x3d, 0x4a, 0x47, 0xed, 0x24, 0xae, 0xae, 0x7f, 0xfc, 0x3b, 0x93, 0xc4, 0x64, 0x8c, 0xcb, 0x79, 0xfc, 0xff, 0x8b, 0xdd, 0xcc, 0x16, 0x02, 0x0b, 0xd6, 0x95, 0xcc, 0x02, 0x74, 0xd5, 0x9b, 0xe5, 0x05, 0x1d, 0x0a, 0x8e, 0xb9, 0x5d, 0xe5, 0xf5, 0xda, 0xf3, 0xbd, 0x93, 0xb3, 0x1f, 0x7f, 0xfe, 0x8c, 0x5a, 0x9e, 0x9e, 0x3c, 0x44, 0x29, 0x2b, 0x2c, 0x2b, 0x02, 0x7d, 0xe7, 0x76, 0xac, 0x20, 0xe5, 0x51, 0x7b, 0xa6, 0x6d, 0xba, 0x00, 0x73, 0xcd, 0xe0, 0xa1, 0x9d, 0x0b, 0x52, 0xe0, 0x11, 0x46, 0xff, 0x18, 0x46, 0x0a, 0x80, 0x1c, 0xe7, 0xc7, 0x11, 0x6a, 0x06, 0x77, 0xec, 0x40, 0xfc, 0x45, 0xe1, 0xe2, 0x8e, 0x3d, 0xc2, 0x6e, 0x01, 0xa4, 0x07, 0x56, 0xd7, 0xa8, 0x39, 0x8c, 0x54, 0x88, 0xa7, 0x96, 0x8f, 0x0b, 0x55, 0x41, 0x39, 0x2e, 0x62, 0x83, 0x8e, 0x96, 0xe4, 0x42, 0xc8, 0xd9, 0x36, 0x5b, 0x4c, 0x2a, 0xdc, 0x3a, 0x4c, 0x73, 0x7a, 0xde, 0x75, 0x9f, 0x98, 0x4d, 0xf1, 0x23, 0xd5, 0x53, 0xf3, 0x51, 0x79, 0x26, 0x3a, 0x48, 0xc9, 0xd0, 0xa3, 0x0a, 0xb9, 0x38, 0x43, 0x84, 0x33, 0x5d, 0x66, 0x76, 0x1d, 0xcb, 0xef, 0x98, 0x9b, 0xab, 0xb4, 0xef, 0x11, 0x5d, 0x61, 0xbe, 0x84, 0xcf, 0x6a, 0x05, 0x0e, 0x46, 0x7c, 0x9b, 0x7c, 0xd9, 0x1e, 0x14, 0xea, 0x03, 0xa3, 0xf4, 0x19, 0x59, 0xf0, 0xa1, 0xb8, 0x5c, 0xd0, 0x53, 0x85, 0x09, 0x82, 0x4a, 0x67, 0x6c, 0xe7, 0x2f, 0x69, 0x98, 0x4f, 0x7f, 0xbe, 0x83, 0x93, 0x82, 0x40, 0xde, 0x28, 0xfd, 0xec, 0xd7, 0x59, 0x49, 0xc8, 0x0e, 0x2e, 0x98, 0x69, 0x51, 0x34, 0x71, 0x75, 0x19, 0xac, 0x7c, 0xac, 0x6f, 0xdb, 0x24, 0x48, 0xbb, 0xa5, 0x13, 0x23, 0x02, 0xbc, 0xe2, 0x62, 0x32, 0x12, 0xa9, 0x15, 0x15, 0x16, 0x92, 0x54, 0x4f, 0xa3, 0xa2, 0x27, 0x8b, 0x14, 0x61, 0x57, 0x8d, 0x6d, 0x24, 0x87, 0x0d, 0x36, 0x5c, 0x5d, 0x10, 0xf1, 0x27, 0xf2, 0x36, 0xf1, 0xc4, 0x32, 0x28, 0x20, 0x23, 0xc2, 0x83, 0x51, 0x21, 0xe5, 0xe1, 0x60, 0x10, 0x2e, 0x38, 0xc8, 0xc2, 0x05, 0x73, 0xd2, 0x6e, 0xb3, 0x0f, 0x20, 0xfe, 0xd9, 0x1b, 0x99, 0xbc, 0x09, 0x3a, 0x69, 0x20, 0xd6, 0xb6, 0x08, 0xc2, 0x62, 0xa5, 0x2d, 0xf5, 0x09, 0x1b, 0x12, 0xf2, 0x2b, 0x36, 0x29, 0xff, 0xfa, 0xec, 0x20, 0x0c, 0xdf, 0x15, 0x52, 0x56, 0x91, 0x34, 0x40, 0xbc, 0xdd, 0x86, 0x93, 0x01, 0x7d, 0xb9, 0x70, 0xdb, 0xff, 0xfa, 0x12, 0xe5, 0x4a, 0x1b, 0xec, 0x61, 0x8f, 0x28, 0x9e, 0xaa, 0x60, 0x31, 0x00, 0xc7, 0x7f, 0xcb, 0x1f, 0x94, 0x79, 0xd6, 0x79, 0x03, 0xce, 0x6b, 0x4c, 0x62, 0x26, 0xc8, 0x4f, 0xae, 0x9c, 0x14, 0x89, 0x54, 0x3c, 0x29, 0x74, 0xdd, 0x69, 0x9d, 0x84, 0x79, 0x40, 0x90, 0xc9, 0xe2, 0xbc, 0xfa, 0x94, 0x87, 0x86, 0x09, 0x19, 0x71, 0x29, 0x53, 0x77, 0xd2, 0x24, 0xf8, 0x69, 0xcb, 0x14, 0x34, 0x51, 0x58, 0x89, 0xa2, 0xd6, 0x17, 0xf2, 0xee, 0x51, 0x4f, 0x03, 0x9a, 0x9e, 0x6f, 0x58, 0x5f, 0xb8, 0xf9, 0x0f, 0x4f, 0x9c, 0x11, 0x64, 0x84, 0xa2, 0x89, 0x94, 0xca, 0x9a, 0x7a, 0x9e, 0xd1, 0xf8, 0x92, 0x4e, 0x45, 0xae, 0xd1, 0xab, 0x09, 0x4f, 0x0b, 0x32, 0x76, 0xf0, 0x39, 0x55, 0x77, 0x1e, 0xfe, 0xa5, 0xc2, 0xce, 0x3d, 0x3b, 0xd5, 0xc6, 0x6d, 0xb6, 0x70, 0x7a, 0x2b, 0x64, 0x20, 0x47, 0x71, 0x23, 0xf9, 0x40, 0x58, 0xd2, 0x68, 0x66, 0xf2, 0x8b, 0x48, 0xfa, 0x66, 0xa4, 0x80, 0x13, 0x4a, 0xc3, 0xe5, 0x2e, 0x65, 0xae, 0xd8, 0x61, 0xfb, 0xba, 0x67, 0x8d, 0x20, 0x54, 0x07, 0xa4, 0x91, 0x2f, 0x94, 0x08, 0x7c, 0xae, 0xc3, 0x6e, 0x79, 0x3a, 0xf4, 0xa3, 0xe9, 0xaf, 0xf7, 0x7b, 0x13, 0xa7, 0x29, 0xdb, 0xf5, 0x93, 0x3e, 0x9a, 0x14, 0xd6, 0x61, 0x45, 0x52, 0x9b, 0x19, 0xfe, 0xa3, 0x85, 0xc4, 0x00, 0x13, 0x31, 0xc8, 0x0d, 0x72, 0x72, 0x8e, 0x68, 0xd0, 0x82, 0x4f, 0x4b, 0xe5, 0x13, 0xe1, 0x96, 0x18, 0xb3, 0x8d, 0xcc, 0x50, 0x59, 0x2a, 0x46, 0xb2, 0x21, 0x98, 0x78, 0xf6, 0xf6, 0xc6, 0x3d, 0xce, 0x38, 0x92, 0x21, 0x33, 0x2a, 0x76, 0x70, 0xec, 0x58, 0x72, 0xfa, 0xde, 0x64, 0xda, 0x08, 0xc9, 0x93, 0x4c, 0xde, 0x1c, 0x86, 0x35, 0x52, 0x58, 0x5b, 0xb0, 0x8e, 0x03, 0x6e, 0x7e, 0xab, 0x11, 0x5e, 0x67, 0x18, 0x74, 0xc5, 0x83, 0xab, 0x6c, 0x10, 0x38, 0x73, 0x0f, 0x2e, 0x92, 0x28, 0x61, 0x7a, 0xd6, 0x45, 0xcb, 0xc0, 0x35, 0x57, 0x72, 0x03, 0x11, 0x12, 0x1f, 0x2b, 0x5d, 0xee, 0x9b, 0xdb, 0xa9, 0x10, 0xd6, 0x21, 0xb0, 0x1e, 0xfd, 0xbe, 0x6e, 0x4b, 0x27, 0xec, 0xc7, 0xc5, 0x46, 0xde, 0x0a, 0x53, 0x53, 0x64, 0xcf, 0x35, 0xc7, 0xf5, 0x02, 0x3a, 0x39, 0xb9, 0xf9, 0xfb, 0x2a, 0x8d, 0xc7, 0x67, 0x63, 0x09, 0x5e, 0x09, 0xd9, 0x16, 0x27, 0x8c, 0x9a, 0xfb, 0xb6, 0xf9, 0x5d, 0xa8, 0x37, 0x92, 0xde, 0x9f, 0x7b, 0x0b, 0x2d, 0xb1, 0x48, 0x09, 0x2e, 0x2e, 0x6a, 0x1c, 0x05, 0x2f, 0x27, 0x83, 0xf5, 0x37, 0xd2, 0x3f, 0xf3, 0x2c, 0x45, 0x80, 0xdc, 0x31, 0x68, 0x05, 0x81, 0x65, 0xa3, 0x1b, 0x6e, 0x5c, 0xaa, 0xf8, 0xa6, 0x60, 0x6a, 0x2e, 0x4d, 0x9d, 0x9c, 0x2f, 0xbf, 0x4c, 0x2e, 0xf3, 0x01, 0xc0, 0xa5, 0x59, 0x00, 0x7d, 0x61, 0x42, 0x21, 0xec, 0x2b, 0x13, 0xfd, 0x3c, 0x45, 0xb4, 0xcd, 0x01, 0x7c, 0x40, 0x47, 0x50, 0xdc, 0x7a, 0x33, 0x26, 0xc0, 0x9a, 0xb9, 0xf4, 0x8c, 0xa8, 0x00, 0xfb, 0x51, 0xbf, 0x04, 0x9b, 0x92, 0x4b, 0xd8, 0x06, 0xb2, 0x71, 0x8b, 0x3a, 0xee, 0x69, 0xc0, 0x2c, 0xc9, 0x5f, 0x57, 0x45, 0x62, 0xa2, 0xdc, 0x89, 0x14, 0xcb, 0x40, 0x74, 0xbb, 0x99, 0x56, 0x0c, 0xb5, 0xdd, 0x11, 0x12, 0xc3, 0x9b, 0x5e, 0x17, 0xdd, 0x4d, 0xcf, 0x1c, 0x4b, 0x5f, 0x3e, 0xd2, 0x45, 0x20, 0x12, 0xc2, 0xeb, 0x70, 0x09, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x07, 0xec, 0x81, 0x00, 0x00, 0xb3, 0x9c, 0x26, 0x3a, 0x16, 0x44, 0x6e, 0xe1, 0xfb, 0x28, 0x93, 0x4d, 0x84, 0x3a, 0x9f, 0xe0, 0xb6, 0x9c, 0x08, 0xe9, 0xb2, 0x19, 0xe5, 0xb2, 0xb4, 0x79, 0x1c, 0x3c, 0x44, 0xa3, 0xe5, 0x33, 0x62, 0xf2, 0x26, 0xdd, 0xef, 0x55, 0x90, 0x47, 0x4c, 0xb6, 0xc2, 0x33, 0x7f, 0xc4, 0xd0, 0x9d, 0x79, 0xcd, 0x9b, 0xf0, 0x47, 0xe4, 0x57, 0xa5, 0x81, 0x51, 0xd8, 0x0c, 0x8d, 0xa4, 0x73, 0xd9, 0xae, 0x6f, 0xaa, 0xfc, 0x73, 0x96, 0xe1, 0x01, 0x40, 0xe8, 0x30, 0xb7, 0x8d, 0x11, 0x95, 0x0d, 0xc8, 0x31, 0x8e, 0x24, 0x93, 0x6e, 0xb4, 0xfc, 0xe8, 0xe0, 0x94, 0x29, 0x6a, 0x6e, 0x98, 0x01, 0x6d, 0x04, 0xde, 0x04, 0xac, 0xf0, 0xcf, 0x89, 0xaf, 0x79, 0xd6, 0xc1, 0xf4, 0x82, 0x90, 0x78, 0xd0, 0x91, 0x8c, 0x6f, 0x0d, 0xc8, 0x80, 0xce, 0x67, 0x3f, 0x2a, 0x86, 0x43, 0x4a, 0x6e, 0x33, 0x87, 0x9c, 0xc5, 0x72, 0xae, 0xc1, 0x90, 0xda, 0x96, 0x46, 0xf1, 0x86, 0x0c, 0x3b, 0xe1, 0x52, 0xad, 0x7b, 0x90, 0xbe, 0x81, 0x91, 0x22, 0xa5, 0xee, 0x65, 0xef, 0xb4, 0x3c, 0xd6, 0x21, 0xd5, 0x30, 0xc7, 0x24, 0x4f, 0x2a, 0x70, 0x81, 0xf4, 0x27, 0xab, 0x2f, 0x2d, 0x75, 0xc6, 0x34, 0xda, 0x36, 0x3c, 0xfa, 0x55, 0x79, 0xd1, 0xe3, 0xee, 0xcd, 0x88, 0x84, 0xd7, 0x1e, 0x95, 0x9c, 0x68, 0x73, 0x07, 0xbb, 0xff, 0x9b, 0x50, 0xbc, 0xdf, 0x12, 0xde, 0xfb, 0xb4, 0x14, 0xe1, 0x41, 0x9f, 0x1e, 0xe3, 0x96, 0xb3, 0xc4, 0x12, 0x2b, 0x7f, 0xb6, 0x73, 0x7c, 0x25, 0x66, 0xa9, 0x6d, 0x4b, 0x81, 0x7f, 0xda, 0x66, 0x88, 0xca, 0x9a, 0x40, 0xa8, 0x57, 0xed, 0x56, 0x7b, 0x39, 0xe9, 0x53, 0x00, 0xeb, 0x7c, 0x7b, 0x7e, 0x96, 0x21, 0x78, 0x13, 0xee, 0x24, 0x52, 0xdd, 0x14, 0x54, 0xc7, 0x98, 0xff, 0x01, 0x9f, 0x63, 0x3b, 0xc1, 0x11, 0x31, 0x96, 0x63, 0x2b, 0xca, 0x38, 0x9d, 0xb3, 0xda, 0xcb, 0x48, 0x72, 0xa2, 0x60, 0xaa, 0x4e, 0xb4, 0xb3, 0xad, 0x66, 0xed, 0x2c, 0x27, 0x43, 0xa2, 0x88, 0x05, 0x39, 0x62, 0x47, 0x79, 0x9d, 0x3f, 0xe3, 0x7d, 0xc5, 0xfb, 0x9f, 0x6a, 0x72, 0xce, 0x24, 0xbf, 0x61, 0x02, 0x23, 0xde, 0x00, 0x84, 0xcc, 0xd8, 0xd5, 0x8e, 0xe3, 0xd3, 0xc9, 0x47, 0x29, 0x83, 0x7a, 0x81, 0xc0, 0x52, 0xcb, 0x4e, 0x1f, 0x61, 0x16, 0x3f, 0x95, 0xc8, 0x2a, 0xf9, 0x0d, 0x3b, 0xb2, 0x6f, 0x2b, 0x89, 0x22, 0xd4, 0xf3, 0x62, 0xc8, 0x49, 0x45, 0xce, 0x7d, 0xa9, 0x4b, 0xc5, 0x02, 0x17, 0x96, 0x9c, 0xcd, 0x87, 0x99, 0x1c, 0xa8, 0xb3, 0xb3, 0xf9, 0xab, 0x27, 0x04, 0xf9, 0x3a, 0xf9, 0xd8, 0x92, 0xb8, 0x3f, 0x3c, 0x66, 0x0e, 0x62, 0xf9, 0x86, 0xfe, 0x4e, 0xe6, 0x57, 0xf7, 0xa2, 0x7f, 0x0b, 0x7f, 0xf5, 0x42, 0xbb, 0xb0, 0x5e, 0xc2, 0xc3, 0x4c, 0x8f, 0xc7, 0x97, 0xa8, 0x63, 0xbb, 0x20, 0x41, 0xc8, 0x67, 0x61, 0x08, 0x27, 0x4a, 0x4b, 0x72, 0x81, 0x4c, 0xca, 0x85, 0xed, 0x93, 0x81, 0x41, 0x60, 0x16, 0x85, 0xaa, 0x7e, 0x56, 0x07, 0x65, 0xd3, 0xe9, 0x35, 0x0b, 0xf7, 0x96, 0xbc, 0x00, 0x31, 0x5a, 0xae, 0x68, 0xe7, 0x94, 0x97, 0x29, 0x2a, 0xec, 0x0b, 0xc7, 0x89, 0xa0, 0x03, 0xd2, 0xc0, 0x35, 0x11, 0xa9, 0xe7, 0x19, 0x6e, 0x5b, 0x83, 0x40, 0xe6, 0xf5, 0xf4, 0x90, 0x6c, 0xdc, 0x8c, 0xe4, 0xac, 0xde, 0xb7, 0x9f, 0x15, 0x54, 0xaa, 0x46, 0x56, 0xf1, 0x60, 0xe6, 0x77, 0x1b, 0x80, 0xa5, 0x21, 0xb9, 0x5b, 0x93, 0x6d, 0x7e, 0xf0, 0x06, 0x5f, 0x65, 0xc7, 0xdc, 0x5f, 0x12, 0x88, 0x31, 0x2f, 0x78, 0x8b, 0x56, 0xea, 0x23, 0x9a, 0xf7, 0x7c, 0xcc, 0x96, 0x56, 0xc8, 0x49, 0x86, 0xb0, 0x90, 0x71, 0xc0, 0x83, 0xc5, 0xdd, 0xa3, 0x40, 0xa2, 0x11, 0x7d, 0xc3, 0xc5, 0x07, 0x05, 0xe1, 0x19, 0x6c, 0xed, 0x23, 0x01, 0xf8, 0xbe, 0x96, 0xa9, 0x6f, 0x66, 0xb3, 0xcd, 0x88, 0xc2, 0xf0, 0x19, 0xaf, 0x4b, 0x79, 0x16, 0xdf, 0x84, 0x28, 0x28, 0x3e, 0x05, 0xe4, 0xcb, 0xf7, 0x69, 0x45, 0xf8, 0x31, 0xb9, 0x35, 0xad, 0xc0, 0x71, 0xf5, 0xd9, 0x38, 0xc7, 0xa2, 0xd3, 0xf6, 0x5b, 0xf6, 0xb4, 0xc0, 0x3d, 0x3f, 0x1d, 0xdf, 0xad, 0x05, 0xf6, 0x15, 0x01, 0x1f, 0xdd, 0x03, 0x3d, 0x9e, 0xb5, 0x9a, 0x16, 0xdc, 0xf5, 0x6c, 0x8e, 0x59, 0x03, 0xa8, 0x84, 0x6b, 0x16, 0x43, 0xf0, 0x57, 0xcb, 0x5e, 0xa4, 0x74, 0x26, 0x88, 0xac, 0x41, 0x8d, 0x97, 0xd0, 0x69, 0x6c, 0xeb, 0x32, 0xc4, 0xda, 0x5e, 0x02, 0xa2, 0x36, 0x5e, 0x07, 0x81, 0x26, 0x38, 0x0c, 0x73, 0x26, 0x12, 0x8f, 0x90, 0xff, 0xdc, 0x5b, 0x69, 0xd9, 0x2f, 0xc4, 0x67, 0xbb, 0xc6, 0x14, 0x36, 0xba, 0xee, 0x3b, 0x2c, 0xb4, 0x22, 0x13, 0x89, 0x2e, 0xf4, 0x65, 0x1d, 0x22, 0x19, 0xbe, 0x9c, 0xf4, 0x00, 0x6c, 0xb2, 0x42, 0x5b, 0x65, 0x1a, 0x8a, 0x11, 0xae, 0xf6, 0x29, 0x8a, 0xbc, 0xef, 0xce, 0x8d, 0xeb, 0x7a, 0x9e, 0xb7, 0xb3, 0x5d, 0xfa, 0x07, 0xa4, 0x98, 0xa2, 0xbc, 0xbc, 0xb6, 0xca, 0x72, 0x00, 0x7c, 0xbf, 0xde, 0xe9, 0x5c, 0x12, 0x1f, 0x1e, 0x03, 0xaa, 0x15, 0xde, 0x7e, 0xfc, 0xfa, 0x4c, 0x97, 0x21, 0x77, 0xb1, 0xfa, 0x16, 0xa8, 0x8d, 0x88, 0x00, 0xc5, 0x9b, 0xb2, 0x2e, 0xd3, 0x65, 0xfc, 0x68, 0x44, 0x86, 0xf1, 0x08, 0xec, 0xa7, 0x88, 0xcd, 0x56, 0xf1, 0x09, 0x55, 0x1e, 0x6a, 0x6b, 0x71, 0x4b, 0x7b, 0x7f, 0x58, 0xf0, 0xd7, 0xd7, 0xe6, 0xb9, 0xe6, 0x5e, 0xef, 0xa2, 0xc0, 0x24, 0x8a, 0xee, 0xd5, 0xeb, 0x38, 0x0e, 0x9b, 0x18, 0x8b, 0x9c, 0x5f, 0xb2, 0x1e, 0x21, 0xb5, 0x1f, 0xb7, 0xef, 0xf5, 0xa4, 0xdf, 0xae, 0x07, 0xcd, 0xf8, 0x7f, 0xe4, 0x13, 0x0a, 0x90, 0x2e, 0x2a, 0x6d, 0xd3, 0x2b, 0x30, 0x06, 0x2f, 0xea, 0xd7, 0x26, 0x06, 0x94, 0xc3, 0x97, 0x6e, 0x00, 0x29, 0x80, 0x85, 0xa9, 0xb9, 0xfc, 0x86, 0x52, 0x78, 0x19, 0xdc, 0x82, 0xc7, 0xae, 0xda, 0x54, 0xc3, 0x27, 0x6d, 0xf9, 0x2e, 0xf8, 0x62, 0xcf, 0xe7, 0xd1, 0x27, 0x44, 0x2b, 0x7f, 0x97, 0xf1, 0xe7, 0x1a, 0x4f, 0x0d, 0xae, 0x93, 0x77, 0x96, 0x41, 0xfb, 0x3c, 0x40, 0xb0, 0xc2, 0xef, 0x5e, 0x7b, 0x50, 0x4e, 0xb3, 0x73, 0xbb, 0xf9, 0x29, 0x22, 0x82, 0x3a, 0x0f, 0xf9, 0x99, 0x42, 0x1a, 0xf5, 0x4e, 0x13, 0xa1, 0x16, 0xc5, 0x00, 0xd9, 0xa6, 0x25, 0xdd, 0x14, 0xf8, 0xd7, 0x87, 0xc7, 0x67, 0x13, 0xc4, 0x09, 0xaa, 0xa9, 0xab, 0x51, 0x2b, 0xf2, 0xbf, 0x81, 0xfb, 0xcd, 0x8d, 0x53, 0xf7, 0xc7, 0x9b, 0xe2, 0xdc, 0xe9, 0x7c, 0xa3, 0x27, 0x79, 0xe4, 0xc5, 0x00, 0x8f, 0x40, 0xf8, 0x71, 0xcf, 0x80, 0xf6, 0xa2, 0xc2, 0x9e, 0x62, 0xcc, 0x71, 0x2c, 0xc8, 0x88, 0xde, 0x76, 0xdd, 0x5e, 0xfa, 0xbc, 0xdd, 0x9e, 0x30, 0xbd, 0x2f, 0x90, 0x0d, 0x0b, 0x3f, 0x66, 0x5a, 0xb3, 0x76, 0x0f, 0x3a, 0xd8, 0x14, 0xec, 0xc2, 0x24, 0x56, 0x5b, 0xe2, 0xf8, 0xe2, 0xac, 0x05, 0x70, 0x92, 0xf6, 0x5b, 0xf5, 0x77, 0x60, 0xa8, 0x55, 0xbe, 0x6a, 0xf1, 0x54, 0x87, 0x62, 0xfe, 0x0c, 0xb5, 0x2c, 0x25, 0x8f, 0xc7, 0xff, 0xdf, 0x0e, 0x66, 0x2a, 0xd5, 0xb2, 0x4d, 0x75, 0x8e, 0xa7, 0xcc, 0x17, 0x10, 0x32, 0xfb, 0xeb, 0x67, 0xc0, 0x19, 0x80, 0x0d, 0xd0, 0xfc, 0x69, 0xaa, 0xd0, 0xe1, 0x9e, 0xff, 0xd6, 0x41, 0xbb, 0xe9, 0x1a, 0x04, 0x13, 0x4f, 0x82, 0x1e, 0x30, 0x20, 0xea, 0x77, 0x85, 0x05, 0x75, 0x6c, 0x0c, 0xc8, 0x66, 0x62, 0x77, 0xbd, 0xaf, 0xf3, 0xfa, 0x06, 0x4b, 0xb9, 0xc3, 0xb2, 0xc3, 0x63, 0x64, 0x02, 0x81, 0x2a, 0x8d, 0x02, 0x5a, 0x87, 0x94, 0x0f, 0x4f, 0x22, 0x1e, 0x30, 0x4c, 0x44, 0xac, 0xf0, 0x2d, 0x87, 0xe1, 0x56, 0x61, 0xe9, 0xa6, 0xcc, 0xa6, 0x39, 0xba, 0xac, 0xeb, 0x49, 0x7c, 0x04, 0xbb, 0xeb, 0x77, 0x5c, 0x9b, 0xc8, 0x69, 0xf4, 0x9a, 0xfb, 0xac, 0xa6, 0x54, 0xd7, 0x7b, 0x4e, 0x53, 0x74, 0x95, 0x6a, 0xa2, 0x7a, 0x9b, 0x10, 0x0a, 0x10, 0x1d, 0xae, 0x4e, 0xf7, 0xf4, 0x38, 0xd7, 0x4f, 0x94, 0xb4, 0xc1, 0x16, 0xee, 0xce, 0xab, 0x0f, 0xaf, 0x89, 0x85, 0x2a, 0x66, 0xb9, 0x5c, 0xfb, 0xf8, 0xd1, 0xa8, 0xc5, 0x01, 0xf6, 0x98, 0xac, 0x77, 0xce, 0x4b, 0xaa, 0xc3, 0xe3, 0x1d, 0x23, 0x23, 0xec, 0xb4, 0x92, 0xcf, 0xa5, 0xbf, 0x9f, 0xac, 0x92, 0x6f, 0xa7, 0xdf, 0xf4, 0x46, 0x81, 0x3d, 0x93, 0x85, 0x03, 0x7a, 0x7a, 0x65, 0xed, 0xe1, 0x22, 0xd5, 0x5a, 0xcb, 0x9b, 0x6b, 0x3c, 0xa0, 0x81, 0xc3, 0xc2, 0x3b, 0x8c, 0x2e, 0x7e, 0xfb, 0xf2, 0x97, 0x9d, 0x2b, 0x5f, 0x81, 0x31, 0xdc, 0xce, 0xec, 0x88, 0x9c, 0x70, 0x84, 0xed, 0x5f, 0xac, 0xbd, 0x76, 0x0e, 0xab, 0x1f, 0x15, 0x97, 0xbe, 0xd1, 0x74, 0x5d, 0x3a, 0x0a, 0xe0, 0xd7, 0x4a, 0x79, 0xb0, 0xd2, 0xf5, 0x70, 0x72, 0x6a, 0xa0, 0x50, 0xd2, 0x15, 0x97, 0xc9, 0xb6, 0x6f, 0x3c, 0xd7, 0x71, 0x94, 0x64, 0x7e, 0x15, 0xa1, 0x90, 0xe2, 0xa4, 0xed, 0xef, 0x00, 0x4d, 0xb8, 0xea, 0x48, 0x00, 0x18, 0x73, 0x24, 0x54, 0xb7, 0x96, 0x37, 0x5f, 0x04, 0xb3, 0x50, 0x06, 0xfe, 0x1c, 0x2e, 0x23, 0x19, 0xce, 0x8a, 0x64, 0x02, 0xfa, 0x6e, 0x77, 0xd2, 0xd4, 0x0b, 0x96, 0xc5, 0xfa, 0x04, 0xc5, 0x35, 0x24, 0x9d, 0x55, 0x6a, 0xac, 0x4e, 0x2a, 0x85, 0x44, 0xa8, 0xba, 0xde, 0x2d, 0x54, 0x26, 0xf4, 0x51, 0x78, 0x47, 0x93, 0x0b, 0x00, 0xa8, 0x88, 0x24, 0xac, 0x05, 0x56, 0x6c, 0xb7, 0xe0, 0x4c, 0xc6, 0xc4, 0x74, 0xe7, 0xc5, 0x77, 0xfd, 0x8f, 0x3a, 0x77, 0x1b, 0xb8, 0xc7, 0xca, 0x12, 0x9c, 0xcc, 0x86, 0x0a, 0x77, 0xba, 0x1d, 0x79, 0x42, 0xba, 0x01, 0x52, 0x97, 0x9d, 0x84, 0xdb, 0xdc, 0xbf, 0x27, 0x1e, 0x82, 0x22, 0x2e, 0x10, 0xb3, 0x1a, 0x2a, 0x95, 0x34, 0x84, 0x1d, 0x68, 0xda, 0xec, 0xc3, 0xc7, 0x19, 0xcb, 0xe1, 0x12, 0x98, 0xac, 0x78, 0xad, 0x18, 0xe7, 0xa0, 0xfe, 0x26, 0xae, 0xd7, 0xda, 0x38, 0xce, 0x83, 0x0d, 0xdb, 0x0d, 0xea, 0x02, 0x21, 0x3e, 0x03, 0x71, 0x9a, 0x4d, 0xc6, 0x2f, 0x8a, 0xe6, 0x5f, 0x12, 0x60, 0xfe, 0x88, 0x4b, 0x1d, 0x1f, 0x9c, 0x6f, 0x72, 0x0e, 0xdb, 0x5d, 0xcf, 0x19, 0x95, 0xeb, 0x9e, 0x18, 0xa6, 0x14, 0xe2, 0x81, 0x50, 0x45, 0x7d, 0x0b, 0xb4, 0x27, 0x56, 0xda, 0x22, 0x9a, 0x4b, 0x98, 0xed, 0x3e, 0x0e, 0xd8, 0xe7, 0x96, 0xe9, 0xa0, 0x5b, 0x41, 0xbe, 0x3a, 0x5c, 0x11, 0x99, 0x98, 0x86, 0x5a, 0xe6, 0xba, 0xe5, 0xc7, 0x3f, 0xa8, 0x13, 0x26, 0x26, 0x53, 0x4c, 0x8b, 0x76, 0xa6, 0xee, 0x0f, 0x04, 0x02, 0x5d, 0x34, 0xf1, 0x94, 0x79, 0x4d, 0x44, 0x8d, 0x8b, 0xf6, 0x9e, 0xbf, 0x3c, 0x88, 0xee, 0xcf, 0x75, 0x28, 0xfe, 0xfb, 0x89, 0x77, 0xb7, 0x33, 0xd9, 0xe0, 0x3c, 0x92, 0x14, 0x1c, 0x8e, 0xcb, 0x9b, 0x49, 0x4b, 0xd7, 0x02, 0x4d, 0xdd, 0xea, 0x57, 0x5c, 0x03, 0xd2, 0xbe, 0x06, 0x67, 0x75, 0x55, 0x48, 0x06, 0x78, 0xc6, 0x6f, 0xe9, 0x80, 0x61, 0xc3, 0xc5, 0xeb, 0xdd, 0x44, 0xd7, 0xd6, 0x22, 0x13, 0xeb, 0x4b, 0x22, 0xfc, 0xfa, 0xa0, 0xa9, 0xd7, 0x6f, 0x20, 0x29, 0x74, 0xe9, 0x27, 0x19, 0xbc, 0x57, 0x30, 0x91, 0x1c, 0x16, 0x86, 0x7a, 0xf4, 0x71, 0xbe, 0x67, 0x33, 0xde, 0xfc, 0x96, 0x61, 0xa9, 0x8e, 0x9b, 0x3f, 0x7e, 0xc9, 0xb2, 0xe2, 0xea, 0x07, 0xe2, 0x0c, 0xf6, 0x58, 0x12, 0x2d, 0x18, 0x73, 0x9e, 0x8b, 0xfe, 0xe1, 0x7c, 0x55, 0x7c, 0x81, 0x35, 0x85, 0x0d, 0xf1, 0x0d, 0xa2, 0x0a, 0x5f, 0x32, 0x52, 0x90, 0xd5, 0xad, 0xc4, 0xcc, 0xdf, 0x2f, 0xd4, 0xf1, 0x65, 0xeb, 0xdd, 0xf0, 0x77, 0x9e, 0x70, 0x25, 0x8d, 0x44, 0xae, 0x6b, 0x25, 0x1b, 0x1a, 0xce, 0x39, 0x2e, 0xe0, 0xc7, 0xa4, 0xc5, 0x8a, 0x96, 0xd7, 0x25, 0x28, 0xb2, 0x38, 0x35, 0x62, 0xbd, 0x8b, 0x12, 0x84, 0x47, 0xa4, 0xf3, 0x72, 0x06, 0x33, 0x7f, 0xc7, 0x35, 0xa5, 0x5c, 0x8b, 0x57, 0x9d, 0xd5, 0x3f, 0xc6, 0x64, 0xa8, 0xaf, 0xbf, 0x51, 0x8f, 0xcc, 0x88, 0x15, 0x34, 0xea, 0xc3, 0x13, 0x71, 0x02, 0x12, 0xa6, 0xb9, 0x01, 0x58, 0xe7, 0x3a, 0x24, 0x8f, 0x31, 0xa7, 0xfb, 0x4d, 0x1e, 0x76, 0x44, 0xb2, 0xd8, 0x15, 0xe5, 0xf6, 0x79, 0x37, 0x00, 0x0d, 0x3f, 0x12, 0xcf, 0x2b, 0x10, 0xa2, 0x51, 0x28, 0x99, 0x88, 0xc6, 0x33, 0xf7, 0xf3, 0x3f, 0xf9, 0xd2, 0xa9, 0x00, 0x3a, 0x1f, 0xfa, 0x28, 0xb2, 0xe5, 0x2c, 0xd0, 0x7d, 0x9a, 0x14, 0xcd, 0x2e, 0x20, 0x27, 0x71, 0x57, 0x73, 0x78, 0x61, 0x99, 0x9b, 0x2b, 0x98, 0xa0, 0x0b, 0xf3, 0x4a, 0x36, 0x1c, 0xd1, 0x38, 0x91, 0xda, 0x0c, 0xf2, 0x38, 0x27, 0x41, 0x69, 0xa7, 0xe9, 0x88, 0x9d, 0xe8, 0xcf, 0xe7, 0x0c, 0xe2, 0x61, 0x25, 0x5a, 0xb4, 0xce, 0x4e, 0x1d, 0xbd, 0x6f, 0x8f, 0x06, 0x20, 0xb1, 0x4a, 0x24, 0x46, 0x84, 0xfe, 0xaa, 0x82, 0x07, 0x59, 0x08, 0x79, 0xd9, 0xc3, 0xb5, 0x14, 0xce, 0x1a, 0xd8, 0x76, 0x06, 0x39, 0x09, 0x2f, 0x18, 0x4e, 0x6b, 0x1c, 0xe3, 0xb6, 0xff, 0x96, 0xbe, 0x39, 0x8d, 0xa1, 0x46, 0xe4, 0x3b, 0xeb, 0x85, 0xf5, 0xe5, 0x7c, 0x05, 0xf2, 0x39, 0xcd, 0x0d, 0x7b, 0xa0, 0x95, 0x5c, 0x03, 0x99, 0xaa, 0x53, 0xca, 0x12, 0xb3, 0x25, 0x9a, 0x0a, 0x2f, 0x4b, 0x3f, 0x89, 0x28, 0x12, 0x27, 0x31, 0x2c, 0xce, 0x55, 0x2f, 0x4d, 0xb1, 0xfb, 0x2a, 0x5e, 0x3b, 0x8f, 0x73, 0x1d, 0x4d, 0xfa, 0x20, 0x8f, 0x3b, 0x8d, 0x83, 0x08, 0xb3, 0x53, 0xb6, 0x0f, 0xcb, 0xe9, 0xa3, 0xde, 0x25, 0xa1, 0xbc, 0x0e, 0x1c, 0x15, 0x9c, 0xc4, 0x2f, 0xee, 0x39, 0x41, 0xf9, 0xe4, 0x57, 0x14, 0xf3, 0x4a, 0x92, 0xeb, 0xae, 0xbf, 0x1c, 0x18, 0x01, 0xbd, 0x78, 0xa1, 0xf6, 0xbe, 0x40, 0x0e, 0xcb, 0x35, 0x1c, 0x7e, 0x17, 0x8c, 0x2e, 0xc3, 0xb3, 0x8d, 0xa1, 0xbe, 0xec, 0x04, 0x35, 0x6a, 0x2f, 0xe0, 0xd0, 0x94, 0x63, 0xca, 0x86, 0x19, 0x1a, 0xdc, 0x70, 0xf9, 0x5d, 0x06, 0xf1, 0xeb, 0x4c, 0x04, 0x05, 0x25, 0x7e, 0xe1, 0xfa, 0x14, 0x01, 0x06, 0x21, 0x95, 0x50, 0x8b, 0x3f, 0xd8, 0xee, 0x11, 0xc2, 0x79, 0xb7, 0x54, 0x50, 0x66, 0x0d, 0xed, 0x83, 0x5c, 0x38, 0xed, 0x54, 0x11, 0x0a, 0xb3, 0x52, 0x50, 0x05, 0x7a, 0x58, 0xb9, 0xe2, 0xea, 0xde, 0x00, 0x00, 0x01, 0xb7 }; +constexpr AccessUnit M2V_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, true, 0, {}, { 0x60, 0x03, 0x38, 0xf1, 0x3d, 0xc4, 0xab, 0x4f, 0x09, 0xbd, 0xc3, 0xae, 0x12, 0xf0, 0xc2, 0xb8, 0x16, 0x3e, 0xa1, 0x92 } }; + +const std::vector ATRACX_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0xfd, 0xff, 0xe6, 0x35, 0x3c, 0xd3, 0x39, 0xd0, 0x8e, 0x3e, 0x56, 0x34, 0x97, 0x50, 0xf0, 0x75, 0x62, 0x8f, 0x4f, 0x2e, 0x75, 0x9c, 0x56, 0xc5, 0xcb, 0x1f, 0xa9, 0x84, 0xd5, 0xe2, 0x85, 0xec, 0xcf, 0x29, 0xcc, 0xbd, 0xc6, 0x77, 0xff, 0x7d, 0x1b, 0xec, 0x2c, 0x85, 0x65, 0x1f, 0xeb, 0x71, 0x26, 0x0d, 0x71, 0x01, 0x09, 0x7a, 0xb2, 0xed, 0x0b, 0x50, 0x39, 0x71, 0x96, 0xc9, 0x38, 0x98, 0x7b, 0x43, 0x4c, 0xa1, 0x7f, 0xac, 0xe2, 0x26, 0x30, 0xfc, 0xc0, 0x89, 0xb2, 0x6b, 0x09, 0xbf, 0x39, 0x02, 0x2f, 0x9f, 0x40, 0x3d, 0x17, 0xd3, 0x29, 0x03, 0xa4, 0x28, 0x30, 0x55, 0xa9, 0x36, 0x87, 0x10, 0xf3, 0x31, 0x88, 0x89, 0xda, 0x33, 0x88, 0x04, 0x49, 0x00, 0x81, 0x49, 0x5c, 0xe3, 0x8c, 0x83, 0x11, 0xc0, 0x84, 0xcd, 0xb5, 0x95, 0x29, 0x91, 0x83, 0x4b, 0xc8, 0x50, 0xf4, 0x5d, 0xb5, 0xeb, 0x28, 0xdc, 0x3a, 0x79, 0x68, 0x6e, 0x2b, 0x78, 0x06, 0x67, 0x83, 0x3b, 0x10, 0x7e, 0xba, 0x58, 0x72, 0x06, 0xce, 0x41, 0xed, 0xe1, 0xb7, 0x4d, 0x0e, 0x3d, 0x4a, 0xc2, 0x0b, 0xb7, 0xb1, 0x3b, 0x9a, 0x23, 0x6e, 0x1c, 0xaf, 0x02, 0xfa, 0x73, 0x0d, 0x58, 0x15, 0x33, 0x4f, 0x2f, 0x6b, 0x91, 0x82, 0x1a, 0x8d, 0xb6, 0xc2, 0x44, 0x96, 0x08, 0x9e, 0x69, 0x53, 0xb1, 0x5b, 0x2d, 0x3d, 0xa4, 0xac, 0xac, 0xf1, 0x54, 0xb3, 0xfe, 0x6a, 0x21, 0x67, 0x19, 0xfa, 0x37, 0x99, 0x41, 0x08, 0x81, 0xf6, 0xac, 0x12, 0x1d, 0x98, 0xef, 0x7a, 0x4b, 0xcc, 0xb2, 0xea, 0xdb, 0x08, 0x5e, 0xad, 0x02, 0xe6, 0x6e, 0x83, 0x10, 0x12, 0x3b, 0x7e, 0xc7, 0xdc, 0xc0, 0xd7, 0x26, 0x48, 0x6a, 0x66, 0x01, 0x11, 0x35, 0xc3, 0x4a, 0xce, 0xd6, 0x03, 0xe7, 0x29, 0x6a, 0x22, 0x3a, 0x8e, 0x55, 0x8c, 0x8a, 0xc8, 0xad, 0x3b, 0x22, 0xb9, 0xfa, 0xc1, 0x05, 0x4e, 0xd2, 0x9e, 0x84, 0xdf, 0x6f, 0xec, 0x2a, 0x75, 0x9b, 0x7f, 0xcc, 0x3b, 0xeb, 0x59, 0xb9, 0xf3, 0x02, 0x99, 0x50, 0x79, 0x41, 0x1e, 0x58, 0x8b, 0x6c, 0x39, 0x08, 0xce, 0x90, 0xb6, 0x5c, 0x59, 0x2c, 0x0b, 0xd2, 0xa0, 0xae, 0x47, 0xa9, 0x01, 0x81, 0xe4, 0xda, 0x5c, 0xdb, 0x68, 0xac, 0xda, 0xa5, 0xcf, 0xfe, 0x71, 0xed, 0xab, 0x00, 0x4a, 0xcf, 0x62, 0x95, 0xce, 0x74, 0xf4, 0x48, 0x18, 0xab, 0x00, 0xe2, 0x43, 0x5a, 0x9f, 0xff, 0x03, 0xdd, 0xd5, 0xd3, 0xd4, 0x22, 0xcb, 0x83, 0x9d, 0x0f, 0xd0, 0x43, 0x1f, 0x3d, 0xfa, 0x0c, 0x39, 0x89, 0x33, 0x4f, 0x6c, 0xdd, 0x40, 0x8e, 0xb8, 0x4d, 0x75, 0x38, 0x3d, 0x1e, 0x6c, 0x0a, 0x8f, 0xd4, 0x07, 0x71, 0xcf, 0x8b, 0xa8, 0x65, 0x4a, 0xb4, 0xc9, 0x9f, 0x4a, 0x6f, 0xee, 0xab, 0x2a, 0xee, 0xc1, 0x5b, 0x88, 0xe6, 0x93, 0x7c, 0x7b, 0x23, 0xee, 0x1a, 0xab, 0xb6, 0x82, 0x03, 0x63, 0x24, 0x8e, 0xea, 0xd3, 0xdc, 0x1f, 0x8e, 0x3d, 0x6a, 0xb9, 0x96, 0x79, 0xd2, 0x8f, 0x37, 0x23, 0x9d, 0x1b, 0x58, 0x38, 0xb4, 0x9e, 0x50, 0x8e, 0x13, 0x00, 0xcc, 0x22, 0x17, 0x25, 0x04, 0xde, 0x29, 0xea, 0x36, 0xac, 0x1a, 0x70, 0x7a, 0x15, 0x22, 0xbd, 0x14, 0x70, 0x08, 0x62, 0xfa, 0x1d, 0xeb, 0x37, 0xe1, 0xcd, 0x16, 0x8b, 0x3b, 0x24, 0x39, 0xec, 0xe8, 0x76, 0x4e, 0x50, 0x4a, 0x9f, 0x83, 0xc2, 0xb5, 0x9d, 0x1d, 0x71, 0xb3, 0x7f, 0xcd, 0x8d, 0x5d, 0x3e, 0x75, 0x6d, 0x3e, 0xd9, 0x2d, 0xfb, 0x3e, 0x0d, 0x95, 0x63, 0x3b, 0xe0, 0x34, 0x85, 0x91, 0xb3, 0x88, 0x6c, 0x87, 0x58, 0x60, 0x1c, 0x10, 0x4e, 0xd0, 0x18, 0x10, 0x77, 0x9f, 0xe1, 0x73, 0x05, 0x69, 0xd0, 0xc3, 0xe0, 0xa9, 0x7d, 0x11, 0x5f, 0xe8, 0xee, 0x05, 0xc3, 0x97, 0x19, 0x5b, 0x6f, 0xa9, 0x9f, 0xb8, 0x1c, 0x6c, 0x43, 0x40, 0x88, 0x7b, 0xc1, 0xf0, 0x5a, 0x2e, 0x5e, 0x2c, 0xf9, 0xd4, 0xbb, 0xef, 0x4a, 0x84, 0xe3, 0x3e, 0x9b, 0xbf, 0x62, 0x99, 0x8d, 0x5f, 0x26, 0x76, 0x39, 0x13, 0xc7, 0x8d, 0x36, 0xff, 0xa1, 0xf1, 0xd7, 0x47, 0xf7, 0x73, 0x10, 0x6e, 0x24, 0x1a, 0x44, 0xad, 0xca, 0xbd, 0xbc, 0xa6, 0xa8, 0xb4, 0x56, 0x26, 0xfc, 0x1f, 0x57, 0xe0, 0xca, 0x6e, 0x67, 0x33, 0x3e, 0x5f, 0x39, 0x47, 0x82, 0xb6, 0x54, 0xde, 0xc5, 0x92, 0xa8, 0xb7, 0xbc, 0x82, 0x03, 0xa7, 0x3d, 0x7b, 0x13, 0x70, 0x64, 0x57, 0x29, 0xa5, 0x33, 0x27, 0x63, 0xc1, 0xaa, 0x60, 0x3b, 0xe1, 0x91, 0xfd, 0x6c, 0x01, 0x88, 0x34, 0xc0, 0x07, 0xc3, 0x85, 0xfb, 0x1f, 0x12, 0xd7, 0x31, 0xfe, 0x78, 0xb8, 0x15, 0xe5, 0xc7, 0xf2, 0x97, 0x60, 0x05, 0xd1, 0x35, 0x34, 0x1b, 0x25, 0x4f, 0x35, 0xc6, 0x98, 0x12, 0x17, 0xc1, 0xe6, 0x42, 0xd0, 0xa3, 0xd7, 0xc8, 0xef, 0xed, 0x01, 0x7c, 0x3e, 0xc5, 0xc1, 0xf5, 0x02, 0xd7, 0x92, 0xea, 0x53, 0xfc, 0x65, 0xc4, 0x84, 0x85, 0x08, 0x1a, 0xbc, 0x07, 0xd2, 0xbc, 0xc4, 0x28, 0xf6, 0xab, 0xb0, 0x22, 0x9e, 0x05, 0x9b, 0xc6, 0xb4, 0x5e, 0x5f, 0xb5, 0xf5, 0x1f, 0x6c, 0xe0, 0xc8, 0xdb, 0x17, 0xd8, 0xe3, 0xdb, 0x50, 0x65, 0xef, 0x2a, 0xda, 0x40, 0x34, 0xc3, 0x21, 0x21, 0x13, 0x79, 0x12, 0x04, 0x84, 0x35, 0x34, 0x7f, 0x82, 0x37, 0xe8, 0x14, 0x29, 0x61, 0x2f, 0x19, 0xd2, 0xa2, 0x42, 0x93, 0x6f, 0x6d, 0x85, 0x38, 0x30, 0x6e, 0x25, 0x45, 0x78, 0xd5, 0x2a, 0xc4, 0x0e, 0xfd, 0xa0, 0xab, 0xa6, 0xae, 0xdc, 0x93, 0xa7, 0x72, 0x2a, 0x09, 0x04, 0xb4, 0x4e, 0xf2, 0x56, 0x00, 0x15, 0x98, 0x7f, 0x3b, 0x4f, 0x43, 0x90, 0x08, 0x42, 0xd0, 0x11, 0x93, 0x58, 0xd1, 0x23, 0xd4, 0x9a, 0x9a, 0x80, 0x0b, 0xf6, 0xa8, 0xe4, 0x17, 0x1a, 0xa8, 0xe3, 0x3d, 0x5a, 0x05, 0xf4, 0x73, 0xa7, 0x2d, 0xe6, 0xee, 0xa9, 0x78, 0xa2, 0x6e, 0x1b, 0xc2, 0x07, 0x04, 0xb8, 0x31, 0xb2, 0x01, 0x76, 0xba, 0x19, 0x0c, 0x0f, 0x4f, 0xce, 0xbe, 0x63, 0xa2, 0xb8, 0x80, 0xf2, 0x22, 0x8d, 0x0c, 0xdb, 0x25, 0x66, 0x7a, 0x40, 0xa3, 0x0b, 0xe2, 0x2f, 0x47, 0x4a, 0xfe, 0xd4, 0xd6, 0x12, 0x0f, 0x26, 0x5b, 0x04, 0xf4, 0x8c, 0xdf, 0x6b, 0x67, 0x45, 0x67, 0xe9, 0x62, 0xf3, 0x1d, 0x2c, 0x2e, 0x1a, 0xd6, 0x58, 0x43, 0x62, 0x03, 0x0a, 0xf1, 0xe6, 0x2d, 0xf8, 0xe0, 0x1a, 0x77, 0xbf, 0xe6, 0x39, 0x4c, 0x45, 0xaa, 0xce, 0xbf, 0x6c, 0x6c, 0xbb, 0x55, 0x91, 0x51, 0xd5, 0x49, 0x05, 0x1d, 0x39, 0xe4, 0xf6, 0x22, 0x20, 0x24, 0xc4, 0xb2, 0x83, 0xda, 0xb7, 0xb3, 0x86, 0xdf, 0x37, 0xe0, 0x01, 0xe1, 0x5b, 0x55, 0xd9, 0x60, 0x8b, 0x55, 0xcb, 0x28, 0x7f, 0xf9, 0xfa, 0x50, 0x0b, 0x4c, 0xc0, 0x18, 0x1d, 0x2e, 0x92, 0x19, 0x05, 0xa4, 0xd7, 0xde, 0xc7, 0x3e, 0xc4, 0x3f, 0x27, 0x56, 0x35, 0x00, 0xf5, 0xe3, 0x32, 0x71, 0xcb, 0xa0, 0x34, 0xa2, 0xbd, 0x3c, 0x6b, 0x17, 0x1e, 0x94, 0xb9, 0x7b, 0x62, 0xb8, 0xcb, 0xa4, 0xa2, 0x8a, 0x90, 0xb0, 0xc0, 0xb6, 0xc3, 0xfa, 0x9e, 0x1f, 0xa3, 0x75, 0x09, 0x71, 0x5d, 0x9c, 0x23, 0xdd, 0xf6, 0x6d, 0x4f, 0x42, 0xd2, 0xaf, 0x8d, 0x89, 0x54, 0xc1, 0xfd, 0x36, 0x25, 0x2c, 0x06, 0x2e, 0x4a, 0xea, 0x41, 0x63, 0x0e, 0x3d, 0xfc, 0x40, 0xa7, 0x71, 0x1c, 0x3c, 0x9c, 0x75, 0x02, 0xcb, 0xb3, 0x32, 0x6e, 0x33, 0xf5, 0x30, 0xb9, 0x63, 0x40, 0xd2, 0xb4, 0xff, 0xd5, 0x9e, 0xcd, 0x44, 0x9b, 0xeb, 0x4a, 0x43, 0x1d, 0x0f, 0xd0, 0x60, 0xa6, 0xad, 0x0a, 0xb7, 0x6d, 0xef, 0x82, 0x15, 0x02, 0x35, 0xd8, 0x4d, 0xdc, 0x1b, 0xdf, 0x1f, 0x69, 0x2c, 0x86, 0xdd, 0x11, 0x91, 0x22, 0x70, 0x74, 0x3e, 0x64, 0xef, 0x3f, 0xb2, 0xb1, 0xc3, 0xbe, 0x6e, 0x9d, 0x13, 0x8c, 0x8f, 0xff, 0xd6, 0x74, 0x0b, 0xc0, 0x89, 0x6a, 0x87, 0xd0, 0xe5, 0x4b, 0x3c, 0x30, 0xd7, 0x27, 0xad, 0xf1, 0xc8, 0x0c, 0x07, 0x1d, 0xea, 0x31, 0xfe, 0x37, 0x5b, 0x0b, 0xeb, 0xfe, 0xc2, 0x43, 0x55, 0xa4, 0xf6, 0x92, 0x11, 0x38, 0xa4, 0x71, 0xbc, 0x77, 0x59, 0x8e, 0x38, 0x24, 0xe3, 0xd3, 0xb0, 0x61, 0x5f, 0xe5, 0x76, 0x20, 0x93, 0x81, 0xba, 0x0f, 0x8d, 0xc4, 0x86, 0x73, 0x78, 0x74, 0xdf, 0x7a, 0xb4, 0x93, 0x58, 0xf2, 0x02, 0x40, 0x4e, 0x10, 0x93, 0xe4, 0xdd, 0xeb, 0x1e, 0x8d, 0x96, 0xa2, 0x32, 0x0a, 0x4b, 0xfe, 0xa7, 0x48, 0x2d, 0x72, 0x1e, 0x89, 0xa7, 0x50, 0x5c, 0x10, 0xe8, 0x52, 0x49, 0x4a, 0x13, 0xcc, 0x51, 0xba, 0x22, 0x7c, 0xa3, 0xca, 0xc8, 0xcf, 0x31, 0x79, 0x40, 0x2a, 0x6f, 0xf6, 0x6d, 0x82, 0x5c, 0x6c, 0xb5, 0x3a, 0x6c, 0xa7, 0x4f, 0xdf, 0x52, 0x94, 0xe0, 0x1a, 0xaa, 0xe6, 0x43, 0x20, 0x2f, 0xa6, 0x27, 0x67, 0x08, 0xbb, 0x31, 0x5c, 0x3d, 0xfd, 0x9a, 0xf9, 0x2e, 0x42, 0x95, 0x56, 0x8f, 0xad, 0x86, 0x20, 0xae, 0xd4, 0x04, 0x74, 0x1f, 0xfe, 0xe2, 0x0d, 0x0f, 0x69, 0xb3, 0x73, 0x2a, 0x57, 0x26, 0xca, 0x2f, 0xdd, 0xa5, 0xdd, 0x4d, 0x77, 0x44, 0x43, 0x54, 0x37, 0xf5, 0xda, 0x70, 0x36, 0x59, 0x89, 0x3d, 0x91, 0x3f, 0x6b, 0xff, 0x8f, 0x29, 0x3d, 0x8f, 0x4b, 0x07, 0xb8, 0x70, 0x7f, 0x13, 0x89, 0x9d, 0x03, 0xe9, 0x81, 0xcb, 0x19, 0xc5, 0x98, 0xde, 0xcd, 0x32, 0xdf, 0x33, 0x14, 0x69, 0xbf, 0x9b, 0xb1, 0x39, 0xdc, 0xec, 0x29, 0xf2, 0x3a, 0x88, 0x1d, 0x23, 0x1b, 0xec, 0xd1, 0x0f, 0xc4, 0x82, 0x94, 0xf7, 0xc1, 0x55, 0x3f, 0x98, 0xc9, 0xd8, 0x34, 0xd9, 0x80, 0x05, 0x59, 0xb7, 0xca, 0x24, 0x85, 0xbe, 0xf1, 0xfc, 0xb7, 0x42, 0xa0, 0x1b, 0xd5, 0x1c, 0x10, 0x6b, 0x1c, 0x99, 0x20, 0x4c, 0x7e, 0xa8, 0x8d, 0xf6, 0x27, 0x07, 0x48, 0xf3, 0x18, 0x99, 0x73, 0x42, 0x37, 0x96, 0x4e, 0x34, 0x1d, 0x38, 0x91, 0x5a, 0x0e, 0x61, 0x6b, 0x9f, 0xfa, 0xe0, 0x39, 0x3a, 0x54, 0x87, 0xfc, 0x5d, 0xcf, 0x13, 0xba, 0x74, 0x8c, 0xc3, 0xa2, 0xa3, 0x89, 0x91, 0x7c, 0x97, 0xbe, 0xf8, 0x26, 0x0f, 0x54, 0x5c, 0x40, 0xb4, 0x61, 0x3f, 0xbb, 0x87, 0xa1, 0xdd, 0x62, 0x5d, 0x5c, 0x49, 0x93, 0x85, 0x50, 0x30, 0x32, 0x8a, 0xd7, 0x2c, 0x83, 0xf0, 0x4b, 0x76, 0x4a, 0xac, 0x87, 0x0e, 0x6e, 0xff, 0x7a, 0x11, 0xbd, 0x49, 0x71, 0xaf, 0x2d, 0xa7, 0x44, 0x7b, 0xcc, 0x71, 0xc3, 0xb8, 0x13, 0x28, 0xe9, 0x62, 0x1a, 0xa5, 0x67, 0x78, 0xb6, 0x19, 0x83, 0xc5, 0xa7, 0x15, 0xd2, 0x3d, 0xf9, 0x85, 0xb1, 0x99, 0xd8, 0x18, 0x4d, 0x16, 0x1d, 0x17, 0x3e, 0x29, 0x63, 0x8f, 0x07, 0x86, 0x03, 0x9f, 0x0f, 0xc5, 0xcf, 0x76, 0x9d, 0xef, 0xe3, 0xaa, 0x0a, 0xac, 0x37, 0xa4, 0xfc, 0x49, 0x25, 0xa5, 0x8f, 0x1c, 0x4e, 0xab, 0x2b, 0x68, 0x3f, 0x59, 0xbb, 0x9f, 0x80, 0x47, 0x82, 0x31, 0x92, 0x64, 0xf3, 0xab, 0x6b, 0xd3, 0xd1, 0x42, 0xe7, 0x26, 0xb4, 0x73, 0x5e, 0xac, 0x08, 0xdd, 0x48, 0x89, 0xbd, 0xd3, 0x68, 0xa1, 0xfa, 0x20, 0x05, 0xe3, 0x39, 0x37, 0x84, 0x78, 0x52, 0x3d, 0x0f, 0xe8, 0x2b, 0xa2, 0x8c, 0x3c, 0xd3, 0x5b, 0x60, 0x31, 0xf1, 0x60, 0x20, 0xd6, 0x64, 0xb2, 0x9c, 0xa4, 0x99, 0xf5, 0x90, 0xd9, 0xca, 0x5f, 0xf2, 0x39, 0x1c, 0x6e, 0xd2, 0x0d, 0x65, 0xda, 0x0c, 0x2a, 0x67, 0x16, 0x6f, 0x63, 0x88, 0x6f, 0x66, 0xc7, 0x39, 0x4b, 0xf6, 0x5b, 0xaa, 0x30, 0x2b, 0xc2, 0xb9, 0x40, 0x88, 0xda, 0x10, 0xb4, 0x2d, 0x5f, 0x9b, 0x16, 0xc1, 0xb5, 0x19, 0x2f, 0x70, 0xa7, 0x22, 0xdf, 0x2d, 0xe8, 0x7b, 0x1c, 0x6d, 0xa8, 0xce, 0x75, 0xb9, 0x5b, 0x68, 0x01, 0xb3, 0x36, 0x95, 0xcd, 0x0c, 0x98, 0x5b, 0xf1, 0x1d, 0xfe, 0xaa, 0x20, 0xf2, 0xd8, 0x9b, 0xdd, 0xeb, 0x5b, 0x98, 0x6d, 0x59, 0xd1, 0xd4, 0xe8, 0x83, 0x05, 0xf1, 0x15, 0x9d, 0x56, 0xb2, 0x5a, 0xd6, 0xfd, 0x05, 0x7e, 0x7b, 0x89, 0xf6, 0x53, 0xcf, 0x5a, 0x43, 0xef, 0x49, 0x99, 0xf5, 0xee, 0xa0, 0x36, 0x5f, 0x07, 0x02, 0x3d, 0x08, 0xd9, 0xb1, 0xfc, 0xd2, 0xb5, 0x72, 0x60, 0xee, 0xa9, 0xaf, 0x27, 0x48, 0x96, 0x86, 0x97, 0xf5, 0x37, 0x74, 0x56, 0x2e, 0x80, 0x02, 0xc5, 0xf1, 0x80, 0x2e, 0xa8, 0xc1, 0x20, 0xcf, 0x60, 0x78, 0xcc, 0xa6, 0x48, 0xea, 0xf1, 0x72, 0xce, 0xb7, 0x23, 0xeb, 0x58, 0x51, 0x9f, 0xfa, 0xf6, 0x3d, 0x13, 0x5b, 0x82, 0xa6, 0x1c, 0x25, 0xac, 0x71, 0x94, 0xe9, 0x86, 0x60, 0xf7, 0x86, 0xe3, 0xab, 0x11, 0x0a, 0xbf, 0x23, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x75, 0x77, 0xd9, 0xe4, 0xa6, 0x14, 0x6e, 0x44, 0x44, 0xa3, 0xd5, 0x48, 0xc2, 0x54, 0x30, 0xb1, 0xbe, 0x24, 0x0f, 0x09, 0xf3, 0xb4, 0xb1, 0xb4, 0x97, 0x47, 0xff, 0x0a, 0xe2, 0x1e, 0xa2, 0xff, 0xcf, 0x78, 0x49, 0x56, 0xe6, 0x64, 0xfc, 0x68, 0xcd, 0xf8, 0x61, 0xef, 0x67, 0xf1, 0x44, 0x5e, 0x70, 0x90, 0xf3, 0xf2, 0x4e, 0x4e, 0x8c, 0xae, 0x31, 0xca, 0x70, 0xc6, 0x31, 0xed, 0x4b, 0x1c, 0xac, 0x2d, 0x6a, 0x0b, 0xaa, 0xb4, 0x08, 0xc8, 0xb6, 0xd3, 0xef, 0xf6, 0x2b, 0x5f, 0x8b, 0xe4, 0xd4, 0x3b, 0x7a, 0x73, 0x76, 0x75, 0x4f, 0xe7, 0x61, 0xd5, 0x66, 0xca, 0x4f, 0xd1, 0x16, 0xfb, 0x53, 0x9f, 0x1b, 0x1e, 0xd5, 0x2c, 0xdb, 0x0b, 0x11, 0x95, 0xb8, 0xa5, 0x29, 0xf6, 0xa3, 0x00, 0x61, 0x73, 0x0f, 0x5f, 0xbc, 0x6a, 0x87, 0xe0, 0x84, 0x4e, 0xcc, 0x91, 0x9d, 0x8a, 0x5c, 0x4a, 0x63, 0x67, 0xd5, 0xa7, 0x31, 0xe2, 0xc8, 0x79, 0xc3, 0x42, 0xce, 0xa2, 0x0f, 0x68, 0x3c, 0x8a, 0x84, 0xad, 0x53, 0xd7, 0x4f, 0x27, 0xfa, 0x65, 0xcf, 0x48, 0xd5, 0x50, 0xdc, 0x83, 0x29, 0xfc, 0x2c, 0xcf, 0x41, 0x07, 0xe8, 0xf8, 0x90, 0x03, 0xf1, 0x12, 0x8c, 0x9c, 0xee, 0x42, 0x19, 0x2a, 0xff, 0xf8, 0xf8, 0x0f, 0x64, 0x32, 0x28, 0x79, 0xf6, 0xe4, 0xad, 0x07, 0x2e, 0x1f, 0xef, 0x3b, 0xc6, 0xc9, 0x01, 0x08, 0x94, 0xfe, 0x22, 0x10, 0x05, 0x07, 0x7f, 0x01, 0x19, 0x86, 0xf1, 0xf6, 0x86, 0x79, 0x62, 0xb4, 0xe3, 0x0c, 0x92, 0x3c, 0x0b, 0x82, 0xb7, 0x7f, 0x8b, 0x4e, 0x3e, 0x85, 0x7e, 0xe1, 0x84, 0x5e, 0xc1, 0xa6, 0xf9, 0xdc, 0xc9, 0x8e, 0xec, 0x09, 0x7d, 0x9e, 0x52, 0xeb, 0xe6, 0x70, 0x9b, 0xa6, 0x8a, 0xbe, 0x09, 0xd6, 0xea, 0x34, 0x30, 0x26, 0x5c, 0x70, 0xc6, 0x55, 0x7c, 0x4d, 0xfc, 0xb6, 0xb5, 0x76, 0x8b, 0x5a, 0xa1, 0x96, 0x72, 0x81, 0xba, 0x47, 0xd4, 0x3e, 0xde, 0x29, 0x94, 0xa6, 0xcb, 0x59, 0xe4, 0xff, 0x44, 0xc9, 0xc4, 0xf5, 0x6c, 0x9a, 0xef, 0x52, 0xe4, 0x82, 0x5d, 0x51, 0xdd, 0x8b, 0x17, 0xfd, 0x56, 0x01, 0x8f, 0x9a, 0x36, 0xc8, 0xe5, 0x92, 0x40, 0xdb, 0x8c, 0x21, 0x30, 0x02, 0xdf, 0x4f, 0xd3, 0x42, 0x0f, 0xd1, 0x72, 0x01, 0x42, 0x5b, 0xe6, 0xb8, 0x27, 0x0c, 0xb6, 0x57, 0xf4, 0xf4, 0x81, 0xdb, 0x88, 0x24, 0x87, 0xa3, 0xb7, 0x06, 0x09, 0x4a, 0x9c, 0x1d, 0x42, 0xa6, 0x3d, 0x20, 0x5c, 0x14, 0x24, 0x53, 0xb3, 0x02, 0x32, 0xcd, 0xea, 0x10, 0xab, 0xa7, 0x79, 0x00, 0xd9, 0xa4, 0x44, 0xa3, 0x2d, 0x8a, 0xa2, 0xdd, 0x44, 0xf3, 0x32, 0x35, 0x10, 0x31, 0xf7, 0x59, 0x5a, 0x0b, 0x5a, 0x87, 0x51, 0xa7, 0x6b, 0x3b, 0xea, 0xcb, 0xd5, 0xf8, 0x07, 0x56, 0x1a, 0x53, 0xd9, 0xd8, 0x83, 0x77, 0xf3, 0xf4, 0xec, 0x3d, 0x0b, 0xc7, 0xea, 0x91, 0x4f, 0xe5, 0xaf, 0x4d, 0x8a, 0xb9, 0xcf, 0xd5, 0x86, 0x61, 0x5a, 0x94, 0xaa, 0x84, 0xb9, 0xad, 0x62, 0xeb, 0x1f, 0x26, 0x1b, 0x64, 0xb8, 0xdc, 0xe9, 0xe7, 0x8f, 0x8c, 0xfd, 0x19, 0xf5, 0x9d, 0xff, 0x6a, 0xb9, 0x01, 0x7c, 0x93, 0x70, 0x3f, 0x45, 0x4d, 0x29, 0xcc, 0x45, 0xcb, 0xba, 0x43, 0xc6, 0x2e, 0x03, 0xda, 0x4c, 0xd6, 0x21, 0x57, 0x8f, 0x74, 0x99, 0x31, 0x0f, 0xd0, 0x9b, 0x54, 0x8c, 0x57, 0xb0, 0x14, 0xd0, 0xdd, 0x26, 0xec, 0xbb, 0xb4, 0x2f, 0xb1, 0xfe, 0xb1, 0xba, 0x50, 0xd9, 0x24, 0xd1, 0x49, 0xbb, 0x68, 0x7a, 0x88, 0xeb, 0x38, 0xc8, 0x1e, 0x8e, 0x11, 0xb0, 0x58, 0x88, 0xaf, 0xa1, 0xf3, 0xb7, 0x7f, 0xc9, 0xab, 0xc2, 0x29, 0xec, 0x5c, 0x85, 0xc8, 0x18, 0xb8, 0x8d, 0xd6, 0x7f, 0xbb, 0xc2, 0x48, 0xfc, 0x73, 0xfa, 0xb4, 0x6a, 0xaa, 0x3c, 0x0f, 0x7c, 0x90, 0x75, 0x52, 0xed, 0x0e, 0x24, 0xdd, 0x5f, 0xbe, 0x1d, 0x88, 0xce, 0xbb, 0xeb, 0xf3, 0xcc, 0x24, 0x02, 0xed, 0xad, 0x97, 0x7e, 0x73, 0x1f, 0x82, 0x52, 0x35, 0x9b, 0xd9, 0x95, 0x9a, 0x2f, 0x2e, 0x91, 0x07, 0xa9, 0xb1, 0x5c, 0x39, 0xe8, 0xe4, 0x60, 0x7e, 0x1a, 0xa1, 0x45, 0xa2, 0xc8, 0xdb, 0x6f, 0xbb, 0x82, 0x33, 0x54, 0x46, 0xca, 0x97, 0xc6, 0xa5, 0xf6, 0x16, 0x7d, 0x98, 0x10, 0x6a, 0x66, 0x82, 0x22, 0x4a, 0x35, 0x35, 0x6b, 0x8c, 0xd3, 0xe7, 0x36, 0x39, 0x0f, 0x1a, 0x9c, 0xa5, 0xf2, 0x5d, 0x8b, 0x57, 0x16, 0xc8, 0xc3, 0xa6, 0xa9, 0x34, 0xa7, 0x30, 0x82, 0x12, 0x79, 0x6a, 0x75, 0x5e, 0x38, 0xef, 0x37, 0xaf, 0xad, 0x8b, 0xf1, 0x60, 0xdc, 0x6c, 0xb3, 0x97, 0xf5, 0x06, 0x56, 0x11, 0xdc, 0x96, 0xf2, 0x37, 0x12, 0x75, 0xac, 0xa7, 0x40, 0xb4, 0xd7, 0x43, 0x97, 0x4e, 0x70, 0x56, 0xef, 0xf0, 0x5e, 0xfb, 0xbe, 0xc2, 0xc2, 0x9a, 0xc3, 0xf5, 0xfb, 0x75, 0xde, 0x2a, 0xc6, 0x6e, 0x44, 0x3b, 0x65, 0x2d, 0xa4, 0xd2, 0x3b, 0x39, 0x21, 0x64, 0x4a, 0xc8, 0x14, 0xa5, 0xb9, 0x4a, 0x38, 0x6d, 0x8c, 0x46, 0x4c, 0x22, 0x76, 0x20, 0x9b, 0x00, 0x71, 0x32, 0x98, 0xd4, 0xea, 0x9e, 0x38, 0x89, 0xdb, 0x83, 0xd2, 0x9d, 0xbc, 0x04, 0x55, 0x55, 0x38, 0x0e, 0x03, 0x51, 0x57, 0x33, 0x75, 0x82, 0x07, 0x8c, 0x2a, 0xe7, 0x64, 0xe1, 0x18, 0x2c, 0x1f, 0x9e, 0xca, 0x3e, 0x35, 0xda, 0xaa, 0x08, 0x8c, 0xa7, 0x59, 0x5c, 0xaa, 0x92, 0x53, 0xc3, 0x87, 0x66, 0x14, 0x2a, 0x94, 0x35, 0xda, 0x03, 0x3b, 0xea, 0xea, 0x54, 0xea, 0x27, 0x25, 0x65, 0x64, 0x78, 0xbc, 0x76, 0x50, 0xd7, 0xd4, 0xc3, 0x3f, 0x62, 0x71, 0xbb, 0xe5, 0x85, 0x5d, 0xf9, 0x39, 0xc4, 0xdf, 0x6a, 0xa7, 0x46, 0x18, 0x4f, 0x71, 0x34, 0x6e, 0x1a, 0x3b, 0x5d, 0x9a, 0xa3, 0xde, 0xe0, 0xc1, 0xd7, 0xa1, 0xc5, 0x49, 0x68, 0x4e, 0xd1, 0xc8, 0xb6, 0x2b, 0xbe, 0xda, 0xdf, 0xc1, 0x68, 0x63, 0xdd, 0xef, 0xed, 0x86, 0x5e, 0xc1, 0x15, 0x73, 0x2d, 0x40, 0x2f, 0xe9, 0xeb, 0x16, 0x10, 0x34, 0x5e, 0xdf, 0x5d, 0xee, 0x75, 0x43, 0xe0, 0x29, 0x8e, 0x5e, 0xe3, 0x3f, 0xbb, 0xd1, 0x04, 0x9c, 0x91, 0xf1, 0x4b, 0xd7, 0x44, 0xeb, 0xba, 0xbe, 0x0c, 0x06, 0x0f, 0x5d, 0x05, 0x2c, 0x2f, 0x46, 0x46, 0x01, 0x7d, 0xae, 0x50, 0x2b, 0xe5, 0x38, 0xec, 0x44, 0x6f, 0x32, 0x27, 0xcc, 0x54, 0xfa, 0xf9, 0x97, 0x9a, 0xa6, 0xaf, 0xa5, 0x11, 0x6c, 0x59, 0xf5, 0x51, 0xd1, 0xd2, 0x5a, 0xfa, 0x6e, 0x58, 0xf0, 0xd0, 0xd0, 0xca, 0x84, 0x8d, 0x07, 0x3f, 0xb1, 0xe9, 0x27, 0x4d, 0x6d, 0x1e, 0x3e, 0x09, 0xaf, 0xd3, 0x5a, 0x6b, 0x36, 0x06, 0x7d, 0x85, 0xbe, 0x72, 0x76, 0x8d, 0x8f, 0xf3, 0x14, 0x82, 0xad, 0xbe, 0x89, 0xf3, 0x46, 0x78, 0xd9, 0x32, 0x49, 0xdb, 0x96, 0x19, 0xe2, 0x86, 0x29, 0xcf, 0x2f, 0x41, 0x4a, 0xdd, 0xab, 0xb1, 0xad, 0x36, 0xf0, 0x4a, 0xc3, 0x31, 0xa2, 0x95, 0xc2, 0xdb, 0xfc, 0x6b, 0xda, 0xf6, 0x07, 0x39, 0x55, 0x53, 0x21, 0x28, 0x06, 0x3d, 0xaf, 0xf2, 0x6c, 0x56, 0x94, 0xc4, 0x9d, 0xd2, 0x80, 0xac, 0x53, 0xc2, 0xc7, 0xaf, 0x55, 0x60, 0x6c, 0x18, 0x34, 0x37, 0x9f, 0x57, 0xdc, 0xb8, 0xdb, 0x96, 0x0d, 0x03, 0x23, 0xaf, 0xff, 0xfd, 0x03, 0x3d, 0x4f, 0x7e, 0x33, 0xa3, 0x24, 0xd8, 0x61, 0x23, 0xfc, 0x18, 0x76, 0xed, 0xa0, 0xaf, 0xb6, 0x09, 0x87, 0x3c, 0x7f, 0x1d, 0xae, 0x23, 0x2b, 0x50, 0x17, 0x39, 0x02, 0x72, 0x55, 0xc7, 0x67, 0xc7, 0x04, 0x0e, 0x31, 0x40, 0x7f, 0xb3, 0x84, 0xe7, 0x10, 0x89, 0x2f, 0xef, 0xe6, 0xfd, 0x1e, 0xfb, 0xcf, 0x3b, 0x10, 0xe8, 0x24, 0x50, 0x81, 0x72, 0xc3, 0x31, 0xd2, 0xa7, 0x65, 0xf2, 0xed, 0x95, 0xc4, 0x2a, 0xd9, 0x7e, 0x98, 0x4f, 0x50, 0xe3, 0xb1, 0x9d, 0x60, 0xbf, 0x3c, 0x50, 0x4f, 0xb4, 0x33, 0xd6, 0x19, 0xb6, 0xeb, 0x66, 0x36, 0x16, 0xd9, 0x39, 0x50, 0xcd, 0x16, 0xce, 0xdf, 0x52, 0x48, 0x8f, 0x01, 0x64, 0xff, 0x3d, 0x6c, 0x7e, 0x8a, 0xb4, 0x14, 0x5f, 0xc7, 0x8c, 0x29, 0xb9, 0xc5, 0xc7, 0x18, 0x47, 0xfe, 0xe3, 0x9e, 0xe8, 0xea, 0x65, 0x14, 0xe5, 0x40, 0x43, 0x71, 0xb9, 0x93, 0x3f, 0x7b, 0xf2, 0x81, 0x5d, 0x9b, 0x66, 0x1b, 0x08, 0x51, 0x0a, 0x4d, 0x27, 0x35, 0x54, 0x62, 0xb5, 0x71, 0x00, 0x99, 0x61, 0x79, 0xfe, 0x45, 0xa3, 0xaa, 0x72, 0x5c, 0xec, 0x5d, 0x0a, 0x7b, 0xee, 0xa2, 0x9b, 0x1f, 0xff, 0xf2, 0x53, 0x40, 0x9b, 0xce, 0xae, 0x9f, 0xd5, 0x07, 0x60, 0x18, 0x86, 0xb9, 0xdb, 0xc1, 0x2e, 0x61, 0xc8, 0xba, 0x73, 0x60, 0x2c, 0x7c, 0x14, 0x55, 0x6e, 0xce, 0x9d, 0x23, 0xf6, 0xcb, 0xbf, 0x3f, 0x3b, 0x9a, 0xd6, 0x21, 0x3b, 0x73, 0x27, 0x5f, 0xf3, 0xda, 0x99, 0x19, 0xb6, 0x81, 0xd9, 0x7e, 0xc0, 0x2e, 0x29, 0x4e, 0xcb, 0xa2, 0x3f, 0x67, 0xf3, 0x69, 0xde, 0xa7, 0xa5, 0xed, 0x9c, 0xb4, 0x4e, 0xcd, 0xd2, 0x74, 0xa3, 0xce, 0x3d, 0x59, 0x7d, 0x71, 0x72, 0x83, 0xb7, 0x10, 0x07, 0xd4, 0x2c, 0x03, 0xa3, 0x26, 0xe2, 0xed, 0x3c, 0x8b, 0xd7, 0xab, 0xf5, 0xb2, 0xe7, 0xf7, 0xe1, 0x0a, 0xeb, 0xe2, 0x3d, 0xcf, 0x1c, 0x96, 0x92, 0xa7, 0xe1, 0x35, 0x45, 0x3d, 0x7f, 0xe9, 0x58, 0x5b, 0xae, 0xfe, 0x6b, 0xfd, 0xaf, 0xd9, 0x68, 0x33, 0x26, 0xee, 0x6d, 0x9e, 0xc3, 0x0d, 0x17, 0x22, 0x0a, 0xf6, 0x55, 0x24, 0x2b, 0x26, 0x05, 0xaf, 0x66, 0x1d, 0xfb, 0x19, 0xec, 0x7c, 0x01, 0x1f, 0x71, 0xa3, 0x86, 0x50, 0x82, 0xb1, 0x61, 0x5a, 0x30, 0xac, 0x58, 0xe7, 0x62, 0xe1, 0x9f, 0xf9, 0x0c, 0x99, 0x06, 0x6d, 0xf9, 0x0f, 0xd0, 0x78, 0x79, 0x46, 0x65, 0x27, 0xe4, 0x03, 0xf2, 0x25, 0xb4, 0xa5, 0xe2, 0x95, 0x14, 0x5d, 0x49, 0x71, 0x9b, 0x5e, 0xf7, 0x0f, 0xe7, 0x6b, 0xe3, 0xe9, 0xce, 0x92, 0xb4, 0xef, 0x15, 0x3f, 0x1a, 0x5b, 0x73, 0xe9, 0x7e, 0x45, 0x4d, 0x8b, 0xdb, 0x58, 0x56, 0x67, 0x10, 0xbd, 0xd8, 0xe4, 0x83, 0x6f, 0x42, 0x67, 0x55, 0x78, 0xa7, 0x2a, 0xe6, 0xf7, 0x0b, 0x21, 0x04, 0x19, 0x2b, 0xbe, 0x5c, 0x40, 0x3c, 0xa0, 0x7e, 0x94, 0x56, 0x7c, 0xcd, 0x85, 0x49, 0x28, 0xf9, 0xec, 0x85, 0x94, 0xfc, 0x8c, 0x4f, 0x60, 0xd6, 0x9a, 0x58, 0xaa, 0x83, 0xbe, 0x9a, 0xf1, 0x99, 0xeb, 0x02, 0xce, 0xb5, 0x74, 0x27, 0x49, 0x35, 0xd1, 0xcd, 0xdc, 0x05, 0xab, 0x07, 0x81, 0xac, 0x36, 0xf4, 0x1a, 0x4d, 0x6b, 0xd9, 0xc4, 0xd5, 0x1a, 0x41, 0xab, 0x90, 0x34, 0xe8, 0xbb, 0xe1, 0xb7, 0xad, 0x46, 0x5d, 0x11, 0x17, 0x2f, 0x60, 0xa1, 0x2e, 0x4a, 0xbf, 0xea, 0x75, 0xba, 0x65, 0xd7, 0x30, 0xf5, 0x75, 0x92, 0xba, 0xbb, 0x69, 0x2e, 0x2b, 0x5d, 0x72, 0xcc, 0xec, 0xf3, 0x19, 0x74, 0x2d, 0x1c, 0x1b, 0xb3, 0xf5, 0xe8, 0xd8, 0xc8, 0x9f, 0xe7, 0x6e, 0x83, 0x44, 0x61, 0xbb, 0x5e, 0x8c, 0xaf, 0x3f, 0xc1, 0x8b, 0x7f, 0xaf, 0x2c, 0xc9, 0x4d, 0xfe, 0xde, 0x37, 0xa1, 0x96, 0x32, 0x76, 0x38, 0xcb, 0xc3, 0x38, 0xce, 0x96, 0x12, 0x9b, 0xb9, 0x8c, 0x91, 0xac, 0x9f, 0x95, 0x0d, 0x27, 0x3c, 0xb2, 0x1d, 0xfb, 0xc3, 0x94, 0x29, 0xc8, 0xc2, 0xa9, 0xd8, 0x3f, 0x29, 0x85, 0xa7, 0x16, 0x37, 0xb9, 0xc3, 0x96, 0x52, 0x76, 0xe2, 0x01, 0xa3, 0x4e, 0x54, 0xb5, 0x3b, 0x0a, 0x29, 0x6d, 0x90, 0xc1, 0xd1, 0x97, 0x56, 0x04, 0xd7, 0x78, 0x0a, 0x1d, 0x5c, 0x5e, 0x27, 0xa0, 0x46, 0x95, 0xb8, 0x7d, 0x0e, 0xad, 0x2c, 0xe7, 0x1f, 0xea, 0xa1, 0x80, 0xc9, 0x20, 0x21, 0xf7, 0x98, 0xca, 0x9c, 0x06, 0x31, 0x34, 0xec, 0x75, 0xd2, 0x10, 0x50, 0xe8, 0xae, 0x95, 0x54, 0x96, 0xc2, 0x45, 0x70, 0xef, 0x32, 0xae, 0x38, 0xd1, 0x69, 0x95, 0xba, 0xa8, 0x8a, 0x9f, 0xae, 0x8f, 0xea, 0x06, 0x57, 0x98, 0xe7, 0xdd, 0x3f, 0xd8, 0x7d, 0x9a, 0xff, 0xf5, 0xb4, 0x4b, 0xe1, 0x72, 0x2d, 0x5f, 0x53, 0xdb, 0x8a, 0x3a, 0xff, 0xe5, 0x58, 0x7d, 0xa1, 0xe9, 0xdb, 0x9b, 0x71, 0xf6, 0xb9, 0x0b, 0x43, 0x04, 0x70, 0xad, 0x29, 0xd1, 0x98, 0x0f, 0x1b, 0xbe, 0x27, 0x94, 0x7d, 0xf6, 0x1c, 0x7d, 0x39, 0x1d, 0x8d, 0x3d, 0x25, 0xbb, 0x1c, 0x8e, 0x67, 0x3b, 0x22, 0xa9, 0x5e, 0x5c, 0x95, 0x6e, 0x2c, 0x61, 0x1e, 0x5d, 0x18, 0x4b, 0xd0, 0x41, 0x6f, 0x9b, 0x1c, 0x6d, 0x5d, 0x8b, 0x8a, 0x10, 0x4b, 0x14, 0xc0, 0x91, 0xcf, 0xc9, 0x69, 0x77, 0x08, 0x3b, 0x1d, 0x4f, 0x2b, 0x8e, 0x7b, 0xc7, 0x66, 0xe1, 0x0b, 0xda, 0x69, 0xbb, 0xcc, 0x21, 0x09, 0x07, 0xaa, 0x47, 0xd3, 0x6c, 0x91, 0xc3, 0x43, 0xdb, 0x07, 0x5a, 0xd4, 0xbf, 0x88, 0xca, 0x23, 0xcb, 0xcc, 0xf9, 0x0c, 0x09, 0xc6, 0xdf, 0xe2, 0xe1, 0xa4, 0x7c, 0x42, 0x4a, 0x0d, 0xf9, 0xa7, 0xf1, 0x1a, 0x6c, 0xb9, 0x5c, 0x09, 0xa9, 0x92, 0x90, 0xe9, 0xce, 0xa5, 0x62, 0xd4, 0x51, 0x6b, 0x32, 0xc1, 0x2f, 0x70, 0x68, 0x40, 0x11, 0x3d, 0x6a, 0x35, 0xa0, 0xde, 0x38, 0x3a, 0x10, 0x0f, 0x6e, 0x9b, 0x23, 0x6a, 0x3d, 0x2e, 0xab, 0x7b, 0x77, 0x5e, 0xa2, 0x11, 0xbc, 0xa1, 0x8e, 0x05, 0xcd, 0x27, 0x97, 0x98, 0x4b, 0x9c, 0xec, 0x30, 0x8b, 0x2b, 0xdf, 0x84, 0x30, 0xa2, 0x72, 0xc7, 0x59, 0xdb, 0xbf, 0x4f, 0xc8, 0x9e, 0x90, 0x3f, 0x33, 0x4a, 0x86, 0xd5, 0x43, 0x8f, 0xa0, 0x7f, 0x75, 0x90, 0xb1, 0x51, 0xbd, 0xc8, 0x58, 0xe6, 0xbb, 0x55, 0x24, 0x62, 0x28, 0x54, 0xb9, 0x85, 0xe7, 0x09, 0x8d, 0xec, 0xfb, 0xe5, 0x55, 0x4a, 0x09, 0x08, 0xc0, 0xbc, 0x2a, 0x29, 0xb7, 0xbe, 0x69, 0x73, 0x68, 0xd4, 0xc2, 0xaa, 0x24, 0xd0, 0x69, 0x9d, 0xc2, 0xcd, 0xf5, 0x78, 0x80, 0xbe, 0xe0, 0xcc, 0xe1, 0x1d, 0x7d, 0xcc, 0xe1, 0x1e, 0x3b, 0x40, 0xfb, 0x17, 0xa2, 0x11, 0xa5, 0xa5, 0x7a, 0x22, 0xf3, 0x98, 0x9c, 0x85, 0xa8, 0x2f, 0x01, 0x6f, 0xb5, 0x7b, 0xb4, 0x2f, 0xde, 0x0b, 0x85, 0x02, 0x7c, 0x1b, 0xba, 0x0e, 0x40, 0xcb, 0x1f, 0xac, 0x88, 0x35, 0x84, 0xe3, 0x30, 0x90, 0x77, 0xe7, 0xc9, 0xf5, 0x1c, 0xf7, 0x3a, 0x21, 0x8a, 0x26, 0x2a, 0xc8, 0x98, 0x1a, 0xaf, 0xbd, 0x4e, 0x12, 0xe3, 0x76, 0x01, 0x20, 0x17, 0x2e, 0x57, 0x15, 0xe0, 0xab, 0x1c, 0xf6, 0x89, 0x1b, 0x45, 0xfa, 0x20, 0x1f, 0x3d, 0xc0, 0x40, 0xf4, 0x83, 0x03, 0x76, 0x38, 0x81, 0xe1, 0x35, 0xdc, 0x7a, 0x88, 0x13, 0x50, 0x47, 0x72, 0x9c, 0x8d, 0x8f, 0x69, 0x70, 0xcd, 0xc0, 0x6f, 0x7a, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x7d, 0x70, 0x64, 0xa8, 0x3f, 0x8a, 0x3a, 0x5c, 0xdc, 0xc3, 0xb6, 0x0e, 0x2e, 0x85, 0x44, 0x01, 0x62, 0xb2, 0x2b, 0x63, 0xcb, 0x0a, 0xab, 0xa1, 0xf7, 0x60, 0xae, 0x98, 0xa1, 0x3a, 0xf7, 0xd6, 0xc8, 0x39, 0x4d, 0x37, 0xe5, 0x42, 0x0e, 0x62, 0xfc, 0x7c, 0x33, 0x38, 0xdc, 0xaa, 0x14, 0x67, 0xa7, 0xed, 0xaa, 0xc6, 0xc7, 0x96, 0xb7, 0xf5, 0x5a, 0x9d, 0x23, 0xbd, 0x0f, 0x50, 0xa8, 0x0d, 0x4d, 0x27, 0x48, 0xfe, 0x79, 0xc6, 0x13, 0x6f, 0x4e, 0xd3, 0xd7, 0xae, 0xd7, 0xcc, 0xf5, 0x43, 0x07, 0x5b, 0x81, 0x4e, 0x23, 0x4e, 0x29, 0x16, 0x22, 0xb7, 0xa1, 0x90, 0x0a, 0x99, 0x23, 0xdd, 0xac, 0x5f, 0xb3, 0x36, 0x23, 0x84, 0x64, 0xf9, 0xf3, 0x8d, 0x4a, 0x3c, 0x70, 0x43, 0x39, 0x9d, 0x5d, 0xf4, 0x23, 0x2e, 0x02, 0xd2, 0x7f, 0x78, 0x5e, 0x73, 0x3b, 0xfd, 0x8f, 0x68, 0x59, 0x82, 0x2c, 0x64, 0xfe, 0x7e, 0x36, 0x68, 0x89, 0x59, 0x75, 0xa4, 0x07, 0x8b, 0xfc, 0x87, 0x32, 0xcf, 0x98, 0xee, 0xa4, 0xda, 0x37, 0x1d, 0x3d, 0x09, 0x17, 0x70, 0x25, 0x11, 0x90, 0xc9, 0xda, 0x0e, 0xca, 0xa7, 0x6f, 0xc8, 0x7f, 0x12, 0xe9, 0x18, 0xf0, 0xb0, 0xa9, 0xbf, 0x94, 0x00, 0x5e, 0x3b, 0x76, 0xa1, 0x41, 0x14, 0xec, 0x57, 0x3b, 0x67, 0x6c, 0x0d, 0xaa, 0x20, 0x52, 0xc5, 0x82, 0x19, 0xd3, 0x37, 0x34, 0x5e, 0xd2, 0x62, 0xe2, 0x66, 0x95, 0xf9, 0x58, 0x25, 0x16, 0x77, 0xff, 0xff, 0x8e, 0xd1, 0xfc, 0xb2, 0xa5, 0x60, 0x15, 0x21, 0x34, 0xf0, 0x2e, 0x74, 0xf2, 0x85, 0x23, 0x60, 0x57, 0x01, 0xaa, 0x9f, 0x18, 0x70, 0x3a, 0x4c, 0x87, 0xa2, 0x7f, 0xaf, 0xb4, 0xfa, 0x6d, 0xba, 0xaa, 0xfe, 0x12, 0x9c, 0x04, 0x2a, 0x28, 0xcd, 0x14, 0x9a, 0x18, 0xf9, 0xc9, 0x2e, 0x08, 0x5f, 0x3a, 0x8c, 0x11, 0xe4, 0x52, 0x0a, 0xdf, 0x2e, 0x26, 0xd4, 0x99, 0xf8, 0x4c, 0xa7, 0xbf, 0x2a, 0xb3, 0x90, 0x07, 0x9c, 0xc0, 0x43, 0x0b, 0x07, 0x5a, 0xa5, 0x9b, 0x1d, 0x25, 0x69, 0x1a, 0x5c, 0x35, 0x5a, 0x59, 0x06, 0x26, 0xa2, 0xe3, 0xf7, 0x03, 0x58, 0x01, 0x90, 0x37, 0x07, 0x8b, 0x44, 0x64, 0xc6, 0xf3, 0x0b, 0x64, 0x79, 0xff, 0x59, 0x3e, 0xe0, 0x82, 0xaf, 0xac, 0x06, 0x31, 0x7a, 0x93, 0x69, 0x67, 0xe3, 0xca, 0x22, 0xcf, 0xc2, 0x0f, 0xd0, 0xec, 0xc5, 0x75, 0xbf, 0x9b, 0x02, 0x0f, 0xd0, 0x09, 0x1d, 0x02, 0x80, 0x31, 0x6c, 0x7b, 0xeb, 0x11, 0xe5, 0x06, 0xe8, 0x84, 0x27, 0x9f, 0x9a, 0xbf, 0x39, 0x73, 0xbe, 0xef, 0x5b, 0xce, 0x05, 0x60, 0xe7, 0x02, 0x47, 0xf2, 0x59, 0x4f, 0xd9, 0xfd, 0x1a, 0x4f, 0x13, 0x69, 0xc0, 0xdc, 0xd9, 0xfa, 0xfa, 0x18, 0xaa, 0x8d, 0x8f, 0xd8, 0x42, 0xee, 0x3a, 0x12, 0xcf, 0xe6, 0xaa, 0x64, 0x3d, 0x98, 0xc9, 0x28, 0x1f, 0x01, 0x63, 0xa4, 0xe6, 0x4a, 0xb0, 0x69, 0x30, 0x4c, 0x52, 0x8a, 0xbc, 0xa9, 0x18, 0x31, 0xe9, 0x14, 0x55, 0xf7, 0xdf, 0x79, 0x12, 0x0b, 0x8c, 0x69, 0xf3, 0xb3, 0x8a, 0xb8, 0x86, 0x90, 0x21, 0x96, 0x1c, 0x5b, 0xd8, 0x0a, 0x10, 0xbe, 0xc3, 0xd7, 0x15, 0xae, 0xcb, 0x19, 0x2b, 0xf9, 0xa8, 0x24, 0x5f, 0x04, 0x8c, 0xfe, 0xc3, 0x93, 0x8e, 0x8c, 0x01, 0x44, 0x6b, 0x92, 0x27, 0x06, 0xc4, 0x4b, 0x41, 0xf1, 0x6c, 0xd4, 0xfa, 0xf2, 0x51, 0xd5, 0xaa, 0xac, 0x5b, 0xcd, 0xa3, 0xb0, 0x14, 0xb7, 0x48, 0x5c, 0x77, 0xf1, 0x12, 0xeb, 0xcd, 0x17, 0x04, 0xb0, 0xea, 0x37, 0x3b, 0xc4, 0xa2, 0x47, 0x35, 0x87, 0x4d, 0x8c, 0x9d, 0x61, 0xdb, 0xad, 0x95, 0x76, 0xad, 0x11, 0x72, 0x8c, 0xff, 0xed, 0x8e, 0x94, 0xbf, 0xd3, 0xb5, 0xe8, 0xfd, 0xa9, 0x60, 0x17, 0x8b, 0xec, 0xaa, 0x4e, 0x8d, 0x1b, 0xf3, 0xa0, 0xca, 0x56, 0x1a, 0xe8, 0x95, 0x48, 0x35, 0xa2, 0xa3, 0xd1, 0xd7, 0xd2, 0x99, 0x14, 0x4c, 0x96, 0x53, 0x9a, 0x8b, 0x4e, 0xa8, 0x0b, 0xb1, 0xaa, 0x6d, 0x9b, 0x43, 0x7e, 0x6c, 0xe9, 0x77, 0x68, 0x75, 0x09, 0x43, 0xd5, 0xa7, 0x36, 0xc6, 0x3b, 0xf4, 0x2c, 0xd4, 0x65, 0x6f, 0xa0, 0xe2, 0x80, 0x81, 0xc7, 0xbf, 0x19, 0x92, 0xb1, 0x1a, 0x00, 0x4f, 0xa0, 0x4a, 0x5b, 0xad, 0x62, 0x9a, 0xad, 0x50, 0x86, 0xf2, 0x88, 0x04, 0x80, 0x35, 0x08, 0x3a, 0x34, 0x4b, 0xde, 0xc3, 0x3d, 0xd8, 0x2a, 0x7a, 0x53, 0x9d, 0x88, 0xca, 0xca, 0x47, 0xa4, 0xcb, 0xff, 0x2e, 0xbf, 0x8d, 0x34, 0xba, 0x79, 0xdf, 0x7b, 0x2a, 0xa2, 0xa3, 0x5f, 0x05, 0x85, 0x7e, 0x90, 0x81, 0xb2, 0xf6, 0xa3, 0xd4, 0x82, 0x0f, 0xc9, 0x64, 0x06, 0x92, 0x0c, 0x09, 0x47, 0x72, 0x37, 0x34, 0x84, 0x8a, 0x02, 0x34, 0x49, 0x9a, 0xae, 0xa2, 0x47, 0xa2, 0xb6, 0x17, 0x3d, 0x32, 0xb3, 0x0a, 0x6b, 0x0a, 0xb4, 0x2c, 0xbc, 0x80, 0x06, 0x84, 0xcd, 0x86, 0xec, 0x9e, 0x21, 0x6d, 0xb6, 0xbb, 0x1c, 0x60, 0x96, 0x0b, 0xe8, 0xe3, 0x28, 0x03, 0xc6, 0x2e, 0x89, 0xd3, 0x87, 0x1b, 0xf5, 0x14, 0xdd, 0x37, 0x50, 0x6a, 0xd1, 0x93, 0x37, 0x0b, 0x82, 0x78, 0x93, 0x18, 0x56, 0x9c, 0x95, 0x0b, 0x37, 0x37, 0xfe, 0xfd, 0x88, 0xc3, 0xad, 0xb8, 0x56, 0x16, 0xa4, 0xa2, 0xda, 0x0c, 0x92, 0xa5, 0xa2, 0xe9, 0x37, 0x55, 0x9c, 0x24, 0x90, 0x3a, 0x53, 0x81, 0xee, 0x6d, 0x98, 0x9e, 0x7a, 0x46, 0xb9, 0x42, 0x22, 0xfd, 0x2a, 0xb9, 0xc2, 0xa2, 0xde, 0x01, 0x0d, 0x5c, 0x5d, 0x91, 0x0f, 0x31, 0x52, 0xec, 0x23, 0x72, 0x5c, 0xee, 0x63, 0x81, 0xfa, 0x96, 0x9f, 0x1e, 0x4f, 0x62, 0x00, 0xb8, 0xb5, 0xf1, 0x03, 0x2a, 0x7f, 0xe0, 0x7b, 0x2c, 0x38, 0xf0, 0xb6, 0x50, 0xfc, 0xf3, 0xbc, 0xe2, 0x7c, 0xf8, 0xf3, 0x4f, 0x6b, 0x98, 0xf8, 0x9b, 0x02, 0x6d, 0xcc, 0x34, 0x2b, 0xfb, 0xfc, 0x59, 0x13, 0xb2, 0x2f, 0x7e, 0x50, 0x90, 0xe5, 0x99, 0x4d, 0x6b, 0xa0, 0xe9, 0x0f, 0x71, 0x73, 0xff, 0xaf, 0xcd, 0x14, 0xf1, 0x70, 0x31, 0x6c, 0x2d, 0x51, 0x3c, 0xf4, 0xe6, 0x4a, 0x25, 0x90, 0x51, 0x86, 0x86, 0x66, 0xce, 0x20, 0xdd, 0x5c, 0xe0, 0x35, 0x0a, 0xf9, 0x9b, 0xe0, 0xd5, 0xa5, 0x76, 0xf6, 0x7f, 0x9a, 0x96, 0x3b, 0x92, 0x37, 0xe5, 0xb1, 0xb7, 0xba, 0x0c, 0xe0, 0x73, 0x07, 0x99, 0xac, 0xa4, 0x3d, 0x2f, 0x14, 0x69, 0x6f, 0x70, 0xf5, 0x2b, 0xe5, 0x11, 0x31, 0x71, 0x02, 0xca, 0x77, 0xb2, 0x81, 0x1c, 0xc5, 0xe9, 0xf4, 0xcd, 0x85, 0xb0, 0xd0, 0x97, 0x10, 0xa9, 0xc5, 0xa9, 0xc5, 0xcf, 0x6c, 0xd3, 0x5d, 0xe5, 0x55, 0xe2, 0x2a, 0xb3, 0x23, 0xda, 0x36, 0x63, 0xa7, 0xd7, 0x1c, 0xb8, 0xba, 0x5a, 0x2b, 0xd2, 0x88, 0xdb, 0xe1, 0x77, 0xf9, 0x2b, 0xf6, 0x9f, 0xa5, 0xa5, 0xcd, 0x08, 0x8e, 0x2e, 0x72, 0x35, 0xac, 0x50, 0xe5, 0x5f, 0xfa, 0xf9, 0xa4, 0x9d, 0x7c, 0xfd, 0xf8, 0x15, 0x35, 0x38, 0xa1, 0x7e, 0x26, 0x0c, 0x9a, 0x16, 0x3a, 0x14, 0x22, 0x14, 0x9d, 0x26, 0x33, 0x55, 0x76, 0x53, 0x2e, 0xaa, 0x84, 0xb0, 0xb0, 0x2d, 0x4d, 0xff, 0x4d, 0x08, 0x01, 0x69, 0x2a, 0x97, 0xdc, 0xff, 0x41, 0x35, 0x27, 0xc1, 0x93, 0xed, 0xd7, 0xe7, 0x70, 0xcb, 0x9c, 0xa1, 0x8a, 0xa0, 0xce, 0x42, 0xd7, 0x41, 0x5d, 0x9a, 0xef, 0x08, 0x58, 0xd2, 0x8b, 0x72, 0x3f, 0x21, 0xeb, 0xcf, 0x20, 0xaf, 0xed, 0x0b, 0xc4, 0x25, 0x14, 0xe9, 0x57, 0xd5, 0x0d, 0xc7, 0xcb, 0x56, 0x10, 0x89, 0x11, 0xa5, 0x92, 0xb3, 0xbb, 0xb1, 0xc7, 0xc7, 0x94, 0x4f, 0x0a, 0x9d, 0xcd, 0x10, 0x62, 0x06, 0xa7, 0x48, 0x68, 0x2e, 0x67, 0xf0, 0xb0, 0x1e, 0x12, 0xd6, 0x27, 0xaf, 0xef, 0xe9, 0xa5, 0x6e, 0x58, 0x79, 0x6a, 0x4f, 0xc6, 0xad, 0xee, 0xb3, 0x5d, 0xd4, 0xf8, 0x51, 0x47, 0x71, 0x55, 0x5f, 0x25, 0xc6, 0x57, 0x0d, 0xbe, 0xba, 0x8a, 0xa9, 0xf6, 0x25, 0x24, 0x32, 0x76, 0x9f, 0x75, 0x3b, 0xfa, 0x30, 0xf2, 0xa1, 0x5e, 0xea, 0x69, 0xa4, 0x4b, 0xa3, 0x27, 0x25, 0x3c, 0x3f, 0xe1, 0xb1, 0x1f, 0xd3, 0x03, 0x52, 0xf4, 0x8e, 0xf4, 0xf3, 0x10, 0x83, 0x69, 0x81, 0x58, 0x44, 0x3f, 0x93, 0xb6, 0x41, 0x1b, 0x86, 0x5d, 0x9d, 0xe4, 0x16, 0x51, 0xac, 0x02, 0xb1, 0xdb, 0x77, 0xdc, 0x51, 0x61, 0x8d, 0x5b, 0x04, 0x08, 0xa6, 0x8d, 0xa0, 0x89, 0x11, 0xf4, 0x95, 0xd8, 0xc1, 0x87, 0xb2, 0xa9, 0xe1, 0xb1, 0x68, 0xbb, 0x0d, 0xdf, 0x2d, 0x14, 0xa5, 0x0f, 0x1b, 0x5a, 0xbd, 0x32, 0x2f, 0x88, 0x9b, 0x5d, 0x78, 0xdf, 0x89, 0x13, 0x62, 0xc3, 0x4f, 0x6b, 0x29, 0xa0, 0x0c, 0x65, 0x21, 0x9a, 0x4f, 0x18, 0xbc, 0x4c, 0x94, 0x21, 0x37, 0x76, 0x22, 0xf8, 0x39, 0x21, 0xe2, 0xb3, 0x7c, 0x83, 0xe3, 0x13, 0x1b, 0x92, 0x30, 0x9e, 0x07, 0xc9, 0x78, 0xe5, 0xe9, 0x4a, 0x0b, 0x09, 0xe3, 0x9c, 0x8e, 0x00, 0x98, 0x1b, 0x57, 0x92, 0x1e, 0x3b, 0x78, 0x24, 0xc2, 0xf7, 0x24, 0x31, 0x15, 0x99, 0x5b, 0xc8, 0x58, 0xc0, 0x32, 0xde, 0x31, 0x3a, 0xb8, 0xb4, 0xac, 0xde, 0xfe, 0x2f, 0x1b, 0x82, 0x42, 0xe9, 0xb0, 0x7e, 0xd0, 0x68, 0x0d, 0x69, 0xce, 0xa4, 0x2a, 0x2a, 0x63, 0xc2, 0xfd, 0xc3, 0xd4, 0x73, 0x0e, 0x2c, 0xd5, 0x8e, 0x5c, 0xeb, 0x2b, 0x7e, 0x31, 0xd4, 0x1a, 0x49, 0x64, 0xd0, 0xb4, 0x5b, 0x06, 0x4c, 0xb4, 0x55, 0x25, 0xf1, 0x8e, 0xc6, 0xd7, 0xe9, 0x37, 0x11, 0x46, 0x40, 0x43, 0xb2, 0x9d, 0x51, 0xfe, 0x83, 0x51, 0xf6, 0xd4, 0xca, 0xd3, 0xed, 0x0c, 0x0f, 0x74, 0xa5, 0x4c, 0xc7, 0x29, 0x4f, 0x55, 0xf1, 0x71, 0x6d, 0x90, 0x9a, 0x36, 0x51, 0x3a, 0x7f, 0xbb, 0xd1, 0x37, 0x8a, 0xde, 0xd6, 0xfe, 0xb7, 0x1c, 0xbe, 0xe4, 0xc6, 0x4e, 0xb0, 0x91, 0x54, 0xd2, 0xf3, 0x1b, 0xbe, 0xaa, 0x1a, 0xf6, 0x70, 0xbd, 0x07, 0x5d, 0x65, 0xa9, 0xd4, 0xbd, 0xda, 0xa3, 0x35, 0xad, 0x2f, 0x88, 0x7e, 0xb4, 0x0c, 0x8c, 0x62, 0x5a, 0x9a, 0x03, 0x3b, 0x9d, 0x67, 0x1b, 0x94, 0xa2, 0xce, 0x7d, 0x9d, 0x05, 0x0d, 0x19, 0xe2, 0x84, 0x3e, 0xb4, 0x5d, 0xc2, 0xf1, 0x72, 0x9f, 0xbd, 0xad, 0x52, 0xa4, 0x7a, 0xa2, 0x4a, 0x99, 0x28, 0x5b, 0x9a, 0x47, 0xb0, 0xac, 0xc5, 0x02, 0x4b, 0x2d, 0x3f, 0xc5, 0x20, 0xed, 0xcd, 0x8c, 0xda, 0x44, 0x73, 0x0f, 0x68, 0x86, 0x19, 0xce, 0xf0, 0xf5, 0x58, 0x44, 0x0d, 0xb6, 0x4e, 0x4d, 0x1e, 0xf6, 0x72, 0xcb, 0x3a, 0xff, 0xfb, 0xd1, 0x2a, 0xf6, 0x7e, 0x1f, 0xe0, 0xe0, 0x29, 0xdf, 0xb8, 0x0c, 0x75, 0x2d, 0x28, 0x48, 0x29, 0xa2, 0xd5, 0xcc, 0xe7, 0x9c, 0xf2, 0x0b, 0x12, 0x27, 0x19, 0xd9, 0xb7, 0x10, 0x31, 0x36, 0xc5, 0x51, 0xaa, 0xe5, 0x94, 0xeb, 0x0f, 0x36, 0xaf, 0xb5, 0xdf, 0x22, 0xd5, 0x32, 0xbc, 0xeb, 0xf7, 0x38, 0x68, 0x86, 0x3a, 0x19, 0x43, 0xed, 0x78, 0x1a, 0x15, 0x9e, 0xb9, 0xc2, 0x9c, 0x98, 0x04, 0x10, 0x28, 0x1d, 0x22, 0xd9, 0x3d, 0x20, 0x99, 0x62, 0xfb, 0xd8, 0xec, 0x13, 0x7f, 0xc0, 0x79, 0x99, 0xe2, 0x73, 0x74, 0xf7, 0xa9, 0xc9, 0x05, 0x18, 0xdb, 0x15, 0x11, 0x12, 0x5c, 0xd7, 0xeb, 0x53, 0x6f, 0xba, 0x3b, 0x7c, 0x8c, 0x7d, 0xd8, 0x74, 0xa1, 0x32, 0x8e, 0x3c, 0x3f, 0x59, 0x5d, 0x3c, 0xcf, 0xf5, 0xee, 0x62, 0x2d, 0x50, 0x23, 0xbd, 0x3d, 0x13, 0xce, 0x0d, 0x90, 0xc9, 0xf5, 0xbd, 0x80, 0x2e, 0xf8, 0x7d, 0x9c, 0x9d, 0xbd, 0xd2, 0x2b, 0xad, 0x2b, 0x44, 0x0f, 0x47, 0x07, 0x7b, 0x64, 0x57, 0x2e, 0x9e, 0xbd, 0xff, 0x63, 0xa2, 0xf6, 0x6c, 0xc0, 0x2a, 0x93, 0x77, 0xfb, 0xb8, 0x9c, 0x7a, 0x77, 0x4b, 0x24, 0x6b, 0x0e, 0xb0, 0x2b, 0xa3, 0xcf, 0xa9, 0xec, 0x5c, 0x7d, 0x4c, 0xcd, 0xbf, 0x65, 0xbb, 0x5d, 0x8b, 0x43, 0x69, 0x45, 0xdb, 0x8b, 0x81, 0xdf, 0x3b, 0x34, 0xd6, 0x8c, 0x74, 0xc8, 0x63, 0xd5, 0x88, 0x5c, 0xfe, 0xd7, 0x9b, 0xd8, 0x32, 0x42, 0x88, 0x79, 0x81, 0x33, 0xaa, 0x9c, 0x0e, 0x0e, 0x90, 0x52, 0xf8, 0x44, 0x10, 0xb3, 0x01, 0x07, 0xf9, 0x3b, 0x67, 0x26, 0x71, 0xf2, 0x7b, 0x39, 0xf0, 0x1e, 0xe8, 0xc8, 0xd2, 0xbd, 0xbe, 0x36, 0xae, 0x28, 0x8f, 0xe7, 0xf3, 0x1a, 0xb5, 0x92, 0xf2, 0x46, 0x48, 0xf6, 0xc1, 0xc3, 0x1d, 0x05, 0xe5, 0x26, 0xd3, 0xba, 0x32, 0xcd, 0x17, 0x64, 0xbd, 0xc1, 0xfc, 0xd1, 0x53, 0xbf, 0x8d, 0xd4, 0xf4, 0x03, 0x48, 0x24, 0xb8, 0x16, 0x40, 0x63, 0xce, 0xd3, 0xd1, 0xf2, 0x21, 0x38, 0x9e, 0x01, 0xc4, 0x6a, 0xfb, 0x0b, 0x27, 0x35, 0x6d, 0xf5, 0x65, 0x67, 0xe2, 0x2a, 0x20, 0x32, 0xbc, 0xa8, 0xca, 0x95, 0x24, 0xb2, 0xe9, 0xab, 0xaa, 0xa8, 0xcf, 0xa3, 0xb6, 0xc4, 0x29, 0xe2, 0x5b, 0x72, 0x00, 0x64, 0x64, 0x96, 0x25, 0x04, 0xb0, 0x98, 0x74, 0xfb, 0xe8, 0x90, 0x83, 0x4e, 0x9f, 0x08, 0x0e, 0xbe, 0x71, 0xfa, 0xf5, 0x5f, 0x0d, 0xd9, 0xb3, 0x1e, 0x11, 0xb8, 0x50, 0x28, 0x5d, 0x21, 0xd9, 0x77, 0x28, 0xa7, 0xa8, 0x63, 0x84, 0xeb, 0xab, 0xa1, 0x29, 0x35, 0xf9, 0xc6, 0x6a, 0xfa, 0x7b, 0x31, 0xbb, 0xdc, 0x4a, 0xce, 0x86, 0xd4, 0xcd, 0x64, 0x53, 0x45, 0x4b, 0x0b, 0x8c, 0x1d, 0x76, 0x8d, 0xd2, 0x27, 0x74, 0xf2, 0x37, 0x95, 0x84, 0xe3, 0xfd, 0x43, 0xf6, 0x0c, 0x44, 0xea, 0xbc, 0x4c, 0x52, 0x6f, 0xca, 0x23, 0x48, 0x92, 0xa8, 0x43, 0x3e, 0x64, 0xd6, 0x0e, 0xd1, 0x59, 0xf2, 0xe2, 0xfe, 0xe5, 0xdc, 0x12, 0x9a, 0x65, 0x26, 0x1d, 0x18, 0x1f, 0x8d, 0xf8, 0xeb, 0xc5, 0x92, 0xcc, 0x47, 0x1d, 0x32, 0x60, 0xe7, 0x7b, 0xa6, 0xd2, 0x09, 0xaa, 0x70, 0xfc, 0x1e, 0x02, 0x70, 0x54, 0xff, 0x71, 0x93, 0xa5, 0x28, 0xc9, 0xf4, 0x08, 0x5a, 0xa6, 0x29, 0x85, 0x77, 0xaa, 0xdc, 0xdb, 0x8e, 0xb6, 0x52, 0x48, 0x97, 0x02, 0x16, 0x4c, 0x87, 0x19, 0x06, 0x2f, 0x3f, 0x31, 0x1a, 0x42, 0xc0, 0xd3, 0xed, 0xcf, 0xd5, 0x43, 0x82, 0xcc, 0xc8, 0xbf, 0x4f, 0x45, 0x0f, 0x09, 0x3e, 0xc3, 0x80, 0x39, 0xd2, 0x08, 0xe5, 0x02, 0x63, 0xfe, 0x35, 0xe8, 0x27, 0x9a, 0xb7, 0x54, 0xb2, 0x9d, 0x06, 0x24, 0x2a, 0x22, 0x90, 0xbf, 0x99, 0x48, 0x7a, 0x1a, 0x9e, 0xc7, 0xb5, 0x1f, 0xea, 0x63, 0x2c, 0x45, 0xff, 0x41, 0x59, 0xa7, 0x5e, 0xd1, 0xb4, 0x54, 0x93, 0x30, 0x9f, 0xa7, 0x7e, 0xbb, 0x1f, 0x90, 0x27, 0x32, 0xc1, 0x9d, 0x55, 0x45, 0xf7, 0x25, 0x40, 0x4d, 0xbc, 0xdf, 0x23, 0xd4, 0xcf, 0x5d, 0x2f, 0x03, 0xdf, 0xda }; +constexpr AccessUnit ATRACX_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x11, 0x92, 0xc6, 0xab, 0x16, 0x53, 0x3d, 0x96, 0x54, 0xa0, 0x81, 0xef, 0x3b, 0x10, 0x94, 0x47, 0x4a, 0x4d, 0x0a, 0x36 } }; + +const std::vector AC3_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x0b, 0x77, 0xe2, 0x05, 0xa5, 0xda, 0x2b, 0xef, 0x62, 0xd4, 0xa5, 0xaf, 0xd9, 0x1b, 0xd0, 0x7c, 0xec, 0x75, 0x5e, 0x09, 0x04, 0x80, 0xb4, 0x45, 0x05, 0x0e, 0xb6, 0xa6, 0x5d, 0x0d, 0x01, 0x68, 0x40, 0xce, 0x9f, 0x93, 0xf9, 0x3e, 0xda, 0x08, 0x41, 0x76, 0xeb, 0x39, 0xfa, 0xbb, 0xe6, 0xd6, 0x8e, 0x40, 0x05, 0x75, 0xbc, 0x84, 0x47, 0x2b, 0x79, 0x20, 0x5e, 0x94, 0x66, 0x36, 0x39, 0x4c, 0xd4, 0xa9, 0xa9, 0xf7, 0xf7, 0x9e, 0x0e, 0x80, 0xe8, 0x5a, 0x63, 0xb4, 0x53, 0x04, 0x59, 0xe5, 0xf6, 0x31, 0xc9, 0x6d, 0xe3, 0x29, 0x13, 0x81, 0xd5, 0x17, 0x70, 0xf3, 0x9c, 0x2c, 0x7a, 0xec, 0xcf, 0x9b, 0xb2, 0xe9, 0x62, 0x25, 0xf3, 0x1f, 0x4b, 0x08, 0xcc, 0x67, 0xaf, 0x7c, 0x21, 0x7a, 0xac, 0xda, 0xf6, 0x06, 0x6d, 0x3f, 0x48, 0xac, 0x8e, 0xc6, 0x0a, 0x49, 0xe3, 0xf6, 0x60, 0x07, 0x62, 0x7b, 0xa6, 0x86, 0x85, 0xf2, 0xac, 0xa2, 0x11, 0x7b, 0xda, 0x9d, 0xa3, 0xad, 0x10, 0xe4, 0xe1, 0x7d, 0x13, 0x8a, 0xe6, 0xcb, 0xe0, 0xf7, 0xec, 0xc0, 0x51, 0x1e, 0xf5, 0x51, 0x4f, 0x08, 0xbc, 0x30, 0xcf, 0xaa, 0x9c, 0x6b, 0xf7, 0xc4, 0x85, 0xe6, 0x72, 0x06, 0xbf, 0x1f, 0x0a, 0x59, 0xf2, 0x27, 0x8e, 0xb2, 0xde, 0x77, 0x1c, 0x4a, 0x6d, 0x3a, 0x10, 0x31, 0x70, 0x19, 0x30, 0x4e, 0x73, 0xbb, 0xf6, 0xf2, 0xf4, 0x7f, 0x5f, 0xb5, 0x08, 0x34, 0x72, 0x40, 0x66, 0x9a, 0xa0, 0xe7, 0xb2, 0x60, 0x12, 0x0b, 0x0a, 0x01, 0x6b, 0x18, 0x0b, 0x63, 0xc9, 0xf2, 0x9c, 0x63, 0xde, 0xf7, 0x41, 0xca, 0xfb, 0x4f, 0x62, 0x69, 0x31, 0x44, 0xd4, 0x78, 0xf6, 0xce, 0xc9, 0xc5, 0x3d, 0x89, 0x7b, 0xee, 0xf9, 0x7b, 0xab, 0x0a, 0x1b, 0xb3, 0x32, 0xc8, 0xad, 0x1a, 0xdc, 0x4c, 0xf4, 0x6d, 0x5d, 0xc0, 0x7a, 0x9b, 0x17, 0x2f, 0xf4, 0x49, 0x15, 0xe3, 0x17, 0x1f, 0x4e, 0x40, 0x2e, 0x51, 0x41, 0xa8, 0x71, 0x0d, 0x9c, 0x7b, 0x4f, 0xad, 0x57, 0xc3, 0xb3, 0xa6, 0x38, 0x50, 0xa0, 0x43, 0x68, 0xa2, 0x38, 0xc1, 0xf3, 0x42, 0xfc, 0x3f, 0xa3, 0x29, 0x06, 0x2b, 0x8a, 0xff, 0x58, 0xa4, 0x61, 0xef, 0xc0, 0xbf, 0x34, 0x99, 0x6b, 0x86, 0xaf, 0x92, 0x4b, 0x00, 0xcd, 0xfe, 0xe8, 0xae, 0x26, 0xfc, 0x9f, 0xb4, 0x55, 0x52, 0x84, 0x5c, 0x06, 0x99, 0xf8, 0x08, 0x98, 0x09, 0x4d, 0x67, 0x7e, 0xc9, 0xa2, 0x98, 0xe0, 0x55, 0xc1, 0x30, 0x87, 0x85, 0x4d, 0xdf, 0xaf, 0x57, 0x09, 0x37, 0x43, 0x3b, 0x49, 0xee, 0x13, 0x69, 0xc8, 0x53, 0xa7, 0x9c, 0xb2, 0x87, 0x87, 0xd5, 0xcf, 0x4b, 0xa8, 0xb0, 0x4a, 0x2e, 0xd2, 0x47, 0x31, 0xad, 0x77, 0x29, 0x43, 0xf7, 0x69, 0x90, 0x8f, 0x84, 0xd5, 0x8a, 0xea, 0xb2, 0x1f, 0x27, 0x7a, 0x2a, 0xf7, 0x6b, 0x90, 0x0f, 0xed, 0x72, 0x97, 0xdf, 0xf2, 0x03, 0xb3, 0xd3, 0xee, 0x99, 0x6e, 0xce, 0x6c, 0x3f, 0x9d, 0xc5, 0x0a, 0x57, 0xcd, 0xbd, 0x5f, 0x25, 0x7b, 0x64, 0x27, 0xb3, 0xef, 0x34, 0xaa, 0x06, 0x1c, 0x6c, 0x75, 0xd2, 0x9d, 0xc8, 0xd5, 0x96, 0x0c, 0x31, 0x9f, 0xdd, 0x75, 0x99, 0x0e, 0x77, 0x10, 0xe5, 0x77, 0xda, 0xc8, 0xde, 0xc5, 0xf5, 0x3b, 0xae, 0x2f, 0xe2, 0x08, 0xc1, 0x43, 0x02, 0xf0, 0x13, 0x15, 0xfc, 0x86, 0xbf, 0xaa, 0x31, 0xac, 0x6b, 0xdd, 0xac, 0x60, 0x4e, 0xe2, 0x69, 0x26, 0xd9, 0x8b, 0xdb, 0x69, 0x41, 0xc8, 0x04, 0x76, 0x29, 0xa1, 0xb3, 0xba, 0xee, 0xf8, 0xa5, 0x1e, 0x02, 0x86, 0x2c, 0x62, 0x0a, 0x00, 0x7d, 0xba, 0x57, 0x39, 0x85, 0xd3, 0x03, 0x7e, 0x42, 0x0c, 0x06, 0x74, 0x15, 0x5b, 0xba, 0x82, 0x96, 0x61, 0x6a, 0x3d, 0x93, 0x8a, 0xae, 0x0c, 0xf1, 0x45, 0x61, 0x22, 0x58, 0xcc, 0xd7, 0x64, 0xb4, 0x23, 0x0a, 0xa7, 0xf1, 0xd8, 0x82, 0xce, 0xb8, 0x3b, 0xf1, 0xc8, 0x9d, 0xb4, 0xb2, 0x2b, 0x9a, 0xc4, 0xf3, 0x9d, 0x6c, 0xe9, 0x5a, 0xca, 0x37, 0x8f, 0x03, 0xb2, 0xad, 0x52, 0x67, 0xd0, 0x53, 0x72, 0xd2, 0xeb, 0xc6, 0x93, 0x41, 0x31, 0x83, 0x60, 0x18, 0x48, 0xb7, 0xe8, 0xe4, 0x93, 0xbc, 0x0b, 0xab, 0xd6, 0x78, 0x8a, 0x7d, 0x24, 0x83, 0x49, 0xf4, 0x80, 0x77, 0xfa, 0xb1, 0xa1, 0xa6, 0x7a, 0x7f, 0xd7, 0xba, 0x9d, 0x62, 0x46, 0x30, 0xc4, 0x38, 0xf5, 0x97, 0x11, 0x00, 0xdc, 0xfe, 0x93, 0xe9, 0xcd, 0xbf, 0xd0, 0x55, 0xea, 0xce, 0xb0, 0x70, 0x76, 0x2d, 0x69, 0x2b, 0xdc, 0xe9, 0x6a, 0xfe, 0xda, 0x36, 0x3b, 0xca, 0x3d, 0x0a, 0x7d, 0x76, 0x7e, 0x0d, 0xad, 0x93, 0xe8, 0xa6, 0xfc, 0x17, 0x31, 0xb0, 0x0b, 0x77, 0xc7, 0x9f, 0x75, 0x41, 0xe3, 0xe3, 0xea, 0x48, 0xc6, 0xe9, 0x62, 0x69, 0xbd, 0x87, 0x86, 0x5f, 0xe4, 0x13, 0xbf, 0xb9, 0x63, 0xc8, 0xb4, 0x24, 0x49, 0x17, 0x5c, 0xe5, 0x5f, 0xc1, 0x4d, 0x77, 0x78, 0x26, 0xbd, 0x66, 0x21, 0xcf, 0xd0, 0x3b, 0x7e, 0x01, 0x06, 0x49, 0x9a, 0x99, 0x46, 0x89, 0x18, 0xa3, 0x3e, 0x1b, 0xae, 0x6a, 0x33, 0xdd, 0xca, 0x36, 0x33, 0x34, 0xa8, 0xa8, 0xd3, 0x18, 0x6c, 0x6b, 0x7e, 0x1e, 0x0f, 0xca, 0x12, 0x35, 0x78, 0xc2, 0x30, 0x84, 0xcf, 0xc4, 0xe5, 0x81, 0x65, 0xc7, 0xf3, 0xb5, 0xed, 0x89, 0xaa, 0x65, 0xcf, 0x9d, 0x71, 0xd8, 0x06, 0x5a, 0xac, 0xe5, 0x66, 0xf2, 0x18, 0xc4, 0x28, 0x54, 0xdc, 0x45, 0x1b, 0x16, 0x7b, 0xd9, 0x56, 0x70, 0x9f, 0x66, 0x92, 0x65, 0x50, 0x95, 0x27, 0x75, 0x2c, 0x85, 0x67, 0x8d, 0x6e, 0x6e, 0x12, 0x09, 0xa5, 0x34, 0x62, 0x55, 0x50, 0xc8, 0xb0, 0xe6, 0xd8, 0x63, 0x81, 0x63, 0xc7, 0x44, 0xf1, 0x35, 0x5e, 0xc6, 0x41, 0x24, 0x6c, 0x00, 0xb3, 0xba, 0x5f, 0x7b, 0x4a, 0x01, 0x49, 0x6a, 0x64, 0x45, 0x7b, 0xf1, 0xce, 0x3b, 0xe3, 0x59, 0xeb, 0x83, 0xd1, 0xda, 0xa7, 0x5e, 0x60, 0x8f, 0x16, 0x32, 0x06, 0xa9, 0xd8, 0x88, 0x2d, 0x5a, 0xf9, 0x21, 0x51, 0xb2, 0x1b, 0x62, 0x2a, 0x6a, 0xce, 0xd3, 0x02, 0x06, 0xc1, 0xf5, 0x2f, 0xe7, 0xb4, 0x6e, 0x22, 0x2b, 0x52, 0x80, 0x94, 0x7c, 0x86, 0xc6, 0x0f, 0xfd, 0xc1, 0xd0, 0x7e, 0xb1, 0x8d, 0xd1, 0x5f, 0xa6, 0xd9, 0x1b, 0x42, 0x62, 0x88, 0x11, 0x68, 0x21, 0x9e, 0x66, 0x6e, 0xca, 0xf6, 0xa0, 0x9a, 0x05, 0xef, 0x4c, 0xa4, 0xf4, 0x59, 0x7a, 0x33, 0x25, 0x22, 0xdc, 0xf8, 0x32, 0x34, 0xbb, 0x2f, 0x0a, 0xf0, 0xb7, 0x2f, 0x47, 0x1a, 0x08, 0x62, 0xcb, 0x46, 0xaf, 0x67, 0xf0, 0x9d, 0x02, 0xb9, 0x24, 0x26, 0x2a, 0x84, 0x61, 0x62, 0x3e, 0x44, 0x36, 0xd0, 0x41, 0x37, 0xf6, 0x48, 0xd7, 0x6d, 0x02, 0x4e, 0xef, 0xe1, 0x57, 0xc3, 0x0a, 0xc4, 0xe3, 0x9f, 0x63, 0x49, 0xed, 0x3a, 0xda, 0x68, 0xd5, 0x51, 0x96, 0x58, 0x05, 0xa6, 0xdc, 0xf9, 0xcb, 0xeb, 0x7d, 0x1a, 0xfe, 0x99, 0x0f, 0xca, 0x35, 0x65, 0xdc, 0x82, 0xae, 0x3b, 0x05, 0x02, 0x0e, 0xad, 0xf7, 0x55, 0xfb, 0xc6, 0x1d, 0xc1, 0x00, 0x50, 0x29, 0x1b, 0x10, 0xa2, 0x4d, 0x7f, 0x58, 0xea, 0x85, 0x56, 0x13, 0x74, 0x76, 0x4e, 0xd4, 0x30, 0xc4, 0xec, 0x81, 0xc2, 0x2d, 0x8d, 0x54, 0x61, 0x50, 0xb2, 0x98, 0xab, 0x89, 0x16, 0x7d, 0xaf, 0x78, 0xa7, 0x99, 0xdd, 0x91, 0xa8, 0x20, 0xc0, 0x0f, 0xf9, 0x76, 0xde, 0xaa, 0x16, 0x2d, 0xcb, 0xc3, 0x12, 0xeb, 0x6a, 0x9c, 0x57, 0xfa, 0x76, 0xb0, 0x30, 0x3a, 0x0e, 0x82, 0xc1, 0x6f, 0x9a, 0x43, 0xfa, 0x8d, 0xf6, 0xf9, 0x97, 0x1a, 0xf9, 0x70, 0x44, 0xa5, 0x04, 0x13, 0xc5, 0x5e, 0x89, 0x68, 0xf5, 0x3c, 0x53, 0xa7, 0xd2, 0x2d, 0x15, 0x77, 0x7a, 0xfc, 0x3e, 0x94, 0xe4, 0xa7, 0x66, 0xbe, 0xe6, 0xcd, 0x72, 0x34, 0xa8, 0x92, 0x64, 0x18, 0x81, 0x16, 0x8a, 0x7c, 0x12, 0xdd, 0x9a, 0xc0, 0x3e, 0x2f, 0x0b, 0xb7, 0x55, 0xfe, 0xc3, 0x2a, 0x04, 0x60, 0x0d, 0x98, 0x4c, 0x63, 0xfb, 0x13, 0x2b, 0xb9, 0x07, 0xc3, 0xb0, 0x69, 0xec, 0x56, 0x55, 0xe4, 0x50, 0xc5, 0x60, 0xb7, 0xd6, 0x2d, 0xf2, 0xff, 0xbb, 0x26, 0xeb, 0xb3, 0xc5, 0x41, 0xdd, 0x11, 0x20, 0x97, 0xb3, 0x4a, 0xa8, 0x14, 0xb0, 0xa0, 0xd4, 0x35, 0xaa, 0x5a, 0xa7, 0x68, 0xb5, 0xcc, 0x8d, 0xab, 0xa2, 0x68, 0x38, 0x9a, 0x9e, 0xbb, 0xe6, 0x3d, 0x2f, 0xc0, 0xd3, 0xe9, 0x9c, 0x74, 0x51, 0xe8, 0xce, 0x5d, 0x0d, 0xcf, 0xea, 0x44, 0x01, 0x32, 0x39, 0x8e, 0x00, 0x0e, 0xa4, 0x0e, 0x28, 0x04, 0xf1, 0x1b, 0xa2, 0xd1, 0x34, 0xa6, 0x52, 0xc5, 0x2c, 0xd4, 0xf2, 0xd5, 0x53, 0x99, 0x67, 0x07, 0x92, 0x6e, 0x6c, 0x66, 0xfe, 0x29, 0xbd, 0xdf, 0x63, 0x72, 0x82, 0xde, 0xb1, 0x2a, 0xb7, 0x06, 0xc1, 0xa6, 0x71, 0x61, 0x61, 0x79, 0xc0, 0x0c, 0x1f, 0x56, 0x5e, 0x97, 0xe6, 0xb8, 0xfb, 0xe6, 0x00, 0xcd, 0x1a, 0xb5, 0x18, 0xf9, 0xad, 0x35, 0x6b, 0x9d, 0xf8, 0x9a, 0xfc, 0x87, 0x7a, 0xb6, 0x3b, 0x10, 0xa0, 0xb7, 0x67, 0xc5, 0xa0, 0xdb, 0xd8, 0x59, 0xde, 0xb2, 0x18, 0x81, 0xce, 0x84, 0xbc, 0xf0, 0xfe, 0xa2, 0x53, 0x96, 0x15, 0x17, 0x0f, 0x94, 0x4c, 0xac, 0x3b, 0x4c, 0x11, 0x1f, 0xd7, 0x07, 0x79, 0x12, 0xe0, 0x1a, 0xbc, 0x16, 0x16, 0x30, 0x54, 0x71, 0x05, 0x0f, 0x66, 0x7f, 0xb9, 0x2e, 0xd7, 0x38, 0xbe, 0xaf, 0x78, 0x7d, 0x91, 0x6a, 0xee, 0x33, 0xa0, 0xea, 0xe0, 0xed, 0xbf, 0x0f, 0x59, 0x2d, 0xe3, 0x07, 0xd4, 0xa0, 0xe3, 0xb8, 0xdf, 0x83, 0x1a, 0xd8, 0x22, 0x9b, 0x42, 0x5a, 0x08, 0x2e, 0x7a, 0x4b, 0x17, 0xf4, 0x92, 0xb9, 0xb2, 0x99, 0x5e, 0x28, 0x0f, 0x4e, 0x51, 0x4f, 0x97, 0x7a, 0x1a, 0xa0, 0x7b, 0x5a, 0x0d, 0x4e, 0xab, 0x46, 0xed, 0x93, 0xa0, 0xc2, 0x04, 0x9b, 0x6f, 0xde, 0xc9, 0xf5, 0xf4, 0xb3, 0x7c, 0x37, 0xef, 0x4a, 0x93, 0xf7, 0x9b, 0x1f, 0x7a, 0x23, 0xe8, 0x08, 0x87, 0x19, 0x2f, 0xe2, 0xb8, 0xe6, 0x34, 0xac, 0x96, 0x66, 0x61, 0xf0, 0xdc, 0x16, 0x15, 0x79, 0x43, 0x3c, 0xc0, 0x43, 0x6c, 0x11, 0x51, 0x91, 0x8a, 0xd8, 0x48, 0x8d, 0xae, 0x1c, 0x69, 0xec, 0x76, 0x60, 0xdd, 0xb8, 0xc6, 0x1c, 0x40, 0x2b, 0xf0, 0x29, 0x11, 0x27, 0xc1, 0x36, 0x2c, 0x49, 0x74, 0xbd, 0xc1, 0xfe, 0x0d, 0x12, 0x3f, 0x1f, 0xd4, 0x27, 0x30, 0xc3, 0x4e, 0xfd, 0x87, 0x72, 0x25, 0xd7, 0x45, 0x12, 0xce, 0x9a, 0x93, 0x50, 0x24, 0xd2, 0x70, 0xf9, 0x46, 0x1b, 0x53, 0x59, 0x6b, 0x9e, 0x65, 0x39, 0x60, 0x01, 0xe1, 0xbd, 0x0c, 0x61, 0xfb, 0x3c, 0x0a, 0x7f, 0x3c, 0xd1, 0x5f, 0x4b, 0x82, 0xfb, 0x55, 0xde, 0x86, 0x66, 0xd1, 0xb6, 0x7c, 0x6e, 0xd9, 0xe1, 0x9f, 0x41, 0x45, 0x56, 0x2f, 0x91, 0xaf, 0xc5, 0x65, 0x45, 0xd8, 0x34, 0x31, 0x7d, 0xbe, 0xb1, 0xf5, 0xe6, 0x13, 0x8e, 0x72, 0x2e, 0x3b, 0x76, 0xbc, 0x3f, 0x34, 0x82, 0x25, 0x35, 0x6f, 0xaf, 0xe2, 0x90, 0xef, 0x08, 0xc6, 0xb4, 0xdc, 0xa5, 0x11, 0xea, 0xbb, 0x23, 0x8b, 0x71, 0x4e, 0xba, 0x6e, 0x6f, 0xb2, 0x70, 0xca, 0xf0, 0xe1, 0xfa, 0xc2, 0x93, 0x37, 0xc9, 0x24, 0xa3, 0xb9, 0x38, 0x7e, 0x38, 0xc6, 0xde, 0x2c, 0x73, 0x70, 0x1d, 0x21, 0x4b, 0xae, 0x3e, 0x46, 0x2c, 0x6f, 0x9f, 0x10, 0xd0, 0xb0, 0xee, 0x1b, 0x14, 0x19, 0x55, 0x59, 0x72, 0x7c, 0xcb, 0x53, 0x61, 0xdc, 0x52, 0x1d, 0xea, 0x47, 0x7b, 0xed, 0xe6, 0x06, 0x6e, 0xbf, 0xe8, 0x56, 0xa8, 0xa7, 0xd7, 0x5d, 0xb8, 0xd0, 0x8c, 0x9f, 0xcf, 0xc3, 0x33, 0xae, 0x5a, 0x73, 0x02, 0xc2, 0x76, 0x7f, 0x65, 0x82, 0x23, 0x58, 0xed, 0x6c, 0x5e, 0xde, 0x98, 0x6c, 0x3e, 0x36, 0xec, 0x8a, 0xc1, 0x0b, 0xa4, 0x28, 0x20, 0x2c, 0xf8, 0xcd, 0xe7, 0x49, 0x50, 0xec, 0x6f, 0xe0, 0xcc, 0x76, 0x03, 0x10, 0x6b, 0xdf, 0xf8, 0x94, 0x2d, 0x71, 0x2b, 0x11, 0xd5, 0x64, 0x3f, 0xeb, 0x62, 0x50, 0x40, 0xf8, 0x94, 0x9f, 0xa4, 0x10, 0x61, 0x6c, 0x18, 0x50, 0xa1, 0x0c, 0xaf, 0x13, 0x5b, 0x96, 0x2b, 0x17, 0x05, 0x19, 0xd3, 0xba, 0x83, 0xba, 0xc2, 0xed, 0xb7, 0x58, 0xe5, 0x57, 0xd5, 0x26, 0xf4, 0xaf, 0xac, 0x0b, 0x06, 0x28, 0x79, 0xee, 0xbf, 0x76, 0xf8, 0xee, 0x93, 0xcd, 0x0a, 0x88, 0x00, 0xc2, 0xfe, 0x5a, 0x44, 0xce, 0x0b, 0xc7, 0xb5, 0x5d, 0xb8, 0x8c, 0x5c, 0x91, 0xbf, 0xd6, 0x4d, 0x16, 0xfd, 0x76, 0x5f, 0xd6, 0x2c, 0x71, 0xf7, 0x45, 0xe7, 0xf0, 0x61, 0x24, 0x55, 0x86, 0xb1, 0x88, 0x0b, 0x77, 0xc7, 0xe0, 0x54, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xf2, 0x8f, 0x7b, 0xf7, 0x90, 0x80, 0xe5, 0x04, 0x40, 0xe5, 0x72, 0xe8, 0x0f, 0x33, 0x29, 0xa8, 0x11, 0x1b, 0xf6, 0xd9, 0x92, 0x2a, 0xf4, 0x5f, 0xe7, 0x96, 0x33, 0xc4, 0xd5, 0x56, 0x52, 0x07, 0x63, 0xc8, 0xa5, 0xc7, 0x4b, 0x1a, 0xf6, 0x7a, 0x9f, 0x9e, 0x15, 0x3f, 0x8d, 0x9c, 0xd2, 0xb9, 0x72, 0x78, 0x4b, 0xbe, 0x51, 0xbd, 0xca, 0xa2, 0xc7, 0xb0, 0x15, 0x55, 0x23, 0x79, 0x2b, 0x7e, 0x48, 0x2a, 0x9d, 0x5a, 0xb9, 0xc6, 0x9c, 0xbd, 0x91, 0x2f, 0x94, 0x4b, 0xff, 0x05, 0xd9, 0xb8, 0x6c, 0xb7, 0xd5, 0x13, 0x16, 0xd7, 0x7e, 0xd3, 0x73, 0xd8, 0x18, 0x4b, 0x8c, 0x1b, 0x89, 0xdd, 0xdb, 0x43, 0x39, 0x73, 0x7b, 0x9f, 0x65, 0x20, 0x03, 0x74, 0xc8, 0xf4, 0x31, 0x23, 0xe8, 0xae, 0xcd, 0x7b, 0x08, 0x9d, 0x38, 0xa0, 0x48, 0x8b, 0xa2, 0xe5, 0xe6, 0xa6, 0x72, 0x1f, 0x2a, 0x71, 0x84, 0x15, 0x4d, 0xde, 0x68, 0x3e, 0xb3, 0x74, 0x0d, 0xe1, 0x5a, 0xa5, 0xc0, 0x5b, 0x95, 0x57, 0x39, 0x24, 0xda, 0xde, 0x36, 0x36, 0x59, 0x85, 0x5a, 0x8b, 0x5d, 0x6f, 0x7a, 0xfe, 0x20, 0x12, 0x9e, 0x01, 0x6e, 0xe1, 0x2d, 0x3a, 0xb5, 0xa9, 0x53, 0xcc, 0x20, 0x55, 0xcc, 0x9f, 0xe7, 0xda, 0xb0, 0x91, 0x71, 0xb3, 0xa1, 0x71, 0x49, 0xab, 0xa4, 0x41, 0xeb, 0x44, 0xb0, 0x14, 0x70, 0x69, 0xd9, 0x61, 0x3d, 0x08, 0x39, 0xee, 0x44, 0xb0, 0x14, 0x0b, 0xdb, 0xb5, 0xa6, 0x75, 0x6d, 0x11, 0x06, 0x61, 0x5f, 0x99, 0xdf, 0xd8, 0x20, 0x17, 0x96, 0x07, 0xee, 0xa8, 0x11, 0xc3, 0xbc, 0x5b, 0x1d, 0x23, 0x76, 0x87, 0x50, 0x99, 0xc8, 0x59, 0x31, 0xa1, 0x7d, 0x89, 0x46, 0x65, 0x74, 0x9c, 0x07, 0xc6, 0x9d, 0x9a, 0x53, 0xd3, 0x81, 0x68, 0xf0, 0xf5, 0x9b, 0xb9, 0x10, 0x1d, 0x5d, 0x5b, 0x34, 0x2a, 0xc6, 0x29, 0xbb, 0xd2, 0x00, 0xef, 0xee, 0x86, 0xfc, 0xcd, 0x6b, 0x5d, 0xf8, 0xa0, 0x46, 0x8a, 0xd3, 0x6d, 0x8f, 0xc1, 0x69, 0x29, 0xad, 0xa2, 0xcc, 0x33, 0x10, 0x53, 0x1f, 0xbd, 0xc6, 0x08, 0x0e, 0xd7, 0x3f, 0xcc, 0xd0, 0xaf, 0xae, 0x54, 0x16, 0x40, 0x0e, 0x64, 0xc4, 0x91, 0x50, 0xd5, 0xc3, 0x2d, 0xe9, 0xe7, 0x2e, 0x9b, 0x97, 0xd7, 0xd5, 0x63, 0xdd, 0xb5, 0x29, 0x46, 0x2c, 0xec, 0xc5, 0x02, 0x1b, 0x3c, 0xb4, 0xe4, 0xb4, 0xae, 0xa7, 0x25, 0x84, 0x0b, 0x77, 0xd3, 0xd3, 0x02, 0xdd, 0x1f, 0xab, 0x25, 0x18, 0x63, 0xe3, 0xa5, 0xb6, 0x67, 0x97, 0x42, 0xae, 0x8d, 0x77, 0x0f, 0xaa, 0x8b, 0xe2, 0x67, 0x49, 0xa2, 0x87, 0xd8, 0x66, 0x5d, 0xc5, 0xb3, 0x12, 0x52, 0x88, 0xb3, 0x34, 0x8c, 0x03, 0xda, 0x92, 0x1e, 0xbc, 0x73, 0xba, 0x4f, 0x54, 0xb4, 0x70, 0x17, 0x0e, 0x2b, 0xa9, 0x3b, 0x61, 0x32, 0x2b, 0x22, 0xb2, 0xb8, 0x61, 0xfc, 0xbb, 0xe6, 0x84, 0xa3, 0x1c, 0x65, 0xe8, 0xe4, 0x08, 0x55, 0xf0, 0x7a, 0xfc, 0x66, 0x2b, 0x7f, 0xaf, 0xe2, 0x74, 0xdd, 0x06, 0xb4, 0xa2, 0x2f, 0x44, 0xb3, 0x40, 0x84, 0xba, 0x95, 0xf5, 0x6d, 0xf9, 0x4b, 0xa2, 0x33, 0x92, 0xfe, 0x89, 0x2d, 0xd6, 0x32, 0xd4, 0xe0, 0x2b, 0x10, 0x9f, 0x65, 0xe9, 0x18, 0x76, 0x23, 0xa6, 0x78, 0x4d, 0xdf, 0x7f, 0xce, 0x87, 0xf7, 0x5a, 0xfe, 0x8f, 0x6b, 0xd7, 0x68, 0xcd, 0x00, 0x75, 0xaf, 0x14, 0xdd, 0xea, 0x85, 0x39, 0x83, 0x73, 0x2b, 0xe5, 0x64, 0x78, 0x03, 0x51, 0x4b, 0x06, 0x67, 0x32, 0x73, 0x58, 0x0c, 0x86, 0xcc, 0x09, 0xfb, 0x41, 0x7f, 0x2d, 0x67, 0xe9, 0xcf, 0x0e, 0x5d, 0x73, 0x0b, 0x76, 0x12, 0xb1, 0x66, 0x5f, 0xd0, 0x46, 0x57, 0x23, 0xad, 0xb9, 0xf8, 0x8e, 0x99, 0xc4, 0xd2, 0xb6, 0x88, 0x40, 0x7a, 0x48, 0xe1, 0x38, 0x08, 0xc3, 0x90, 0xec, 0x32, 0xd5, 0x68, 0x38, 0xfb, 0x58, 0xc4, 0x9e, 0xb2, 0x0d, 0x9e, 0xb2, 0x22, 0x22, 0xb4, 0x62, 0x49, 0x56, 0x26, 0x5f, 0xbc, 0x1f, 0xb9, 0x1b, 0x02, 0x6e, 0x0b, 0x22, 0xcc, 0x31, 0x7e, 0x64, 0x82, 0xc5, 0x75, 0x78, 0xf5, 0xa7, 0x56, 0x2e, 0x19, 0xf8, 0x73, 0x66, 0xea, 0x16, 0x52, 0x0c, 0xc4, 0xcb, 0x55, 0xf0, 0x34, 0x2d, 0x42, 0x2f, 0x0c, 0x50, 0x41, 0xc5, 0x68, 0x09, 0xd1, 0x14, 0xab, 0x6b, 0x46, 0x45, 0x35, 0x92, 0x93, 0xd0, 0x49, 0x72, 0xdb, 0x99, 0x10, 0xcd, 0x31, 0x5b, 0x97, 0x6c, 0xb7, 0x1a, 0xea, 0x04, 0x77, 0xd5, 0xb5, 0x05, 0x52, 0xe6, 0x43, 0xc9, 0x07, 0x67, 0xf7, 0xb4, 0xf1, 0x05, 0x2b, 0xb2, 0x88, 0x9a, 0x20, 0xe6, 0x4a, 0x8b, 0x8f, 0xb9, 0x32, 0x0a, 0x85, 0x2e, 0x1c, 0xcb, 0x5d, 0xdc, 0x56, 0x7f, 0x2f, 0x7a, 0x59, 0x4b, 0xf2, 0x6b, 0xb7, 0x37, 0xf8, 0x46, 0xf2, 0x85, 0xfb, 0x19, 0x37, 0x69, 0x46, 0x48, 0xbb, 0xe6, 0x3d, 0x70, 0xba, 0xbf, 0x18, 0xf7, 0xbf, 0x9d, 0xc4, 0xf6, 0xb8, 0xda, 0xdb, 0xc5, 0x14, 0x35, 0xe4, 0x2c, 0x35, 0x33, 0x13, 0x6d, 0xe6, 0xb2, 0x04, 0x9b, 0xed, 0x4c, 0x9c, 0xd3, 0xf6, 0x6d, 0x34, 0xca, 0xb7, 0xbd, 0xf0, 0x4e, 0x98, 0xbe, 0xbd, 0x70, 0xb8, 0x82, 0xef, 0xd9, 0x2c, 0x9e, 0x75, 0x14, 0x2d, 0xd3, 0x74, 0x7f, 0xf2, 0xb0, 0x6b, 0x7f, 0xb6, 0x38, 0x02, 0x1f, 0x56, 0xe0, 0xf1, 0x91, 0x55, 0x53, 0xf6, 0xad, 0x26, 0xde, 0xcc, 0x64, 0x86, 0xc7, 0xb2, 0x11, 0x74, 0x0a, 0x09, 0x91, 0x53, 0x98, 0x94, 0x44, 0xd0, 0xe5, 0x9a, 0x5f, 0x68, 0x3e, 0x21, 0x14, 0xc6, 0x3f, 0x17, 0x9a, 0x3e, 0x93, 0x6b, 0x8a, 0xbd, 0x34, 0xfe, 0x4e, 0xa8, 0x72, 0xca, 0x20, 0x01, 0x09, 0x52, 0x51, 0x67, 0x36, 0x29, 0xd3, 0x07, 0x5e, 0xbf, 0xed, 0xce, 0x56, 0xfa, 0x98, 0x5b, 0x1c, 0x68, 0xad, 0x92, 0x42, 0xb8, 0x19, 0xfe, 0x3a, 0xbf, 0x4e, 0x1f, 0x06, 0xea, 0xd2, 0x78, 0x02, 0x91, 0x21, 0xfd, 0x88, 0x83, 0x49, 0xc2, 0x31, 0x4e, 0x40, 0x6e, 0x8e, 0x41, 0xbc, 0xd0, 0x74, 0xc4, 0x07, 0xa1, 0x39, 0x8b, 0x95, 0x4c, 0x33, 0x3d, 0x4a, 0x1a, 0xdd, 0x26, 0x1b, 0xcc, 0x03, 0xf5, 0xe6, 0xc3, 0xae, 0xb4, 0x90, 0x33, 0x75, 0x8b, 0xbd, 0xfc, 0xa6, 0x22, 0xea, 0x6b, 0x5d, 0x39, 0x15, 0x1f, 0x15, 0x60, 0xea, 0x56, 0x00, 0xcd, 0x65, 0x28, 0x40, 0x59, 0x87, 0xf6, 0x40, 0x08, 0x61, 0x65, 0x8e, 0xc8, 0xde, 0x2a, 0x5e, 0x4a, 0x2b, 0xfb, 0x1c, 0x61, 0xea, 0xd0, 0xe8, 0x2f, 0xd4, 0xcd, 0x5c, 0xb4, 0xfa, 0x93, 0x87, 0xfd, 0x87, 0x56, 0x83, 0x87, 0x25, 0x25, 0xfb, 0x80, 0x87, 0x59, 0xca, 0x85, 0x55, 0x86, 0x8e, 0xd6, 0x63, 0xfd, 0x0f, 0x15, 0xb5, 0x7c, 0xf7, 0x87, 0xb9, 0x09, 0xa7, 0xbf, 0x9b, 0x36, 0x2b, 0x8c, 0x5b, 0xd1, 0xa6, 0x8a, 0xc2, 0x27, 0x6a, 0xbc, 0xb1, 0xea, 0xa2, 0x04, 0xe0, 0x6e, 0x34, 0xbf, 0x4b, 0x1d, 0x2a, 0xf2, 0xe2, 0x22, 0xfc, 0xb0, 0x58, 0x33, 0x35, 0x01, 0x51, 0x27, 0x03, 0x7f, 0x6a, 0x24, 0xb8, 0xe9, 0x8b, 0x42, 0xbd, 0x7e, 0x60, 0x39, 0xaf, 0x43, 0xfd, 0xfb, 0xb3, 0x4a, 0xc9, 0xb8, 0x21, 0xbd, 0x06, 0xad, 0x39, 0x67, 0x55, 0xc3, 0x8c, 0x01, 0x23, 0x70, 0x48, 0x7c, 0x5b, 0x5b, 0x94, 0xd3, 0x37, 0xd2, 0x27, 0xac, 0x11, 0x78, 0xd9, 0x8e, 0xbb, 0x52, 0xdf, 0x75, 0x96, 0x4d, 0x2f, 0xe0, 0x7a, 0x52, 0x02, 0xb5, 0xed, 0xc5, 0xd1, 0xe4, 0x41, 0xa5, 0x1f, 0xba, 0x3e, 0xf3, 0x1b, 0x7c, 0x61, 0x08, 0xce, 0x2e, 0xba, 0xf3, 0xa4, 0x5b, 0x46, 0x9a, 0x59, 0x64, 0xe2, 0xd6, 0x0c, 0x3e, 0x8d, 0x2d, 0xd4, 0x92, 0x15, 0xec, 0xf8, 0xfb, 0xeb, 0x35, 0x05, 0x13, 0x7c, 0x70, 0x37, 0x88, 0x3e, 0x59, 0xe4, 0x51, 0x53, 0x31, 0xc8, 0x09, 0x51, 0xf7, 0x30, 0xbe, 0xad, 0x8d, 0xe2, 0x63, 0xc8, 0x48, 0xc1, 0xee, 0x3e, 0x71, 0xc4, 0x56, 0xb7, 0x5f, 0xf9, 0x32, 0x58, 0x33, 0x14, 0x7d, 0x51, 0xbf, 0xeb, 0x23, 0x19, 0x4a, 0x07, 0x3e, 0x73, 0xd4, 0xd2, 0xc8, 0xc8, 0x2a, 0x72, 0x24, 0x0e, 0xed, 0xf0, 0xb6, 0x95, 0x0e, 0xea, 0x24, 0xcb, 0x92, 0xdb, 0xa6, 0xf3, 0xc2, 0xef, 0x73, 0x9a, 0xef, 0x3e, 0xb9, 0x00, 0xf3, 0xda, 0xe2, 0x28, 0x3b, 0xb4, 0xfa, 0x5f, 0x9e, 0xc2, 0x4b, 0x8b, 0x4a, 0xbb, 0x7c, 0x25, 0xf6, 0x32, 0xf8, 0x60, 0x07, 0xeb, 0x11, 0xb6, 0x75, 0xf2, 0xc9, 0x66, 0x87, 0xb3, 0x31, 0x96, 0x1b, 0x13, 0x99, 0x13, 0x00, 0x9e, 0xd6, 0xd7, 0x59, 0xba, 0x90, 0xf8, 0xda, 0x00, 0x96, 0x94, 0x0f, 0xa1, 0x74, 0x84, 0x9f, 0xd7, 0xc1, 0xbb, 0xd3, 0xae, 0xe6, 0x7f, 0x0f, 0x82, 0x70, 0x13, 0x4d, 0x55, 0xdc, 0x0a, 0x5f, 0xa6, 0x48, 0xae, 0x16, 0x24, 0x83, 0x38, 0x42, 0x39, 0x7b, 0x23, 0x29, 0x3f, 0x98, 0x76, 0x04, 0x3d, 0x9b, 0x60, 0x51, 0xf7, 0xc7, 0xdb, 0x50, 0x39, 0x4d, 0x87, 0x7c, 0xef, 0x1b, 0xbc, 0xf0, 0x0c, 0xa6, 0x1b, 0x27, 0x4a, 0x0c, 0x6b, 0x09, 0x3b, 0x9f, 0xc3, 0x67, 0x86, 0x0d, 0xdb, 0x11, 0xd2, 0x50, 0xbb, 0x19, 0xe8, 0xb8, 0x18, 0xf2, 0x51, 0xce, 0xa8, 0x9b, 0x12, 0x69, 0x49, 0x3f, 0x22, 0x81, 0xfe, 0x23, 0x50, 0x02, 0xc0, 0xbd, 0x4b, 0xe4, 0x36, 0xd8, 0xe5, 0x5d, 0x11, 0x29, 0x10, 0x79, 0xd9, 0x6e, 0xd0, 0xdb, 0x81, 0x57, 0x9e, 0xa7, 0x54, 0x1f, 0x85, 0xb8, 0x1a, 0xdf, 0xa6, 0xbf, 0x0a, 0x43, 0x74, 0xc2, 0xb8, 0x6c, 0x09, 0x20, 0xbe, 0x59, 0xae, 0x05, 0xc7, 0x52, 0xe2, 0x67, 0xa8, 0x00, 0x21, 0x23, 0xbd, 0x3e, 0x6a, 0x2f, 0x10, 0x44, 0x09, 0xfb, 0x62, 0x35, 0xe0, 0x9a, 0x41, 0x1f, 0x06, 0x72, 0x12, 0x49, 0xed, 0x26, 0x78, 0x67, 0xdd, 0xfb, 0x9e, 0x28, 0xe4, 0x8d, 0xe1, 0x7a, 0xa2, 0x2f, 0x64, 0xca, 0xda, 0xa0, 0xee, 0x51, 0xc5, 0x2c, 0x8d, 0x65, 0x8c, 0xb1, 0x01, 0xd0, 0x91, 0x5f, 0x60, 0x8f, 0xba, 0xbd, 0x6a, 0x7f, 0x35, 0x40, 0x74, 0xaa, 0x24, 0xad, 0x42, 0xcc, 0xfa, 0xba, 0x02, 0xc4, 0xdc, 0xda, 0x24, 0x87, 0xb7, 0xd6, 0xc9, 0x1e, 0x3e, 0xd5, 0xb2, 0x31, 0x83, 0xc8, 0x32, 0x99, 0x9e, 0xef, 0xec, 0x94, 0xe6, 0x0c, 0xba, 0x6d, 0x0d, 0x0e, 0x18, 0x3e, 0x5c, 0xfb, 0xa1, 0xbc, 0xda, 0x16, 0xec, 0x71, 0xd7, 0x67, 0xe6, 0xbb, 0x2e, 0x88, 0x4c, 0x37, 0x14, 0x71, 0x23, 0x38, 0x6d, 0xae, 0x4b, 0xb0, 0x7a, 0xd1, 0xdb, 0x2a, 0x6d, 0xbb, 0xd5, 0x9f, 0x38, 0xdf, 0x4b, 0x43, 0xe5, 0xfa, 0x27, 0x5c, 0x95, 0x45, 0x28, 0x6a, 0xfe, 0x29, 0x82, 0x49, 0x24, 0x11, 0x59, 0xc1, 0x81, 0x37, 0x22, 0x18, 0xf6, 0x35, 0xf3, 0x74, 0x54, 0xea, 0x4c, 0xed, 0x04, 0x71, 0x14, 0x20, 0x09, 0xbf, 0x79, 0x34, 0xa5, 0x15, 0xdb, 0x9c, 0xa0, 0x18, 0x67, 0xbc, 0x74, 0x83, 0x5f, 0x7e, 0x7e, 0xbf, 0x1a, 0x8a, 0x8b, 0xf3, 0xb8, 0xe8, 0x9e, 0xb6, 0x98, 0x4a, 0x99, 0x0b, 0x77, 0x9a, 0xf6, 0x47, 0x24, 0x34, 0xf3, 0xcb, 0xc3, 0x48, 0x73, 0x6b, 0x17, 0x52, 0x3a, 0xf5, 0x50, 0xcd, 0x9e, 0xc2, 0xec, 0xf6, 0x15, 0x4b, 0x67, 0xf5, 0x8c, 0x90, 0xdc, 0x4b, 0x0a, 0xb4, 0x53, 0xf8, 0x63, 0x10, 0x9d, 0x01, 0x5d, 0x97, 0xc7, 0x9e, 0xc0, 0xcf, 0x99, 0xcd, 0x71, 0x4b, 0x71, 0xd4, 0xf2, 0x3d, 0xb8, 0x79, 0xc1, 0x15, 0xfd, 0xe2, 0xc0, 0xe9, 0xb5, 0x5b, 0xef, 0xb7, 0xc4, 0x72, 0xf9, 0x65, 0x14, 0xad, 0x96, 0x2b, 0x26, 0x3e, 0x75, 0xac, 0xb1, 0xea, 0x9b, 0xd2, 0xe1, 0xd1, 0xb6, 0xe1, 0x5e, 0x46, 0xa7, 0x4f, 0x50, 0xde, 0x00, 0x3b, 0xb2, 0x7d, 0xb0, 0xdf, 0x59, 0x69, 0xd6, 0xac, 0xa1, 0x64, 0xe8, 0xdf, 0xb9, 0x71, 0xf2, 0x31, 0x45, 0x1f, 0xd2, 0x4d, 0x8b, 0x67, 0x18, 0xd9, 0x67, 0x9c, 0xd6, 0x90, 0x64, 0x04, 0x5b, 0x46, 0x12, 0x45, 0xd3, 0xb7, 0xa0, 0xc9, 0xb8, 0x25, 0x79, 0xb7, 0x7c, 0x0e, 0x08, 0xc4, 0x4b, 0x01, 0xef, 0x36, 0x6b, 0xda, 0x9a, 0xb9, 0x34, 0x1b, 0x2c, 0xba, 0xf7, 0xc9, 0xfa, 0x5a, 0x16, 0xec, 0xbb, 0x4d, 0x94, 0x40, 0x1b, 0x37, 0xaf, 0x57, 0x9c, 0x7d, 0xd1, 0x69, 0x12, 0xeb, 0xb7, 0x20, 0x0b, 0x4b, 0x67, 0x9d, 0xfb, 0x6a, 0x58, 0x81, 0xaa, 0x9a, 0xe9, 0xd4, 0xf8, 0xbb, 0x0d, 0x68, 0x8c, 0xe0, 0x88, 0x91, 0x4d, 0xd7, 0x57, 0x73, 0x62, 0x88, 0xd5, 0xb7, 0xc6, 0x2e, 0x53, 0xa1, 0xfa, 0x7b, 0x1f, 0xdf, 0xc4, 0x78, 0x48, 0xcf, 0x06, 0x52, 0xbf, 0xff, 0xa3, 0xf6, 0x97, 0xa4, 0x04, 0x4e, 0xeb, 0x56, 0xa7, 0xf9, 0x39, 0x78, 0x8e, 0x23, 0x0a, 0xbf, 0xd9, 0x4a, 0xde, 0xda, 0x9f, 0x0a, 0x94, 0x2d, 0x8b, 0xb5, 0x7e, 0x28, 0x88, 0xa0, 0xfb, 0x72, 0x63, 0x3c, 0x26, 0xa3, 0x2f, 0xd4, 0x4b, 0xd0, 0x25, 0x6d, 0xc7, 0x9b, 0x34, 0x3d, 0x54, 0xb7, 0xd2, 0x4b, 0x89, 0x81, 0x07, 0x01, 0x89, 0x0e, 0x0f, 0x22, 0x64, 0xce, 0x21, 0xff, 0x4d, 0xfd, 0x9b, 0x04, 0x0f, 0xb8, 0x44, 0xd2, 0xe1, 0x2f, 0x0c, 0x41, 0xdd, 0xf3, 0x72, 0xdd, 0x02, 0x89, 0xca, 0x3e, 0xb6, 0xc8, 0xce, 0xff, 0xaf, 0x20, 0xd1, 0x8e, 0x9b, 0xf5, 0x87, 0x94, 0x49, 0x5b, 0x9f, 0x82, 0x28, 0xd4, 0x3c, 0xe3, 0xb9, 0x46, 0x4e, 0x0a, 0x48, 0xfb, 0x8c, 0x77, 0x7b, 0xf1, 0x10, 0x6f, 0x07, 0x8b, 0x75, 0x4f, 0xaa, 0x66, 0x45, 0x6a, 0xef, 0xee, 0x6f, 0x2c, 0x3c, 0x58, 0x30, 0x3c, 0x0d, 0xa2, 0x52, 0x32, 0x6a, 0x37, 0xda, 0x25, 0xd5, 0x02, 0xf9, 0x64, 0x36, 0x0e, 0x42, 0xb9, 0xb6, 0x88, 0xa9, 0xd5, 0xd1, 0x58, 0x3d, 0x33, 0x4d, 0x92, 0xa0, 0x10, 0xe0, 0x05, 0x63, 0xc8, 0x0a, 0x72, 0x6a, 0x95, 0xa7, 0x71, 0x18, 0x6c, 0x23, 0x65, 0xab, 0x01, 0x77, 0xa7, 0x23, 0x38, 0xd9, 0x1a, 0xec, 0x4e, 0x58, 0x1f, 0x5e, 0xfc, 0xf0, 0x7c, 0xf6, 0x3e, 0x00, 0x06, 0xfc, 0x10, 0x92, 0xf9, 0x07, 0x2c, 0x60, 0xcf, 0xbd, 0x74, 0xb6, 0x5b, 0xe4, 0x81, 0x07, 0x7b, 0x92, 0x8c, 0x0b, 0xf1, 0xc1, 0xf9, 0x60, 0x96, 0x1c, 0x1f, 0xf6, 0x6e, 0x21, 0x99, 0xea, 0xce, 0x12, 0x8f, 0x9b, 0xe4, 0x69, 0xaf, 0x3e, 0x61, 0x85, 0xca, 0x96, 0xbf, 0xcb, 0xbd, 0xb3, 0x91, 0x65, 0x9a, 0xcf, 0xe8, 0xcc, 0x98, 0xb1, 0xa5, 0x5a, 0xd4, 0xaa, 0xff, 0x07, 0x54, 0x4e, 0xb9, 0x1c, 0x0b, 0x77, 0xef, 0x10, 0x11, 0x0f, 0xa7, 0x75, 0xf8, 0x24, 0xe8, 0xe2, 0xf5, 0x9f, 0xe0, 0x91, 0xd4, 0x39, 0xad, 0xd9, 0x97, 0x44, 0xc0, 0xd1, 0x00, 0x66, 0xfa, 0x69, 0xad, 0xd1, 0x2c, 0xbc, 0x46, 0x5b, 0xe7, 0x4f, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x97, 0xe6, 0x8b, 0xbe, 0x78, 0x2d, 0xeb, 0xc6, 0x0e, 0x8e, 0x5a, 0xa9, 0xee, 0x19, 0xd4, 0x5a, 0x17, 0x32, 0xb0, 0xf9, 0x3c, 0x7e, 0x4a, 0xb1, 0x7f, 0x9b, 0xc0, 0x9e, 0xf5, 0x0d, 0x22, 0x73, 0x1e, 0x93, 0xac, 0x8f, 0x06, 0xea, 0x26, 0x10, 0x2f, 0xca, 0x13, 0xc0, 0x8e, 0xcd, 0x52, 0x13, 0x59, 0xdf, 0x30, 0xda, 0x86, 0x9b, 0x82, 0x5a, 0xbd, 0x13, 0x34, 0xcb, 0x58, 0x31, 0xad, 0x08, 0x49, 0xc3, 0x08, 0x5b, 0xf2, 0xf8, 0x13, 0xec, 0x7a, 0x0b, 0x77, 0x1a, 0x06, 0x1f, 0xe7, 0x4b, 0xf8, 0xf8, 0x1e, 0x75, 0xab, 0xa3, 0x3e, 0xb5, 0x5f, 0x85, 0xc3, 0x77, 0xc9, 0x81, 0xeb, 0x46, 0xd9, 0x3b, 0x91, 0xe6, 0xc2, 0x13, 0x16, 0x39, 0xf0, 0x50, 0x89, 0xa6, 0x79, 0x83, 0xba, 0xe4, 0x0e, 0x6c, 0x1b, 0x8b, 0xf2, 0x46, 0xc7, 0x63, 0x01, 0xb8, 0x36, 0x45, 0x6d, 0x89, 0xdb, 0xff, 0x30, 0xa8, 0xb7, 0x67, 0x48, 0xa7, 0x74, 0xe3, 0x08, 0xbf, 0x1a, 0xa0, 0xeb, 0x24, 0xa9, 0xfb, 0x11, 0x33, 0xb0, 0x11, 0xc6, 0x22, 0x6f, 0x23, 0x99, 0x3a, 0xf2, 0x8d, 0xc7, 0x9d, 0x3c, 0xab, 0xf1, 0xaa, 0x7f, 0x19, 0x9b, 0x2f, 0xcf, 0x3f, 0xf4, 0xe7, 0x2d, 0xda, 0x49, 0x70, 0x09, 0x12, 0xb3, 0xe8, 0xc5, 0xec, 0x29, 0xd9, 0xf0, 0x36, 0x40, 0xdf, 0xdc, 0x10, 0x54, 0xba, 0x4e, 0xad, 0xbd, 0x6b, 0xe8, 0xc0, 0xed, 0x81, 0x8e, 0x57, 0xb0, 0x1c, 0xd3, 0x6c, 0x7f, 0x10, 0x1c, 0x5e, 0x51, 0x34, 0x50, 0x48, 0x9b, 0x90, 0x01, 0x50, 0x7e, 0x36, 0x28, 0x3a, 0x75, 0x90, 0x13, 0x17, 0xe6, 0x43, 0x33, 0xc8, 0xac, 0xba, 0xa8, 0x00, 0x2c, 0xa2, 0xd0, 0x98, 0xfc, 0x97, 0x8b, 0x14, 0x70, 0xa7, 0x6e, 0x80, 0xc3, 0x0f, 0xe9, 0x1d, 0x00, 0xe5, 0xac, 0x53, 0x6d, 0x0f, 0xd4, 0xc5, 0x92, 0x0d, 0xf8, 0x2f, 0x75, 0x32, 0x72, 0x8b, 0x87, 0x05, 0xb3, 0xf8, 0xce, 0x1c, 0x1a, 0x41, 0x44, 0xe8, 0x1a, 0x8b, 0x8b, 0x6a, 0x82, 0x29, 0xa7, 0x35, 0x31, 0xe8, 0xee, 0x7f, 0x9f, 0x10, 0xe4, 0xe8, 0xd0, 0xaf, 0x04, 0x18, 0x71, 0xbc, 0x45, 0xdf, 0x59, 0x84, 0xd6, 0xca, 0x1f, 0x8f, 0xd7, 0x29, 0xff, 0xc1, 0x3d, 0x18, 0xc7, 0x91, 0x16, 0x53, 0x90, 0x36, 0x70, 0x7c, 0xad, 0x7f, 0xf2, 0x67, 0x30, 0x22, 0x31, 0x5b, 0x19, 0x21, 0x86, 0x37, 0xd7, 0x82, 0x82, 0x14, 0x35, 0x06, 0xbc, 0x73, 0x55, 0x39, 0x54, 0xbb, 0xf5, 0x6e, 0xd9, 0x47, 0xc3, 0xdc, 0xd0, 0xf8, 0xd0, 0x8b, 0x1c, 0x25, 0x89, 0xdf, 0x78, 0x09, 0xb8, 0xcd, 0x98, 0x8f, 0xe8, 0xf3, 0xbe, 0x88, 0xf1, 0x26, 0x3b, 0x97, 0x02, 0x6e, 0xaa, 0xe9, 0x95, 0x5d, 0x9e, 0xe4, 0xd0, 0x53, 0xa6, 0x91, 0xa0, 0x88, 0x84, 0xc6, 0x2f, 0x0d, 0x41, 0x0c, 0x9d, 0x0f, 0x51, 0x3f, 0xea, 0xf8, 0x85, 0x14, 0x17, 0x70, 0x00, 0xf2, 0x57, 0xa8, 0x6e, 0x79, 0xce, 0x2f, 0x28, 0x3f, 0x6c, 0xb3, 0x28, 0x8b, 0x29, 0xec, 0xe5, 0x42, 0x4e, 0xf1, 0x6f, 0x1b, 0x09, 0x4e, 0x57, 0x49, 0xf8, 0xac, 0x0b, 0x32, 0x9f, 0x84, 0x01, 0x6c, 0xcf, 0x11, 0xc7, 0xb9, 0x01, 0xe1, 0xe2, 0x8d, 0x74, 0xe0, 0xff, 0xcc, 0xb6, 0x26, 0xfb, 0xf2, 0xce, 0xa3, 0x78, 0x59, 0xc5, 0x64, 0x84, 0x72, 0xed, 0xaf, 0xa8, 0x5f, 0x7d, 0xe2, 0x17, 0xa1, 0xb2, 0xc9, 0x21, 0xb0, 0x83, 0x5b, 0x2a, 0xea, 0xc6, 0xa8, 0xe0, 0x63, 0x61, 0x73, 0x1e, 0x43, 0xc8, 0xc4, 0x29, 0x19, 0xa8, 0x21, 0x1b, 0xb5, 0x80, 0x15, 0x23, 0xf4, 0xeb, 0x3e, 0x3a, 0xcc, 0x88, 0x88, 0xae, 0x5c, 0x52, 0xd5, 0xb3, 0x2f, 0x9e, 0x74, 0x97, 0x61, 0x14, 0x1b, 0x82, 0xaa, 0x75, 0xdf, 0x08, 0x58, 0x94, 0x27, 0xe8, 0x59, 0x6b, 0xc8, 0xd6, 0x2e, 0x2a, 0xc5, 0x83, 0x80, 0x64, 0x32, 0x77, 0xd9, 0xf1, 0x7c, 0xca, 0x27, 0xe2, 0x68, 0xbc, 0xf2, 0x41, 0x49, 0x5f, 0x52, 0xbf, 0xef, 0xf6, 0xcc, 0x70, 0x94, 0x37, 0xa8, 0x2d, 0xb2, 0x15, 0x9a, 0xab, 0x45, 0x26, 0xee, 0x5c, 0x5c, 0x06, 0x03, 0x24, 0x21, 0xff, 0xc5, 0x86, 0x08, 0xbe, 0x96, 0xda, 0x36, 0x45, 0x6a, 0x4d, 0xa7, 0xb6, 0xce, 0xd4, 0xde, 0x66, 0x87, 0x4e, 0xc3, 0xbb, 0x3c, 0xe7, 0xf6, 0xe5, 0x56, 0x38, 0xd0, 0x3a, 0x94, 0x9a, 0xe4, 0xea, 0x97, 0x5c, 0x1e, 0xe6, 0x1a, 0x99, 0xc8, 0xf6, 0x50, 0x3d, 0x76, 0xf9, 0xfc, 0x37, 0xbd, 0xd0, 0x7a, 0xc3, 0x51, 0x02, 0x2e, 0xea, 0xb4, 0x43, 0x88, 0x1f, 0xcb, 0x95, 0x6a, 0xda, 0x05, 0xfc, 0x8a, 0xa4, 0x2e, 0xa0, 0x60, 0x90, 0x7c, 0x66, 0xdb, 0xa7, 0x70, 0xb8, 0x39, 0xe2, 0xca, 0x74, 0x0c, 0xf8, 0x60, 0x59, 0x15, 0xa2, 0x62, 0x76, 0x73, 0xfa, 0xf3, 0x74, 0x4f, 0x57, 0xc4, 0xd4, 0xba, 0xca, 0x2e, 0x40, 0x9c, 0x45, 0x59, 0xbb, 0x6c, 0x88, 0xbb, 0x30, 0x8e, 0xdf, 0x01, 0xbb, 0x9d, 0xbc, 0xae, 0x64, 0x2f, 0xe2, 0x48, 0xbd, 0x10, 0xd6, 0xad, 0x31, 0x93, 0xb8, 0xff, 0x06, 0xf8, 0xc6, 0x01, 0x8c, 0x0e, 0x87, 0x63, 0xbb, 0x9d, 0x80, 0xa5, 0x5e, 0x0e, 0x8b, 0xc1, 0xb6, 0xec, 0xfe, 0x46, 0x23, 0x64, 0x54, 0x52, 0x46, 0x46, 0x79, 0x07, 0x4e, 0xd0, 0xd7, 0x6d, 0x8d, 0xe1, 0x9a, 0xd1, 0xfe, 0xa2, 0x38, 0xfb, 0xdf, 0x03, 0x47, 0x78, 0xd5, 0x01, 0x5c, 0xf9, 0x48, 0xa6, 0x63, 0xa0, 0xe4, 0xfb, 0x50, 0x35, 0x9f, 0xb8, 0xce, 0x80, 0x9f, 0xb5, 0x2b, 0x01, 0xcf, 0x78, 0x31, 0x72, 0x2c, 0x44, 0x66, 0xb7, 0x7d, 0x6f, 0xfd, 0x00, 0x25, 0x0e, 0xf9, 0x04, 0x98, 0x49, 0xf5, 0xc1, 0xeb, 0xae, 0x27, 0x95, 0xe4, 0x47, 0xc3, 0xb5, 0x27, 0x64, 0x2d, 0x1a, 0xa5, 0x0b, 0x57, 0xde, 0xa3, 0x23, 0xda, 0x11, 0xd5, 0xeb, 0xa9, 0xec, 0xdc, 0x6f, 0xeb, 0xc2, 0x95, 0x56, 0xf4, 0x26, 0x6d, 0xb4, 0x64, 0x8e, 0x8c, 0x88, 0x1d, 0x59, 0x25, 0xb6, 0x56, 0x78, 0x85, 0x3d, 0xf4, 0xd9, 0x12, 0xa0, 0x7a, 0xc8, 0xd2, 0x49, 0x0c, 0xfc, 0x68, 0x1c, 0xbd, 0xf5, 0xe6, 0x9a, 0x0f, 0x54, 0x1e, 0x37, 0x60, 0x9e, 0x93, 0xe5, 0xe7, 0x46, 0x9d, 0x0d, 0x2f, 0xd7, 0x61, 0xfc, 0x4c, 0xdf, 0x6c, 0x39, 0x07, 0x4f, 0x4b, 0x04, 0xfb, 0xec, 0x5c, 0x83, 0x54, 0x06, 0x14, 0x80, 0x05, 0x5f, 0xba, 0xf9, 0xec, 0x2f, 0xe3, 0x43, 0x74, 0xc6, 0x4d, 0xb9, 0x48, 0x93, 0xd8, 0xc8, 0x37, 0xdd, 0xf5, 0x39, 0x0a, 0x64, 0xb7, 0x91, 0x79, 0xf8, 0x85, 0x03, 0xbb, 0x41, 0xa1, 0xb1, 0x62, 0x2c, 0xd7, 0xec, 0x62, 0xc4, 0xc6, 0xc5, 0xc4, 0xdb, 0xb8, 0xf7, 0x5f, 0x41, 0xb7, 0x92, 0xe7, 0x17, 0xfc, 0xcf, 0x4f, 0x35, 0xb3, 0x49, 0xaf, 0xf1, 0x32, 0x3c, 0x16, 0x46, 0xc7, 0xb2, 0xef, 0xf4, 0x5d, 0x42, 0x11, 0x36, 0x29, 0x68, 0x92, 0x44, 0xb8, 0x1a, 0x14, 0xa0, 0x25, 0x94, 0x71, 0xdf, 0xa5, 0xbd, 0xa2, 0x30, 0xa8, 0xe5, 0xaf, 0x6b, 0x46, 0x62, 0xff, 0xcd, 0x34, 0xe6, 0x09, 0x4c, 0x96, 0x06, 0x5d, 0xb2, 0xb4, 0xcb, 0xc0, 0x54, 0x61, 0x56, 0x8f, 0x8e, 0xef, 0x59, 0x0f, 0x8e, 0xc2, 0x62, 0x83, 0x01, 0x50, 0x2f, 0x16, 0x6d, 0xe8, 0x6e, 0xda, 0xd6, 0x7b, 0x9d, 0xf6, 0xca, 0x30, 0x10, 0x59, 0xc7, 0x06, 0x92, 0x9d, 0xdd, 0x98, 0xd3, 0x07, 0x06, 0x3d, 0x35, 0xba, 0xe6, 0x4e, 0xf1, 0x49, 0x4f, 0x11, 0x4a, 0x75, 0x23, 0x5b, 0xc2, 0xec, 0x0c, 0x43, 0xd4, 0x9d, 0x3b, 0xfc, 0xc8, 0xc9, 0x75, 0x77, 0xee, 0x96, 0x0a, 0x52, 0xbe, 0xa5, 0x76, 0xde, 0x8e, 0x40, 0x85, 0x1d, 0x32, 0x3a, 0xe8, 0x75, 0xd1, 0x1d, 0x2b, 0x65, 0xfd, 0x40, 0xbe, 0x7d, 0x5b, 0x25, 0x95, 0xdf, 0x60, 0xde, 0xa9, 0x70, 0x5d, 0x53, 0x2d, 0xe0, 0xa1, 0x6d, 0xdb, 0xe5, 0xd5, 0xd8, 0x77, 0x19, 0xeb, 0x4e, 0xa3, 0x32, 0x82, 0x25, 0x5b, 0xe4, 0xfa, 0x90, 0x16, 0x6e, 0xfa, 0x0d, 0x77, 0xa7, 0xee, 0xf4, 0xf6, 0x50, 0xe7, 0xdb, 0x46, 0x6e, 0xe0, 0x7b, 0x37, 0xe5, 0xf6, 0xee, 0x81, 0x0b, 0x90, 0x39, 0x4f, 0x0e, 0x1a, 0x1f, 0xb5, 0x4d, 0x80, 0x7c, 0x31, 0xbd, 0x86, 0x5c, 0x30, 0x50, 0x38, 0x93, 0x18, 0x78, 0x5d, 0xbb, 0x23, 0x4b, 0x60, 0x8b, 0x42, 0x69, 0x7e, 0xfd, 0xf4, 0xaa, 0xe2, 0x9a, 0xb6, 0xe1, 0x28, 0x83, 0x37, 0x1b, 0x62, 0x17, 0x2f, 0x9b, 0xc5, 0xa1, 0x9d, 0x0b, 0xea, 0x0e, 0x9e, 0x68, 0x8b, 0xa9, 0x04, 0xf8, 0x5c, 0x21, 0x94, 0xad, 0x0b, 0x94, 0xc0, 0x43, 0x92, 0x7d, 0xd0, 0xc2, 0x09, 0x36, 0x47, 0x59, 0x4f, 0x85, 0x70, 0xba, 0x03, 0x91, 0xd0, 0x25, 0xb6, 0xf5, 0xc7, 0xd2, 0xf5, 0x38, 0x67, 0x5a, 0x26, 0xdd, 0xcb, 0xff, 0x7b, 0xac, 0xe0, 0x26, 0x13, 0xfa, 0x2d, 0xb9, 0x05, 0x86, 0xa9, 0xf6, 0xc4, 0xb8, 0x8f, 0x5d, 0x94, 0xe0, 0x51, 0xfe, 0x38, 0x6b, 0x71, 0x26, 0x3f, 0xa4, 0x93, 0x6f, 0x6d, 0xf4, 0xd8, 0x53, 0xdd, 0x08, 0xb2, 0x51, 0x7f, 0x30, 0xab, 0x46, 0x4d, 0xaa, 0x15, 0xa0, 0xba, 0xed, 0x38, 0x90, 0xb9, 0x28, 0x62, 0x2f, 0xfd, 0xae, 0xf6, 0xa1, 0x1d, 0x82, 0xfa, 0xc2, 0x50, 0x8a, 0xfe, 0xf1, 0x82, 0xaf, 0x58, 0x3e, 0xec, 0x78, 0x94, 0x54, 0x2d, 0xaa, 0x8e, 0x5f, 0xe0, 0x11, 0x41, 0xd5, 0xcf, 0x25, 0x0b, 0x37, 0x4d, 0xc0, 0x1f, 0xf0, 0x98, 0x55, 0x3e, 0x6c, 0x75, 0xd7, 0xd1, 0x60, 0xe7, 0x03, 0x03, 0x4d, 0x48, 0x5b, 0x30, 0x75, 0xb3, 0x95, 0x0b, 0xa2, 0x2f, 0x34, 0xe6, 0x23, 0xdc, 0x04, 0x36, 0x5e, 0x32, 0x5b, 0x25, 0x49, 0xe1, 0x26, 0x11, 0xbf, 0x5c, 0x27, 0xba, 0xa7, 0x1c, 0x11, 0xbb, 0xcc, 0x0b, 0x83, 0xb3, 0x46, 0x1d, 0x7b, 0xbc, 0x51, 0x11, 0x45, 0xc4, 0xbd, 0x85, 0x2a, 0xda, 0x0a, 0x86, 0xb2, 0x7b, 0x61, 0x6b, 0x3f, 0x5e, 0x6b, 0xcf, 0x77, 0x48, 0x4f, 0x59, 0xf0, 0x2f, 0x10, 0x53, 0xeb, 0x52, 0x98, 0x4d, 0xf5, 0x8f, 0xee, 0xb5, 0x97, 0xaa, 0xe7, 0xdc, 0xa5, 0x92, 0xfb, 0xd8, 0xec, 0x3b, 0x23, 0xd1, 0xbf, 0x9a, 0x99, 0xc3, 0x07, 0x56, 0xc1, 0x68, 0x99, 0x8f, 0xc6, 0xbc, 0x39, 0xf2, 0x3e, 0x20, 0xd1, 0xa3, 0xa5, 0xc5, 0x1c, 0xe6, 0x4d, 0x73, 0x83, 0x8a, 0x86, 0xbd, 0xde, 0x63, 0xdd, 0xe4, 0x78, 0x99, 0xcc, 0x8a, 0x24, 0x4b, 0x08, 0x74, 0x22, 0x11, 0x14, 0xd3, 0xfa, 0x3a, 0x90, 0xd4, 0xd6, 0xe1, 0x43, 0x2c, 0xc4, 0xfa, 0x43, 0x2e, 0x42, 0x79, 0x48, 0xb2, 0x52, 0x48, 0x76, 0x06, 0x93, 0xc1, 0x92, 0x76, 0x7a, 0xb8, 0xa8, 0x35, 0x5b, 0xb6, 0x63, 0x5d, 0x74, 0x3e, 0xb6, 0x10, 0xa1, 0x4a, 0xf7, 0x3c, 0xb1, 0x67, 0x35, 0x2a, 0x62, 0xbd, 0xd6, 0x44, 0x11, 0x0d, 0x25, 0xf5, 0xe1, 0xd2, 0xd6, 0x98, 0xfb, 0xc0, 0xc7, 0x5b, 0x0a, 0xae, 0x2d, 0x1d, 0x4e, 0x5c, 0xcf, 0x82, 0x8e, 0xd7, 0x54, 0x85, 0x93, 0xb9, 0xbe, 0x09, 0x61, 0xa9, 0x51, 0x74, 0xc8, 0xb5, 0x0f, 0xa6, 0xb2, 0x23, 0x3f, 0x5e, 0x06, 0xa4, 0x36, 0x95, 0xaa, 0xd7, 0xfa, 0x05, 0x8d, 0x32, 0x30, 0x6b, 0xae, 0x97, 0x0a, 0xf5, 0x51, 0x4b, 0x88, 0x61, 0x29, 0x81, 0xee, 0xc9, 0xde, 0xe0, 0x46, 0x19, 0x2d, 0xe8, 0xc6, 0x88, 0x0c, 0x01, 0x5c, 0xf8, 0x8c, 0xf6, 0x66, 0xa0, 0x21, 0x5b, 0x65, 0x79, 0x46, 0x7f, 0xb3, 0x85, 0x8d, 0x51, 0xd8, 0xfb, 0x94, 0xcc, 0x0b, 0x94, 0x79, 0x29, 0xcc, 0x07, 0x6b, 0xb0, 0x2e, 0x9f, 0x3b, 0x81, 0xab, 0x62, 0x0b, 0x3c, 0x2e, 0x09, 0x46, 0x6a, 0x22, 0x95, 0x04, 0x1c, 0xd1, 0x9e, 0x6c, 0x59, 0xe1, 0x0d, 0xf4, 0xc0, 0x9c, 0x58, 0x52, 0xa2, 0xf1, 0x68, 0x30, 0xe1, 0x8e, 0x4b, 0x4c, 0x3c, 0xbc, 0x0e, 0xb1, 0x5a, 0x54, 0x97, 0xef, 0x0c, 0x69, 0x6a, 0x7b, 0xbc, 0x2b, 0x02, 0xc6, 0x84, 0xfa, 0x0a, 0x92, 0xe7, 0xea, 0x11, 0x89, 0x2f, 0x16, 0xf4, 0x0b, 0xfc, 0x7d, 0xc0, 0x21, 0x7f, 0x10, 0xb7, 0x98, 0x3d, 0x50, 0x51, 0x4e, 0xcb, 0x4f, 0x06, 0x85, 0x1b, 0xda, 0xdb, 0x39, 0x15, 0x8a, 0x86, 0xe5, 0xe9, 0xa7, 0xc9, 0x52, 0xde, 0x56, 0xca, 0x87, 0x1d, 0xb1, 0x92, 0x14, 0x2a, 0x64, 0x3e, 0x3a, 0x44, 0x4e, 0x48, 0x5d, 0x1f, 0x8a, 0x26, 0x92, 0xd3, 0xf5, 0xbc, 0x0d, 0x33, 0x0c, 0x94, 0xe8, 0x47, 0x62, 0x8c, 0x86, 0xaa, 0x50, 0x5d, 0x5b, 0xb8, 0x37, 0xc0, 0x21, 0x8f, 0x10, 0xba, 0x0a, 0xd1, 0xb4, 0x33, 0xa3, 0x6b, 0xe8, 0xe3, 0x29, 0x2e, 0xfd, 0x4a, 0xd4, 0xfb, 0xa5, 0x06, 0x55, 0x3a, 0xe4, 0xba, 0x69, 0x61, 0x80, 0x5d, 0x43, 0x92, 0xb5, 0xd9, 0xeb, 0x40, 0x50, 0x4c, 0xd5, 0x74, 0x2e, 0xfa, 0x88, 0xe4, 0xf1, 0xf3, 0x36, 0xb1, 0x19, 0xf7, 0xd7, 0xba, 0x6a, 0x11, 0xc3, 0x84, 0x28, 0xc2, 0xa7, 0xda, 0x6e, 0x0b, 0xad, 0x0e, 0x8b, 0xe5, 0x32, 0xe8, 0xee, 0x77, 0x3d, 0xfe, 0xc5, 0x25, 0x76, 0xb3, 0x1a, 0x08, 0xa9, 0xf6, 0x01, 0x5d, 0x3f, 0xdb, 0xd1, 0x25, 0x59, 0xb9, 0x3f, 0x54, 0x88, 0x29, 0x42, 0xd9, 0xfd, 0xa6, 0x89, 0x01, 0x16, 0x1b, 0xbe, 0x72, 0xb5, 0x41, 0x00, 0x44, 0x15, 0xd9, 0xd0, 0xca, 0x5c, 0x50, 0xbb, 0x45, 0x76, 0x4d, 0xa3, 0x28, 0x2e, 0x76, 0x7c, 0x4d, 0xef, 0xfc, 0x95, 0x21, 0x19, 0x45, 0x77, 0xfe, 0xe6, 0x51, 0xc3, 0xad, 0xbf, 0x37, 0x41, 0xf0, 0xb6, 0x65, 0x96, 0x8b, 0xa9, 0x72, 0x64, 0x57, 0xc1, 0xcc, 0x43, 0xd5, 0x1a, 0xff, 0xcf, 0x8c, 0x03, 0x30, 0xd8, 0x92, 0x18, 0xa2, 0xf0, 0x74, 0xab, 0xb0, 0xa4, 0xf2, 0xab, 0x73, 0x66, 0x85, 0x4a, 0x07, 0x4b, 0xcb, 0x7f, 0xb2, 0x19, 0x3a, 0xa0, 0xc8, 0x89, 0x4c, 0x1f, 0x57, 0x15, 0x3a, 0x1d, 0x9d, 0xca, 0x39, 0x19, 0xe7, 0x2a, 0xf6, 0x03, 0x33, 0x41, 0x5d, 0x94, 0xf5, 0xc2, 0x40, 0xdf, 0xf0, 0x20, 0xd1, 0x68, 0x25, 0xfa, 0x4d, 0x50, 0xdc, 0x00, 0x30, 0x93, 0xa1, 0xc6, 0xc9, 0x17, 0xd5, 0x8a, 0xb7, 0xb5, 0x34, 0xb7, 0xaf, 0xad, 0x92, 0x7f, 0xb6, 0x30, 0x37, 0x7d, 0xc8, 0x22, 0x26, 0x56, 0x63, 0xe0, 0xbe, 0x23, 0x23, 0x81, 0xeb, 0xe7, 0xe4, 0x1a, 0x06, 0x1a, 0x12, 0x7e, 0x6a, 0xb6, 0xab, 0x27, 0xd6, 0xff, 0x81, 0xa7, 0x91, 0x68, 0x3d, 0x7d, 0x82, 0xce, 0xf5, 0xc0, 0x58, 0x2c, 0x3d, 0xd0, 0xc8, 0x9e, 0x19, 0x91, 0x13, 0x8a, 0xf7, 0x0e, 0xab, 0xc3, 0x0f, 0x92, 0xe8, 0x56, 0xed, 0x64, 0xbf, 0x84, 0x99, 0xd7, 0xdb, 0xbc, 0xc8, 0x99, 0xad, 0x6e, 0xcc, 0xd5, 0xc3, 0xe4, 0x44, 0xb5, 0x03, 0x1f }; +constexpr AccessUnit AC3_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x15, 0x52, 0x08, 0x0e, 0x4a, 0x8b, 0xd1, 0xa1, 0xfe, 0x30, 0xc1, 0x4b, 0xc9, 0x96, 0x59, 0xc4, 0x6c, 0x6b, 0x42, 0xed } }; + +const std::vector LPCM_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x40, 0x00, 0x00, 0x00, 0xfb, 0xba, 0x2b, 0xca, 0x88, 0x65, 0x2b, 0x01, 0xf4, 0xe6, 0xfc, 0x43, 0xc2, 0xad, 0x45, 0xe3, 0xf1, 0x0b, 0x86, 0x17, 0x75, 0x98, 0x11, 0x62, 0xb4, 0xd9, 0xb5, 0x6c, 0x1e, 0xac, 0xf0, 0xaa, 0xf6, 0xc4, 0x4a, 0xcc, 0x5d, 0xb3, 0x3d, 0xd3, 0x40, 0x11, 0xbc, 0x73, 0x09, 0x49, 0x80, 0xe4, 0xef, 0x95, 0xb2, 0xc8, 0xb4, 0x48, 0x20, 0xe2, 0x49, 0x07, 0x94, 0x7c, 0xe7, 0xab, 0x73, 0x0b, 0xa9, 0x97, 0xbd, 0x8b, 0xf3, 0x90, 0x3c, 0x12, 0x29, 0xec, 0xe8, 0x5a, 0x8a, 0xbb, 0x35, 0x60, 0xf5, 0x6c, 0xaa, 0x93, 0xf1, 0x3c, 0x86, 0x8b, 0x63, 0x11, 0xa8, 0x22, 0x32, 0x90, 0x4a, 0x57, 0xa0, 0x91, 0xbf, 0x95, 0x45, 0xef, 0x98, 0xa1, 0x11, 0xf7, 0x59, 0x05, 0xc2, 0x0f, 0x13, 0x86, 0x27, 0xd4, 0x28, 0x21, 0x27, 0x74, 0x31, 0xdb, 0xe6, 0xf9, 0xa5, 0xbd, 0xe1, 0x19, 0x79, 0x9f, 0xc6, 0xd4, 0x49, 0x14, 0x06, 0x59, 0x03, 0x0f, 0x07, 0x16, 0x93, 0x95, 0x2e, 0xae, 0x82, 0x99, 0xbb, 0x86, 0x36, 0xda, 0x6e, 0xf2, 0x3e, 0x77, 0xa9, 0x74, 0x79, 0x92, 0x0c, 0x28, 0x24, 0x4a, 0x1f, 0x0e, 0x16, 0xf8, 0xdf, 0xa9, 0x4f, 0x67, 0xb8, 0xe1, 0xfa, 0x83, 0x42, 0x3a, 0x38, 0x2e, 0x12, 0xb3, 0x10, 0x54, 0x59, 0x0c, 0xdb, 0xa1, 0xe8, 0x64, 0x0d, 0x87, 0x6b, 0xac, 0xd1, 0x2c, 0x90, 0x15, 0xd6, 0xed, 0x5e, 0x78, 0x94, 0x05, 0x2d, 0x15, 0xb0, 0xf0, 0xbd, 0xd6, 0x02, 0xa1, 0xf7, 0xf2, 0x2a, 0xf1, 0x1a, 0xe7, 0xf0, 0x3c, 0x36, 0xd9, 0x24, 0xb6, 0x98, 0x4e, 0xda, 0x73, 0x39, 0x33, 0xda, 0x5c, 0xb1, 0x4e, 0x4c, 0xca, 0x01, 0xa2, 0x96, 0x13, 0x9f, 0x8a, 0x87, 0xdb, 0x3f, 0x09, 0x14, 0x6b, 0x2c, 0x99, 0x55, 0x37, 0xe4, 0xe5, 0x08, 0x61, 0xf5, 0x4e, 0xb2, 0x0a, 0x3e, 0xbd, 0xb8, 0x52, 0xdf, 0xea, 0x8b, 0xee, 0x49, 0x98, 0x7d, 0x94, 0x95, 0x2c, 0x1c, 0x29, 0x67, 0xb5, 0xa2, 0x38, 0x06, 0x91, 0x25, 0x22, 0xd3, 0x3c, 0xd6, 0xd0, 0x7d, 0x2f, 0xd1, 0x03, 0x2a, 0xec, 0xea, 0xa9, 0xfa, 0xab, 0x70, 0x49, 0xf4, 0xde, 0x5d, 0xfd, 0xda, 0x7f, 0xf7, 0xf1, 0xfc, 0x56, 0x52, 0x1e, 0x85, 0x1c, 0x9f, 0xaa, 0xbd, 0x6f, 0x3d, 0xda, 0x46, 0xe2, 0x58, 0x80, 0xe1, 0x3d, 0xae, 0xed, 0x51, 0xf8, 0x1c, 0x65, 0x71, 0x9b, 0xf0, 0x04, 0x31, 0xdd, 0xb8, 0x4b, 0x15, 0x29, 0xf5, 0xaa, 0x82, 0x11, 0x26, 0x1c, 0xaf, 0xb7, 0x47, 0xa0, 0x72, 0x26, 0x48, 0x73, 0x7e, 0xa2, 0xaa, 0x0b, 0x9f, 0x86, 0x44, 0xa5, 0xfd, 0xfa, 0xb5, 0x58, 0x21, 0x1b, 0x46, 0x4b, 0x46, 0xd7, 0x6b, 0xc8, 0xcd, 0xc3, 0x08, 0x60, 0x6d, 0xc8, 0x65, 0xd7, 0xa5, 0x67, 0x63, 0xf9, 0x07, 0x8b, 0x68, 0x16, 0xce, 0x35, 0x37, 0xe3, 0x71, 0xb7, 0xb1, 0x5f, 0x73, 0x3b, 0xba, 0xe3, 0xd6, 0x38, 0x2b, 0x35, 0x77, 0x06, 0x11, 0x2e, 0x63, 0xf2, 0xdc, 0x26, 0x34, 0x8d, 0x86, 0x81, 0x05, 0x70, 0xd3, 0x0a, 0x65, 0xec, 0x7a, 0xf4, 0x6a, 0xcc, 0x36, 0x93, 0x19, 0xe4, 0x40, 0xd7, 0x2c, 0x33, 0x8e, 0xab, 0xc0, 0x19, 0x2c, 0xd5, 0x60, 0x7f, 0x5e, 0x99, 0x82, 0x09, 0x23, 0x08, 0xe0, 0x2c, 0x50, 0x5d, 0x88, 0xd7, 0x7f, 0x13, 0xdc, 0xb3, 0x0f, 0xfb, 0x99, 0x4b, 0x75, 0xfb, 0x40, 0xa0, 0x8b, 0x13, 0xbc, 0x74, 0x03, 0xe4, 0x36, 0x18, 0x28, 0x50, 0x26, 0xfa, 0x94, 0x3d, 0xa6, 0x41, 0x6c, 0xff, 0xd1, 0x14, 0x35, 0x81, 0xe8, 0x9c, 0x6d, 0x15, 0xea, 0xc2, 0xef, 0x61, 0x80, 0x56, 0x97, 0xd9, 0xec, 0x66, 0x3d, 0xf8, 0x6f, 0x74, 0xb0, 0x18, 0x50, 0x9d, 0x12, 0x4a, 0x96, 0xdc, 0x86, 0xf7, 0x2c, 0xa1, 0x8a, 0x43, 0x03, 0x3b, 0xe8, 0x4e, 0xd9, 0x43, 0x2e, 0x46, 0xa5, 0xa9, 0xce, 0x92, 0x38, 0x12, 0xab, 0xe1, 0x47, 0x18, 0x8e, 0x26, 0x44, 0x17, 0x7a, 0xe9, 0xd0, 0x58, 0xd7, 0x6a, 0xc4, 0xc5, 0x00, 0x04, 0x24, 0x47, 0xb5, 0xaa, 0x61, 0x2b, 0x9d, 0x41, 0xbd, 0x97, 0x63, 0x03, 0x3c, 0x55, 0x85, 0x15, 0x2d, 0x3f, 0xb8, 0x68, 0x3f, 0xb9, 0x80, 0x57, 0x59, 0xcf, 0x50, 0xb1, 0x53, 0xda, 0x5e, 0xfb, 0xff, 0xde, 0x85, 0x1e, 0xaf, 0x1c, 0x95, 0x87, 0xe1, 0xbd, 0xe2, 0x10, 0x42, 0xb4, 0x44, 0x42, 0xf3, 0x5a, 0xbf, 0x16, 0xd9, 0xbf, 0x45, 0x36, 0x8e, 0x00, 0xd7, 0xaf, 0x72, 0xb3, 0x85, 0xf7, 0x98, 0xbf, 0x3d, 0xb0, 0x20, 0xc3, 0x92, 0xb6, 0x2e, 0xda, 0x71, 0x0c, 0x6e, 0xdd, 0x05, 0x74, 0x30, 0xbe, 0xd7, 0x35, 0x66, 0x07, 0xcc, 0x43, 0x75, 0xc8, 0xbe, 0xce, 0x66, 0x1e, 0x36, 0xcd, 0x1f, 0xe8, 0x63, 0x7e, 0x0b, 0x9c, 0x86, 0x85, 0xdc, 0xfd, 0xd4, 0x71, 0xb1, 0x0f, 0xe8, 0x69, 0xd8, 0x91, 0xa9, 0xc4, 0x26, 0xde, 0x57, 0xd7, 0xcd, 0x35, 0xd8, 0x40, 0xb8, 0x79, 0xfa, 0x33, 0xb0, 0x4c, 0xb2, 0xe2, 0x76, 0x21, 0x75, 0x72, 0x08, 0xf4, 0x45, 0x3d, 0x0b, 0xaa, 0x98, 0x0c, 0x5a, 0x72, 0x15, 0x17, 0x49, 0xf0, 0xcc, 0x33, 0x0d, 0x55, 0x04, 0x58, 0x17, 0x1a, 0x5c, 0x52, 0xb6, 0x5d, 0x22, 0xaa, 0x73, 0x24, 0xe5, 0x3b, 0x3e, 0xa4, 0x6a, 0xcc, 0xc9, 0x23, 0x6d, 0xc6, 0x9b, 0xc6, 0x5c, 0xe8, 0x6e, 0x7c, 0x0a, 0xa1, 0xa0, 0xb8, 0x05, 0x17, 0xb1, 0x18, 0xb8, 0x27, 0x38, 0x7e, 0xff, 0x89, 0x73, 0x6e, 0x79, 0x7d, 0xf9, 0x1e, 0x35, 0xb3, 0x2f, 0x9b, 0x85, 0xda, 0xd0, 0xbc, 0xb2, 0xd2, 0x2c, 0x56, 0x99, 0x12, 0xba, 0x62, 0xbc, 0x62, 0xc9, 0xaf, 0x3c, 0x62, 0x53, 0xf3, 0xb6, 0x64, 0xa1, 0xd8, 0x43, 0xda, 0x97, 0xe7, 0x68, 0xb0, 0x2f, 0xba, 0x8a, 0x0f, 0x09, 0x13, 0xbf, 0x6a, 0xe2, 0x92, 0x04, 0xf5, 0xb3, 0xd3, 0x3b, 0xfa, 0x28, 0xb8, 0x76, 0x55, 0x7a, 0xe8, 0x0a, 0xa5, 0x41, 0x62, 0xfe, 0xf3, 0xd9, 0x50, 0x68, 0xc7, 0xb2, 0x6d, 0xde, 0xc7, 0x77, 0x1e, 0x7e, 0x50, 0x79, 0xc0, 0xf2, 0xd2, 0x83, 0x8b, 0x0d, 0x9e, 0xce, 0xaf, 0x9b, 0x33, 0x20, 0xd9, 0x8b, 0xf5, 0xf1, 0x3c, 0x92, 0xb7, 0x5d, 0x93, 0x38, 0xda, 0xd4, 0x84, 0xe6, 0xbe, 0xcd, 0x65, 0x14, 0x94, 0x60, 0xae, 0x26, 0x6b, 0x1d, 0x15, 0x99, 0xf3, 0x56, 0xac, 0x20, 0x5e, 0x0a, 0x2e, 0x90, 0x5e, 0x69, 0x6a, 0xb2, 0xf0, 0xe2, 0xf2, 0x96, 0xfe, 0x61, 0xcd, 0xe8, 0x44, 0x52, 0x0a, 0x5d, 0x2a, 0x3d, 0x4e, 0x45, 0xc5, 0xef, 0x95, 0x55, 0x59, 0xe1, 0x7f, 0x9e, 0x43, 0x05, 0x7c, 0x09, 0xd5, 0xd8, 0x32, 0x9a, 0x41, 0x40, 0xa5, 0x22, 0x3a, 0xf9, 0x28, 0x85, 0x5c, 0x94, 0x89, 0x63, 0xbf, 0x81, 0x06, 0xa9, 0x6f, 0x63, 0x66, 0x2d, 0x9d, 0x66, 0x87, 0xfb, 0x6f, 0xdc, 0x0d, 0x75, 0x76, 0x61, 0x16, 0xd1, 0xda, 0xfa, 0x65, 0xe1, 0x3d, 0x32, 0xea, 0x01, 0x11, 0x71, 0x38, 0x20, 0x5a, 0x27, 0x3b, 0x6c, 0x9d, 0xb2, 0xda, 0xb0, 0x7b, 0xef, 0x26, 0x6a, 0x96, 0x86, 0x62, 0x80, 0x6f, 0x59, 0xcb, 0xc2, 0x79, 0x49, 0x24, 0x95, 0x8f, 0xd0, 0x4a, 0x65, 0x94, 0x0f, 0xbf, 0x9f, 0x9b, 0xc7, 0x1f, 0x7b, 0x46, 0x56, 0x29, 0x21, 0xa9, 0xdf, 0x01, 0xba, 0x89, 0x3d, 0x24, 0xef, 0x6f, 0x4b, 0x24, 0x6f, 0x4c, 0x74, 0xe7, 0x40, 0x0c, 0xde, 0x60, 0xbf, 0xe2, 0x86, 0x78, 0x26, 0xe6, 0xd6, 0xd3, 0x27, 0x10, 0x57, 0xd9, 0xb8, 0x09, 0x85, 0x3f, 0x28, 0xdf, 0x36, 0xba, 0x4d, 0x4f, 0xc3, 0xa3, 0x65, 0x81, 0x6d, 0xdf, 0x94, 0xc9, 0x90, 0xce, 0x65, 0xc2, 0x7e, 0x42, 0xc9, 0x4c, 0x11, 0x53, 0x45, 0xa7, 0x95, 0x97, 0x7a, 0x2d, 0xc5, 0x79, 0xee, 0x61, 0x0e, 0x5c, 0xe9, 0x9c, 0xfc, 0xb4, 0xba, 0x19, 0x7f, 0x64, 0x60, 0xac, 0x94, 0x6e, 0xc7, 0xc1, 0x5c, 0x3f, 0x9e, 0xac, 0xfb, 0x78, 0x52, 0xc8, 0x8a, 0x91, 0x02, 0x5c, 0x3c, 0xf7, 0x45, 0xe0, 0x14, 0x94, 0x2f, 0x8a, 0x02, 0x43, 0x83, 0x03, 0x67, 0x82, 0x5b, 0xc6, 0xc7, 0xe0, 0x0a, 0xe2, 0x06, 0x90, 0x1f, 0x80, 0xdc, 0x12, 0x52, 0xc7, 0x1d, 0x6a, 0x2a, 0xcd, 0x71, 0x85, 0xb1, 0x51, 0x9a, 0xa1, 0x2e, 0xc6, 0x07, 0x88, 0xa3, 0x3a, 0xd5, 0xdd, 0x8f, 0x55, 0xbd, 0xe4, 0x63, 0xd1, 0x95, 0x98, 0x4b, 0xe6, 0xea, 0x8f, 0x70, 0x0e, 0x67, 0x91, 0x74, 0xd6, 0x79, 0x9c, 0x17, 0xfd, 0xef, 0xf2, 0x8b, 0xa6, 0xf6, 0x26, 0xdf, 0x0e, 0x5c, 0xc2, 0x5d, 0x1d, 0x9c, 0x4d, 0xe5, 0xb2, 0xf7, 0xb4, 0xb5, 0x63, 0x15, 0x4b, 0x16, 0x3f, 0x21, 0x77, 0xe1, 0x8b, 0x1a, 0x92, 0x0d, 0x02, 0x39, 0x9b, 0xdf, 0x74, 0x79, 0x73, 0x08, 0x78, 0x69, 0x6d, 0xcb, 0x8d, 0xc2, 0x57, 0x85, 0xed, 0x2a, 0x54, 0xeb, 0x75, 0x14, 0xfe, 0x16, 0xc8, 0x4a, 0x72, 0xa2, 0x58, 0x01, 0xd9, 0x2c, 0xbb, 0x9e, 0x42, 0x8f, 0xf6, 0x1d, 0x6c, 0x50, 0x7c, 0x78, 0x69, 0x15, 0x57, 0x05, 0x6a, 0x55, 0x04, 0x66, 0x31, 0xf2, 0x2e, 0x96, 0x28, 0x59, 0x86, 0xbd, 0xcf, 0x83, 0x69, 0xc8, 0x76, 0xe7, 0xf3, 0x61, 0xac, 0x1a, 0x02, 0x7a, 0xf3, 0x2e, 0x8a, 0x65, 0x99, 0x6a, 0x06, 0xc0, 0xca, 0x3d, 0x28, 0x83, 0x66, 0xde, 0x2b, 0xf4, 0xfa, 0x78, 0xa0, 0x3b, 0xa8, 0x6c, 0x75, 0x22, 0x51, 0xd4, 0x0e, 0xcb, 0x3e, 0x88, 0x65, 0x02, 0x9e, 0xde, 0xb1, 0x2a, 0x46, 0x00, 0xc0, 0x50, 0x57, 0x67, 0xdf, 0x8d, 0xa5, 0x78, 0x68, 0xbb, 0x6f, 0x8d, 0x41, 0xb6, 0x37, 0x6d, 0x4e, 0x1a, 0x78, 0x71, 0x3b, 0x72, 0xe9, 0x04, 0x84, 0x8b, 0x84, 0xc9, 0x79, 0xce, 0x83, 0xaa, 0x2b, 0xeb, 0x2c, 0x61, 0xa2, 0x8a, 0xc8, 0x91, 0xe4, 0x77, 0x9b, 0x89, 0x4a, 0x46, 0x34, 0x39, 0x74, 0xdb, 0xe4, 0x29, 0x8f, 0x94, 0xf1, 0x2f, 0xf6, 0x58, 0x0d, 0x3f, 0x4f, 0x4e, 0x99, 0x59, 0xda, 0x14, 0x4c, 0x8f, 0xd6, 0x80, 0x7b, 0x6f, 0xb4, 0x71, 0x52, 0xaf, 0x2a, 0x9e, 0xe5, 0x61, 0x75, 0xec, 0x45, 0x21, 0x45, 0x27, 0x72, 0x0b, 0xa3, 0xe2, 0xf0, 0x02, 0xd7, 0xd6, 0xf3, 0xc9, 0xe1, 0x6b, 0xb1, 0xbd, 0x33, 0xda, 0x38, 0xa9, 0x69, 0x4e, 0x27, 0x9d, 0x1c, 0xf4, 0x77, 0x47, 0xc5, 0xa2, 0x31, 0x3d, 0x46, 0xbe, 0x21, 0xd3, 0xdb, 0x41, 0xbe, 0x09, 0x94, 0x2a, 0x6e, 0xfe, 0x7a, 0x21, 0xaa, 0x00, 0x0b, 0x5a, 0xa6, 0x3c, 0xd6, 0x5a, 0xb0, 0xe4, 0x3e, 0x74, 0x5d, 0x82, 0x15, 0x0a, 0x83, 0x58, 0x08, 0x03, 0xb4, 0x32, 0x44, 0x4c, 0xb3, 0x2b, 0xd8, 0x28, 0x3a, 0x6c, 0xca, 0x4d, 0xa9, 0xec, 0x8b, 0x87, 0x0b, 0x1b, 0xd4, 0x17, 0x24, 0x4e, 0xf5, 0x05, 0xd8, 0x37, 0xa7, 0x60, 0xee, 0x8a, 0x17, 0xa8, 0x7b, 0x1e, 0xd2, 0x79, 0xe1, 0x91, 0x39, 0xab, 0x96, 0x5c, 0x63, 0xcc, 0x1c, 0xc9, 0x54, 0xdd, 0xdb, 0xbd, 0x36, 0xec, 0x95, 0x87, 0x4b, 0xb8, 0x43, 0xfe, 0x0f, 0x16, 0xcd, 0x36, 0x55, 0x7c, 0x64, 0xd8, 0x69, 0x88, 0x31, 0x79, 0xc0, 0x53, 0xe5, 0x93, 0x5c, 0x94, 0x66, 0x87, 0xb2, 0x63, 0x39, 0x66, 0x7e, 0x79, 0x3a, 0x0e, 0xbe, 0x66, 0xdb, 0xac, 0x0a, 0xbe, 0xdb, 0x28, 0x69, 0xd9, 0x8e, 0x5c, 0x39, 0xea, 0x6f, 0xec, 0x83, 0x72, 0xee, 0xd7, 0x66, 0x82, 0xce, 0xa4, 0x4e, 0x25, 0x26, 0xbc, 0x8c, 0x4c, 0x19, 0x69, 0x0c, 0x35, 0x39, 0x42, 0x6d, 0xde, 0x7b, 0x23, 0x63, 0x82, 0x4f, 0xfd, 0x1a, 0x02, 0xbf, 0x38, 0x76, 0xc0, 0xb1, 0x4b, 0x85, 0x3f, 0xde, 0x99, 0x7b, 0x8d, 0x13, 0x76, 0x45, 0x77, 0x69, 0x2b, 0x6a, 0xf5, 0x3b, 0x5c, 0x55, 0xbb, 0x25, 0x9d, 0x02, 0xb1, 0xd8, 0xa7, 0xae, 0x89, 0xc6, 0x4d, 0x56, 0x82, 0xb4, 0x86, 0x01, 0x25, 0xc4, 0x25, 0x1e, 0xd4, 0xed, 0x99, 0xc4, 0x46, 0xba, 0xea, 0xb9, 0x6c, 0xa2, 0x49, 0xe4, 0x59, 0xf6, 0xfd, 0x4c, 0x24, 0xcb, 0xc5, 0x38, 0xc9, 0x11, 0xa1, 0x81, 0x1d, 0xae, 0xab, 0x28, 0x5d, 0x61, 0xda, 0xb9, 0x16, 0x5a, 0x9b, 0x9f, 0xda, 0x94, 0xa0, 0xb3, 0x5e, 0x65, 0x6a, 0xd6, 0x64, 0x68, 0x98, 0xb4, 0x4c, 0x82, 0xf0, 0x98, 0xeb, 0xf0, 0x05, 0xb8, 0xbf, 0x3f, 0x61, 0xb2, 0xe3, 0x99, 0x4a, 0x36, 0x52, 0x4b, 0x08, 0x7c, 0x47, 0x55, 0x1e, 0xfa, 0x9d, 0x5f, 0xbe, 0x77, 0xf9, 0x51, 0x81, 0x02, 0x0a, 0x9c, 0x4c, 0xd1, 0xdf, 0x3a, 0xcc, 0x13, 0x6c, 0x1b, 0xd1, 0xbb, 0xd9, 0x30, 0x09, 0x66, 0xb0, 0x2b, 0xdc, 0xe4, 0xcd, 0x0e, 0xb8, 0xf5, 0xf9, 0x2c, 0x0c, 0x7d, 0x26, 0xc0, 0xe4, 0xc1, 0x6f, 0x4f, 0x32, 0xe6, 0x60, 0xbf, 0x5e, 0xae, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xfc, 0x48, 0xcd, 0xae, 0x7c, 0x9e, 0x15, 0x6f, 0x47, 0x49, 0x2b, 0x4d, 0x91, 0xaf, 0x65, 0x47, 0x4d, 0x69, 0x82, 0xc6, 0x41, 0xa3, 0xe8, 0x85, 0xb0, 0x66, 0x08, 0x86, 0xb8, 0x99, 0x25, 0x99, 0xa5, 0xb1, 0xdf, 0x6b, 0x6d, 0x6f, 0xd0, 0x08, 0xfe, 0x3d, 0xee, 0x78, 0xfc, 0xa8, 0xb5, 0x9a, 0x9b, 0xb8, 0x8e, 0x8e, 0x20, 0x89, 0x9a, 0x5c, 0x4e, 0x4f, 0x9e, 0x4f, 0x22, 0xc9, 0x77, 0xe9, 0xa7, 0x9c, 0x68, 0xaf, 0xe2, 0xcc, 0xf6, 0xa0, 0x3b, 0x71, 0x83, 0xdd, 0x64, 0xc4, 0xf2, 0x9a, 0x17, 0x98, 0x44, 0xc6, 0xa8, 0x9a, 0xe0, 0xcd, 0x0c, 0x64, 0xd8, 0x34, 0x90, 0x43, 0x16, 0x5a, 0x65, 0x25, 0x4d, 0x14, 0x1b, 0x53, 0x03, 0x24, 0x89, 0xf8, 0x00, 0x3b, 0xfe, 0xe8, 0x91, 0xf9, 0x4e, 0x4d, 0x8a, 0xb6, 0x4d, 0xb8, 0x81, 0xa9, 0x13, 0x53, 0x9f, 0x6a, 0xd3, 0xeb, 0xa2, 0x5c, 0x17, 0xcc, 0x7a, 0x53, 0xd5, 0xad, 0x44, 0x3a, 0xa5, 0xd7, 0x2e, 0x45, 0xe5, 0xff, 0x55, 0x79, 0xc8, 0x99, 0x2e, 0x4c, 0x6f, 0x70, 0xc8, 0xf1, 0x8b, 0x02, 0xe5, 0x19, 0x38, 0xcc, 0xb7, 0xe4, 0x12, 0xac, 0x53, 0x07, 0x93, 0xd0, 0x69, 0xd2, 0xb1, 0x5c, 0x79, 0x8f, 0xbc, 0xcb, 0x19, 0x2f, 0xe0, 0x11, 0xea, 0xb2, 0x6f, 0x0a, 0x0e, 0x53, 0x2d, 0xc1, 0x05, 0x09, 0x67, 0xd7, 0x58, 0xed, 0x1c, 0xf2, 0xc4, 0x20, 0x6d, 0x12, 0x75, 0x71, 0xc6, 0xeb, 0xe7, 0x51, 0x81, 0x08, 0x4a, 0x95, 0x24, 0x55, 0xd8, 0x7a, 0x26, 0x79, 0xe6, 0x76, 0x26, 0x63, 0x1c, 0x10, 0xeb, 0xab, 0xba, 0x2a, 0x92, 0x35, 0xc8, 0x0f, 0x2c, 0x2b, 0x6f, 0x76, 0x45, 0xf1, 0x30, 0x07, 0x11, 0xc1, 0x8c, 0xb2, 0xe4, 0x44, 0x81, 0x20, 0xaa, 0xab, 0xc4, 0xa6, 0x31, 0xe7, 0x6f, 0xd8, 0x1f, 0x92, 0x2b, 0x57, 0xe3, 0xbe, 0x66, 0xe0, 0xe1, 0xa2, 0x76, 0x13, 0xb0, 0x6d, 0xfa, 0x36, 0x9f, 0x6d, 0x35, 0x14, 0xd3, 0xf0, 0xc3, 0x94, 0x9e, 0x88, 0x52, 0x1d, 0x41, 0xff, 0xe1, 0xc3, 0xa7, 0xd7, 0xa8, 0x6e, 0x3c, 0xf5, 0xba, 0xc8, 0xca, 0x4c, 0x06, 0x0c, 0x26, 0xbc, 0x0e, 0xda, 0xc0, 0x3c, 0x49, 0x65, 0x09, 0x64, 0x0a, 0x1e, 0xaf, 0x35, 0x32, 0x03, 0x04, 0x7d, 0x85, 0xc3, 0xd5, 0x87, 0x22, 0x3a, 0x1f, 0xe0, 0xd2, 0x18, 0xfc, 0x5f, 0xc5, 0xa9, 0x1c, 0x6f, 0x6f, 0x54, 0x6c, 0x6b, 0xd5, 0x3f, 0xa7, 0x7a, 0x09, 0x22, 0xad, 0x88, 0x4a, 0xf1, 0x16, 0xae, 0x17, 0x38, 0x6d, 0x9a, 0x89, 0x4f, 0x6b, 0xb7, 0x23, 0x80, 0x4e, 0x1a, 0x53, 0x80, 0x25, 0xd9, 0xc8, 0x1b, 0xb5, 0xf3, 0x8a, 0xb7, 0x5f, 0x1e, 0x5f, 0xa7, 0x86, 0xf7, 0x1f, 0x43, 0x17, 0xfd, 0xb5, 0x49, 0x27, 0x91, 0x6f, 0xa9, 0x03, 0x2d, 0x94, 0x35, 0x9d, 0x64, 0x53, 0x2a, 0x44, 0xce, 0x4d, 0x47, 0x8e, 0x7a, 0xf9, 0x8e, 0x22, 0x19, 0xb4, 0xe8, 0x59, 0x54, 0x1b, 0xa5, 0x75, 0xda, 0xdc, 0xc0, 0x16, 0xf4, 0x45, 0x75, 0x83, 0xe7, 0x31, 0xc0, 0x3f, 0x1b, 0x50, 0x0f, 0xae, 0x33, 0x46, 0x29, 0xf2, 0x1d, 0xb2, 0xcf, 0xe8, 0xb0, 0x2d, 0x7e, 0x73, 0x3d, 0xfd, 0x7d, 0xdc, 0x85, 0x7a, 0x8f, 0x8d, 0xbc, 0x14, 0x60, 0xaf, 0xcf, 0x44, 0x48, 0x6f, 0xd3, 0x05, 0x5d, 0x37, 0x77, 0x81, 0xd5, 0x63, 0xb5, 0x31, 0x72, 0xc0, 0xd4, 0x3e, 0x79, 0x56, 0x9c, 0x2d, 0xb4, 0xe9, 0xed, 0xa6, 0x00, 0x87, 0x47, 0x26, 0xf9, 0x1c, 0x0b, 0xe1, 0xce, 0x0b, 0xaa, 0x20, 0x71, 0x6c, 0x80, 0x88, 0x65, 0x17, 0x9b, 0x06, 0x66, 0x25, 0xcc, 0x57, 0x55, 0x3d, 0x7c, 0x4a, 0x8a, 0xde, 0x6d, 0xe1, 0x53, 0x46, 0x8d, 0xd7, 0xaa, 0xb5, 0x7d, 0xd8, 0x4a, 0x85, 0xe0, 0x2a, 0x1d, 0x1c, 0xab, 0x72, 0x10, 0xd8, 0x83, 0x77, 0x36, 0xe9, 0xab, 0x7a, 0xe8, 0xc3, 0xd3, 0xf7, 0x9f, 0xb1, 0xc6, 0x36, 0x3b, 0x8c, 0x78, 0x80, 0x04, 0x4f, 0x29, 0x33, 0x77, 0x17, 0xa3, 0x68, 0xf4, 0x00, 0x37, 0xf1, 0x11, 0x20, 0x14, 0x61, 0x90, 0x70, 0xe7, 0xaf, 0xd4, 0x1b, 0xc4, 0x3d, 0x84, 0x47, 0x35, 0xfa, 0x11, 0xc1, 0x8a, 0xe6, 0x8c, 0x9b, 0x8b, 0x07, 0xbd, 0xd4, 0x8b, 0x99, 0x94, 0xeb, 0x85, 0x28, 0x90, 0x36, 0x8d, 0x4a, 0x86, 0xad, 0xbd, 0xf1, 0x33, 0x95, 0xd4, 0x99, 0xfa, 0xa2, 0x3f, 0x03, 0x56, 0xb5, 0x72, 0x30, 0xcb, 0x4d, 0x39, 0x91, 0x64, 0x47, 0xa9, 0xa8, 0xa3, 0x0a, 0x3f, 0x91, 0xac, 0xd7, 0xca, 0xaf, 0x7b, 0x46, 0x9d, 0x9d, 0xc3, 0xa3, 0x28, 0x23, 0x9f, 0x01, 0xae, 0xf8, 0x07, 0xec, 0x79, 0xa0, 0x4f, 0x97, 0x25, 0x85, 0xa3, 0x39, 0xae, 0x0e, 0x37, 0xc1, 0x32, 0x98, 0xae, 0xb5, 0xa2, 0x5a, 0x11, 0xa6, 0xd3, 0x38, 0x90, 0xda, 0x92, 0xc2, 0x2b, 0x7c, 0xd0, 0xd2, 0xf3, 0xe4, 0x23, 0x11, 0x9b, 0x7b, 0x0f, 0x61, 0xfa, 0xe3, 0x4b, 0x4c, 0xbb, 0x0a, 0x4c, 0x93, 0x60, 0x15, 0x51, 0x0d, 0x76, 0x41, 0x37, 0x39, 0x02, 0x21, 0x80, 0x3b, 0x04, 0xc5, 0x1b, 0xf0, 0x97, 0x2e, 0x17, 0x5f, 0xf4, 0xa0, 0x19, 0x55, 0xf3, 0x2f, 0xe8, 0x53, 0x07, 0xae, 0xdf, 0x98, 0xe4, 0xc3, 0xd0, 0xe9, 0x32, 0x0e, 0x34, 0x00, 0x3b, 0x7d, 0xe8, 0x1b, 0xb6, 0x9d, 0x60, 0x67, 0xff, 0x57, 0xa4, 0x04, 0x32, 0x14, 0x95, 0xe5, 0xa5, 0x06, 0xb0, 0xd4, 0x94, 0xb2, 0xc1, 0xe4, 0x5b, 0x14, 0x44, 0x7d, 0xee, 0x01, 0x81, 0xe2, 0x2d, 0xfb, 0x01, 0x39, 0x41, 0xdf, 0x6b, 0xd8, 0x16, 0x80, 0x4c, 0x9c, 0xdf, 0x5c, 0x8a, 0x75, 0xf6, 0x99, 0xcb, 0xcc, 0xf3, 0x39, 0x78, 0x31, 0xfe, 0x8c, 0xe8, 0x74, 0x02, 0xa3, 0x44, 0x36, 0xf8, 0x20, 0xcf, 0x3a, 0x97, 0xcd, 0x18, 0xec, 0xda, 0xac, 0x4c, 0xbe, 0xe6, 0x03, 0xf3, 0xe2, 0x4b, 0x62, 0x93, 0x0e, 0xc5, 0xb9, 0x17, 0x33, 0xc9, 0xa1, 0xef, 0x2c, 0x7e, 0x02, 0x41, 0xec, 0xe8, 0x8e, 0x86, 0x71, 0xd3, 0xe7, 0xad, 0x42, 0x5e, 0x37, 0xb0, 0x05, 0xba, 0x8c, 0xdd, 0xb1, 0x35, 0x66, 0xe8, 0xf5, 0x41, 0x22, 0xd0, 0x1b, 0xd5, 0x38, 0x85, 0x5d, 0xc0, 0xa1, 0x79, 0x1e, 0x29, 0x9c, 0x1c, 0xc3, 0x2d, 0x4b, 0x42, 0xe7, 0xe6, 0xcc, 0x0b, 0x19, 0xc1, 0xa4, 0x4b, 0xb2, 0x74, 0x4c, 0xf7, 0x07, 0x52, 0x34, 0x9d, 0xf4, 0x69, 0xd7, 0xd1, 0x80, 0xe5, 0xfb, 0x41, 0xf9, 0x08, 0xef, 0x03, 0x26, 0xd8, 0xf4, 0xd5, 0xf0, 0x25, 0xcf, 0x90, 0xb4, 0x39, 0x39, 0x55, 0x6b, 0x2c, 0x1b, 0x16, 0xde, 0x81, 0xce, 0x4f, 0x39, 0x65, 0xad, 0xee, 0x69, 0x7c, 0xd0, 0xf9, 0x10, 0xcd, 0x94, 0xf5, 0x5c, 0xa9, 0x6c, 0xb4, 0x60, 0x1f, 0xbf, 0x64, 0x18, 0x43, 0x7e, 0xf2, 0x22, 0xcc, 0x9d, 0xde, 0x21, 0xbb, 0xcb, 0x2c, 0xdf, 0xb4, 0xda, 0xb6, 0xb8, 0xe1, 0x79, 0x02, 0xb2, 0x06, 0xcb, 0xec, 0xf0, 0x6d, 0x38, 0xf5, 0x99, 0xe6, 0x72, 0xce, 0x68, 0x79, 0x15, 0x90, 0x35, 0x6b, 0xdd, 0x51, 0x31, 0x21, 0xcd, 0x3b, 0x2d, 0x54, 0x0d, 0x49, 0x80, 0xa1, 0x22, 0x70, 0x50, 0x4c, 0x97, 0xd2, 0xef, 0x68, 0xaa, 0x65, 0xa9, 0x0f, 0x1c, 0x46, 0xcf, 0x55, 0x15, 0xbc, 0x60, 0x93, 0xd9, 0xbc, 0xd7, 0x53, 0xef, 0xdb, 0xbf, 0x9d, 0xc1, 0xc9, 0xac, 0xa3, 0x88, 0x23, 0x59, 0xff, 0x78, 0xb0, 0x6b, 0x6d, 0x7e, 0x31, 0xf3, 0xc2, 0xf0, 0x02, 0xc6, 0xa6, 0x5a, 0x1b, 0x97, 0xc3, 0x77, 0xa6, 0xb9, 0x0b, 0xdd, 0x3b, 0x70, 0x6b, 0x20, 0xbd, 0xd7, 0xdb, 0x2d, 0xd6, 0x28, 0xc8, 0x1c, 0x09, 0x8d, 0x43, 0x4f, 0xb5, 0x5b, 0x56, 0xb0, 0x57, 0x67, 0xf2, 0xb4, 0x01, 0xa4, 0x13, 0x9f, 0x24, 0xf0, 0x93, 0x7a, 0x9d, 0xbe, 0xdf, 0xfa, 0xcc, 0x60, 0x4d, 0xdf, 0x8e, 0xeb, 0x43, 0x48, 0x82, 0x2a, 0x38, 0xec, 0xdd, 0x4a, 0x0e, 0x2e, 0x34, 0x14, 0x13, 0xee, 0x52, 0x39, 0x04, 0x48, 0x82, 0x6d, 0x03, 0xa0, 0xac, 0xef, 0x3b, 0x3d, 0x37, 0x58, 0x4d, 0x9c, 0x2a, 0xb1, 0x88, 0x38, 0x1b, 0x1f, 0xfc, 0x97, 0x40, 0xa5, 0xfe, 0xdb, 0xc0, 0x51, 0x2a, 0x96, 0x77, 0xa3, 0x4d, 0xec, 0x61, 0xe4, 0x27, 0x21, 0x30, 0x45, 0x70, 0xd9, 0x67, 0xae, 0x62, 0xb2, 0xba, 0x98, 0xf1, 0x4d, 0x4b, 0x70, 0x88, 0x21, 0x03, 0x98, 0xc8, 0x4d, 0xf8, 0xe6, 0x00, 0x64, 0x34, 0x9b, 0x80, 0x87, 0xc9, 0x48, 0xa2, 0x5c, 0x18, 0x1e, 0xd9, 0x40, 0xfc, 0x27, 0x8f, 0xbf, 0x9f, 0x9a, 0xe6, 0x83, 0x8d, 0xcb, 0xde, 0x18, 0x66, 0x13, 0xa9, 0x7b, 0x86, 0x22, 0x90, 0x8f, 0x0a, 0xbd, 0x1d, 0x07, 0x08, 0xe6, 0x03, 0x26, 0x08, 0xa3, 0x4b, 0xcd, 0xf9, 0xf1, 0x8b, 0x67, 0xd0, 0xe6, 0x81, 0xa9, 0xbd, 0x71, 0x88, 0x66, 0xe4, 0xef, 0xe8, 0xd6, 0x3e, 0xb4, 0x33, 0x0e, 0x48, 0x8f, 0x1f, 0x12, 0x86, 0x92, 0xa1, 0xc8, 0x13, 0x42, 0xe0, 0xe3, 0x3c, 0xb7, 0x68, 0x9f, 0x56, 0xc9, 0xe2, 0xd1, 0x40, 0xa5, 0x40, 0x27, 0xa6, 0xce, 0x2b, 0x63, 0xa7, 0xd7, 0xeb, 0xdf, 0x16, 0xa2, 0xb6, 0xe0, 0xfa, 0x78, 0x77, 0xae, 0x9f, 0x46, 0xe7, 0x63, 0xe2, 0x19, 0xd0, 0xa9, 0x00, 0x2b, 0x5d, 0xb0, 0x5e, 0x8a, 0x1e, 0xd9, 0xaa, 0x57, 0x03, 0x92, 0x52, 0x30, 0xda, 0x8e, 0xba, 0x0c, 0x61, 0xbe, 0x1c, 0xbf, 0x99, 0xf2, 0x08, 0x24, 0x57, 0xd3, 0x81, 0x48, 0xc6, 0x7d, 0x36, 0x8b, 0xd1, 0x9c, 0xa8, 0x21, 0x91, 0xdb, 0xf0, 0x2c, 0x44, 0x61, 0x82, 0x25, 0x11, 0x08, 0xcc, 0x67, 0xe3, 0x71, 0x58, 0xf3, 0x09, 0xd5, 0x66, 0x99, 0x6d, 0x4e, 0x97, 0x20, 0x50, 0x90, 0x91, 0xbd, 0x79, 0x5b, 0x7e, 0x32, 0xab, 0x65, 0x1d, 0x2d, 0xdc, 0xda, 0x4c, 0x0c, 0x5c, 0xae, 0xbd, 0xa2, 0x61, 0xc9, 0xb4, 0x5f, 0x7e, 0x65, 0x8b, 0xc3, 0xc2, 0xdd, 0x60, 0xf0, 0x8d, 0xec, 0x83, 0x6f, 0x3e, 0x33, 0x5b, 0x76, 0x2d, 0x28, 0x19, 0xe1, 0xb9, 0x60, 0x6c, 0x1d, 0xcb, 0x3a, 0x68, 0x94, 0x5a, 0xca, 0xc8, 0xa4, 0x11, 0x03, 0x6d, 0xcb, 0x20, 0x68, 0x70, 0x26, 0x60, 0xdb, 0xc4, 0x6c, 0xe8, 0x57, 0xa7, 0xcb, 0xea, 0x86, 0xb6, 0xb4, 0x7b, 0x48, 0xe9, 0xfc, 0x06, 0x87, 0x1c, 0x38, 0xe9, 0xdb, 0x93, 0xd0, 0x69, 0xd8, 0xee, 0x0c, 0x2c, 0x80, 0x67, 0x3f, 0xcc, 0xbf, 0xd1, 0x49, 0x9f, 0x04, 0x30, 0x1a, 0x33, 0xd8, 0x31, 0x50, 0x0c, 0x26, 0x66, 0xd6, 0x02, 0x47, 0x56, 0xdb, 0x8f, 0x55, 0x9d, 0x53, 0xf2, 0x4b, 0x96, 0x46, 0xa1, 0x8b, 0xf0, 0x9f, 0xcf, 0xf4, 0x6a, 0x0f, 0x0b, 0x98, 0xd9, 0x9d, 0xa7, 0xbb, 0xe3, 0xd5, 0xc0, 0xbc, 0x0b, 0xc3, 0xcb, 0x5a, 0x87, 0x17, 0xf6, 0xe2, 0x86, 0xad, 0x00, 0x27, 0x4d, 0xe3, 0x63, 0x72, 0x7d, 0x7f, 0xe8, 0xec, 0xf6, 0x7e, 0xbe, 0x57, 0x60, 0x16, 0xd7, 0xa8, 0x03, 0x7d, 0x0d, 0xbf, 0xc3, 0x1e, 0x0d, 0xd6, 0x54, 0x79, 0x2b, 0xe5, 0xc1, 0x59, 0x51, 0xcd, 0x16, 0xf4, 0x97, 0xd2, 0x09, 0xe6, 0x90, 0xff, 0x43, 0x8b, 0x25, 0x35, 0xd1, 0xb3, 0x53, 0x34, 0x68, 0xcf, 0x9d, 0xde, 0x13, 0x38, 0xca, 0x3a, 0x2a, 0xd2, 0xd8, 0xd1, 0xf4, 0xb6, 0x7d, 0x1b, 0x38, 0x9b, 0x37, 0xcb, 0xd5, 0xb8, 0x00, 0x09, 0xc4, 0x0b, 0x6b, 0x46, 0x2e, 0x63, 0x85, 0x72, 0x37, 0xce, 0x25, 0x1f, 0xf3, 0xfa, 0x2b, 0xd1, 0xf7, 0x73, 0x3d, 0xa0, 0xec, 0x8e, 0x7d, 0xe8, 0x0f, 0x44, 0x07, 0x89, 0xf6, 0xc0, 0xca, 0xb6, 0xaf, 0x39, 0x94, 0x78, 0x3d, 0xfe, 0x92, 0x26, 0xf1, 0x88, 0x78, 0x7f, 0xf8, 0x37, 0x3f, 0x5a, 0x4c, 0x62, 0xfe, 0x5d, 0x4a, 0xa8, 0xd1, 0x5e, 0xfd, 0xc3, 0x92, 0x78, 0x53, 0x87, 0x31, 0xbd, 0x44, 0x87, 0x7e, 0xac, 0x59, 0x86, 0x93, 0x23, 0x48, 0xad, 0x57, 0x31, 0x1c, 0x60, 0x24, 0xef, 0x13, 0x07, 0xa0, 0x01, 0x0f, 0xb3, 0xc7, 0x81, 0x62, 0xfa, 0x26, 0xfb, 0x6e, 0x1b, 0xd6, 0x9e, 0x1f, 0xbe, 0x0e, 0x38, 0x1d, 0x11, 0xb3, 0xbc, 0x24, 0x76, 0x9d, 0x57, 0xd6, 0xb1, 0x27, 0x04, 0xbd, 0x54, 0x15, 0x57, 0xa1, 0xb3, 0x38, 0x11, 0x0f, 0x2f, 0x40, 0x42, 0xdc, 0x8d, 0x88, 0x9f, 0xbb, 0x6b, 0xf1, 0x02, 0x4c, 0x11, 0x29, 0xa7, 0xb9, 0xc3, 0x19, 0xc1, 0xeb, 0x3d, 0x8a, 0xa9, 0x7a, 0x02, 0x02, 0x4f, 0xe8, 0xa6, 0x39, 0xbb, 0xa7, 0x80, 0xa5, 0xfb, 0x1e, 0x05, 0x04, 0x8f, 0x56, 0xba, 0xb1, 0x85, 0xf0, 0xc0, 0xd9, 0xe7, 0xf2, 0xf7, 0x15, 0x85, 0x0f, 0x84, 0x0e, 0x31, 0x24, 0xae, 0x19, 0xc5, 0xaa, 0xfb, 0xf2, 0x80, 0x8d, 0x7e, 0x1e, 0x00, 0xd3, 0x89, 0xac, 0x0a, 0x9c, 0x29, 0xfe, 0xe3, 0xc2, 0x8b, 0xa4, 0xb9, 0x19, 0xc9, 0xf7, 0x37, 0x4e, 0x60, 0xb6, 0x93, 0x20, 0xf8, 0xcf, 0xf9, 0xe1, 0xbf, 0x25, 0x33, 0x67, 0xa9, 0xd4, 0xce, 0xc5, 0x74, 0xdd, 0xbf, 0x62, 0xfa, 0xfd, 0x5f, 0x25, 0xcc, 0x36, 0x30, 0x28, 0xf1, 0x4c, 0x67, 0x31, 0x2d, 0x1e, 0xc0, 0x93, 0x0d, 0x2e, 0xb1, 0xfe, 0xe1, 0xf7, 0x17, 0xe8, 0x55, 0x83, 0x24, 0x94, 0x44, 0xe1, 0xaf, 0xa5, 0xa4, 0x90, 0x42, 0x93, 0x16, 0x7c, 0xdf, 0x7b, 0xc7, 0x03, 0x5a, 0x61, 0x1c, 0x04, 0xdd, 0xf7, 0x7a, 0xf6, 0xc7, 0xe9, 0xa7, 0x9e, 0x94, 0xe8, 0x36, 0x6e, 0x4d, 0x75, 0xa7, 0x60, 0x68, 0x28, 0x5d, 0x27, 0xce, 0xc5, 0x79, 0x88, 0x13, 0xfc, 0x88, 0x6a, 0x16, 0x3e, 0x02, 0x49, 0xed, 0x8f, 0x32, 0x0e, 0x80, 0x7e, 0x19, 0x7d, 0xcf, 0xbe, 0x84, 0xcb, 0x4b, 0xfd, 0x8d, 0xba, 0x85, 0x75, 0x10, 0x87, 0x6a, 0xd5, 0xfd, 0xe1, 0x54, 0xd4, 0x8f, 0xaf, 0x0c, 0xf7, 0x37, 0x04, 0x19, 0xbe, 0xfa, 0x3e, 0xf8, 0xb4, 0x14, 0x73, 0x7c, 0x33, 0x99, 0xdf, 0xe7, 0x09, 0xb4, 0x3f, 0x2d, 0x1f, 0x6f, 0x5b, 0x40, 0xa0, 0x6b, 0x6d, 0x9b, 0x51, 0xac, 0xa9, 0x96, 0x65, 0x13, 0xbf, 0xf2, 0xb5, 0xe3, 0xab, 0xc5, 0xe2, 0xa8, 0x3a, 0x4c, 0x38, 0xf6, 0x30, 0xd4, 0xfe, 0xf9, 0x59, 0x66, 0x74, 0x8a, 0x99, 0xa3, 0xa2, 0x7c, 0x81, 0xae, 0xbc, 0xa3, 0xdc, 0x16, 0xe4, 0xd4, 0xa4, 0x3b, 0x62, 0x9f, 0x56, 0xb2, 0x21, 0xee, 0xb0, 0x86, 0xe7, 0xae, 0xa8, 0x4c, 0x09, 0x4a, 0xc4, 0x52, 0x92, 0x73, 0x2e, 0xa2, 0x5d, 0x8b, 0x38, 0x76, 0xcc, 0x43, 0xe1, 0x1a, 0xbf, 0x9e, 0x89, 0x82, 0xd6, 0x5c, 0x5f, 0x4c, 0x00, 0xb7, 0xd5, 0x56, 0x72, 0x63, 0x64, 0xca, 0xde, 0xaf, 0x58, 0xe9, 0xf9, 0x3f, 0x17, 0x3a, 0xa4, 0x49, 0x0a, 0x21, 0xea, 0x9f, 0x4a, 0xbf, 0xe9, 0x4e, 0x82, 0x43, 0x29, 0xbc, 0x70, 0xad, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0xc6, 0xd7, 0x7c, 0xc0, 0xcb, 0xc4, 0x09, 0x67, 0x85, 0xf1, 0x8e, 0x19, 0x9c, 0xef, 0x6b, 0xd4, 0xab, 0x9e, 0x39, 0xa2, 0xa3, 0x6d, 0x71, 0xea, 0x44, 0x1e, 0x39, 0xc7, 0x45, 0x57, 0xe2, 0x12, 0xe8, 0x75, 0x6f, 0x3b, 0xc0, 0x3e, 0x83, 0x3b, 0x76, 0x00, 0x4f, 0x11, 0x4e, 0xdd, 0x59, 0x7e, 0xb3, 0xaf, 0x36, 0x2f, 0x90, 0xfb, 0xb5, 0x14, 0x64, 0x62, 0xb8, 0x40, 0x6e, 0xfa, 0xb3, 0xee, 0x58, 0xdf, 0xb8, 0xfe, 0xcb, 0x89, 0x65, 0x04, 0x03, 0xca, 0x5c, 0xc5, 0xf8, 0x39, 0x08, 0xb6, 0x4a, 0xe1, 0xc4, 0x1a, 0x92, 0xf3, 0x4b, 0x47, 0xcf, 0x00, 0xcd, 0xfd, 0xce, 0xb4, 0x7a, 0x25, 0x31, 0x43, 0xc4, 0xf9, 0x9d, 0x9b, 0x62, 0x30, 0x25, 0xae, 0xcb, 0x56, 0x8a, 0xd0, 0xa9, 0x47, 0x3e, 0x29, 0x3b, 0x0f, 0x69, 0x80, 0xb9, 0x4b, 0x7f, 0x52, 0xa3, 0xa6, 0x62, 0xe8, 0xa8, 0x62, 0x2f, 0x64, 0x82, 0xad, 0xba, 0x18, 0x75, 0xcb, 0x09, 0x68, 0x96, 0x65, 0x48, 0xae, 0x2c, 0xfb, 0x88, 0xb9, 0x0c, 0x07, 0x9a, 0x4c, 0x3b, 0x85, 0xe8, 0x30, 0xce, 0xbb, 0xce, 0x24, 0x9d, 0x6d, 0xcb, 0xd9, 0xed, 0x05, 0x22, 0xb0, 0x65, 0x62, 0x45, 0x28, 0xb9, 0xcf, 0x2d, 0x06, 0xe3, 0xef, 0x93, 0x42, 0x68, 0xa5, 0xce, 0xe3, 0x57, 0x6a, 0x8b, 0x69, 0x7e, 0x0e, 0xeb, 0x12, 0x6a, 0x1f, 0xf5, 0xf4, 0x8a, 0x96, 0x5a, 0x4f, 0x82, 0xbf, 0x1c, 0x5c, 0xb0, 0xdb, 0xad, 0x21, 0x28, 0xd4, 0x05, 0x70, 0xf6, 0x14, 0x7d, 0x6b, 0xa0, 0xca, 0x22, 0xd2, 0xbb, 0x55, 0x4c, 0x52, 0x84, 0xc9, 0x8c, 0xe3, 0x59, 0xb3, 0x1b, 0xd9, 0x0e, 0x87, 0x2e, 0x6e, 0x49, 0x27, 0xc9, 0xe4, 0xbf, 0xb2, 0x2e, 0xa7, 0xde, 0x16, 0xc6, 0x62, 0x9b, 0x72, 0xbe, 0x11, 0x20, 0x38, 0xaa, 0x35, 0x54, 0xc1, 0xc6, 0x5f, 0xd2, 0x4d, 0x42, 0xce, 0xc4, 0xe6, 0xf1, 0x81, 0x11, 0x59, 0x8d, 0x0c, 0x43, 0x35, 0x7f, 0x3f, 0x74, 0xc2, 0xdd, 0x05, 0x12, 0x8b, 0x05, 0x40, 0xd8, 0x74, 0x9d, 0x5b, 0x45, 0x36, 0xff, 0x6e, 0xe9, 0xb7, 0xa2, 0x9e, 0x95, 0x95, 0x41, 0xef, 0x2c, 0x39, 0xc5, 0x78, 0xe8, 0xe5, 0x9d, 0x54, 0x68, 0x78, 0x7f, 0x81, 0xb1, 0x40, 0xbf, 0x7c, 0x11, 0xb0, 0x41, 0xbf, 0xaa, 0x04, 0x71, 0x34, 0x2a, 0x72, 0x30, 0xbb, 0x75, 0xb1, 0xf5, 0x0c, 0x07, 0x9b, 0xa7, 0xab, 0xd0, 0x38, 0x80, 0x9e, 0x64, 0xb1, 0x19, 0x70, 0x6f, 0xa9, 0x45, 0x66, 0x1b, 0x41, 0xd6, 0xd9, 0x73, 0xb3, 0xa6, 0xfb, 0x2e, 0x62, 0xf6, 0x18, 0x1d, 0x38, 0x63, 0x07, 0x68, 0x5e, 0xbf, 0x14, 0xa4, 0xec, 0x4e, 0x47, 0x49, 0xa7, 0x8c, 0xdf, 0x32, 0xfb, 0xec, 0x80, 0xca, 0xbd, 0xfc, 0xc3, 0x70, 0xac, 0x7c, 0x5e, 0x6a, 0xc9, 0x67, 0x4b, 0x7a, 0x07, 0xd5, 0xcd, 0xef, 0xba, 0x70, 0x73, 0x5b, 0x66, 0x75, 0xd9, 0x85, 0xfe, 0x72, 0x65, 0xcb, 0x74, 0xe8, 0x14, 0xde, 0xf1, 0xb9, 0xe7, 0xac, 0x6e, 0x2f, 0xc9, 0x8f, 0x94, 0x06, 0x05, 0x9d, 0x48, 0xe7, 0xc6, 0x96, 0xeb, 0x8c, 0x44, 0x84, 0x91, 0x14, 0xa8, 0x76, 0x4c, 0x4f, 0x78, 0xba, 0x9a, 0x18, 0x23, 0x56, 0x86, 0xb9, 0x38, 0xd9, 0x62, 0xeb, 0x36, 0x5b, 0xbf, 0x1b, 0x9a, 0xb6, 0x6d, 0x8a, 0x0a, 0x69, 0x33, 0x87, 0x1e, 0xbd, 0x07, 0x85, 0xcc, 0x86, 0xa0, 0x17, 0x2b, 0x00, 0x51, 0x19, 0x93, 0xbd, 0x64, 0x25, 0x47, 0xad, 0x5d, 0xa1, 0xbd, 0x84, 0xe6, 0xf5, 0xaa, 0x1d, 0x61, 0x19, 0x49, 0x9a, 0x59, 0xdc, 0x40, 0xd7, 0xf7, 0x4e, 0xda, 0x0a, 0x93, 0x39, 0x0f, 0x39, 0xdd, 0x54, 0x95, 0x14, 0x30, 0xcb, 0x25, 0xdd, 0x63, 0xf5, 0x00, 0xf2, 0x75, 0x33, 0x5c, 0xea, 0x7a, 0xac, 0x20, 0xb2, 0xfe, 0xab, 0x94, 0x76, 0x7d, 0x0b, 0x15, 0x67, 0x3a, 0x4c, 0x1e, 0xa8, 0x3d, 0x75, 0x0d, 0x31, 0xcb, 0xdf, 0xe2, 0xa7, 0xa3, 0xff, 0xb1, 0x95, 0x14, 0x42, 0x3b, 0x53, 0xba, 0x1b, 0xb4, 0xcd, 0x97, 0x02, 0xc3, 0x63, 0x91, 0x7d, 0x91, 0xa0, 0xbf, 0xca, 0x29, 0xd5, 0xfb, 0xc0, 0x54, 0x49, 0x1c, 0xff, 0x15, 0x65, 0xff, 0xda, 0x36, 0x66, 0xe6, 0x66, 0xbc, 0x1e, 0x29, 0x46, 0xca, 0xf2, 0xaf, 0x93, 0xb8, 0x82, 0xb4, 0xdc, 0x43, 0x05, 0xf1, 0xd9, 0x71, 0x3f, 0x18, 0x75, 0xb6, 0x5f, 0x12, 0x7f, 0x2e, 0x35, 0xf7, 0xf8, 0x50, 0xf3, 0xa8, 0xd7, 0xc4, 0xad, 0xa6, 0x11, 0x6d, 0x83, 0xe5, 0xe1, 0x14, 0x3a, 0x33, 0x32, 0xb0, 0x17, 0x36, 0xd9, 0xcd, 0x98, 0x05, 0x81, 0x13, 0xcd, 0x87, 0x37, 0x87, 0x48, 0x3e, 0x12, 0x61, 0xea, 0x09, 0x7e, 0x93, 0x4d, 0x10, 0x98, 0x6d, 0xa6, 0x6f, 0x87, 0x4f, 0x7c, 0x05, 0x41, 0x7e, 0x3d, 0x6b, 0xc8, 0x5b, 0x63, 0xdb, 0x34, 0x2b, 0xc4, 0xc9, 0x2a, 0x25, 0xbe, 0x03, 0x67, 0x0c, 0xd4, 0xc8, 0x95, 0x3e, 0xb5, 0xf5, 0xf4, 0xc2, 0xa7, 0xce, 0x23, 0xd9, 0x0c, 0x0f, 0x73, 0xc3, 0x19, 0xeb, 0xae, 0x18, 0x47, 0x4c, 0xdc, 0xba, 0x7e, 0xdd, 0x5a, 0xec, 0x8f, 0x41, 0xef, 0x8d, 0xf9, 0x7f, 0x23, 0x88, 0xf2, 0xda, 0x3e, 0x8e, 0x78, 0xef, 0xeb, 0x46, 0xae, 0xea, 0xa6, 0x86, 0x49, 0x6e, 0x01, 0x37, 0xf8, 0x83, 0x9c, 0x21, 0x73, 0x68, 0xff, 0x29, 0x3e, 0xf4, 0x65, 0xab, 0x22, 0x15, 0xdf, 0x5f, 0xfb, 0x53, 0x98, 0xec, 0xee, 0xe5, 0x6e, 0xa5, 0xae, 0x1f, 0xac, 0x58, 0x3e, 0x1a, 0x53, 0xc3, 0x3a, 0xa8, 0x72, 0xf2, 0x53, 0xf9, 0x37, 0x7d, 0xba, 0xec, 0xb3, 0x91, 0xfd, 0x05, 0xd2, 0x5c, 0xb9, 0x24, 0xb1, 0xf6, 0xe5, 0xb1, 0x1f, 0xc8, 0x27, 0x2d, 0xa7, 0x49, 0x77, 0xfd, 0xe2, 0x39, 0x37, 0x48, 0x5b, 0x70, 0x28, 0x85, 0x83, 0x12, 0xdf, 0xbc, 0xb0, 0x65, 0x05, 0x02, 0xa1, 0x73, 0x71, 0x0e, 0xd3, 0x8f, 0x3a, 0x27, 0xb8, 0xc4, 0x5b, 0xe4, 0xb1, 0x12, 0x18, 0xa8, 0x6c, 0xc8, 0x17, 0xe2, 0x13, 0xf1, 0x51, 0x49, 0xb4, 0x0f, 0xb7, 0xf5, 0x88, 0x94, 0x20, 0xc2, 0x8e, 0x95, 0xff, 0xd6, 0xfd, 0xda, 0x4f, 0xda, 0x19, 0xa9, 0x59, 0x49, 0x71, 0x01, 0xf5, 0x5c, 0xdf, 0x2c, 0x93, 0xb5, 0x7f, 0xd7, 0x42, 0x57, 0x6e, 0x76, 0xd8, 0x03, 0x5e, 0xd6, 0xfa, 0x0e, 0x79, 0xa2, 0x91, 0xbd, 0xb0, 0xda, 0x6b, 0xa7, 0x38, 0xfc, 0x95, 0x39, 0x8b, 0xf0, 0x7f, 0xfe, 0xb9, 0x5a, 0xbb, 0x5d, 0xa2, 0x8e, 0x3a, 0xd1, 0x6e, 0x60, 0xb6, 0x55, 0x24, 0xfb, 0x05, 0xce, 0x75, 0x19, 0xb3, 0x53, 0x79, 0x11, 0xb9, 0xbb, 0xff, 0x0c, 0xcf, 0x3c, 0x42, 0xaf, 0xec, 0xf4, 0x51, 0x20, 0x0b, 0xc0, 0x10, 0xc8, 0x69, 0x52, 0x03, 0xc4, 0xcb, 0x67, 0x08, 0xb5, 0x06, 0x4c, 0x78, 0xf5, 0x39, 0xd9, 0x44, 0x03, 0x17, 0xbf, 0xa2, 0xb6, 0x45, 0x0b, 0xfb, 0xca, 0xb5, 0xe1, 0xc0, 0x33, 0x53, 0xe5, 0x4f, 0x0b, 0x40, 0xc5, 0xda, 0x6a, 0x40, 0x35, 0x10, 0x24, 0xac, 0x43, 0xd5, 0x8b, 0x17, 0xac, 0x84, 0x64, 0x37, 0xc6, 0x48, 0x1f, 0x9f, 0x68, 0x52, 0xa5, 0x5a, 0x08, 0xac, 0x92, 0x19, 0xa9, 0xe0, 0xa7, 0xbe, 0x98, 0x8c, 0x9e, 0xd1, 0xfe, 0x14, 0x27, 0x76, 0x58, 0x9d, 0x02, 0xc6, 0x9a, 0x31, 0xbc, 0x73, 0x9a, 0x73, 0x26, 0x65, 0x05, 0xe0, 0x7f, 0x46, 0xe3, 0x2f, 0xf9, 0x6d, 0xd5, 0x96, 0x35, 0xab, 0xea, 0x75, 0x04, 0xe6, 0xa1, 0x57, 0x3d, 0x8c, 0x3b, 0x76, 0xcc, 0xfc, 0x50, 0x25, 0xe8, 0xbe, 0x8d, 0x6b, 0xe2, 0x60, 0xdc, 0xa2, 0x41, 0xc0, 0xa9, 0xc8, 0x92, 0xdb, 0xa0, 0x7f, 0xb4, 0xb3, 0x80, 0xcb, 0x68, 0xc0, 0x4a, 0x0a, 0xda, 0xda, 0x79, 0xed, 0x3d, 0x66, 0x62, 0xcb, 0x28, 0xdf, 0x06, 0x88, 0x74, 0x09, 0x24, 0xe9, 0xeb, 0x55, 0xd4, 0x15, 0x45, 0x28, 0xb2, 0xb1, 0xc7, 0x0e, 0x7c, 0x67, 0x73, 0xe3, 0x57, 0xf7, 0x26, 0x79, 0x7c, 0x0f, 0x7a, 0x31, 0x8f, 0x4b, 0xf4, 0xd9, 0xef, 0xc3, 0xda, 0x12, 0x8b, 0x24, 0x8d, 0x41, 0xde, 0xbb, 0x6f, 0x20, 0x19, 0xae, 0x0f, 0xad, 0xd5, 0xd5, 0xba, 0x4a, 0x8e, 0x74, 0x36, 0x2e, 0x86, 0x02, 0xbf, 0x87, 0x33, 0x2f, 0xd3, 0x52, 0xe5, 0xce, 0x06, 0xc2, 0x00, 0xa0, 0x93, 0x54, 0x47, 0x27, 0x6e, 0xa5, 0xdd, 0xee, 0x51, 0x24, 0xdb, 0x19, 0xb2, 0x9d, 0xf0, 0x6d, 0x5e, 0x01, 0x73, 0x91, 0x4f, 0x89, 0x70, 0xc5, 0x41, 0x7c, 0xc4, 0x31, 0x4d, 0xc0, 0x1e, 0x7a, 0x0a, 0x07, 0xbb, 0xce, 0x45, 0x8c, 0x7c, 0x70, 0x44, 0xc4, 0x26, 0xa6, 0xc9, 0x98, 0xaa, 0x3a, 0xf2, 0xaf, 0xc9, 0x03, 0x62, 0x10, 0xa6, 0xa5, 0x7c, 0x66, 0x2f, 0xc7, 0x00, 0x43, 0x9d, 0xf7, 0x04, 0x9f, 0x66, 0x58, 0x78, 0x3a, 0xc9, 0xc3, 0xca, 0x98, 0x7a, 0x56, 0x1f, 0xa6, 0x6b, 0x5b, 0x60, 0x45, 0xb0, 0x57, 0x17, 0x90, 0x1f, 0xa9, 0x5c, 0x0a, 0x4c, 0xbb, 0x7c, 0x63, 0xf0, 0x0c, 0x77, 0x63, 0x11, 0x52, 0xc8, 0xa9, 0x36, 0x39, 0x4b, 0xfb, 0x07, 0x07, 0x60, 0xd7, 0x77, 0x1e, 0x4e, 0xbe, 0x0d, 0xf6, 0xdb, 0xcd, 0x09, 0x98, 0x66, 0x5a, 0xc2, 0xc7, 0x36, 0x79, 0x92, 0xa8, 0x21, 0xc3, 0x03, 0xb7, 0x40, 0x93, 0x58, 0x28, 0xb3, 0xa4, 0x2d, 0x7c, 0xa2, 0xeb, 0x33, 0x3c, 0x97, 0xbd, 0x34, 0x37, 0x38, 0x33, 0x6b, 0xe6, 0x0c, 0xfd, 0x95, 0x39, 0x8b, 0x72, 0xbc, 0x49, 0x6d, 0xfc, 0x74, 0x97, 0x59, 0xfe, 0x87, 0x7c, 0xec, 0x50, 0xde, 0x72, 0x83, 0x9c, 0x35, 0x3b, 0x84, 0xa4, 0x96, 0x46, 0x7e, 0xe0, 0x3a, 0xcd, 0xb8, 0xa3, 0x4e, 0x82, 0x4b, 0x59, 0xaa, 0x0b, 0xc4, 0x18, 0xb4, 0x36, 0x97, 0x41, 0xad, 0x6c, 0xd7, 0x13, 0x6a, 0x4e, 0x86, 0x0e, 0x8f, 0xe5, 0x90, 0xf2, 0x03, 0x94, 0x5c, 0x1d, 0x13, 0xda, 0x0f, 0x7c, 0xd7, 0xc1, 0x31, 0xa0, 0x50, 0x2a, 0x4c, 0x7e, 0xb0, 0xd2, 0x9b, 0xc0, 0xd7, 0x7e, 0x72, 0x2d, 0xf2, 0x25, 0x2e, 0xd5, 0x85, 0xf2, 0xb2, 0x82, 0x9f, 0x8e, 0x5c, 0x8e, 0x5a, 0xe9, 0x5f, 0x1d, 0x87, 0xcd, 0xdb, 0x14, 0x5f, 0x9d, 0xa3, 0x95, 0x35, 0x73, 0x48, 0x10, 0xc1, 0xd4, 0x30, 0x0d, 0x79, 0xe9, 0x56, 0xab, 0xbf, 0xf7, 0x07, 0xe6, 0x06, 0xa2, 0x24, 0xa1, 0x78, 0x6b, 0x2a, 0xdf, 0xd1, 0x6a, 0x8a, 0x18, 0x84, 0x4e, 0xaf, 0x37, 0x9a, 0xea, 0x86, 0x08, 0xf0, 0x8f, 0x88, 0xa4, 0xb5, 0x3d, 0x94, 0x5e, 0xec, 0x24, 0x15, 0x06, 0xbf, 0x09, 0x8b, 0x4e, 0xa5, 0xef, 0x48, 0x87, 0xa1, 0xe5, 0x1a, 0x4f, 0x32, 0x16, 0x8c, 0x5a, 0x97, 0xae, 0x68, 0x6f, 0x66, 0x15, 0xb0, 0x24, 0x62, 0x1b, 0x17, 0x51, 0xc9, 0xab, 0x51, 0x69, 0x63, 0x96, 0x0f, 0x59, 0x61, 0xad, 0xe7, 0x34, 0x4e, 0xad, 0xc6, 0x74, 0xaa, 0x79, 0xfb, 0x67, 0x66, 0x58, 0xf8, 0x6f, 0x98, 0x03, 0x17, 0x09, 0x86, 0x1e, 0x5b, 0xe4, 0x13, 0x50, 0xcc, 0xaf, 0x1a, 0x4d, 0xd1, 0x5b, 0xf2, 0x8e, 0x85, 0x8d, 0x29, 0x2d, 0xc8, 0x71, 0x74, 0xcd, 0x68, 0xa3, 0x4c, 0xc1, 0xc8, 0xc8, 0x02, 0x20, 0xc7, 0xcd, 0x26, 0x7f, 0x7f, 0xa3, 0x83, 0xa0, 0x4f, 0x9f, 0x50, 0x9d, 0x99, 0x21, 0x0c, 0x05, 0xd4, 0x68, 0xd2, 0xfe, 0xd3, 0x3e, 0x64, 0xf7, 0xe0, 0x81, 0x45, 0x91, 0x25, 0xeb, 0x0a, 0x81, 0x5c, 0xdb, 0xc6, 0x9d, 0x0e, 0xe0, 0x83, 0x4c, 0x4d, 0x6f, 0x66, 0xf9, 0x91, 0xf0, 0x91, 0x5a, 0x1f, 0x74, 0x57, 0xcd, 0x20, 0x6b, 0x79, 0x72, 0xf5, 0x51, 0xb0, 0x51, 0x68, 0x34, 0x6f, 0xf0, 0x80, 0x85, 0x7e, 0x68, 0x6c, 0xd5, 0x10, 0x63, 0x35, 0x77, 0x37, 0xf2, 0xf5, 0x91, 0x06, 0xfd, 0x81, 0xa4, 0x20, 0xf2, 0x72, 0x66, 0xe3, 0x7d, 0x32, 0x05, 0xa3, 0xdc, 0xf4, 0xda, 0x36, 0x58, 0x8d, 0xae, 0x20, 0x34, 0x0f, 0x8e, 0xe0, 0xd1, 0x82, 0x0c, 0xcf, 0x2b, 0xac, 0x5e, 0xda, 0x3e, 0x49, 0x4d, 0xb4, 0x2c, 0x17, 0x15, 0xda, 0xe2, 0x30, 0x9b, 0x86, 0x01, 0xa8, 0x71, 0x20, 0xdb, 0x18, 0x27, 0x3d, 0xcf, 0xe6, 0x01, 0x09, 0x6d, 0xe0, 0xf2, 0xa9, 0xea, 0x4c, 0x80, 0x56, 0xab, 0x3b, 0x56, 0xfb, 0x4f, 0xe2, 0x5f, 0x80, 0x7a, 0x6c, 0xe8, 0x02, 0x6b, 0x65, 0xef, 0x3a, 0xd6, 0x66, 0xe4, 0x9f, 0xa1, 0x15, 0x50, 0x21, 0xe1, 0x37, 0x84, 0xfc, 0x5e, 0xe4, 0xf2, 0x89, 0xdb, 0x57, 0xa7, 0x9a, 0x68, 0x7c, 0x3d, 0x75, 0xf3, 0x64, 0x54, 0xca, 0xff, 0x83, 0xc7, 0x9e, 0x39, 0xc5, 0x98, 0x6a, 0xb3, 0x79, 0x30, 0x6f, 0xd6, 0x96, 0x2e, 0xa3, 0xdd, 0x4a, 0x84, 0xa7, 0x9f, 0x48, 0x06, 0xa1, 0x47, 0x1b, 0x79, 0xeb, 0x75, 0x12, 0x8d, 0xf9, 0xde, 0x43, 0xbd, 0x5f, 0xfa, 0xba, 0x28, 0x5e, 0x8e, 0x4c, 0xfb, 0xf9, 0x85, 0xd0, 0xe5, 0x37, 0xdc, 0x23, 0x99, 0x56, 0xea, 0x84, 0x8a, 0xa2, 0xe6, 0xdd, 0x1f, 0x25, 0xfb, 0x7d, 0x1c, 0x0b, 0xd9, 0x46, 0xc1, 0xfe, 0xf9, 0xc9, 0xf4, 0x51, 0xaf, 0xe9, 0x67, 0x1a, 0xe0, 0xeb, 0x22, 0xf2, 0xe0, 0x66, 0xa6, 0x2a, 0x47, 0x8d, 0xdd, 0xe3, 0x82, 0x9c, 0x92, 0x51, 0x05, 0x4f, 0x3f, 0x2f, 0xf6, 0xfb, 0x40, 0x3b, 0xf7, 0x73, 0xbb, 0xcd, 0xe1, 0xc5, 0xd1, 0xe4, 0xe0, 0x5d, 0xd2, 0xbb, 0xa8, 0xe4, 0x9e, 0x83, 0xf0, 0x7a, 0x77, 0x0e, 0x42, 0x7c, 0xd9, 0xeb, 0xe4, 0xb9, 0xb1, 0x17, 0x53, 0x8c, 0x17, 0xdc, 0xaf, 0x64, 0x99, 0x49, 0x76, 0xf3, 0xf0, 0x8e, 0x76, 0x54, 0xba, 0xde, 0x81, 0xce, 0x52, 0xaf, 0x0c, 0xb8, 0xec, 0x28, 0x99, 0x36, 0x75, 0xb8, 0x6e, 0x2f, 0x07, 0xd5, 0x41, 0x1b, 0x27, 0xfe, 0x12, 0xc6, 0x00, 0xe7, 0x90, 0x8b, 0x8d, 0xcb, 0xb4, 0x61, 0x09, 0x29, 0x7d, 0x50, 0xc0, 0xdc, 0x93, 0xb0, 0xa3, 0x2e, 0x2f, 0x7e, 0x2b, 0xc5, 0x0e, 0x87, 0x7a, 0xa4, 0x32, 0xd1, 0x90, 0xf0, 0xbe, 0x3c, 0x78, 0x9d, 0xd5, 0xae, 0xe5, 0xa8, 0xa1, 0x9b, 0xed, 0x03, 0xa2, 0xfe, 0x1a, 0x26, 0x13, 0x15, 0x99, 0xe6, 0xf5, 0x2d, 0x58, 0x68, 0x42, 0xe1, 0xda, 0x25, 0x1c, 0x8e, 0x0d, 0xed, 0x78, 0x4f, 0x42, 0x10, 0x8f, 0x1d, 0x2b, 0x24, 0x01, 0x94, 0xcf, 0xe1, 0x65, 0xeb, 0x67, 0x96, 0x08, 0xa2, 0x10, 0xa0, 0x9c, 0x45, 0x0b, 0x01, 0xf3, 0xa9, 0x38, 0x1e, 0xab, 0xbe, 0x24, 0x80, 0x07, 0xff, 0x43, 0xa7, 0x32, 0xf2, 0x54, 0xee, 0xba, 0xe7, 0x63, 0xfd, 0xc3, 0x5b, 0x26, 0x27, 0x36, 0x4f, 0xf0, 0xbd, 0x5b, 0xfc, 0x9a, 0x58, 0xe1, 0xb9, 0x60, 0x60, 0x3f, 0x5b, 0x92, 0x61, 0xa8, 0x7b, 0x13, 0xf2, 0xed, 0x9d, 0x9d, 0xee, 0x2a, 0x6b, 0x06, 0xd4 }; +constexpr AccessUnit LPCM_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, false, 3, { 0x00, 0x00, 0x00, 0xfb, 0xba, 0x2b, 0xca, 0x88, 0x65, 0x2b, 0x01, 0xf4, 0xe6, 0xfc, 0x43, 0xc2 }, { 0xd6, 0x8c, 0x4f, 0x4c, 0xff, 0x84, 0x68, 0xd3, 0xb0, 0x60, 0x67, 0xd0, 0x3c, 0x90, 0x37, 0x14, 0x84, 0xba, 0x7a, 0xca } }; + +const std::vector USER_DATA_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x20, 0x4d, 0x00, 0x00, 0x12, 0x34, 0x5c, 0x19, 0xda, 0x7f, 0x08, 0x26, 0x84, 0x39, 0xe1, 0xd5, 0x52, 0x91, 0x8d, 0x44, 0xa5, 0xfc, 0xcb, 0x75, 0x65, 0x49, 0xd3, 0xaf, 0x92, 0x68, 0x5b, 0x79, 0x65, 0x28, 0x51, 0x4e, 0x74, 0xf7, 0xe6, 0xe6, 0x11, 0xe6, 0x89, 0x46, 0xcf, 0x5c, 0x3b, 0xe3, 0xaa, 0x7e, 0xc0, 0xee, 0xb8, 0x5a, 0xca, 0xf1, 0x60, 0x2d, 0x4b, 0xcd, 0x10, 0x79, 0xca, 0xf5, 0xc6, 0x3a, 0x63, 0x4e, 0xc5, 0x7e, 0x09, 0xeb, 0x6b, 0x12, 0x8f, 0x74, 0x71, 0x4f, 0x7e, 0x73, 0xd1, 0xe8, 0xe6, 0x6d, 0x4a, 0xc9, 0xf7, 0x0b, 0x96, 0x55, 0xcc, 0xcf, 0x96, 0x5b, 0xd2, 0x3e, 0x26, 0x5d, 0x61, 0x46, 0x73, 0xfe, 0x20, 0x18, 0xe7, 0xc7, 0xeb, 0x69, 0x02, 0xd8, 0xd8, 0x34, 0x94, 0xf9, 0xcb, 0x3c, 0xd7, 0x41, 0xd9, 0x8c, 0xa8, 0xbd, 0x8b, 0x18, 0xf1, 0x5d, 0xa0, 0x94, 0xdf, 0xd0, 0xa0, 0x72, 0xb2, 0xc3, 0x29, 0x05, 0xd6, 0x61, 0x95, 0xba, 0xa8, 0x13, 0x8b, 0x56, 0xcf, 0xb7, 0x65, 0x0d, 0xbb, 0xaf, 0xe9, 0x4e, 0x4c, 0xb6, 0xd4, 0xf6, 0x43, 0x81, 0x46, 0x46, 0xb1, 0x0f, 0xf7, 0x59, 0x3d, 0xe3, 0xc5, 0x1b, 0x3f, 0x60, 0x9f, 0x80, 0x71, 0x60, 0x19, 0x37, 0xb6, 0x7a, 0x2b, 0x7e, 0x1e, 0x6a, 0x13, 0x64, 0x5a, 0x80, 0xcb, 0xda, 0xaa, 0x6f, 0xd0, 0xfd, 0x9c, 0x32, 0x36, 0xac, 0x24, 0x9d, 0x9e, 0xfa, 0xfc, 0x26, 0xcb, 0x5d, 0x3a, 0x74, 0x56, 0xd3, 0x0e, 0xea, 0xc2, 0x4e, 0xaf, 0xef, 0x02, 0x5c, 0x2b, 0x68, 0x13, 0x5f, 0x71, 0xae, 0x27, 0x5d, 0xe2, 0xb2, 0x10, 0x01, 0x0e, 0x6e, 0xed, 0x9e, 0x7b, 0x6f, 0xb6, 0xdc, 0x99, 0x62, 0x0b, 0x48, 0x03, 0xa5, 0x8c, 0x6c, 0x82, 0xa1, 0xe3, 0x69, 0x72, 0x90, 0x47, 0xb6, 0x36, 0xe2, 0xfb, 0x9d, 0x14, 0x8a, 0xcd, 0x67, 0x48, 0xb9, 0x01, 0x2d, 0xf0, 0x9d, 0xc3, 0xf1, 0xb3, 0x92, 0x0c, 0x3a, 0xb4, 0xb5, 0x3a, 0x5c, 0x22, 0x0f, 0x31, 0x3c, 0xf9, 0xd1, 0xd8, 0x0c, 0xc9, 0xc9, 0x06, 0xbf, 0x86, 0x4e, 0x5a, 0xe7, 0xd8, 0xd2, 0x6b, 0x7a, 0x2c, 0xb3, 0xb3, 0x40, 0xd3, 0x49, 0xa0, 0xf9, 0xc3, 0x31, 0x18, 0x75, 0x95, 0x34, 0xce, 0x25, 0x3c, 0x48, 0x47, 0xeb, 0x4f, 0xde, 0xa6, 0xd2, 0x5f, 0xf3, 0x4d, 0x09, 0xb1, 0xc0, 0x65, 0xbc, 0xe6, 0x27, 0x3b, 0x8a, 0x08, 0xf6, 0x6e, 0x48, 0x1a, 0x1e, 0xc9, 0x8d, 0x6d, 0x7b, 0x67, 0x6c, 0xdb, 0x67, 0xcc, 0xe2, 0x67, 0x8e, 0x61, 0xf0, 0x3c, 0x0b, 0xac, 0x40, 0x37, 0x57, 0xae, 0x6d, 0x12, 0xfd, 0x2b, 0xec, 0x7e, 0xd3, 0xc0, 0x4e, 0x67, 0x44, 0x5e, 0xa7, 0x88, 0x14, 0x89, 0x44, 0x0e, 0x10, 0x20, 0xf8, 0x01, 0xe2, 0xea, 0xb3, 0xea, 0xd7, 0x04, 0x79, 0x6d, 0x7c, 0xd9, 0x32, 0xc9, 0x6e, 0x0e, 0xb5, 0xa7, 0x16, 0x23, 0x01, 0xdd, 0xb5, 0x6e, 0x51, 0xd8, 0x46, 0x9c, 0x1e, 0x14, 0x1c, 0x48, 0xb6, 0x3b, 0xb7, 0xcd, 0x0f, 0x1c, 0x8a, 0x3a, 0x69, 0xec, 0xb5, 0xa3, 0x31, 0x30, 0x3f, 0x44, 0x45, 0xd1, 0x5b, 0x4f, 0x94, 0xba, 0x01, 0x3f, 0xcd, 0x1f, 0x24, 0x2e, 0xe8, 0x4e, 0x48, 0x59, 0xeb, 0x86, 0xb8, 0x52, 0x1a, 0xcf, 0x1b, 0x02, 0x84, 0x8f, 0x81, 0x52, 0x8c, 0xfc, 0xb7, 0xf0, 0x15, 0xe1, 0xab, 0xa8, 0xc4, 0xd5, 0x61, 0x3c, 0x29, 0xd1, 0x32, 0x40, 0x84, 0xd1, 0xc9, 0x48, 0x03, 0x09, 0x4d, 0x3e, 0xd0, 0x07, 0xaf, 0xc9, 0x90, 0xad, 0xd6, 0x77, 0x27, 0x29, 0x17, 0x51, 0x2d, 0x37, 0x5f, 0xed, 0xe1, 0xef, 0xb1, 0xa0, 0xd5, 0xd6, 0xb6, 0x78, 0x89, 0xb2, 0x98, 0xec, 0x28, 0x05, 0x9e, 0x2b, 0x18, 0xa5, 0x59, 0x00, 0x6d, 0x0c, 0x62, 0x06, 0x85, 0xe4, 0xa7, 0x6f, 0xf9, 0x38, 0x42, 0x59, 0x43, 0xc0, 0xe0, 0xaf, 0xe5, 0x66, 0x7d, 0x70, 0x3c, 0x36, 0x0b, 0x6e, 0x47, 0x8b, 0xcf, 0x19, 0x91, 0xa3, 0xff, 0xe4, 0x98, 0x75, 0x46, 0x45, 0x64, 0x59, 0x9c, 0x9e, 0xf6, 0xe2, 0x47, 0xb0, 0xeb, 0xb6, 0x87, 0x3f, 0xc2, 0xbd, 0xcc, 0x76, 0x49, 0x38, 0xc6, 0x60, 0xb1, 0xc6, 0x57, 0x61, 0x3c, 0xc2, 0xd9, 0x68, 0xde, 0x61, 0x57, 0x0b, 0x7d, 0x80, 0x93, 0xb2, 0xc4, 0xdb, 0x54, 0x2d, 0xa2, 0x9d, 0x30, 0x2e, 0x77, 0x52, 0x64, 0xa0, 0xa5, 0x40, 0x61, 0xa5, 0x17, 0xd0, 0x10, 0x4e, 0x34, 0x1b, 0x15, 0x3b, 0x82, 0xc7, 0xea, 0x9e, 0xf8, 0xdd, 0x6b, 0xc4, 0xa9, 0xc4, 0x69, 0x76, 0xa9, 0x8b, 0x9f, 0x52, 0x06, 0xa3, 0xc4, 0x6b, 0xd9, 0x2e, 0x4a, 0xd6, 0x65, 0xb9, 0x51, 0xde, 0x5c, 0x7b, 0xd1, 0x26, 0x97, 0x80, 0xe1, 0x03, 0xa6, 0x79, 0x30, 0x73, 0xe8, 0x36, 0x91, 0xbe, 0x6b, 0xe1, 0xef, 0x5a, 0xdc, 0x2a, 0x73, 0x03, 0x72, 0x6a, 0x39, 0x60, 0x2a, 0xe3, 0x7f, 0x2f, 0x67, 0x95, 0x19, 0x38, 0x94, 0x27, 0xc0, 0x77, 0xba, 0x9e, 0xe1, 0x98, 0xb4, 0x2f, 0xa9, 0xe2, 0x9c, 0xf3, 0xea, 0x80, 0x5e, 0x6b, 0xee, 0x81, 0x38, 0x80, 0x29, 0xa1, 0x28, 0x84, 0x5f, 0x8e, 0xbb, 0xbe, 0x63, 0xcf, 0x85, 0x7f, 0x9a, 0x22, 0xae, 0x89, 0xfe, 0x87, 0xf5, 0x4f, 0x03, 0x70, 0xc9, 0xeb, 0xf9, 0x90, 0x6e, 0x7c, 0x25, 0xf3, 0xd7, 0xc5, 0xbf, 0x2b, 0x13, 0x8a, 0xbe, 0xbc, 0x50, 0x38, 0xf5, 0x38, 0xd9, 0xf7, 0x3b, 0xa7, 0xb0, 0x57, 0x85, 0x0b, 0xd0, 0x3d, 0x05, 0xfc, 0xe3, 0xf5, 0x3f, 0xc4, 0x23, 0x8c, 0x26, 0x94, 0xe9, 0xf0, 0xb0, 0x84, 0x77, 0xb4, 0x88, 0xa1, 0x5d, 0xd0, 0xb9, 0xb2, 0x9c, 0xf5, 0x18, 0x13, 0x3a, 0x3a, 0x69, 0x90, 0x35, 0x4e, 0x4f, 0xcb, 0xc9, 0xab, 0xb3, 0x1a, 0x5d, 0x8a, 0xff, 0x84, 0xf5, 0x43, 0x45, 0xdd, 0x99, 0x79, 0x48, 0x32, 0x7a, 0x5b, 0xed, 0xc5, 0x9e, 0x8c, 0xef, 0xfd, 0x23, 0x6d, 0x92, 0xf9, 0xef, 0xa2, 0x86, 0xe2, 0x09, 0xdf, 0x06, 0x85, 0x9e, 0xbc, 0x83, 0x88, 0xb3, 0x24, 0x8f, 0xbf, 0x00, 0x84, 0x91, 0x90, 0xc9, 0xc8, 0xaf, 0x4b, 0xbe, 0xa0, 0xa3, 0xff, 0x66, 0xb1, 0x8a, 0x8a, 0x78, 0x37, 0x4e, 0x32, 0xa9, 0x61, 0x9a, 0xbd, 0x13, 0xf5, 0xbc, 0x39, 0x41, 0x8d, 0x4f, 0xfa, 0xe3, 0xdc, 0x76, 0x65, 0x26, 0xf1, 0x23, 0xdb, 0x71, 0xc6, 0x0b, 0x31, 0x4e, 0x05, 0x0c, 0xb4, 0x8d, 0x3c, 0x12, 0x37, 0x86, 0x59, 0x40, 0x1a, 0x40, 0x26, 0xcb, 0x04, 0x29, 0x23, 0x48, 0x76, 0xee, 0x6c, 0x00, 0x22, 0x9d, 0x8e, 0x70, 0x0e, 0x37, 0x9e, 0x78, 0x53, 0x76, 0x91, 0x10, 0x00, 0x23, 0xb0, 0x6c, 0x70, 0x78, 0x1b, 0xeb, 0x3e, 0x26, 0xb0, 0x0b, 0x8b, 0x3b, 0xa2, 0x9c, 0x72, 0x5e, 0xb9, 0x93, 0x17, 0x6b, 0x25, 0x06, 0xd0, 0x87, 0x52, 0x66, 0x0f, 0xe2, 0x28, 0xc9, 0xbb, 0x3a, 0x7f, 0xdb, 0x03, 0x53, 0x58, 0xb0, 0x59, 0x9a, 0xb7, 0x08, 0x57, 0x5a, 0xd9, 0xaa, 0xd9, 0xd5, 0x3b, 0xb1, 0xb2, 0xa7, 0x01, 0xae, 0x5b, 0xb5, 0xef, 0xb7, 0x2a, 0x83, 0x0e, 0x5c, 0x17, 0x70, 0x5f, 0xbf, 0xa5, 0x59, 0xbc, 0xa8, 0xee, 0x8a, 0x88, 0x47, 0x14, 0xfc, 0x59, 0x99, 0x85, 0x4e, 0x52, 0x14, 0x6b, 0x76, 0xd7, 0x23, 0xd2, 0xdf, 0x32, 0x97, 0x70, 0x89, 0x4e, 0xc0, 0xa8, 0x5d, 0x03, 0x64, 0xca, 0x89, 0x63, 0x9b, 0xc8, 0x57, 0x1f, 0xed, 0xf2, 0xbb, 0x87, 0x7c, 0xbf, 0x4c, 0xda, 0xf0, 0x71, 0x62, 0xda, 0x1e, 0xd9, 0x3d, 0x3c, 0xa2, 0xc6, 0xa7, 0x16, 0xdf, 0x6c, 0x8a, 0xd8, 0xbc, 0x7b, 0x8c, 0x23, 0x2e, 0xce, 0x42, 0x48, 0xe7, 0x91, 0xf9, 0x4a, 0xcf, 0xe6, 0xfd, 0xd3, 0xb1, 0x99, 0x86, 0xd9, 0xcc, 0x6f, 0x9d, 0x73, 0x5a, 0x8f, 0x63, 0x5d, 0x4d, 0x07, 0x65, 0x46, 0x7a, 0x1f, 0x60, 0x94, 0x89, 0x53, 0x49, 0x38, 0x1e, 0x3e, 0xf2, 0xeb, 0x55, 0x52, 0x90, 0xa8, 0x76, 0x75, 0x90, 0xd9, 0x16, 0x4a, 0x63, 0x90, 0xe3, 0x02, 0xcf, 0x0f, 0x94, 0xb4, 0xb4, 0xa2, 0x96, 0xb4, 0xc2, 0x6c, 0x8e, 0x87, 0x86, 0x8d, 0x1c, 0x18, 0xbd, 0xc4, 0x1a, 0xd9, 0x8a, 0x0d, 0x87, 0x72, 0xdb, 0x6d, 0xbe, 0x05, 0xb6, 0x79, 0xbe, 0x5d, 0x19, 0x4f, 0x1c, 0x34, 0x89, 0xa5, 0xe2, 0x37, 0x2d, 0x2c, 0xbd, 0x58, 0xf5, 0xb7, 0xb9, 0x8b, 0x2c, 0xf9, 0x0c, 0xa0, 0x4d, 0x10, 0x8d, 0xda, 0x7f, 0x0d, 0x87, 0xcb, 0x6d, 0x59, 0xe9, 0x22, 0xc4, 0x29, 0x8e, 0x4b, 0x40, 0xf1, 0x94, 0xc7, 0xca, 0x37, 0x3d, 0x3f, 0xc9, 0x15, 0xa5, 0x22, 0xaf, 0xec, 0xb9, 0x52, 0xd2, 0x0c, 0xb5, 0x41, 0x33, 0x4f, 0xa1, 0x5b, 0x75, 0x01, 0x40, 0x63, 0x74, 0x52, 0xff, 0x3e, 0x5c, 0x50, 0xab, 0x63, 0x78, 0xad, 0xf5, 0x7c, 0x1e, 0xb1, 0x89, 0x5f, 0xc3, 0xb6, 0x44, 0xc5, 0xd1, 0x1f, 0xb7, 0xa6, 0x32, 0x78, 0x63, 0xc0, 0x68, 0xbe, 0x38, 0x33, 0x6b, 0x81, 0x2f, 0xfa, 0x0e, 0x9f, 0x70, 0x80, 0x6b, 0x0d, 0x29, 0xf9, 0x91, 0x65, 0x36, 0x3f, 0x71, 0x1e, 0x1c, 0xd1, 0xf7, 0xe7, 0xef, 0x82, 0x64, 0x68, 0x1d, 0x8e, 0x9e, 0x04, 0x48, 0x3e, 0xff, 0xc3, 0xff, 0x60, 0x01, 0xda, 0x26, 0x81, 0x42, 0x32, 0x33, 0xf2, 0x66, 0xa5, 0xed, 0xf0, 0x7c, 0x24, 0x54, 0xc7, 0xa6, 0xde, 0x05, 0x3f, 0x89, 0x7c, 0xbc, 0x72, 0x57, 0x23, 0xb4, 0x1e, 0x9b, 0xb0, 0x64, 0x62, 0x4d, 0x59, 0x99, 0x0a, 0xef, 0x7d, 0x69, 0xff, 0x8b, 0xd0, 0x8f, 0xac, 0x38, 0x94, 0xcc, 0xda, 0x15, 0x39, 0x34, 0xd3, 0x0b, 0x91, 0x71, 0x16, 0xf5, 0xf0, 0xa7, 0xd6, 0xe3, 0x1b, 0x02, 0x9d, 0x68, 0x45, 0x70, 0x5c, 0x70, 0x76, 0xdd, 0x0b, 0x3b, 0xcf, 0xbe, 0x81, 0x36, 0x46, 0x5e, 0xd1, 0x23, 0x16, 0xa6, 0x44, 0x71, 0x9f, 0x37, 0x03, 0xa9, 0xf8, 0x44, 0x4c, 0xe9, 0x1c, 0xbd, 0x02, 0xad, 0x66, 0x4f, 0x5c, 0x86, 0xe1, 0xc4, 0xde, 0x4e, 0x8c, 0x23, 0x2b, 0x53, 0x1b, 0xf7, 0x67, 0x2c, 0xb9, 0x2c, 0x32, 0xad, 0x9c, 0x95, 0x97, 0xfa, 0x9e, 0x4d, 0x85, 0xac, 0x46, 0xe0, 0x72, 0x83, 0x56, 0x1d, 0x38, 0x5d, 0x75, 0x3f, 0xb5, 0xf6, 0x23, 0xb2, 0xba, 0x9e, 0xda, 0xe3, 0x3a, 0x3e, 0x02, 0x66, 0x52, 0xd4, 0x9d, 0x3b, 0x52, 0x98, 0x58, 0x89, 0x6f, 0x24, 0xe1, 0x67, 0xd7, 0x1c, 0xea, 0xca, 0xce, 0x9f, 0xe9, 0xa9, 0xca, 0xc6, 0x59, 0x7b, 0x9d, 0xe4, 0x19, 0xeb, 0x86, 0x6f, 0x8a, 0xa0, 0x8a, 0x7a, 0x74, 0x98, 0x71, 0x5d, 0x8b, 0x03, 0xb4, 0xce, 0x13, 0x08, 0x15, 0xa1, 0x38, 0xbb, 0x00, 0xb1, 0xb3, 0x52, 0x27, 0x0f, 0x8c, 0x24, 0x10, 0x9e, 0x18, 0xfd, 0x3e, 0xa7, 0xaa, 0x5d, 0x4f, 0xa4, 0x83, 0x5e, 0xbe, 0x63, 0x9f, 0xc4, 0xf2, 0x0a, 0x95, 0x46, 0xef, 0x84, 0x90, 0x5e, 0xd7, 0xbe, 0x5c, 0xad, 0xc2, 0x85, 0x03, 0xbc, 0xc5, 0xf4, 0x63, 0xb1, 0x9d, 0x4c, 0x9f, 0x2a, 0x6d, 0x4e, 0x1b, 0xf8, 0xf4, 0x24, 0x32, 0xf0, 0x4e, 0xe0, 0x3f, 0xca, 0x5c, 0xc0, 0xb8, 0x71, 0xc3, 0x1c, 0x7a, 0xec, 0xbf, 0x5b, 0xd0, 0xdc, 0xf4, 0x7d, 0x6d, 0x5e, 0x6c, 0xd0, 0x0e, 0xe0, 0x64, 0x22, 0x82, 0x84, 0xb4, 0xeb, 0xc8, 0x79, 0xdf, 0xcc, 0x0b, 0x60, 0x14, 0x9c, 0xa3, 0x7e, 0x9d, 0xb1, 0xb0, 0xf2, 0x1d, 0x7e, 0x3f, 0x28, 0xf3, 0x6a, 0x50, 0x67, 0x14, 0x56, 0xe1, 0x05, 0x89, 0x9b, 0xf2, 0x41, 0x75, 0xc9, 0x59, 0x03, 0xa1, 0xf0, 0x85, 0xa7, 0xca, 0x23, 0x09, 0xaf, 0x3a, 0xe5, 0x92, 0x14, 0xa7, 0xbe, 0x71, 0x7e, 0x99, 0x07, 0x91, 0xef, 0xdf, 0xab, 0x4a, 0x69, 0x97, 0xa5, 0x37, 0xfe, 0xe5, 0x12, 0xf7, 0x3f, 0x82, 0x2a, 0x9d, 0xd2, 0xa5, 0x27, 0xd3, 0xf5, 0xc1, 0x99, 0xc2, 0x78, 0x10, 0x14, 0x8d, 0x2f, 0xf0, 0x5c, 0x0f, 0x15, 0xc8, 0x0c, 0x8c, 0x93, 0x52, 0x1d, 0x3e, 0xb0, 0x2b, 0x35, 0xda, 0xac, 0x00, 0x80, 0x10, 0xb6, 0x56, 0xea, 0x1a, 0x43, 0xdd, 0x14, 0x0e, 0x75, 0x40, 0x96, 0x5f, 0x1d, 0xcb, 0xf6, 0x26, 0x3e, 0x88, 0x9e, 0xf8, 0x1a, 0x1e, 0x74, 0xed, 0x6b, 0xa7, 0xc8, 0x73, 0x83, 0xac, 0xe0, 0xe4, 0x38, 0x02, 0x7c, 0x4b, 0x67, 0x9a, 0xb3, 0xe1, 0xef, 0xc2, 0xb8, 0xc8, 0xc4, 0x19, 0xe0, 0xab, 0x73, 0x55, 0xd4, 0x99, 0x86, 0x22, 0x27, 0xd4, 0x7b, 0x05, 0x4b, 0x43, 0x2c, 0x43, 0x0b, 0xf2, 0x35, 0x37, 0x3c, 0x95, 0x63, 0xcd, 0x08, 0x24, 0x5f, 0x37, 0xce, 0xff, 0x99, 0xbe, 0x98, 0x0e, 0x0b, 0x87, 0x07, 0xe0, 0x70, 0x89, 0x0b, 0x82, 0x53, 0x57, 0x53, 0x62, 0xdb, 0xe7, 0x76, 0xc6, 0x41, 0x0f, 0x0c, 0x9b, 0x52, 0x37, 0xf8, 0x83, 0x40, 0x23, 0x26, 0x55, 0xf9, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x20, 0x91, 0x48, 0x5e, 0xa3, 0x75, 0x85, 0xfa, 0xa0, 0x8b, 0x71, 0x17, 0xb1, 0x83, 0x8f, 0x09, 0x16, 0x15, 0x34, 0x04, 0xa6, 0x6c, 0x2d, 0x5f, 0x2d, 0x6a, 0x6d, 0xf4, 0x63, 0x28, 0x9c, 0xcb, 0x76, 0x85, 0xd6, 0xdc, 0x0b, 0x75, 0x65, 0xa1, 0xcd, 0xcc, 0x10, 0xa9, 0x4a, 0x81, 0xa9, 0x43, 0x0f, 0xf7, 0x7a, 0xb8, 0xa2, 0x25, 0x44, 0xc5, 0x56, 0xbc, 0x22, 0x0b, 0xa6, 0xaf, 0x45, 0xe2, 0xe4, 0x02, 0x61, 0x4d, 0x5d, 0x1e, 0x47, 0x9a, 0xdc, 0x29, 0xc6, 0x80, 0xf5, 0x79, 0x55, 0x74, 0xd0, 0x19, 0x75, 0xa7, 0x89, 0x9a, 0x7d, 0x11, 0x65, 0x0b, 0x7c, 0xcd, 0x41, 0xcc, 0x9e, 0x41, 0x0c, 0x5e, 0x69, 0xd2, 0x16, 0x95, 0x71, 0xfe, 0xa3, 0x05, 0x41, 0xac, 0xaa, 0x63, 0xa3, 0x25, 0x1e, 0x3a, 0xa8, 0xf8, 0x59, 0x62, 0x42, 0x98, 0x0c, 0x42, 0xdc, 0x12, 0xe6, 0xaf, 0xe3, 0x35, 0x58, 0xba, 0x37, 0x02, 0x6d, 0xd0, 0xff, 0xa8, 0xfd, 0x25, 0x31, 0x29, 0x6c, 0xa9, 0x81, 0xa4, 0x24, 0x9c, 0x65, 0x3e, 0x2e, 0x4f, 0xcb, 0x9f, 0x3e, 0x12, 0x13, 0xf6, 0x52, 0x79, 0x38, 0xbf, 0x74, 0xae, 0x13, 0x7f, 0xa1, 0x4b, 0x90, 0xd6, 0x9e, 0x3d, 0x0e, 0xa5, 0x66, 0xea, 0xa7, 0xe8, 0x72, 0xcb, 0xb5, 0x2f, 0x62, 0xc0, 0xa7, 0xb2, 0xe4, 0x83, 0xfd, 0x9d, 0xcc, 0xb7, 0x1d, 0x44, 0x65, 0x78, 0x44, 0x4d, 0x97, 0x83, 0x38, 0xcc, 0xc2, 0x62, 0x8e, 0x4b, 0x4f, 0x98, 0x12, 0x69, 0x53, 0x1e, 0x4d, 0x4c, 0x86, 0xf5, 0x4f, 0x1a, 0x2c, 0x8c, 0x70, 0x9f, 0x4e, 0x75, 0x8e, 0x46, 0x96, 0xcd, 0xe0, 0x90, 0xcc, 0x8e, 0xa4, 0x8a, 0x5a, 0x1f, 0xe3, 0x4b, 0x9e, 0xa0, 0xfc, 0xc8, 0xb8, 0xa3, 0x7e, 0xc8, 0x11, 0xde, 0x62, 0xa9, 0xfe, 0xe0, 0x01, 0x79, 0x92, 0x00, 0x87, 0xef, 0x51, 0xd2, 0x73, 0x50, 0xaa, 0xad, 0xd6, 0x82, 0x50, 0x83, 0xda, 0x93, 0x96, 0xc5, 0x51, 0x21, 0x7e, 0xe3, 0x9d, 0x86, 0x1c, 0xbb, 0xdb, 0xca, 0x6a, 0x38, 0x32, 0xf9, 0x55, 0x63, 0x97, 0x44, 0x4f, 0x2e, 0xf9, 0x07, 0x43, 0x9e, 0x88, 0x25, 0x6a, 0xa5, 0x1f, 0x75, 0xdc, 0x5b, 0xd0, 0xbf, 0x24, 0x6d, 0xd7, 0x02, 0x6c, 0x82, 0x8b, 0x5f, 0x3b, 0xfc, 0x0d, 0xf4, 0x3a, 0xa5, 0x94, 0x36, 0x07, 0xe2, 0x07, 0x9f, 0x7e, 0xed, 0xb7, 0xc7, 0x3c, 0x9c, 0xdc, 0xbb, 0xd6, 0xa7, 0x8b, 0x1c, 0x8f, 0x1f, 0x26, 0x3d, 0x40, 0x87, 0xfe, 0x2b, 0xa8, 0xf4, 0x1e, 0x84, 0x7c, 0x48, 0xd7, 0xb1, 0xdf, 0xdb, 0xda, 0x8c, 0xa5, 0xea, 0xca, 0xa1, 0xe5, 0xc6, 0x54, 0x57, 0x15, 0x3f, 0xc5, 0x7b, 0xea, 0xc4, 0x58, 0x44, 0x81, 0xa1, 0xdc, 0x8d, 0x98, 0x09, 0x1c, 0xb2, 0x4f, 0xdf, 0x0a, 0x14, 0xb5, 0xfd, 0x34, 0x56, 0x8f, 0x33, 0xd7, 0xbb, 0x28, 0xa1, 0x29, 0x81, 0x53, 0xcb, 0xb7, 0x67, 0xd9, 0x78, 0x3e, 0x46, 0xd6, 0x64, 0x0b, 0x0c, 0x84, 0xc4, 0xb5, 0x65, 0xf9, 0x9f, 0x0e, 0x45, 0x2a, 0x2d, 0xbd, 0x92, 0x63, 0x61, 0x8e, 0xab, 0xb9, 0x22, 0x7e, 0x89, 0x77, 0x1a, 0x47, 0x92, 0x87, 0x77, 0xaf, 0xf7, 0x39, 0x2c, 0x52, 0x55, 0xf8, 0xab, 0xa8, 0x29, 0x18, 0xc4, 0xd3, 0xad, 0x9a, 0x1d, 0x2f, 0x8f, 0x0e, 0xdc, 0x1a, 0x06, 0x39, 0xcf, 0xec, 0x1a, 0xca, 0xde, 0x77, 0x43, 0x04, 0xe2, 0x05, 0xac, 0x6a, 0xa0, 0x0c, 0x51, 0x6c, 0x33, 0x4f, 0xa1, 0xdc, 0x7d, 0x28, 0x08, 0x90, 0x2f, 0x7d, 0x7a, 0x46, 0x21, 0x77, 0x7c, 0xcf, 0x19, 0x0e, 0x9e, 0xbb, 0xbf, 0xe6, 0x3b, 0x7c, 0x05, 0xf1, 0x89, 0xb3, 0x93, 0x90, 0x44, 0xa5, 0xe0, 0x39, 0x73, 0x88, 0x16, 0x0f, 0x99, 0xaf, 0x3b, 0x31, 0x81, 0x05, 0x52, 0x09, 0x46, 0x9e, 0x95, 0xe9, 0xf0, 0x86, 0x78, 0xc9, 0x18, 0x54, 0x9d, 0xe8, 0xfc, 0x3d, 0x0f, 0x77, 0x06, 0xc1, 0x6b, 0xf6, 0x8d, 0x67, 0x77, 0x1d, 0xb3, 0xd3, 0x6e, 0x1f, 0x25, 0x9e, 0x27, 0x5f, 0x35, 0x70, 0x52, 0x24, 0xde, 0xed, 0x3c, 0x5a, 0x35, 0xf1, 0x63, 0xe9, 0xc7, 0x58, 0xdb, 0x5f, 0xcc, 0x46, 0x25, 0xe1, 0xb7, 0x89, 0xfe, 0x81, 0xf1, 0x19, 0x65, 0x0d, 0xc7, 0xcf, 0xf0, 0x79, 0x33, 0xcd, 0xbf, 0xd0, 0xdd, 0x2c, 0xdd, 0xdc, 0x7d, 0x68, 0x66, 0x91, 0x51, 0x26, 0x76, 0x6d, 0x8e, 0xe0, 0xe1, 0x3f, 0xdc, 0xc9, 0xc0, 0xe9, 0x75, 0x50, 0x74, 0x23, 0x28, 0xd9, 0x55, 0x16, 0x53, 0xd8, 0x6c, 0xfe, 0xc8, 0xaa, 0x27, 0x0f, 0xd6, 0x46, 0x33, 0xde, 0x0c, 0xa1, 0x49, 0x57, 0xb5, 0xe9, 0x04, 0xc9, 0xc1, 0xfc, 0x4b, 0x10, 0x5b, 0x41, 0x92, 0xa9, 0x66, 0xda, 0x9a, 0x45, 0xf3, 0x57, 0x47, 0x43, 0x32, 0x64, 0xe2, 0xe9, 0x19, 0x2d, 0x53, 0xff, 0xae, 0x3f, 0x69, 0xc3, 0x14, 0x83, 0xdd, 0x2a, 0xdc, 0xc2, 0xeb, 0x2c, 0x9e, 0x2c, 0x26, 0x2b, 0x0b, 0x70, 0x57, 0xe8, 0x47, 0x6a, 0x83, 0xce, 0xf3, 0x3d, 0xda, 0xbf, 0x8c, 0x1f, 0x87, 0x67, 0xfa, 0x38, 0xaf, 0x57, 0xa8, 0x3d, 0x24, 0x1d, 0xf7, 0xf1, 0x82, 0x93, 0x8f, 0x6a, 0xed, 0x97, 0x60, 0xef, 0x10, 0x61, 0x8a, 0x5d, 0x17, 0x58, 0x5e, 0x4d, 0x2d, 0x4a, 0x61, 0x48, 0xc1, 0x1d, 0x17, 0x3e, 0x8c, 0x97, 0x24, 0xb8, 0x8e, 0xfc, 0xba, 0x47, 0x96, 0x52, 0x18, 0xec, 0xf9, 0xec, 0xa9, 0x32, 0x26, 0xe2, 0xe9, 0xb8, 0x59, 0xc7, 0xf2, 0x8b, 0xc7, 0x11, 0xf7, 0x76, 0x64, 0x63, 0x5a, 0x2a, 0x55, 0xef, 0x3b, 0xf2, 0x78, 0x50, 0x44, 0x03, 0xfe, 0xa3, 0xcb, 0x5b, 0xac, 0x9a, 0x2c, 0xef, 0x5f, 0x73, 0x08, 0x4b, 0xac, 0x63, 0x2b, 0xe7, 0x2f, 0x9a, 0x4a, 0x6f, 0xab, 0x1f, 0x53, 0x70, 0xea, 0x58, 0xa3, 0x1f, 0xbe, 0xbb, 0x7e, 0x11, 0xf7, 0x46, 0x0e, 0xfe, 0xe7, 0x7e, 0xd1, 0xfe, 0x88, 0xa1, 0x6e, 0x8a, 0x3e, 0xff, 0x9d, 0xda, 0xf0, 0x57, 0xbb, 0x41, 0xbf, 0xdd, 0x79, 0x0d, 0x47, 0x98, 0x23, 0x11, 0xa3, 0xea, 0x6d, 0x6b, 0x32, 0x70, 0x5f, 0x1a, 0xf5, 0xfc, 0x03, 0x2f, 0xc1, 0x52, 0x2d, 0xab, 0xb4, 0xb4, 0xb9, 0x2f, 0x53, 0x99, 0x3c, 0x93, 0xbe, 0xa3, 0x69, 0x17, 0x91, 0x89, 0x1b, 0xa6, 0x25, 0x9f, 0x84, 0x3e, 0xb5, 0x32, 0x41, 0xaa, 0x2a, 0x7c, 0x09, 0xde, 0xc2, 0xd6, 0xf6, 0x06, 0x99, 0xf2, 0x4e, 0x49, 0x26, 0x0c, 0x75, 0x39, 0x4d, 0x10, 0x41, 0x86, 0x70, 0xc6, 0xa6, 0x92, 0xfc, 0xe1, 0x84, 0xd2, 0xcb, 0xe2, 0x9c, 0x82, 0x62, 0x3c, 0x24, 0xa4, 0x62, 0xc4, 0xbe, 0xfb, 0xc4, 0xdc, 0xde, 0xa3, 0x89, 0x53, 0x26, 0x25, 0xdf, 0x7e, 0x53, 0x6f, 0x57, 0xca, 0x62, 0x22, 0x18, 0xe6, 0xde, 0x87, 0x31, 0x3b, 0x6f, 0x2b, 0x2f, 0xb0, 0x95, 0xc6, 0xa9, 0x36, 0xcf, 0x51, 0x40, 0xd5, 0xe6, 0x9d, 0xeb, 0x9f, 0x5b, 0x9e, 0x82, 0x47, 0xb9, 0x17, 0xdf, 0x94, 0x1e, 0x0c, 0x85, 0x48, 0xd3, 0x00, 0x7d, 0x3a, 0xe0, 0x45, 0xd2, 0xe7, 0x96, 0x27, 0xb6, 0xc5, 0x88, 0x0b, 0x3b, 0x52, 0xcc, 0xa7, 0xbf, 0x0b, 0x20, 0xa5, 0x84, 0x12, 0x29, 0xc9, 0xd9, 0xec, 0xd1, 0xd4, 0x05, 0x4d, 0x38, 0x96, 0x3e, 0x9e, 0xaa, 0x53, 0x85, 0xe2, 0x5f, 0x1c, 0x43, 0xce, 0x88, 0xb1, 0x49, 0x6a, 0x64, 0xc4, 0x11, 0x91, 0x4a, 0x06, 0xac, 0x4c, 0xe7, 0x03, 0x5b, 0x44, 0xf3, 0xbd, 0x9c, 0x7a, 0x56, 0xb5, 0xef, 0x98, 0x18, 0xa9, 0xbf, 0xb9, 0xb9, 0x7d, 0x16, 0xb8, 0x21, 0xe5, 0x2d, 0xfc, 0xb0, 0x16, 0x69, 0x6c, 0x81, 0x59, 0xf0, 0xcd, 0xd3, 0x2b, 0x0c, 0x5a, 0x8b, 0x5b, 0xa7, 0x38, 0x21, 0x85, 0x96, 0xd3, 0x43, 0xdf, 0xb3, 0x81, 0xde, 0xa2, 0x4a, 0x23, 0xb3, 0x95, 0x46, 0x41, 0x9c, 0x24, 0x76, 0x27, 0xe6, 0xc2, 0x8e, 0x52, 0xe9, 0xe5, 0x86, 0x0a, 0x0d, 0x45, 0x2f, 0x70, 0x6e, 0x9d, 0xcb, 0x3a, 0x70, 0xaa, 0xf4, 0xd8, 0xbf, 0xe1, 0x94, 0x95, 0x60, 0x4f, 0x11, 0x04, 0x0f, 0x23, 0x31, 0x1a, 0x35, 0x20, 0xe1, 0x3d, 0x2b, 0xf2, 0x6f, 0xfd, 0x7e, 0x25, 0x88, 0xd7, 0xdf, 0x25, 0x3e, 0x3c, 0x90, 0x09, 0xd3, 0x9b, 0x08, 0xbe, 0x5e, 0x23, 0x9a, 0x8f, 0xdc, 0x0a, 0xda, 0x7f, 0x00, 0xa3, 0xb2, 0x80, 0x86, 0xc4, 0x2d, 0x01, 0xbd, 0x50, 0x13, 0x28, 0xe3, 0xae, 0x87, 0x19, 0x71, 0xcc, 0x31, 0xdd, 0x7a, 0x81, 0x40, 0x55, 0x66, 0x54, 0xa3, 0x9b, 0x30, 0x19, 0x69, 0x91, 0xa0, 0xd6, 0x4c, 0xaa, 0x60, 0xf3, 0x28, 0xce, 0x86, 0xc3, 0xee, 0xff, 0x52, 0xcf, 0x97, 0x2e, 0x41, 0x6f, 0x35, 0xfe, 0x2f, 0x6b, 0x56, 0x51, 0x15, 0x68, 0x53, 0xbc, 0xab, 0xb6, 0xd0, 0x88, 0x80, 0x57, 0x75, 0x4b, 0x87, 0x3e, 0x15, 0x73, 0xba, 0x3c, 0xa8, 0xc7, 0x5b, 0x7a, 0xec, 0x56, 0xf2, 0x56, 0x6d, 0x8d, 0x62, 0x86, 0xeb, 0x9e, 0x8f, 0x50, 0x85, 0xd2, 0x1c, 0xd7, 0xeb, 0x37, 0xeb, 0x96, 0xc1, 0x11, 0xbd, 0xcd, 0xf7, 0xf0, 0xbf, 0x9e, 0xba, 0xaf, 0x66, 0xe1, 0x64, 0x06, 0x4e, 0x6b, 0x48, 0x31, 0xd8, 0x06, 0x8b, 0x5c, 0x14, 0x33, 0x47, 0x78, 0xab, 0xd0, 0x56, 0x52, 0xd2, 0xf1, 0x0f, 0xc0, 0x12, 0xd2, 0x07, 0x8f, 0xe7, 0xe9, 0x85, 0x6f, 0x17, 0x6d, 0xa5, 0x7e, 0xdf, 0xff, 0xd1, 0xb8, 0x12, 0x74, 0x0d, 0xf6, 0xd2, 0xcb, 0xc3, 0xae, 0x8c, 0x3a, 0x5e, 0xcf, 0x46, 0x6f, 0xb3, 0xc1, 0xfb, 0x87, 0xcd, 0x8c, 0x93, 0xf3, 0x10, 0x90, 0x2a, 0xea, 0x9d, 0x92, 0x38, 0x75, 0x07, 0x91, 0x7b, 0x5b, 0x5d, 0x64, 0x32, 0x63, 0x28, 0x58, 0xbf, 0x5c, 0xb4, 0x53, 0x6c, 0x1a, 0xcc, 0x95, 0xbb, 0x54, 0xb0, 0x81, 0x0a, 0xb8, 0x65, 0xf2, 0x71, 0x66, 0xa7, 0x84, 0x71, 0x20, 0x5b, 0x6c, 0x0e, 0x1b, 0xeb, 0x4d, 0xe0, 0xbd, 0x72, 0xa8, 0x9a, 0x6f, 0x6a, 0x44, 0x6d, 0xcc, 0x13, 0xdf, 0x5b, 0x76, 0xd8, 0x54, 0x0d, 0xee, 0xc9, 0xdd, 0x48, 0x1f, 0x80, 0xb2, 0x22, 0x20, 0xb7, 0xc4, 0x3a, 0x91, 0x34, 0x06, 0x97, 0xc2, 0xbb, 0xe8, 0x5f, 0x30, 0x4e, 0x3a, 0x2a, 0xb7, 0x26, 0xe8, 0x7e, 0xb9, 0xfc, 0x84, 0x04, 0x6e, 0xab, 0x93, 0x92, 0xd6, 0x18, 0xfc, 0x51, 0x52, 0x8d, 0x84, 0x45, 0x71, 0x0a, 0x6f, 0x38, 0x37, 0x40, 0x94, 0xc9, 0xbc, 0xa3, 0x87, 0x50, 0xaa, 0x3b, 0x76, 0xab, 0xb4, 0xc3, 0xa4, 0xf4, 0xa6, 0x07, 0xfe, 0x15, 0xac, 0x81, 0x31, 0x4b, 0xfa, 0xcb, 0x5e, 0xa1, 0xb3, 0x3a, 0x77, 0xc9, 0x85, 0xd8, 0xa7, 0x34, 0xf5, 0xf1, 0x06, 0x99, 0x20, 0x05, 0x50, 0xeb, 0x6d, 0x67, 0x2c, 0x51, 0xb8, 0x21, 0xe3, 0x79, 0x40, 0x18, 0x83, 0xbf, 0xa5, 0xe2, 0x9e, 0xb2, 0x9e, 0xc6, 0x58, 0x8d, 0xb6, 0x4b, 0xa8, 0xa6, 0x86, 0x16, 0xcb, 0x8f, 0x67, 0x00, 0xa5, 0x5c, 0x45, 0xdd, 0x46, 0x7b, 0xb3, 0x34, 0xd7, 0x55, 0x63, 0xfc, 0x2a, 0x3f, 0x6d, 0x24, 0xda, 0xd0, 0xf1, 0x5c, 0xe5, 0xbc, 0x80, 0xce, 0x09, 0x4d, 0xcf, 0x96, 0x6e, 0xfb, 0xb1, 0x69, 0xcd, 0xbb, 0x8e, 0x12, 0xfc, 0xb0, 0xe7, 0x39, 0xaf, 0xe8, 0x04, 0xea, 0x2a, 0xbd, 0x11, 0x2e, 0x14, 0xa8, 0x6b, 0x87, 0x4a, 0xe8, 0xda, 0xd2, 0xd2, 0xc1, 0x3b, 0x35, 0x9b, 0x25, 0xb2, 0x18, 0x23, 0xd4, 0xb6, 0xb6, 0x33, 0x53, 0x34, 0xbc, 0xb6, 0x3f, 0x25, 0xc5, 0x68, 0x1f, 0xe7, 0xcb, 0x1e, 0x1e, 0xeb, 0x33, 0x80, 0x7f, 0xa2, 0x29, 0x3e, 0xa7, 0xb6, 0xfb, 0x02, 0xfe, 0x71, 0xbc, 0x9a, 0x4d, 0x22, 0x9c, 0x7e, 0x4f, 0x7d, 0xe3, 0x9e, 0x5e, 0x19, 0x20, 0xf1, 0x59, 0x71, 0xd8, 0x23, 0x58, 0xbb, 0xd1, 0x04, 0x9e, 0xdf, 0x0d, 0x4b, 0x72, 0x94, 0x7c, 0xb4, 0x41, 0xbe, 0x64, 0x2d, 0x88, 0x5d, 0x2e, 0x29, 0x08, 0x96, 0xcf, 0xb8, 0xa9, 0x38, 0x2d, 0x84, 0x7f, 0xec, 0xa8, 0xf3, 0x54, 0x4d, 0x36, 0xc8, 0x3a, 0x3c, 0x3a, 0x3d, 0xdb, 0x60, 0xf7, 0x2e, 0x08, 0x19, 0xd4, 0x6a, 0xe8, 0x12, 0xb5, 0x75, 0x2b, 0xd1, 0xaa, 0xc5, 0xea, 0xd8, 0x75, 0x2e, 0xe0, 0x61, 0x25, 0xc9, 0x86, 0x92, 0x07, 0x6f, 0x7d, 0x4f, 0xd4, 0xda, 0x0c, 0x47, 0xa0, 0xbf, 0xb4, 0x08, 0x97, 0xe5, 0xb1, 0x4c, 0x3a, 0xac, 0xd3, 0xc4, 0xec, 0x5c, 0x2a, 0x6e, 0x3d, 0xb3, 0xf8, 0xf0, 0x7b, 0xdf, 0x02, 0xfa, 0xd9, 0x03, 0x10, 0x96, 0x52, 0x3b, 0xa7, 0x96, 0x51, 0x52, 0x87, 0xb1, 0x28, 0xf8, 0xd6, 0x74, 0x62, 0xa4, 0xfc, 0xa4, 0xd0, 0x5a, 0xbe, 0x9e, 0x9d, 0x72, 0x10, 0x92, 0xac, 0x85, 0x34, 0xfd, 0xcc, 0x1d, 0x1a, 0x37, 0xc7, 0xb0, 0x1e, 0xc2, 0xcc, 0x81, 0x85, 0x7b, 0x21, 0x97, 0xa1, 0x7e, 0x9a, 0xe4, 0x6d, 0x62, 0x93, 0x26, 0xcd, 0x19, 0xfc, 0x81, 0x36, 0xe9, 0x8f, 0x7a, 0x36, 0xd9, 0x22, 0x6e, 0x35, 0x1a, 0xae, 0x5f, 0xfb, 0x9d, 0xf1, 0xf3, 0x19, 0x40, 0x40, 0x4f, 0xab, 0xb7, 0xe2, 0xe7, 0x6e, 0x23, 0xe6, 0x11, 0xa1, 0x87, 0x13, 0x1d, 0x9b, 0xc0, 0x21, 0x9c, 0x7c, 0x6a, 0xfb, 0x5b, 0xc0, 0x53, 0x07, 0x09, 0xd0, 0x57, 0xa6, 0x82, 0xe8, 0x64, 0x61, 0x4b, 0x7c, 0x01, 0xa7, 0x58, 0xfe, 0xd8, 0x7a, 0x0d, 0x05, 0xf1, 0xda, 0xc3, 0x40, 0xf7, 0x3a, 0xd5, 0x8e, 0xba, 0xae, 0xe2, 0x5c, 0xf6, 0x4b, 0x13, 0x09, 0xba, 0x99, 0xb4, 0x97, 0x4d, 0x69, 0xd2, 0x8b, 0x94, 0x5d, 0x2d, 0x15, 0x60, 0xad, 0xb0, 0x4e, 0xfc, 0x07, 0xef, 0x0d, 0xb5, 0x4a, 0x84, 0x59, 0x2d, 0xb9, 0x53, 0x9e, 0x3c, 0x89, 0xbb, 0x24, 0x77, 0x88, 0x63, 0x88, 0xa4, 0x2f, 0x11, 0x5d, 0x7c, 0xd4, 0xd0, 0xf5, 0x89, 0x39, 0xc1, 0x95, 0xde, 0x39, 0x40, 0x53, 0xd6, 0xff, 0x46, 0x17, 0x83, 0x27, 0x94, 0x33, 0xb6, 0xb9, 0x0c, 0xe8, 0x28, 0xb0, 0xc9, 0xc7, 0x96, 0x3e, 0xdd, 0xb9, 0x64, 0x9d, 0xee, 0x99, 0x59, 0x88, 0x59, 0xfe, 0x99, 0x3e, 0xaa, 0xd8, 0xaf, 0x62, 0x6e, 0xb9, 0xc9, 0xb1, 0x86, 0x5a, 0xba, 0xa7, 0x9a, 0xbf, 0xf7, 0x58, 0xff, 0xb1, 0xe2, 0x6d, 0x31, 0x7f, 0x3a, 0xde, 0x51, 0x95, 0x4e, 0x60, 0x9b, 0x53, 0x29, 0x83, 0xd3, 0x8e, 0xf2, 0x47, 0x6f, 0x86, 0x99, 0x89, 0xfb, 0x7d, 0x3b, 0x6d, 0x85, 0xe0, 0xb0, 0x32, 0x0b, 0x26, 0xcb, 0x5f, 0xb8, 0xc7, 0x2d, 0x57, 0xe1, 0xe2, 0x44, 0x81, 0x0a, 0x0b, 0xd4, 0x21, 0x0b, 0x4d, 0x68, 0xfe, 0x31, 0x21, 0x25, 0x8e, 0xfc, 0x38, 0xe2, 0x69, 0x32, 0x67, 0xff, 0x43, 0xbd, 0xc3, 0x7e, 0x3c, 0x0d, 0x7f, 0x6a, 0x70, 0x31, 0x9b, 0x41, 0x45, 0xa9, 0x53, 0x1a, 0x62, 0xa2, 0xaf, 0x03, 0x45, 0xe2, 0xf4, 0x13, 0x04, 0x47, 0xf9, 0x52, 0x05, 0xf5, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x20, 0xa4, 0x0f, 0x2b, 0x24, 0x82, 0x3a, 0x10, 0xf0, 0xcc, 0x73, 0x05, 0x2a, 0x3a, 0x68, 0xdc, 0xd3, 0x1b, 0x96, 0x77, 0x74, 0x51, 0x86, 0x4d, 0xd8, 0x66, 0x59, 0xd5, 0xa6, 0x31, 0x22, 0x48, 0x96, 0x55, 0x98, 0xd0, 0xb6, 0x5b, 0x1a, 0xbd, 0xe4, 0x97, 0x27, 0x3a, 0xc8, 0x39, 0x64, 0x7b, 0x1e, 0x6e, 0x84, 0x92, 0x38, 0xff, 0xb6, 0xcf, 0xc8, 0x4f, 0x4c, 0x47, 0xd3, 0xea, 0x8b, 0xa4, 0xcd, 0xa4, 0x17, 0x8c, 0x14, 0x2e, 0xb2, 0xec, 0x18, 0x3f, 0xa6, 0x6c, 0x8c, 0xae, 0x93, 0x1a, 0x26, 0xd6, 0x5f, 0x7e, 0x1d, 0x88, 0x40, 0x81, 0x85, 0xf9, 0x14, 0x70, 0xf3, 0xbf, 0xd6, 0x4a, 0xdd, 0x90, 0x51, 0x88, 0x0e, 0x90, 0x89, 0x9c, 0x95, 0xec, 0x3c, 0xa1, 0xeb, 0xb6, 0x52, 0x30, 0x3c, 0xd1, 0x0f, 0xb8, 0xf3, 0xbf, 0x42, 0x87, 0x98, 0x0b, 0xad, 0xdf, 0xe7, 0x07, 0x6c, 0x05, 0xf5, 0xd8, 0xb8, 0xce, 0x4e, 0xdc, 0xa9, 0xb2, 0x7d, 0xeb, 0xc1, 0x1d, 0xae, 0x82, 0xbe, 0x15, 0x4a, 0x72, 0xb6, 0x15, 0x0f, 0x75, 0x93, 0xb7, 0x59, 0x4e, 0x22, 0x9e, 0x62, 0xab, 0x81, 0xc7, 0xb0, 0xa9, 0xb7, 0xbb, 0x8c, 0x45, 0x3d, 0x04, 0xcc, 0x1f, 0x15, 0x1a, 0xef, 0x5b, 0x89, 0x77, 0x87, 0xfb, 0x61, 0x91, 0x5d, 0x96, 0x2a, 0x28, 0x39, 0xd4, 0xa2, 0xfc, 0xfa, 0x5b, 0x74, 0x93, 0x30, 0x6c, 0x74, 0x50, 0x2b, 0x26, 0x25, 0xd2, 0xdb, 0xf2, 0xa8, 0xcf, 0xa1, 0x67, 0xe8, 0x63, 0x0e, 0xd8, 0x56, 0xbc, 0x2b, 0xa7, 0x7e, 0x78, 0xa8, 0xaf, 0xe0, 0xf2, 0x04, 0xed, 0xe2, 0xdd, 0xfb, 0xf2, 0x8a, 0x04, 0xf9, 0xdf, 0xba, 0x0e, 0x42, 0x2b, 0xaf, 0xeb, 0xca, 0x17, 0x36, 0x67, 0x5b, 0xf3, 0x93, 0x23, 0x64, 0xeb, 0x9e, 0xd0, 0x3e, 0x51, 0x5d, 0xb7, 0x18, 0x4e, 0x09, 0x2a, 0x91, 0x80, 0xca, 0x73, 0x3b, 0x3f, 0xd6, 0x8e, 0x40, 0xa1, 0x74, 0xd0, 0x03, 0xed, 0xdd, 0x99, 0xe3, 0x87, 0x30, 0x54, 0x65, 0xe8, 0x8b, 0x32, 0x1e, 0xff, 0xa2, 0x1e, 0x25, 0xe7, 0x96, 0xfc, 0xe1, 0xb4, 0x1c, 0xfc, 0x0d, 0x41, 0x48, 0xda, 0x8a, 0x5a, 0x4a, 0x43, 0x50, 0xe6, 0x8b, 0xfb, 0x41, 0xcc, 0xa5, 0xbc, 0x38, 0xc1, 0xc0, 0x8e, 0x11, 0x8d, 0x5f, 0xd9, 0x60, 0x8f, 0x7c, 0xb8, 0x86, 0x51, 0xdc, 0x07, 0x0a, 0xfc, 0x06, 0x48, 0xb4, 0x4b, 0xe2, 0x25, 0x1f, 0x89, 0xd0, 0xcd, 0xcf, 0x92, 0x60, 0xf9, 0x63, 0x31, 0xb1, 0x2b, 0x7c, 0x86, 0x7a, 0xb0, 0x7d, 0x4d, 0x4d, 0x9a, 0xb6, 0x67, 0xa5, 0x48, 0x02, 0x04, 0x53, 0x13, 0x4d, 0x44, 0x86, 0x0d, 0x3d, 0xc0, 0x8b, 0x86, 0x36, 0xfd, 0x50, 0x98, 0x42, 0x18, 0x2f, 0xe3, 0x48, 0x01, 0xed, 0xd8, 0xbf, 0x68, 0x42, 0xde, 0x08, 0xe2, 0xe0, 0xb0, 0x9d, 0x81, 0x05, 0x4b, 0x5b, 0x4d, 0xcc, 0xa4, 0x14, 0xf8, 0x09, 0x73, 0x62, 0xaa, 0x83, 0x27, 0x49, 0x67, 0x75, 0x61, 0xae, 0x6a, 0xa3, 0xf6, 0xa1, 0x87, 0x45, 0x9f, 0x29, 0x99, 0xa5, 0xba, 0x4c, 0x07, 0x5d, 0xb1, 0x42, 0x49, 0x68, 0x94, 0xb8, 0xf9, 0xa0, 0x3c, 0x89, 0xc7, 0x09, 0xa5, 0x0e, 0x62, 0xa6, 0x33, 0xd0, 0x79, 0xf3, 0xd4, 0xc2, 0x72, 0xcb, 0x6b, 0x97, 0xa8, 0x83, 0x92, 0xa1, 0x43, 0xc2, 0x26, 0x50, 0x48, 0xd0, 0x2f, 0x63, 0x5f, 0xff, 0x46, 0xac, 0x7b, 0xe0, 0xe6, 0x4d, 0x8a, 0x2f, 0xb6, 0xf0, 0xfc, 0x58, 0x06, 0xde, 0x5e, 0x42, 0xef, 0x15, 0x74, 0x8b, 0xc4, 0x9e, 0x32, 0x97, 0x19, 0x15, 0x9f, 0x7d, 0x3f, 0xe9, 0xe7, 0x0d, 0x47, 0xd3, 0x6b, 0xad, 0xaf, 0x58, 0x02, 0x5a, 0xd0, 0xb5, 0xa9, 0x94, 0xd8, 0xd4, 0xae, 0xb1, 0xab, 0x93, 0x0f, 0x1b, 0xb4, 0xcb, 0xf7, 0x13, 0x2e, 0x25, 0x80, 0x61, 0x32, 0x47, 0x7c, 0x5a, 0xfa, 0x08, 0x9b, 0x65, 0x42, 0xaf, 0xec, 0x65, 0xaf, 0x7d, 0xb3, 0x87, 0x04, 0xc2, 0x35, 0xb0, 0x23, 0xa4, 0x54, 0xfc, 0xb6, 0x9f, 0x9b, 0xa8, 0xfb, 0x21, 0x6f, 0x51, 0x57, 0x00, 0xb8, 0x9a, 0x48, 0x53, 0x18, 0x69, 0xc1, 0xdc, 0x12, 0x4b, 0xb5, 0x87, 0x3a, 0x5f, 0x48, 0x8f, 0x43, 0xfd, 0x67, 0x51, 0x24, 0x8b, 0xd9, 0xf5, 0xc8, 0xfd, 0xa2, 0x99, 0xac, 0xbd, 0x46, 0x5d, 0x8e, 0xa7, 0xe4, 0x40, 0x2b, 0x27, 0x77, 0x63, 0x3a, 0xbe, 0x03, 0xaf, 0x73, 0x3e, 0xdc, 0xae, 0x6f, 0xea, 0xf0, 0xe2, 0xa0, 0xc5, 0x81, 0xd5, 0x77, 0x72, 0x19, 0x2b, 0x3c, 0x1c, 0xc1, 0xd3, 0xf4, 0xda, 0xf1, 0x6b, 0xbc, 0x3a, 0xd9, 0x0b, 0x8f, 0x28, 0xaa, 0x50, 0x49, 0x0b, 0xda, 0x3f, 0x53, 0x40, 0xf3, 0x73, 0x4e, 0x41, 0x98, 0x96, 0x67, 0x0a, 0xc4, 0x98, 0xd6, 0x1d, 0xae, 0x57, 0xbe, 0x82, 0x77, 0x87, 0x5d, 0xb5, 0xfe, 0x90, 0xe0, 0xd6, 0x85, 0x34, 0x6d, 0x78, 0xf0, 0x7e, 0xba, 0xed, 0x2b, 0xf2, 0xb7, 0xe4, 0x00, 0xee, 0x6e, 0xd2, 0x57, 0x6b, 0xbc, 0xcd, 0x31, 0x20, 0xbd, 0xbe, 0x8f, 0xc4, 0x8a, 0x34, 0x8b, 0x50, 0xfe, 0x7d, 0x3a, 0x57, 0xf1, 0x75, 0x69, 0xa6, 0xdd, 0xf3, 0xae, 0x77, 0x14, 0x98, 0x25, 0x9b, 0xe0, 0x11, 0x68, 0x66, 0xa7, 0xbf, 0xc7, 0x0e, 0xb3, 0x75, 0xd5, 0x2b, 0x44, 0x27, 0xd6, 0x9c, 0x7f, 0x32, 0x9c, 0x54, 0x3e, 0x1c, 0x6b, 0xa6, 0x20, 0x9d, 0xd8, 0xbf, 0x4b, 0xf1, 0x30, 0x48, 0x8b, 0x0a, 0x6d, 0x92, 0x21, 0x5c, 0xd3, 0x21, 0x0a, 0x25, 0x54, 0x3b, 0xa0, 0x15, 0xc8, 0x73, 0xf5, 0x38, 0xce, 0xff, 0x96, 0xf9, 0xbb, 0xbb, 0x3e, 0x9b, 0xba, 0x08, 0x24, 0xcd, 0x14, 0x77, 0x2e, 0xc6, 0x3e, 0x2d, 0x30, 0x19, 0x2c, 0xd5, 0x6a, 0x1e, 0x6d, 0x16, 0x78, 0xa8, 0x9b, 0xca, 0x44, 0x51, 0x74, 0x3b, 0x0e, 0x76, 0x07, 0xf1, 0x81, 0x8f, 0x43, 0x44, 0xf1, 0xf5, 0xab, 0x6e, 0x0a, 0x9b, 0xbb, 0xf7, 0xf6, 0xfb, 0xba, 0x2a, 0x9e, 0xc3, 0xa4, 0xc6, 0x9b, 0x78, 0x6c, 0x01, 0x37, 0x9b, 0x45, 0x2d, 0xee, 0x70, 0x32, 0xd8, 0x29, 0x98, 0xcb, 0x92, 0x42, 0x12, 0x2d, 0x31, 0x1d, 0xd5, 0x39, 0xa3, 0xac, 0x1e, 0x79, 0xb6, 0x54, 0x15, 0x97, 0x8b, 0xa2, 0x82, 0x12, 0xbc, 0xc6, 0x0c, 0x94, 0xcd, 0xcc, 0xe4, 0xb6, 0xda, 0x8d, 0x69, 0xe1, 0xa7, 0x65, 0x66, 0xad, 0x8d, 0xf1, 0x85, 0x6e, 0x1b, 0xd5, 0x9c, 0xf6, 0x45, 0x37, 0xd2, 0x8a, 0xc4, 0x3a, 0x80, 0x23, 0x3d, 0xa7, 0xa5, 0xa5, 0x92, 0x6a, 0xf7, 0x30, 0x06, 0x5f, 0xad, 0x19, 0x0f, 0x64, 0x2c, 0x37, 0xa5, 0xc1, 0xfb, 0xaa, 0x80, 0x6b, 0x71, 0xd8, 0x87, 0xb7, 0x11, 0x03, 0x66, 0x0b, 0x8c, 0xff, 0xc2, 0x16, 0x41, 0xe2, 0x5c, 0x6d, 0xdc, 0x0d, 0x51, 0x09, 0x9f, 0xae, 0xf7, 0x2a, 0xa8, 0x07, 0x91, 0xe4, 0x59, 0x9b, 0x32, 0xd8, 0x68, 0x50, 0x32, 0x99, 0x9f, 0x77, 0xe6, 0x91, 0xd5, 0x80, 0x33, 0xe7, 0xd8, 0x6d, 0xa9, 0xc9, 0xf2, 0xed, 0x7f, 0xd8, 0x15, 0x57, 0xd7, 0x5b, 0x4e, 0xa0, 0x9f, 0xee, 0x81, 0x8a, 0x3d, 0x6e, 0x51, 0x99, 0x3a, 0xdf, 0x33, 0xe3, 0x2b, 0xa2, 0x45, 0xd3, 0xb1, 0x4b, 0x77, 0x69, 0xcb, 0xee, 0x4a, 0xa8, 0x9d, 0x96, 0x8b, 0x97, 0x66, 0xd5, 0xd3, 0x11, 0xad, 0x7a, 0xd5, 0x3a, 0x45, 0x7b, 0x97, 0x00, 0x6f, 0x0f, 0x5b, 0x42, 0x78, 0x0d, 0xd8, 0xa6, 0xb1, 0xc7, 0xc1, 0xc0, 0x94, 0xe5, 0x2b, 0xcb, 0xc8, 0xea, 0x88, 0xa7, 0x9b, 0xf8, 0x6a, 0x6d, 0xfd, 0xf6, 0xf1, 0x05, 0x75, 0x59, 0xd1, 0xdf, 0xd5, 0xfc, 0xa2, 0x40, 0x48, 0x56, 0xba, 0x80, 0xc0, 0xac, 0x11, 0x32, 0x23, 0x4f, 0x36, 0xda, 0x8d, 0x14, 0x65, 0xdd, 0xda, 0x73, 0xcc, 0x04, 0x02, 0x8d, 0xc4, 0x66, 0xf1, 0x0b, 0x91, 0x65, 0xc7, 0xda, 0x5a, 0x42, 0x8a, 0x00, 0xbc, 0xf0, 0x96, 0x7a, 0xd8, 0x05, 0xd3, 0xe7, 0xa1, 0x16, 0xba, 0xbd, 0x2b, 0x38, 0x3d, 0x62, 0x76, 0xbf, 0x6e, 0x82, 0xdb, 0x56, 0xeb, 0x5c, 0x01, 0xd9, 0x58, 0x0d, 0x7e, 0x91, 0x33, 0xdd, 0x4c, 0x0c, 0x50, 0xcc, 0xdf, 0x7f, 0x11, 0x3a, 0x9a, 0x62, 0x21, 0xdb, 0x94, 0xe1, 0xdc, 0xbb, 0x86, 0x3f, 0x6d, 0x34, 0x42, 0x4b, 0xbb, 0x22, 0x4e, 0x1b, 0x7b, 0x6c, 0x75, 0x6f, 0x8c, 0xc0, 0xcf, 0x48, 0xe5, 0xc0, 0x53, 0xd5, 0x77, 0x2e, 0x58, 0x94, 0x36, 0x2c, 0xf0, 0xc8, 0x08, 0x55, 0xb2, 0xae, 0xec, 0x06, 0x8b, 0x1b, 0xa0, 0x51, 0x6f, 0x6b, 0xfa, 0x6f, 0xa0, 0x0a, 0xc5, 0x51, 0xf7, 0xe3, 0x21, 0x6d, 0x2b, 0x8c, 0x9d, 0x94, 0xe4, 0x9a, 0x26, 0xe5, 0x55, 0xdb, 0x35, 0xcf, 0x09, 0x8e, 0x2f, 0x59, 0x50, 0xa9, 0xd7, 0x4d, 0x92, 0xcf, 0x63, 0xfb, 0xc7, 0xe1, 0x41, 0xab, 0x1b, 0x77, 0xfe, 0xdc, 0xaf, 0x2e, 0x2a, 0x90, 0x50, 0x59, 0x73, 0x5b, 0x82, 0x34, 0x6a, 0xcd, 0xcf, 0x3c, 0x67, 0x3f, 0x1e, 0x8c, 0x02, 0xa0, 0x6b, 0xf2, 0xdb, 0x9e, 0xa3, 0xd0, 0xdd, 0xc2, 0x8b, 0x09, 0xf2, 0xb1, 0x17, 0x1c, 0x74, 0x38, 0x1e, 0xc1, 0xcf, 0x36, 0x25, 0x3d, 0x6f, 0x9c, 0x49, 0x79, 0x17, 0x73, 0xb6, 0x6f, 0x81, 0xf6, 0x65, 0xd7, 0xfa, 0xcd, 0x8a, 0x6f, 0x30, 0x42, 0x95, 0xf7, 0xa9, 0xa4, 0xeb, 0x4b, 0xae, 0x22, 0xab, 0x8b, 0x80, 0x38, 0x93, 0x5a, 0x63, 0x44, 0x61, 0x78, 0x54, 0xc6, 0x23, 0xe3, 0x47, 0xe6, 0x63, 0x23, 0x82, 0xb2, 0x53, 0x4b, 0x1b, 0xe2, 0x8f, 0xfe, 0x81, 0x21, 0xb4, 0xfd, 0x12, 0xb9, 0x4a, 0x84, 0x1c, 0xf8, 0x8a, 0xdd, 0x3c, 0xef, 0xef, 0x07, 0x35, 0x80, 0x90, 0x78, 0x03, 0x75, 0x46, 0xfb, 0x09, 0xf4, 0x18, 0x34, 0x70, 0x1c, 0xd8, 0xd7, 0x15, 0x30, 0xaa, 0x6e, 0x66, 0x1c, 0x2b, 0x62, 0x63, 0xd1, 0x28, 0x34, 0x37, 0x93, 0xb9, 0x83, 0x9f, 0x11, 0xae, 0xc5, 0x77, 0xdf, 0xf3, 0xdf, 0x2e, 0x22, 0x24, 0xf4, 0xe7, 0x3e, 0xb6, 0x14, 0x67, 0xc6, 0x4e, 0xae, 0x88, 0x19, 0xcb, 0x3a, 0x64, 0x34, 0xc8, 0xa2, 0xf6, 0xcb, 0x35, 0xc7, 0x93, 0x65, 0x65, 0xd7, 0xd9, 0x98, 0xa6, 0x93, 0xb1, 0xb7, 0xd3, 0xe0, 0xa9, 0x55, 0x02, 0x3f, 0xf9, 0x47, 0x01, 0x09, 0xa0, 0x92, 0xf0, 0x91, 0x98, 0xd4, 0x9b, 0xc8, 0xf1, 0x47, 0xf8, 0x19, 0x6b, 0x4c, 0xa0, 0x23, 0x67, 0xeb, 0xb5, 0xfa, 0x3b, 0xb1, 0x2b, 0xe0, 0xfb, 0x74, 0x7e, 0x3b, 0x58, 0x1a, 0xcf, 0x49, 0x24, 0xb0, 0x52, 0x44, 0x78, 0x8e, 0x06, 0xbf, 0x06, 0x4e, 0x3b, 0x24, 0x9f, 0x4c, 0x5a, 0x68, 0xd4, 0xef, 0x53, 0x4a, 0x4a, 0x85, 0x61, 0x7e, 0x45, 0x2d, 0x3f, 0x69, 0x2f, 0x6b, 0xa3, 0x2f, 0x24, 0x99, 0x9d, 0x45, 0x27, 0x71, 0xce, 0xd3, 0x2d, 0x9c, 0xa6, 0x7f, 0xd7, 0x74, 0x7a, 0x16, 0xd8, 0x07, 0x05, 0x94, 0x93, 0x4c, 0xc5, 0xb9, 0xe8, 0x45, 0xd4, 0x53, 0x65, 0x8b, 0xce, 0x08, 0x98, 0x45, 0xd9, 0x16, 0x0c, 0x45, 0xeb, 0x7a, 0xb3, 0x69, 0x70, 0xbd, 0xef, 0xbc, 0xcb, 0x6f, 0xaf, 0xfd, 0x67, 0x14, 0xcb, 0x34, 0xeb, 0x82, 0x45, 0xb7, 0x7f, 0x13, 0x24, 0xa0, 0xd2, 0x01, 0x86, 0x34, 0xb9, 0xa1, 0x79, 0x45, 0xe9, 0x01, 0x1e, 0x90, 0x01, 0x61, 0x6a, 0x19, 0xce, 0x50, 0xc0, 0xff, 0xc6, 0xb6, 0x83, 0x79, 0xf6, 0x2d, 0x6a, 0x83, 0x8c, 0x2a, 0x6a, 0xe3, 0xe9, 0x7c, 0x6c, 0x69, 0x60, 0xee, 0xb0, 0xaa, 0x14, 0x2a, 0x32, 0x64, 0x08, 0x92, 0x6c, 0x1f, 0x9b, 0xf7, 0xfe, 0xec, 0x46, 0x26, 0x90, 0xe0, 0x23, 0xa3, 0x29, 0xc7, 0x48, 0xde, 0x71, 0x18, 0x69, 0xe9, 0x26, 0x30, 0x01, 0x86, 0x46, 0xe4, 0x6a, 0xac, 0xa8, 0x2f, 0xf7, 0xd1, 0x5a, 0x71, 0xba, 0x6b, 0xa5, 0x20, 0xf1, 0x59, 0xe3, 0x45, 0xc2, 0x85, 0xe7, 0x98, 0xcc, 0x32, 0xef, 0xa8, 0x4b, 0xe9, 0xd3, 0xc6, 0x8e, 0x14, 0x87, 0xee, 0x06, 0xe6, 0xc0, 0x8e, 0x7a, 0xb9, 0x28, 0x71, 0x91, 0xdf, 0xe9, 0xc2, 0x0f, 0x2e, 0xa1, 0xc9, 0xf5, 0x1c, 0x69, 0x1a, 0x9f, 0xfb, 0x9b, 0x31, 0xcf, 0x25, 0xdb, 0xdc, 0x78, 0xb3, 0x12, 0x3a, 0x39, 0x78, 0xa7, 0xc6, 0xb6, 0x6f, 0x9d, 0x4b, 0x65, 0xdc, 0xf8, 0xcd, 0x67, 0x78, 0xee, 0xb0, 0x98, 0xb4, 0x05, 0xd6, 0x8f, 0x8b, 0xba, 0x65, 0x27, 0x07, 0xbf, 0x6a, 0x40, 0x94, 0xcc, 0x29, 0xb4, 0xe2, 0x5c, 0xb6, 0x42, 0x97, 0xb7, 0x0a, 0x98, 0x97, 0x5f, 0x86, 0xe2, 0x38, 0x4a, 0x39, 0xe3, 0x20, 0x00, 0xae, 0xe4, 0x78, 0xe4, 0xf0, 0xa0, 0x37, 0x11, 0xe1, 0x74, 0xad, 0xb4, 0x6e, 0x31, 0xad, 0xb5, 0xe9, 0xb1, 0x48, 0x44, 0x42, 0xbd, 0xc8, 0x25, 0x73, 0xd7, 0x45, 0x83, 0x85, 0x38, 0xfd, 0xcc, 0x69, 0xd4, 0xc7, 0x35, 0x2f, 0xb6, 0xd7, 0xcd, 0x6b, 0x8e, 0x87, 0x2d, 0xe3, 0x81, 0x44, 0x58, 0x16, 0x00, 0x88, 0x8e, 0x41, 0x13, 0xd1, 0xfe, 0x5a, 0xf7, 0xe1, 0x68, 0x5f, 0xeb, 0x0b, 0x04, 0x2e, 0x10, 0xf3, 0x67, 0xc2, 0xe3, 0x1c, 0xea, 0x3c, 0xf6, 0xc5, 0x4d, 0x85, 0x8c, 0x6e, 0x10, 0xa4, 0x52, 0x3f, 0xfd, 0x36, 0x45, 0xd8, 0x03, 0x45, 0xe8, 0xd5, 0x73, 0x1f, 0x00, 0x90, 0x3e, 0x7b, 0x9f, 0x4b, 0x2a, 0x59, 0x4a, 0x01, 0xfa, 0xfc, 0x7d, 0xe6, 0x9b, 0x08, 0x46, 0x0b, 0x20, 0x13, 0xdc, 0xaa, 0x86, 0x47, 0x17, 0x4a, 0xe8, 0xa9, 0xab, 0x16, 0x73, 0x45, 0xc7, 0xb5, 0x84, 0x1c, 0x36, 0x9f, 0x48, 0x89, 0x22, 0xe2, 0xf1, 0xd1, 0x62, 0x7c, 0xb8, 0x79, 0x6d, 0x97, 0x4a, 0x80, 0x6b, 0x69, 0x13, 0xb4, 0x7e, 0x21, 0x34, 0xe7, 0xb3, 0xf1, 0xe2, 0x9b, 0x1f, 0x53, 0x24, 0xcd, 0x07, 0x40, 0x92, 0xed, 0xf1, 0xb3, 0x91, 0x15, 0x76, 0xac, 0xdd, 0x1c, 0x3f, 0xb0, 0xdb, 0x73, 0xfd, 0xb2, 0x98, 0xa1, 0x87, 0x2d, 0xe8, 0x43, 0x19, 0x86, 0x4f, 0xe7, 0x22, 0x77, 0x25, 0x16, 0x10, 0x97, 0xfb, 0x02, 0x0a, 0x57, 0xb4, 0xa1, 0x34, 0x1f, 0x5e, 0x04, 0xea, 0xdc, 0x0b, 0xac, 0x41, 0x9d, 0xe0, 0xd2, 0x9e, 0x5c, 0x3f, 0x25, 0x0a, 0x1d, 0x0a, 0xf6, 0x36, 0x7b, 0xc7, 0x33, 0x16, 0xb0, 0xc3, 0xca, 0x36, 0x1c, 0xd8, 0xd3, 0x09, 0x72, 0xd2, 0xee, 0x00, 0x98, 0xea, 0x30, 0x06, 0x20, 0x5b, 0x15, 0x9a, 0xa0, 0x42, 0x60, 0x5d, 0x41, 0x9b, 0x37, 0xbe, 0x3c, 0x22, 0x2f, 0x15, 0xeb, 0x3e, 0x28, 0x24, 0x1d, 0x54, 0xb0, 0x0f, 0xd3, 0xba, 0xb3, 0x9c, 0xa7, 0x3f, 0x0e, 0x23, 0x35, 0xc3, 0x0e, 0x33, 0x98, 0x98, 0xf7, 0x08, 0xb0, 0x65, 0xd6, 0x3c, 0xdd, 0x58, 0x9c, 0x1c, 0x2c, 0xc2, 0x94, 0x0c, 0x86, 0x87, 0xab, 0x8a, 0x64, 0xd3, 0x88, 0x3b, 0x97, 0xb7, 0x31, 0x38, 0x1a, 0x08, 0xa2, 0x2f, 0xc9, 0xf1 }; +constexpr AccessUnit USER_DATA_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0xe6, 0xce, 0x63, 0xc5, 0xc9, 0x69, 0xbf, 0x14, 0xa4, 0x80, 0x23, 0x67, 0xff, 0x8f, 0x9f, 0x76, 0xf7, 0x10, 0x3e, 0xdb } }; + + +const std::vector ATRACX_SKIP_BYTES_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xf3, 0x3b, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0x7a, 0x01, 0xe0, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x1a, 0x00, 0x80, 0x20, 0x90, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xbd, 0x07, 0x5a, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xa7, 0xab, 0x1e, 0x73, 0x3b, 0x00, 0x4f, 0x02, 0xa0, 0x0f, 0xd0, 0x00, 0x52, 0x18, 0x4c, 0xe5, 0xfb, 0x25, 0x04, 0x81, 0xb1, 0x90, 0x29, 0x50, 0x65, 0x71, 0xac, 0x47, 0xdb, 0x51, 0x9e, 0x31, 0x43, 0xd2, 0x41, 0xc8, 0x06, 0xd3, 0xd3, 0x41, 0x13, 0x26, 0xef, 0xff, 0xba, 0x03, 0xc3, 0x38, 0x5c, 0xb5, 0x79, 0xb1, 0x88, 0x4e, 0x7c, 0xea, 0x44, 0x40, 0x9d, 0x56, 0x92, 0x3c, 0x21, 0x79, 0x83, 0xa9, 0x45, 0x10, 0x5c, 0x9c, 0xca, 0x93, 0x9c, 0x24, 0x89, 0xb5, 0xf5, 0x41, 0x2a, 0xc1, 0x70, 0xfa, 0x7d, 0xe3, 0x6c, 0x48, 0x0a, 0xc8, 0x16, 0xdf, 0xd9, 0x29, 0x95, 0xfc, 0x91, 0x18, 0x0c, 0xd4, 0x63, 0x3e, 0x1f, 0x3a, 0x60, 0x4b, 0xb2, 0x9b, 0x37, 0x4b, 0xf7, 0x70, 0x78, 0xb4, 0x19, 0xb9, 0xd4, 0x3f, 0x03, 0x28, 0xf7, 0x00, 0x22, 0x0b, 0xff, 0x39, 0x21, 0x23, 0xa0, 0xe5, 0xe9, 0xeb, 0x77, 0xfc, 0x81, 0x06, 0x32, 0xe0, 0x83, 0xde, 0x72, 0x7d, 0x49, 0x94, 0x98, 0x08, 0x0b, 0xde, 0xf1, 0x72, 0x8a, 0x78, 0xdb, 0xe9, 0x03, 0x2a, 0xe2, 0x03, 0x87, 0xa5, 0xf1, 0x77, 0xfb, 0xaa, 0x10, 0x78, 0x49, 0x3e, 0x53, 0x0c, 0x96, 0xe2, 0xe6, 0x08, 0x84, 0x11, 0x69, 0x78, 0xd1, 0x78, 0xff, 0xab, 0xd1, 0xa7, 0xc2, 0x20, 0xa5, 0x42, 0x88, 0x07, 0x2c, 0xd9, 0x1e, 0x2d, 0xf4, 0xf2, 0x72, 0x63, 0xcf, 0x01, 0x48, 0xce, 0xc1, 0x42, 0x74, 0xaf, 0x58, 0xb3, 0xbe, 0x85, 0xc7, 0xb8, 0xdb, 0x9f, 0x3b, 0x09, 0x2c, 0x86, 0x4d, 0x00, 0x2b, 0xcc, 0x88, 0x7d, 0xb5, 0x29, 0x5b, 0xc9, 0x94, 0xf4, 0x03, 0x57, 0x0c, 0x69, 0x32, 0x3a, 0x31, 0x3b, 0x88, 0xa8, 0x5e, 0x71, 0x1e, 0xf7, 0x16, 0x84, 0xc0, 0xd4, 0x0d, 0x3e, 0x90, 0xb4, 0x3b, 0xda, 0x28, 0xaf, 0x35, 0x4f, 0x8c, 0x56, 0x23, 0xe5, 0x65, 0x27, 0x0c, 0x62, 0x69, 0xad, 0x64, 0x76, 0xea, 0x82, 0x05, 0x44, 0xdd, 0xae, 0xf8, 0x18, 0xed, 0x25, 0xcd, 0xb2, 0x58, 0x50, 0x5a, 0xbd, 0xae, 0xf5, 0x15, 0x4a, 0xb7, 0xe7, 0x7d, 0x74, 0x0c, 0x40, 0x2b, 0x84, 0x3b, 0x20, 0x8c, 0x2e, 0x69, 0x36, 0x61, 0xc9, 0xdc, 0x7d, 0x78, 0x99, 0xe1, 0xf9, 0x49, 0x8e, 0xe4, 0x6c, 0x5e, 0x07, 0xce, 0x37, 0xbe, 0x86, 0xde, 0xec, 0xb7, 0x62, 0xa1, 0x51, 0xbf, 0xde, 0xce, 0xbd, 0x58, 0x37, 0x04, 0x20, 0x15, 0x90, 0xc9, 0x26, 0x45, 0xcd, 0x4f, 0x36, 0xd0, 0xc3, 0xc7, 0x46, 0x52, 0x4d, 0x51, 0xc0, 0x8c, 0x35, 0xd8, 0xfa, 0x97, 0xf5, 0x63, 0xf2, 0x92, 0xc2, 0xa1, 0x52, 0xac, 0x68, 0xce, 0xfd, 0xb9, 0xed, 0x25, 0x8f, 0xbf, 0xfb, 0x80, 0xa0, 0x26, 0x84, 0xe6, 0xbb, 0x75, 0x27, 0x14, 0x42, 0xd1, 0x4d, 0x53, 0xca, 0x9a, 0xf9, 0x22, 0x9a, 0xe2, 0xc6, 0x83, 0x51, 0xa2, 0x9b, 0xed, 0xf0, 0xd8, 0xf6, 0x45, 0xc4, 0xfe, 0xef, 0x50, 0xe5, 0x84, 0x4a, 0x7c, 0x50, 0x3a, 0x33, 0x07, 0xd0, 0xd2, 0x87, 0xcc, 0x38, 0xef, 0xba, 0x46, 0xa7, 0x61, 0xc6, 0x98, 0xce, 0x86, 0xb0, 0x9d, 0x7f, 0xf1, 0x88, 0x53, 0xf3, 0xca, 0xfa, 0x2e, 0x93, 0x96, 0xd3, 0x17, 0x2c, 0x46, 0x12, 0x2f, 0xe2, 0xc7, 0x60, 0x96, 0x45, 0x79, 0x0a, 0xc7, 0x5a, 0x36, 0xdf, 0x5a, 0x85, 0xd9, 0x8a, 0x2d, 0x94, 0x77, 0x42, 0x4d, 0x6f, 0xa1, 0xee, 0x1e, 0x1d, 0x7c, 0x1d, 0x9a, 0x1c, 0x75, 0x69, 0xa6, 0x55, 0xdf, 0x1b, 0xda, 0x16, 0xd1, 0x40, 0x34, 0xd9, 0xfa, 0x74, 0x94, 0xd2, 0x4f, 0x0f, 0xfe, 0x7d, 0xd0, 0x86, 0x02, 0xaf, 0xb5, 0x24, 0xb8, 0xdb, 0xc9, 0x6f, 0x3a, 0x8f, 0xd4, 0xe0, 0x98, 0x69, 0x39, 0xbc, 0x93, 0xf3, 0x42, 0x35, 0xaf, 0x2c, 0xbb, 0x2c, 0x66, 0xb7, 0xd2, 0x2b, 0x89, 0xed, 0x59, 0x7e, 0x1a, 0x4d, 0xea, 0x78, 0x28, 0x07, 0x87, 0x4f, 0x83, 0x98, 0xa8, 0x24, 0x47, 0xc2, 0xec, 0x0d, 0x90, 0x4a, 0xcb, 0x48, 0xed, 0x41, 0xfc, 0xf0, 0x45, 0xda, 0x7c, 0xcd, 0x58, 0xfa, 0x60, 0x14, 0x0d, 0x09, 0xdc, 0x49, 0x2e, 0xc1, 0x31, 0x8c, 0x53, 0xf0, 0x66, 0xe7, 0x05, 0x69, 0x00, 0x9b, 0x74, 0xab, 0x20, 0x5a, 0x38, 0xea, 0xb2, 0xf1, 0xfa, 0x86, 0x9f, 0xe7, 0x09, 0x1d, 0x28, 0xf7, 0x28, 0xc4, 0xd6, 0x7d, 0x1e, 0x0d, 0xb6, 0x34, 0xdc, 0xf2, 0xb8, 0xde, 0x3e, 0xc9, 0x72, 0xb8, 0xb7, 0xca, 0xa9, 0xd1, 0x6e, 0xda, 0x49, 0x9e, 0xa0, 0xa6, 0xc1, 0x70, 0x50, 0x36, 0xe8, 0x9b, 0x8d, 0x85, 0xdc, 0x7b, 0xdf, 0xd1, 0x7c, 0x9d, 0xa3, 0x9e, 0x7e, 0xc1, 0x6d, 0xb4, 0x34, 0x7a, 0xa4, 0x81, 0x81, 0x98, 0x01, 0xac, 0x9d, 0xb1, 0xa8, 0xce, 0x98, 0x64, 0xf4, 0x87, 0xcc, 0x38, 0x31, 0x78, 0xa2, 0x2e, 0xed, 0xd8, 0x5b, 0x5f, 0x85, 0x97, 0xca, 0x4d, 0x24, 0x5c, 0x2a, 0xb9, 0x5a, 0xcb, 0x77, 0x1c, 0xf6, 0xdd, 0x00, 0x22, 0xd7, 0x0f, 0xd0, 0x01, 0x00, 0xb5, 0xf3, 0xca, 0xde, 0xeb, 0x93, 0x07, 0x58, 0xd3, 0x9e, 0x57, 0xaf, 0x26, 0xe3, 0x44, 0x06, 0x5a, 0x2e, 0x14, 0xcd, 0xcb, 0x11, 0x4f, 0xe8, 0xce, 0x3a, 0x30, 0x44, 0xae, 0x50, 0x8b, 0xcf, 0xcb, 0x6f, 0x0e, 0x31, 0x51, 0xca, 0xfa, 0xc4, 0x53, 0x05, 0xa4, 0xa3, 0x35, 0x42, 0x6a, 0xce, 0xab, 0x0c, 0xeb, 0xc4, 0xc4, 0x84, 0xa8, 0x05, 0xc4, 0x84, 0x5e, 0x5c, 0xbe, 0xa6, 0xc8, 0xf9, 0x37, 0x48, 0x8a, 0x9b, 0x40, 0x1c, 0x7f, 0x69, 0xd1, 0xc5, 0xac, 0x37, 0x56, 0x98, 0x89, 0x48, 0xaf, 0x86, 0x65, 0xda, 0x20, 0xbd, 0x1f, 0x0d, 0xe8, 0x8d, 0x73, 0xe0, 0x84, 0x9c, 0x83, 0x63, 0xcb, 0x79, 0x84, 0x62, 0x73, 0x0c, 0x91, 0x13, 0xa7, 0x86, 0x18, 0x97, 0xba, 0xc6, 0x6c, 0x54, 0x29, 0x52, 0x6a, 0x7f, 0x6a, 0x5a, 0x34, 0x58, 0x48, 0x75, 0x78, 0xe3, 0xc5, 0xef, 0xcb, 0x37, 0xbe, 0xf1, 0x08, 0x9e, 0xc9, 0xd4, 0xb1, 0x21, 0x15, 0x64, 0xd2, 0x40, 0x3b, 0xe3, 0xe7, 0xe8, 0x43, 0x17, 0xa9, 0xf7, 0x54, 0xb1, 0xe8, 0xcf, 0xd5, 0xd4, 0xbc, 0xce, 0xed, 0x91, 0xb4, 0xb5, 0xa9, 0x93, 0xe5, 0x3e, 0x44, 0x63, 0xe3, 0x88, 0x3e, 0xef, 0x0d, 0x05, 0x54, 0x3a, 0xcc, 0x0c, 0x88, 0x73, 0x92, 0x57, 0xb3, 0xc8, 0xc1, 0xef, 0x64, 0xb3, 0xd2, 0x5e, 0x07, 0xa4, 0x54, 0x2f, 0x8c, 0x36, 0xb0, 0x02, 0x0c, 0x59, 0xae, 0xcf, 0x29, 0x2a, 0x3b, 0x0b, 0x24, 0x49, 0xf5, 0xde, 0xe9, 0xf7, 0x5b, 0x8d, 0x7e, 0x5b, 0xc9, 0xcb, 0xae, 0x91, 0x8f, 0xa3, 0xc6, 0x83, 0xc7, 0x0c, 0xc8, 0xa5, 0xbe, 0x81, 0x6b, 0x0d, 0x1e, 0x11, 0xc1, 0x8f, 0x17, 0xcf, 0x70, 0xc2, 0x40, 0x8d, 0xb9, 0x29, 0xfe, 0x56, 0xd4, 0xda, 0x8f, 0x09, 0x50, 0x60, 0x10, 0x00, 0x80, 0xb9, 0x2a, 0xc7, 0x23, 0x9f, 0x2d, 0x22, 0xcf, 0x88, 0xc5, 0x00, 0xd6, 0x09, 0x9c, 0x1d, 0x9f, 0x8d, 0x8d, 0x60, 0xb2, 0x81, 0x38, 0x47, 0xf4, 0x68, 0x23, 0xe1, 0xcc, 0x85, 0xb1, 0x2f, 0x2f, 0x08, 0xa1, 0xf0, 0xc8, 0xd8, 0xdb, 0x25, 0xcc, 0x86, 0xb4, 0xde, 0x1b, 0xf8, 0x0b, 0x18, 0xbc, 0xc4, 0xc1, 0xaf, 0xee, 0x6c, 0x8b, 0xc7, 0x43, 0xdc, 0x1c, 0x23, 0x88, 0xdc, 0x16, 0x3c, 0x6f, 0x63, 0x54, 0x28, 0x45, 0xf6, 0x6b, 0x99, 0x18, 0x7b, 0x86, 0x84, 0x27, 0x31, 0xe8, 0x36, 0x78, 0xb6, 0xc5, 0xe6, 0xf0, 0x4c, 0x3b, 0x11, 0x4b, 0xc3, 0x94, 0x30, 0xcb, 0xb1, 0x25, 0x87, 0x83, 0xf3, 0x6d, 0x26, 0x8b, 0x95, 0x46, 0x64, 0x8e, 0x8c, 0x54, 0x5e, 0x75, 0xfb, 0xfb, 0x43, 0x26, 0xe5, 0x86, 0x86, 0x99, 0x76, 0x53, 0x35, 0xb7, 0x5c, 0x29, 0xfe, 0xc4, 0xc7, 0x09, 0xc4, 0x51, 0x16, 0x1a, 0xb6, 0xf2, 0x44, 0x96, 0x41, 0x2d, 0x92, 0xc0, 0x6a, 0x64, 0x13, 0x52, 0x5b, 0xbe, 0x07, 0xf5, 0x25, 0x34, 0x33, 0xa0, 0x15, 0x59, 0x9a, 0xfd, 0x16, 0x83, 0x54, 0x2f, 0xfc, 0x62, 0x5b, 0x90, 0xb6, 0x34, 0x85, 0x4c, 0xbb, 0x17, 0x1a, 0xed, 0x3e, 0x39, 0xa8, 0x3d, 0xf2, 0xdc, 0x08, 0x07, 0x6b, 0x6c, 0xbf, 0xb3, 0x69, 0x25, 0x25, 0xb6, 0x97, 0xfe, 0x03, 0x4b, 0x8c, 0xe4, 0x87, 0x05, 0x19, 0x6e, 0xd1, 0x1a, 0x34, 0x93, 0x67, 0x84, 0x00, 0x19, 0x5f, 0x4f, 0xce, 0xbf, 0x06, 0xb5, 0x15, 0x51, 0x4c, 0xe2, 0xbd, 0x33, 0x59, 0x7e, 0x32, 0x0e, 0xf1, 0x52, 0x22, 0xa9, 0x93, 0xb3, 0xe7, 0x23, 0x91, 0x78, 0xe3, 0x0b, 0x6f, 0xb0, 0x6e, 0x10, 0x50, 0x62, 0x09, 0x4b, 0x53, 0xfc, 0xf4, 0x58, 0xff, 0x46, 0x70, 0xc2, 0x46, 0x02, 0x2e, 0x70, 0xb0, 0x80, 0xc5, 0x26, 0xab, 0xdb, 0x39, 0x3a, 0x25, 0xa2, 0xcf, 0x0f, 0xd9, 0x21, 0xd6, 0x0e, 0x08, 0x92, 0x11, 0x08, 0x76, 0xdd, 0xed, 0x59, 0xf1, 0xbd, 0xb5, 0x30, 0xae, 0x75, 0x63, 0xc6, 0x47, 0x53, 0xcc, 0x75, 0x31, 0xbe, 0x3e, 0xfb, 0xe1, 0x97, 0xd7, 0x52, 0x05, 0x0c, 0x1c, 0xe5, 0x85, 0x40, 0xa9, 0x21, 0x2b, 0x5c, 0xf8, 0x8f, 0x30, 0xe9, 0x94, 0x04, 0x0a, 0x8d, 0x40, 0x94, 0x2f, 0x8d, 0xe3, 0x55, 0xb7, 0xa4, 0x3a, 0x17, 0x0a, 0x1a, 0xab, 0xa9, 0x04, 0x28, 0xb9, 0x4d, 0x3c, 0x10, 0xe8, 0x66, 0x5e, 0x84, 0x23, 0x9c, 0xbb, 0x2e, 0xe8, 0xe5, 0x85, 0x84, 0xc8, 0x45, 0x57, 0x35, 0x0b, 0x25, 0x08, 0xd8, 0x84, 0x9e, 0xdd, 0xb4, 0xd2, 0x10, 0x9b, 0xb1, 0xb8, 0xe1, 0x15, 0xea, 0x37, 0x4c, 0x33, 0x60, 0x8e, 0x83, 0x8a, 0xb6, 0x60, 0xa1, 0xfe, 0x17, 0x8e, 0x24, 0x21, 0x94, 0x99, 0xed, 0x20, 0xa9, 0x85, 0x07, 0x89, 0xae, 0xa4, 0xa5, 0x44, 0x67, 0xb9, 0x20, 0x6d, 0xfb, 0x55, 0xe9, 0x01, 0x02, 0x6e, 0xad, 0x83, 0x6f, 0x7f, 0x28, 0x0a, 0x89, 0xbe, 0x64, 0x63, 0x3b, 0x34, 0x56, 0x2f, 0x6a, 0xbe, 0x2d, 0x30, 0x1a, 0x4f, 0xab, 0x2c, 0x8e, 0xef, 0x6d, 0x13, 0xb4, 0x54, 0xf9, 0x52, 0x7f, 0x0c, 0xe6, 0x85, 0x0a, 0x9d, 0x8f, 0xf0, 0x9f, 0x16, 0x19, 0x67, 0xfa, 0xd9, 0xae, 0x99, 0x71, 0xc0, 0x4d, 0xea, 0xca, 0xd3, 0x89, 0x36, 0xee, 0x24, 0x11, 0x4c, 0xc8, 0x9a, 0xdd, 0xe5, 0xef, 0xc4, 0x5d, 0x61, 0xfd, 0xe6, 0x0f, 0xab, 0xa4, 0xe6, 0x3d, 0xea, 0xea, 0xd8, 0xe6, 0xf9, 0x1a, 0x33, 0x09, 0xc1, 0x56, 0x08, 0xca, 0xf7, 0xd3, 0xb2, 0x35, 0xcf, 0x31, 0xe3, 0x97, 0xac, 0x71, 0x09, 0xa8, 0xdc, 0x81, 0x58, 0x04, 0xec, 0x66, 0x15, 0xad, 0x20, 0x63, 0xd5, 0x95, 0x19, 0xc4, 0xd2, 0x69, 0xb5, 0x19, 0x95, 0x1c, 0xb8, 0x0e, 0x89, 0xe9, 0xca, 0x2a, 0x3c, 0xd0, 0xce, 0x23, 0x5d, 0xbf, 0xae, 0x93, 0xc7, 0xef, 0x14, 0x36, 0x1e, 0x2a, 0xaf, 0x05, 0xca, 0xf3, 0xfb, 0xd1, 0x6b, 0xd5, 0xb9, 0x33, 0xf8, 0x51, 0x76, 0xf1, 0x2d, 0x21, 0xda, 0x35, 0x07, 0xd3, 0xa5, 0x2d, 0x5b, 0xfd, 0x86, 0xf6, 0xdb, 0x75, 0x3e, 0xeb, 0x0c, 0x5a, 0xaf, 0xb2, 0x02, 0xdf, 0xd3, 0xa9, 0xe1, 0x1d, 0xb4, 0x87, 0x83, 0x62, 0xe5, 0x55, 0xb7, 0xb3, 0x16, 0x16, 0xfc, 0x90, 0xc0, 0xb6, 0xaf, 0x24, 0x03, 0x2e, 0x0e, 0x5f, 0x33, 0xde, 0x84, 0xc5, 0xb0, 0x90, 0x1d, 0xda, 0x0a, 0xb6, 0x2b, 0x73, 0x81, 0xbd, 0x5a, 0x68, 0x68, 0x97, 0xd1, 0x5a, 0x05, 0xd4, 0x23, 0x9b, 0xe2, 0xeb, 0x1a, 0x56, 0xbc, 0x84, 0xb0, 0x99, 0x73, 0xed, 0xb9, 0xd9, 0xb4, 0x0a, 0x11, 0x0a, 0x3d, 0x68, 0x54, 0x6c, 0xf0, 0x40, 0x78, 0xa1, 0x1b, 0x95, 0xbd, 0xb7, 0xa3, 0xbe, 0xdd, 0x2b, 0x02, 0xfe, 0x71, 0x1d, 0x39, 0x08, 0xe5, 0x33, 0x32, 0x7b, 0x77, 0xe8, 0x30, 0xcf, 0x24, 0x39, 0x3b, 0x31, 0x7b, 0x04, 0xc2, 0x40, 0xa9, 0x72, 0xc9, 0xb4, 0x4c, 0x4c, 0x60, 0x62, 0xda, 0x1c, 0x49, 0x24, 0x9d, 0x64, 0xf7, 0x89, 0xa3, 0x64, 0x59, 0x6d, 0x1b, 0x25, 0x78, 0xd1, 0xf5, 0xd5, 0x0b, 0x89, 0xd3, 0x97, 0xb0, 0xb0, 0x8f, 0x60, 0xf6, 0xdc, 0xe9, 0x81, 0x20, 0x96, 0x21, 0xee, 0x16, 0x95, 0x9a, 0x7d, 0x68, 0x9d, 0xb6, 0x82, 0x81, 0x2d, 0x96, 0xab, 0xaf, 0x45, 0x72, 0xee, 0xe3, 0xeb, 0xa2, 0xea, 0x65, 0x47, 0x9f, 0x17, 0xd6, 0x78, 0x8d, 0xa0, 0x3c, 0x73, 0x0e, 0xc5, 0xfd, 0x8e, 0x7a, 0x1a, 0xf0, 0x9f, 0xbe, 0x0c, 0xfb, 0xaa, 0x70, 0x77, 0xe1, 0xa8, 0xe1, 0x3c, 0x32, 0xd4, 0x43, 0x20, 0x7f, 0x82, 0x23, 0x64, 0x53, 0x7a, 0xca, 0xd8, 0x7f, 0x53, 0x4d, 0x68, 0xc3, 0x51, 0x60, 0x55, 0xe9, 0xaa, 0x2d, 0xa2, 0xca, 0x55, 0xc0, 0x6a, 0xed, 0xb7, 0xd9, 0x17, 0x96, 0xca, 0x25, 0xc6, 0x92, 0x9f, 0x38, 0x3b, 0x0b, 0x54, 0xc2, 0x3e, 0x2a, 0xd9, 0xe2, 0x43, 0x63, 0x22, 0x87, 0xa9, 0x9f, 0xa1, 0x4c, 0x08, 0xa7, 0x24, 0x37, 0x48, 0x8c, 0x75, 0x48, 0x7e, 0xe6, 0x51, 0xcc, 0xc9, 0x24, 0xa2, 0xcf, 0xb3, 0x4f, 0xff, 0x2f, 0xc8, 0xf0, 0xe8, 0x22, 0x65, 0x0d, 0x4b, 0x3b, 0xf7, 0x54, 0x2a, 0x35, 0x28, 0xfc, 0x92, 0x14, 0xbd, 0xec, 0x28, 0x6c, 0x11, 0x29, 0xf6, 0xcd, 0x7b, 0xb1, 0x52, 0xad, 0x05, 0x25, 0xf6, 0x5b, 0x52, 0xfa, 0xaa, 0xb8, 0x84, 0x21, 0x18, 0xdc, 0x82, 0x3d, 0xad, 0xd7, 0x0d, 0xe9, 0x9c, 0x2f, 0x54, 0xaf, 0x5a, 0xdc, 0x18, 0x9d, 0x47, 0xd4, 0x92, 0xa9, 0x3c, 0x6d, 0x92, 0x46, 0x3a, 0x26, 0x9a, 0xe4, 0x89, 0xa3, 0xf5, 0x38, 0xda, 0xe0, 0xf4, 0x83, 0x59, 0xf7, 0xe9, 0x42, 0xc3, 0xf0, 0x7e, 0xec, 0xdb, 0x7e, 0x7b, 0xb1, 0xd7, 0x9f, 0x29, 0x6d, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x79, 0x01, 0x00, 0x00, 0x24, 0xff, 0xdb, 0x8c, 0xe6, 0x0a, 0xfa, 0x51, 0x85, 0xb8, 0xdb, 0x2d, 0x4f, 0x23, 0x96, 0x35, 0xb2, 0x4b, 0x26, 0x29, 0x13, 0x41, 0x05, 0xb5, 0x52, 0x96, 0xed, 0xe2, 0x23, 0x2f, 0xc8, 0x03, 0xd7, 0xf8, 0xc1, 0x9e, 0x30, 0x12, 0xf0, 0x30, 0x52, 0x75, 0x34, 0xcb, 0x09, 0x30, 0x0c, 0xd7, 0xd4, 0xa7, 0x9a, 0x96, 0x86, 0x8e, 0x28, 0x1a, 0x63, 0x7e, 0xc7, 0xd1, 0x04, 0x56, 0xe1, 0xee, 0x7c, 0xd4, 0xeb, 0x28, 0x70, 0x11, 0x7d, 0xbc, 0x2a, 0xcd, 0x7a, 0xa3, 0xe0, 0xb2, 0x22, 0x4e, 0xa5, 0x07, 0x24, 0x82, 0xc4, 0x6d, 0x12, 0x09, 0x88, 0x9f, 0xd7, 0x5d, 0x9d, 0x62, 0xfa, 0x7f, 0x96, 0x02, 0xde, 0x9d, 0x49, 0x19, 0x51, 0x47, 0x08, 0x89, 0x03, 0x3f, 0xe2, 0xc6, 0xcb, 0x32, 0x79, 0xf2, 0xca, 0xea, 0x23, 0x67, 0xd5, 0xc1, 0x50, 0x9e, 0xb6, 0x58, 0x6c, 0xaa, 0x26, 0xf7, 0xcb, 0xa2, 0xa1, 0x05, 0x44, 0xad, 0x60, 0x77, 0x8e, 0xa8, 0x26, 0x3b, 0x7e, 0x7d, 0xba, 0xed, 0xc9, 0xa4, 0x16, 0x62, 0xdd, 0x7a, 0xc6, 0xd0, 0xec, 0x53, 0xfd, 0xa9, 0x53, 0x7a, 0x3e, 0x6d, 0xe5, 0x8a, 0xc1, 0xfd, 0xcc, 0xc4, 0xe2, 0x46, 0xfd, 0x5d, 0x42, 0x48, 0x8a, 0xdd, 0x6a, 0xbf, 0x32, 0x0d, 0x16, 0x0d, 0x0e, 0x19, 0x81, 0x1b, 0x31, 0xca, 0x4d, 0x4b, 0x98, 0x10, 0xdd, 0xc9, 0xd5, 0x44, 0x4e, 0xb3, 0x2f, 0xcd, 0x56, 0x03, 0x3f, 0x0f, 0xb7, 0x2b, 0x3c, 0xdd, 0x17, 0xbc, 0x75, 0xd0, 0x5c, 0xa7, 0xb8, 0x2a, 0xe5, 0xda, 0x9a, 0x44, 0x48, 0x4d, 0xe6, 0x9f, 0x62, 0xc8, 0xac, 0x0e, 0xdb, 0xec, 0xa1, 0xa5, 0x79, 0x50, 0xde, 0x57, 0xea, 0xbd, 0x31, 0x6d, 0xc5, 0xca, 0x76, 0x45, 0xfe, 0x7d, 0xc0, 0x07, 0x12, 0x9a, 0x43, 0x36, 0x95, 0xd2, 0x4b, 0x4e, 0xf1, 0xfd, 0xa1, 0xd8, 0x80, 0xff, 0x39, 0xa2, 0x53, 0x24, 0x0b, 0x05, 0x44, 0xea, 0x6a, 0x6b, 0x37, 0xa6, 0x3e, 0x77, 0x96, 0x71, 0xee, 0x7e, 0x71, 0x3c, 0xf0, 0x49, 0xe0, 0x11, 0x39, 0x3a, 0x72, 0xcb, 0x0f, 0x49, 0xda, 0xd9, 0xf2, 0x8b, 0x29, 0xc8, 0x99, 0x1b, 0x32, 0xb4, 0x4b, 0xaf, 0xf8, 0xde, 0xfa, 0x26, 0x42, 0xf9, 0xf1, 0xd0, 0xab, 0xf3, 0x05, 0x58, 0xd6, 0x53, 0x87, 0x70, 0x8e, 0x6e, 0x75, 0xbb, 0x08, 0xf9, 0xab, 0x9d, 0x8a, 0xdb, 0x00, 0xd0, 0x25, 0x2f, 0x9b, 0x00, 0x55, 0xd6, 0xfa, 0xc5, 0xa3, 0x1e, 0x5a, 0xb5, 0xaf, 0x47, 0x8d, 0x75, 0x2b, 0xf9, 0x6d, 0xf3, 0xb7, 0xf1, 0x75, 0x3a, 0xaf, 0x74, 0x28, 0x87, 0x46, 0x50, 0x5b, 0x8e, 0x92, 0x85, 0x88, 0x1c, 0x5f, 0xc6, 0xb4, 0x7d, 0xe1, 0x7f, 0x9e, 0x56, 0xb0, 0x16, 0x34, 0xe4, 0x96, 0x75, 0x8c, 0xbc, 0x20, 0x37, 0xd6, 0x89, 0xf6, 0xf0, 0x11, 0x6e, 0x71, 0x6d, 0x6b, 0xf4, 0xf3, 0xf1, 0xa1, 0xb4, 0xec, 0xb7, 0xbf, 0x28, 0xa4, 0x4d, 0x15, 0x52, 0x23, 0x8f, 0x4d, 0x1e, 0xd3, 0x4f, 0xe4, 0xb4, 0xc0, 0xf5, 0x83, 0x1d, 0x89, 0xaa, 0xef, 0xea, 0x63, 0xcc, 0x93, 0xd5, 0xc3, 0xc6, 0xda, 0x6d, 0x95, 0x8b, 0xd9, 0x56, 0x1c, 0x4f, 0xfe, 0xb9, 0xc3, 0x37, 0xce, 0xcf, 0x9f, 0x1f, 0xdd, 0xbc, 0x52, 0xb3, 0x8a, 0x1f, 0x99, 0x71, 0x32, 0x07, 0xba, 0x5b, 0xdb, 0x37, 0x83, 0x67, 0x8d, 0xe0, 0xb8, 0xf4, 0xe2, 0x4c, 0xf9, 0xde, 0x79, 0x14, 0x90, 0xe7, 0x50, 0xd8, 0xbe, 0x97, 0x40, 0xa6, 0x56, 0xd0, 0x1f, 0x6e, 0xd9, 0xaa, 0x2f, 0x46, 0x55, 0x5e, 0xee, 0x54, 0xba, 0x4d, 0x74, 0x9a, 0x77, 0x79, 0xe0, 0x00, 0x71, 0xe7, 0x8c, 0x5b, 0xca, 0xc9, 0x10, 0x4e, 0xf6, 0x78, 0x3c, 0x39, 0x10, 0x7d, 0x97, 0x9a, 0x81, 0x4d, 0x1b, 0x99, 0x58, 0x69, 0x1c, 0x9c, 0xf0, 0x06, 0xb1, 0x1d, 0xb6, 0x77, 0xfa, 0x1e, 0x40, 0xed, 0x20, 0xfc, 0xfa, 0x60, 0xf1, 0x79, 0x14, 0x99, 0x62, 0x30, 0x87, 0xbf, 0x6e, 0xea, 0x4d, 0xe4, 0x12, 0x69, 0x2e, 0x68, 0x59, 0xb1, 0xb1, 0x32, 0xc6, 0xdd, 0x1f, 0x1b, 0x7d, 0x06, 0xa2, 0x06, 0x02, 0xdb, 0xe8, 0x7f, 0x79, 0xd5, 0xe5, 0xe5, 0xaa, 0x3b, 0x86, 0x6f, 0x42, 0x56, 0x7e, 0x91, 0x13, 0x93, 0x81, 0x99, 0x3d, 0x69, 0x8f, 0x87, 0x9e, 0x43, 0x20, 0x6a, 0xdb, 0xcb, 0x59, 0xdb, 0xe3, 0x4c, 0xa5, 0x4e, 0xd0, 0x14, 0x3d, 0x5c, 0x6c, 0xfc, 0x9d, 0x3b, 0xd7, 0x8e, 0xd6, 0x06, 0x01, 0x66, 0x43, 0x8e, 0x04, 0xd0, 0x1f, 0xcc, 0x83, 0xad, 0xea, 0x3b, 0xa8, 0x35, 0xad, 0xab, 0x59, 0x1a, 0x81, 0x4b, 0xc5, 0x1a, 0xf3, 0x0f, 0x69, 0x0b, 0x20, 0xa4, 0x12, 0xf1, 0x9f, 0x8c, 0xa5, 0xa7, 0xa7, 0x2e, 0x8c, 0x23, 0xfa, 0xdf, 0x27, 0x6c, 0x73, 0x3a, 0x9c, 0xbf, 0x66, 0x46, 0xdd, 0x84, 0x14, 0x44, 0xca, 0xff, 0xe2, 0x26, 0xc0, 0xf3, 0x25, 0xff, 0xff, 0x96, 0xa3, 0xfe, 0xa8, 0x8e, 0x27, 0xb2, 0x5a, 0xd5, 0xbc, 0xb0, 0x9d, 0xc4, 0x73, 0xe5, 0x95, 0x99, 0xd2, 0x14, 0xcb, 0x3a, 0x38, 0x5f, 0xf4, 0x10, 0xe8, 0xdb, 0xfa, 0x32, 0x88, 0x77, 0xcc, 0x47, 0x34, 0xcd, 0x9a, 0xc6, 0x7f, 0xaa, 0x96, 0x8d, 0x07, 0x45, 0x5d, 0xef, 0x6a, 0x90, 0x93, 0xa7, 0xc4, 0x0d, 0x66, 0x64, 0x0b, 0x14, 0xfc, 0xce, 0xe9, 0x7e, 0x00, 0x3d, 0xea, 0x07, 0xcc, 0x80, 0x25, 0xfc, 0xee, 0x70, 0xaf, 0xf7, 0x0b, 0x26, 0x7f, 0xb7, 0x44, 0x1b, 0x97, 0x62, 0xba, 0x81, 0x91, 0xc0, 0xd2, 0x9b, 0xf1, 0x30, 0x41, 0xed, 0xcb, 0x71, 0x20, 0x79, 0xac, 0x82, 0x75, 0x74, 0xcd, 0x24, 0xfd, 0x20, 0xfc, 0xd1, 0x29, 0xae, 0xce, 0x31, 0x92, 0x67, 0x01, 0x57, 0x54, 0x71, 0x14, 0x4e, 0x19, 0xee, 0x8f, 0xd2, 0xc5, 0x56, 0x7a, 0x2b, 0x0d, 0x42, 0xf8, 0x8d, 0x63, 0x08, 0x0a, 0x6f, 0xff, 0xdd, 0xee, 0xc0, 0x04, 0x67, 0xa1, 0xf6, 0xeb, 0xe9, 0x71, 0x3e, 0xce, 0x78, 0xaa, 0x6e, 0x27, 0xde, 0xd0, 0x6f, 0x2d, 0x26, 0xe5, 0x37, 0xdd, 0xe8, 0xb7, 0xa1, 0x54, 0xd6, 0x3a, 0x9d, 0x16, 0x25, 0x51, 0xa5, 0x53, 0xc9, 0xa8, 0x59, 0x58, 0xab, 0x74, 0xba, 0xb7, 0x48, 0x36, 0x69, 0xcf, 0x61, 0xe2, 0xcf, 0xc2, 0xac, 0xfe, 0x34, 0x0a, 0xad, 0x9a, 0x0b, 0x2b, 0x2c, 0x43, 0x04, 0x44, 0xe7, 0x37, 0xb0, 0x72, 0x7d, 0x99, 0xc4, 0x44, 0x0f, 0xd0, 0x43, 0xc5, 0x4a, 0x1d, 0x1c, 0xc5, 0xe3, 0x38, 0x0f, 0x73, 0x6e, 0xbc, 0xd5, 0x71, 0xc8, 0x15, 0xed, 0xee, 0x0a, 0x8b, 0x8a, 0x70, 0x88, 0xf3, 0x68, 0x61, 0x63, 0x2c, 0xb4, 0x80, 0xd4, 0x3e, 0x24, 0xd0, 0x9a, 0x49, 0xfb, 0xa3, 0x40, 0x89, 0x9f, 0xd1, 0x25, 0x1b, 0xdf, 0x57, 0x65, 0x5e, 0x3d, 0xc9, 0x26, 0xff, 0xab, 0x66, 0xde, 0x1f, 0xa9, 0xc3, 0x8d, 0x1e, 0xb8, 0x41, 0x12, 0xf5, 0x7c, 0xd6, 0x06, 0x29, 0x0b, 0xe5, 0xcb, 0xce, 0x43, 0x12, 0xbc, 0x19, 0x30, 0x60, 0xa2, 0x71, 0xc3, 0x09, 0xeb, 0x0e, 0x77, 0xd5, 0x38, 0x96, 0x9f, 0xe1, 0x42, 0x31, 0x77, 0x1d, 0x3c, 0x1c, 0x3f, 0xf6, 0x13, 0xae, 0xe5, 0xed, 0x4b, 0x47, 0x14, 0x10, 0x55, 0xba, 0xb4, 0x97, 0x93, 0x0d, 0x1d, 0x22, 0x76, 0xae, 0x92, 0x50, 0x53, 0x79, 0xcd, 0xa6, 0xfc, 0x29, 0xaa, 0x12, 0x1e, 0x16, 0x34, 0x76, 0xf7, 0x4e, 0xb7, 0x00, 0xf8, 0x75, 0x7d, 0x47, 0x43, 0x04, 0x6f, 0x6a, 0x3f, 0xb7, 0xbc, 0xab, 0x97, 0x55, 0x34, 0x4e, 0x66, 0x2c, 0x0b, 0xa1, 0x6a, 0xd0, 0x1c, 0x7f, 0x7a, 0x09, 0xf7, 0xbe, 0xa0, 0x03, 0x43, 0x48, 0x81, 0x20, 0x41, 0xdb, 0x11, 0x03, 0x78, 0xab, 0xa1, 0xb5, 0xe6, 0x5e, 0xd6, 0x00, 0x29, 0x2b, 0x17, 0x59, 0x81, 0x07, 0x6e, 0xf2, 0xae, 0x2a, 0x05, 0xdd, 0xf6, 0x5b, 0xab, 0x4c, 0xe0, 0xd2, 0x09, 0x51, 0x72, 0x91, 0x79, 0xc4, 0xfa, 0x91, 0xa7, 0x12, 0xb3, 0x1a, 0x6b, 0x2e, 0xd0, 0x25, 0x83, 0xea, 0xaf, 0xb0, 0x1f, 0x60, 0x57, 0x3a, 0x68, 0x40, 0x76, 0xfe, 0x6d, 0x29, 0x77, 0x8e, 0x25, 0x58, 0x79, 0xd3, 0x6d, 0x5c, 0x33, 0xb5, 0x36, 0xa0, 0x12, 0xe1, 0x44, 0xe5, 0x1d, 0x61, 0x3a, 0x12, 0x66, 0x16, 0xc7, 0xef, 0x1d, 0x3b, 0x40, 0xa5, 0x8c, 0x7b, 0xee, 0x22, 0x85, 0x52, 0xe0, 0xc6, 0x12, 0xad, 0x12, 0xe1, 0x76, 0x17, 0x24, 0xf0, 0xc4, 0xda, 0x03, 0xaa, 0x99, 0xe4, 0x40, 0x44, 0xcd, 0x59, 0xe6, 0x79, 0x1f, 0x1d, 0x1e, 0x3f, 0x26, 0xcc, 0xe8, 0x40, 0x1d, 0xd8, 0xb7, 0x72, 0x4e, 0xd3, 0xc0, 0x6e, 0x2b, 0x18, 0x3b, 0x5a, 0x5d, 0x51, 0xfd, 0x8c, 0x5e, 0x9b, 0x0d, 0x39, 0x5f, 0x3e, 0x2e, 0xda, 0x8d, 0x36, 0x87, 0x08, 0x02, 0x0c, 0xcd, 0x10, 0xe4, 0xbc, 0x9d, 0x77, 0x91, 0x99, 0x03, 0x23, 0xcc, 0x7e, 0x3d, 0xfb, 0x48, 0xb3, 0x3c, 0x18, 0x1e, 0x54, 0x8d, 0xee, 0xea, 0x2c, 0x85, 0xf3, 0xac, 0x3c, 0xf5, 0xbf, 0xb3, 0x7d, 0xbe, 0xa6, 0x15, 0x7f, 0xf8, 0x33, 0x94, 0xf9, 0x9d, 0x21, 0xe7, 0x73, 0xda, 0xb0, 0xc1, 0x94, 0x7e, 0x65, 0x1b, 0xc4, 0x20, 0xa2, 0x90, 0x2e, 0x06, 0xa9, 0xd5, 0x4d, 0xd4, 0xe4, 0xa1, 0x83, 0x94, 0x97, 0x7d, 0x88, 0xa1, 0x48, 0x62, 0x92, 0x81, 0x91, 0x21, 0x87, 0xbb, 0x1e, 0xdb, 0xa9, 0x33, 0x08, 0x2e, 0x80, 0x9b, 0xda, 0xc7, 0xf6, 0x00, 0xe5, 0x75, 0xe8, 0x86, 0xbe, 0x07, 0xa7, 0xda, 0xfd, 0x7d, 0x1f, 0xe8, 0x9e, 0x5d, 0xa5, 0xd8, 0x9d, 0x2f, 0xab, 0x7b, 0xad, 0x7a, 0xcf, 0x82, 0x20, 0xc2, 0x05, 0x46, 0x5f, 0x5a, 0xd5, 0xf4, 0x94, 0x0c, 0xf2, 0x60, 0x54, 0xf5, 0x96, 0xd0, 0x75, 0x0d, 0x71, 0x8d, 0x5d, 0x38, 0x17, 0x00, 0x74, 0xdc, 0x35, 0xa8, 0x87, 0x57, 0x03, 0x45, 0x4a, 0xd8, 0xb1, 0xdc, 0x3d, 0x67, 0xc4, 0x9b, 0xa7, 0x2f, 0xb2, 0xaa, 0x76, 0x4d, 0x20, 0x6a, 0x23, 0xb5, 0x8f, 0xc8, 0xf6, 0xfc, 0x72, 0x88, 0x48, 0x07, 0xdf, 0xc7, 0x9d, 0x00, 0x69, 0x08, 0xac, 0x02, 0xc7, 0x8d, 0xc5, 0x60, 0x5f, 0xde, 0x13, 0x88, 0xd6, 0xa2, 0xb4, 0xc8, 0x3b, 0x4f, 0xab, 0x94, 0x70, 0x41, 0x1a, 0x05, 0xe4, 0x35, 0x52, 0xa4, 0xc8, 0x4d, 0xa1, 0xd7, 0x46, 0x0d, 0xed, 0x6a, 0x70, 0xff, 0x8b, 0x0d, 0xe5, 0xdb, 0xd1, 0xd2, 0x6d, 0x79, 0x64, 0xf0, 0xfe, 0xdb, 0x38, 0x5b, 0xeb, 0x19, 0xc0, 0x03, 0x3f, 0x00, 0xcc, 0xb9, 0x73, 0xa6, 0x0b, 0x11, 0x07, 0x4b, 0x3a, 0xca, 0xb6, 0x48, 0x67, 0x86, 0x3a, 0xe7, 0xde, 0xe0, 0xec, 0x54, 0x9f, 0x25, 0xa7, 0x1d, 0x78, 0x50, 0xbf, 0xdf, 0x22, 0xfb, 0xf8, 0x15, 0xf4, 0x60, 0xc4, 0x31, 0x16, 0xb6, 0x39, 0x6a, 0x42, 0x73, 0x88, 0xf6, 0x77, 0x3b, 0xe6, 0x86, 0x3b, 0x95, 0x2b, 0x4c, 0x43, 0x9a, 0x97, 0xd9, 0x9d, 0x4e, 0x8c, 0x9b, 0xbf, 0x46, 0x2a, 0xd6, 0x0f, 0xc9, 0x07, 0x41, 0xc3, 0xa5, 0x8f, 0xc8, 0x39, 0x48, 0xb9, 0x07, 0x1a, 0xee, 0x15, 0x74, 0xed, 0xea, 0x65, 0x6e, 0xf1, 0x57, 0x51, 0x86, 0x5c, 0xc1, 0xd8, 0xc7, 0x59, 0x8f, 0x91, 0xd5, 0x62, 0x36, 0xe9, 0x1e, 0xd4, 0x8e, 0xe0, 0x78, 0xd7, 0xc2, 0x02, 0xf0, 0xf5, 0xb5, 0x95, 0xa0, 0xfc, 0xed, 0x3c, 0xbb, 0x0f, 0x37, 0x7f, 0x50, 0xf1, 0xac, 0x0c, 0x50, 0xf7, 0xd7, 0x90, 0xdd, 0x39, 0xff, 0x7d, 0x01, 0xd1, 0xf8, 0x26, 0x3d, 0x59, 0xeb, 0xfc, 0x9a, 0xf0, 0xfb, 0xdc, 0x2b, 0x77, 0xbe, 0xb3, 0x29, 0xc6, 0xe9, 0xee, 0x17, 0x17, 0xa5, 0x75, 0x99, 0xe3, 0x72, 0x2d, 0xea, 0xe3, 0x8e, 0x39, 0x1c, 0x06, 0x3b, 0x81, 0x93, 0x7d, 0x65, 0x28, 0x60, 0x39, 0x7e, 0x00, 0x6d, 0x6d, 0x93, 0x33, 0xa1, 0x04, 0xf0, 0x8e, 0x6f, 0x13, 0xd5, 0x44, 0x78, 0xac, 0x08, 0x10, 0x2c, 0xb3, 0x62, 0xf8, 0x8f, 0x81, 0x85, 0x33, 0xa6, 0x89, 0x63, 0xe8, 0x13, 0x3f, 0x4f, 0xbe, 0xf0, 0xf4, 0xb3, 0x87, 0xff, 0x7a, 0xa5, 0x73, 0x9e, 0xa9, 0xfa, 0x8f, 0x37, 0x24, 0x97, 0x88, 0x07, 0xff, 0x0e, 0xf7, 0x74, 0x17, 0xd7, 0xa3, 0x58, 0x44, 0xac, 0x83, 0xf6, 0xb6, 0xd7, 0x75, 0x73, 0x24, 0x7c, 0xe1, 0x14, 0x9e, 0x32, 0xd8, 0xa1, 0x24, 0x66, 0x4e, 0x94, 0x62, 0x6d, 0x86, 0x16, 0x23, 0x38, 0xd8, 0xd4, 0x5f, 0x07, 0x5b, 0x3f, 0xfa, 0x9d, 0x26, 0xc1, 0x98, 0xce, 0x28, 0xe8, 0x1c, 0x5f, 0xd4, 0xa7, 0xa8, 0x96, 0x18, 0x27, 0x51, 0xff, 0x60, 0xc2, 0xbf, 0x31, 0xa1, 0x23, 0x7e, 0x9c, 0xa3, 0xaf, 0xb4, 0xbd, 0x0b, 0xa5, 0x7b, 0x25, 0xdf, 0xa2, 0x21, 0x43, 0x80, 0x75, 0xfa, 0xe0, 0x59, 0x6f, 0x97, 0xa5, 0xb3, 0x93, 0x82, 0x3f, 0x84, 0x65, 0xdc, 0xd9, 0x11, 0x30, 0x72, 0x09, 0xc0, 0xf8, 0x36, 0x77, 0x84, 0x86, 0x1b, 0xc8, 0xa1, 0x37, 0xd1, 0x99, 0xc8, 0x77, 0xe6, 0x98, 0xcb, 0x1a, 0x2d, 0x07, 0x50, 0xfe, 0x8f, 0x34, 0x61, 0x99, 0x99, 0xb2, 0xb5, 0x71, 0x67, 0x60, 0xff, 0x96, 0xc8, 0x87, 0xbe, 0x95, 0xb2, 0x9f, 0x43, 0x95, 0x6d, 0x86, 0xf1, 0x7a, 0x07, 0x35, 0xeb, 0x49, 0xed, 0x36, 0xb6, 0x32, 0xcf, 0x7f, 0x80, 0xeb, 0x1d, 0x5d, 0x0f, 0x4f, 0xc8, 0x9a, 0x92, 0x64, 0x11, 0x12, 0xd4, 0x37, 0x9b, 0x54, 0x81, 0x44, 0xfd, 0x15, 0x8d, 0x42, 0x8b, 0x76, 0xdd, 0x92, 0x23, 0x83, 0xd3, 0xb0, 0x22, 0x57, 0x4e, 0x5e, 0xd4, 0xcf, 0x43, 0x67, 0x03, 0xc1, 0x0e, 0x31, 0x7e, 0x10, 0x03, 0x86, 0xb8, 0x28, 0xfb, 0x40, 0xce, 0xa3, 0xd4, 0xc5, 0xa2, 0x32, 0x2a, 0x7c, 0xdb, 0x0f, 0xb6, 0xab, 0xea, 0x84, 0x1b, 0x68, 0x6b, 0x4e, 0x1c, 0x89, 0x8b, 0xf3, 0x6f, 0xc0, 0x3e, 0x51, 0xaf, 0x4f, 0x6c, 0xef, 0x32, 0xf9, 0x70, 0xe3, 0xa3, 0x2f, 0x81, 0x50, 0xbe, 0x86, 0xe7, 0xd4, 0x95, 0x0b, 0x0b, 0x66, 0x1e, 0xf2, 0xd5, 0x78, 0x08, 0xb9, 0xd8, 0x64, 0x11, 0xc9, 0x43, 0x74, 0x5f, 0x14, 0x9e, 0x10, 0x8f, 0x54, 0xb7, 0xdb, 0x78, 0xdc, 0x63, 0xcd, 0xe8, 0x21, 0xdc, 0x9b, 0xc9, 0x6a, 0xf1, 0xed, 0x70, 0x5b, 0x48, 0x3d, 0x18, 0x30, 0x64, 0x5a, 0xb8, 0xf6, 0x47, 0xef, 0xbe, 0x0a, 0xbb, 0x87, 0x5c, 0xa8, 0xbd, 0xe6, 0x78, 0x61, 0x82, 0xbb, 0x5d, 0xb1, 0x14, 0x05, 0xcd, 0x1a, 0x8a, 0xa1, 0x0d, 0x75, 0x3f, 0xe1, 0x02, 0x5c, 0xaf, 0x31, 0x8a, 0xe7, 0xc3, 0x0c, 0x99, 0x1c, 0xb3, 0xe5, 0xca, 0xc1, 0xdd, 0xb2, 0x6a, 0x83, 0x21, 0x3e, 0x36, 0x8f, 0xad, 0x84, 0x44, 0x1d, 0x46, 0x99, 0xd7, 0x86, 0x78, 0xfd, 0x1f, 0xdb, 0x3c, 0x57, 0x10, 0x2e, 0xf8, 0xe8, 0xe3, 0xe6, 0xfa, 0x4c, 0xea, 0xe0, 0xb8, 0x41 }; +constexpr AccessUnit ATRACX_SKIP_BYTES_EXPECTED_AU = { 0x15f90, 0x153d5, false, 0, {}, { 0x8a, 0x7b, 0xc9, 0x69, 0xee, 0xca, 0xcb, 0xab, 0xc6, 0x61, 0xa1, 0xf4, 0x75, 0x2e, 0x59, 0xb5, 0xf2, 0x90, 0x9d, 0x29 } }; + +const std::vector AC3_SKIP_BYTES_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xf3, 0x3b, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0x7a, 0x01, 0xe0, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x1a, 0x00, 0x80, 0x20, 0x90, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xbd, 0x07, 0x5a, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xa7, 0xab, 0x1e, 0x73, 0x3b, 0x30, 0x05, 0x05, 0x00, 0x0b, 0x77, 0xf4, 0x4b, 0x1b, 0x17, 0x5a, 0xaf, 0x1a, 0x24, 0x2c, 0x25, 0xa4, 0x37, 0x51, 0x53, 0xb0, 0x42, 0x4c, 0x69, 0x01, 0x21, 0x3f, 0x19, 0xf9, 0xfe, 0x1f, 0x8c, 0x15, 0x45, 0x98, 0xc8, 0x74, 0xa5, 0x58, 0x15, 0xba, 0xfd, 0xc4, 0x76, 0xf0, 0x2d, 0x4c, 0x44, 0x42, 0x21, 0xe0, 0x5a, 0xa7, 0xab, 0x3c, 0x92, 0xdf, 0xdf, 0x11, 0x67, 0x62, 0x1a, 0x35, 0xf5, 0x0b, 0xea, 0x6d, 0xc4, 0xb5, 0x70, 0x78, 0xfd, 0x0b, 0xfc, 0x67, 0x0b, 0x41, 0x02, 0x74, 0xba, 0x7d, 0x9c, 0xd8, 0x5a, 0x13, 0x3c, 0x59, 0x7a, 0xf9, 0x42, 0x91, 0x37, 0x02, 0xa3, 0x29, 0x4c, 0xc0, 0xc1, 0x7c, 0x3e, 0x2f, 0x2e, 0x6c, 0x62, 0x7b, 0x04, 0x54, 0xa4, 0x88, 0xeb, 0x67, 0x33, 0x0b, 0x1e, 0xe5, 0x8a, 0x60, 0xf1, 0xec, 0x79, 0x67, 0xa7, 0xe1, 0x1d, 0x17, 0xaa, 0xad, 0xf7, 0x8e, 0x68, 0x42, 0x86, 0xd2, 0x66, 0x31, 0x17, 0x86, 0x59, 0x41, 0xb0, 0x43, 0x42, 0x4b, 0x4e, 0x68, 0xef, 0xd5, 0xd3, 0x7d, 0x5a, 0x24, 0x5c, 0x85, 0xba, 0xc9, 0xde, 0xe1, 0x54, 0xda, 0x4e, 0x93, 0x52, 0x60, 0xa0, 0x0f, 0x32, 0xaa, 0x60, 0xe8, 0x93, 0x88, 0xcd, 0xf5, 0x76, 0xaa, 0x9d, 0xd4, 0x2d, 0x9a, 0xd3, 0xdf, 0x9c, 0x16, 0x62, 0xf5, 0x7f, 0xb6, 0x76, 0xa5, 0xdb, 0x2d, 0x9f, 0xaf, 0xc8, 0x9b, 0x42, 0xdd, 0x3f, 0x9b, 0xf8, 0xa6, 0xa0, 0x26, 0xd2, 0x26, 0x0a, 0x71, 0xa8, 0x52, 0xc9, 0x4c, 0xdb, 0x7f, 0x6d, 0xb8, 0x40, 0x9a, 0x4c, 0xb6, 0x12, 0xad, 0x8a, 0x86, 0x2b, 0x88, 0xe4, 0xdb, 0xd9, 0xb4, 0xcf, 0xad, 0x0d, 0x04, 0xbf, 0xbd, 0xc7, 0x60, 0x95, 0xf4, 0xea, 0xa9, 0x89, 0x25, 0xf1, 0xd6, 0x19, 0xe6, 0x1d, 0x9d, 0xca, 0x7d, 0x16, 0x45, 0xc4, 0x29, 0x27, 0x88, 0x96, 0x2d, 0x85, 0x94, 0xb8, 0x6e, 0x42, 0x8f, 0x85, 0x93, 0xe7, 0x32, 0xc1, 0xe9, 0xd2, 0x65, 0x06, 0x84, 0xcf, 0xe7, 0x82, 0x5e, 0x97, 0x6a, 0xf9, 0x64, 0x17, 0xbe, 0xfb, 0xbe, 0xbb, 0xdc, 0xa1, 0xc1, 0x18, 0xfe, 0x65, 0x4e, 0xac, 0x13, 0xda, 0x91, 0xa5, 0x2f, 0x4f, 0x69, 0xc3, 0xd5, 0xad, 0xec, 0xe2, 0x34, 0x19, 0xc4, 0xbc, 0xb2, 0x2b, 0x65, 0xe2, 0x6d, 0xba, 0x51, 0x06, 0x76, 0x9c, 0xed, 0x1a, 0xf8, 0xd2, 0xa4, 0xd6, 0xa4, 0xfa, 0x46, 0xa4, 0xef, 0x0f, 0xf3, 0x14, 0x0e, 0xbf, 0x03, 0x4b, 0xc5, 0xe8, 0xa0, 0x12, 0x6a, 0x06, 0x21, 0x73, 0xac, 0x9e, 0x53, 0x18, 0x0a, 0xf3, 0x2a, 0xc8, 0x0c, 0x91, 0xa8, 0xbd, 0x98, 0x76, 0xe2, 0xbc, 0x0c, 0xea, 0x69, 0x10, 0xe5, 0x53, 0x93, 0xe0, 0x27, 0x8a, 0x5b, 0x8f, 0xc9, 0x84, 0xdc, 0xfe, 0xd7, 0x56, 0x97, 0xf6, 0x14, 0xe5, 0x13, 0x10, 0x48, 0xc9, 0x77, 0xd4, 0x8a, 0x32, 0x3c, 0xfc, 0x25, 0xd9, 0x12, 0xf6, 0xf8, 0x51, 0x8d, 0x2c, 0x6a, 0x2f, 0x47, 0xa1, 0x4d, 0xf4, 0x7c, 0xea, 0x4f, 0xa9, 0x57, 0x9a, 0xcf, 0x86, 0x69, 0x96, 0x3e, 0x34, 0x13, 0x01, 0x58, 0x66, 0xce, 0xa2, 0xdd, 0xed, 0x98, 0xfa, 0xa5, 0x76, 0x02, 0x6a, 0x21, 0x9a, 0x95, 0x27, 0xb6, 0xf8, 0x8e, 0xd1, 0x79, 0x6e, 0x2e, 0xf0, 0x3e, 0xbd, 0x12, 0xb2, 0x05, 0x1e, 0x61, 0x9d, 0x24, 0x9f, 0xb4, 0x25, 0xdb, 0x47, 0x08, 0x42, 0x0f, 0x54, 0x29, 0x8e, 0x65, 0x24, 0x5d, 0x75, 0x07, 0x87, 0x42, 0x81, 0xbe, 0x93, 0x1c, 0xd9, 0x26, 0x44, 0x16, 0x6f, 0x35, 0x6b, 0x2a, 0x78, 0x56, 0xbe, 0xb2, 0x2b, 0xcb, 0x1f, 0xd5, 0xea, 0x1f, 0x51, 0x5d, 0x3d, 0xd1, 0xb9, 0x9a, 0x54, 0x8b, 0xea, 0x6b, 0xfd, 0x8b, 0x19, 0x86, 0x2b, 0x11, 0xad, 0xa2, 0x8d, 0xed, 0x8f, 0x1c, 0xd2, 0x96, 0xf6, 0x2c, 0x93, 0x5a, 0xbf, 0xd6, 0x01, 0x7f, 0xa6, 0x1c, 0xcf, 0x85, 0xd7, 0x2c, 0x00, 0xcc, 0xc0, 0x80, 0x7c, 0x51, 0x13, 0x34, 0xaf, 0x4b, 0x59, 0x06, 0x80, 0xce, 0x95, 0xc7, 0x63, 0xd5, 0xcf, 0x2c, 0x6c, 0x3c, 0x87, 0x44, 0x89, 0xa0, 0x5f, 0x0a, 0x54, 0x26, 0x94, 0xd6, 0x28, 0x9d, 0xfc, 0x9f, 0x69, 0x86, 0xac, 0x52, 0x22, 0xe7, 0x80, 0xb7, 0x6e, 0x00, 0x1a, 0xa1, 0x53, 0x44, 0x27, 0x61, 0xfb, 0x29, 0xe8, 0xbe, 0x7b, 0xb4, 0x5f, 0xed, 0x8c, 0xdb, 0x96, 0x3e, 0xf1, 0x10, 0xe4, 0x85, 0x61, 0xa1, 0x20, 0x70, 0x35, 0xb9, 0x2e, 0x4e, 0x35, 0x2c, 0x51, 0x03, 0x43, 0x5a, 0x2d, 0x1b, 0xba, 0xda, 0x6b, 0x46, 0xc0, 0xb3, 0x5a, 0xb0, 0xed, 0x50, 0x1b, 0xf1, 0xf3, 0x7f, 0x12, 0x98, 0x38, 0x20, 0xc0, 0x83, 0x8c, 0x5c, 0x41, 0x88, 0x63, 0x7f, 0xff, 0x2a, 0x42, 0xd1, 0x66, 0x50, 0x53, 0x0f, 0xa9, 0x42, 0x38, 0x59, 0xdb, 0x61, 0xa0, 0xb6, 0xf1, 0x5d, 0x39, 0x86, 0x74, 0xdf, 0xf4, 0x84, 0xf0, 0xe3, 0xc2, 0x2d, 0x6e, 0x45, 0x3b, 0xac, 0x7e, 0x38, 0xd8, 0xa8, 0xaa, 0x9b, 0xa8, 0x8b, 0x52, 0x7c, 0xb7, 0x25, 0x3e, 0x33, 0x84, 0xc0, 0x7c, 0xd6, 0x45, 0x05, 0x4d, 0x05, 0xd0, 0x52, 0x2b, 0x4b, 0x63, 0x4d, 0x3b, 0x8a, 0xb7, 0xe9, 0xbc, 0x31, 0xff, 0x21, 0x26, 0x38, 0xce, 0x15, 0x28, 0x23, 0x02, 0x5b, 0xb5, 0x7d, 0x2a, 0xa6, 0xb5, 0x92, 0x0a, 0x22, 0x34, 0x5a, 0x3a, 0x12, 0xfb, 0xdd, 0xf0, 0xa1, 0x05, 0x80, 0x80, 0xef, 0x3b, 0xff, 0x24, 0xc3, 0x5a, 0x0a, 0x0d, 0x78, 0x03, 0xc9, 0xd6, 0x01, 0x44, 0xba, 0xd7, 0x24, 0x27, 0xad, 0xf0, 0x44, 0x12, 0xd2, 0xd5, 0x53, 0x03, 0x1c, 0xdf, 0xd4, 0xf9, 0x74, 0xf7, 0xfd, 0x10, 0x6f, 0x2a, 0x58, 0x1a, 0x96, 0xe2, 0x82, 0xcd, 0x64, 0xe2, 0xe4, 0xc6, 0x88, 0x84, 0x7b, 0xf2, 0x27, 0xd4, 0x18, 0x25, 0x05, 0x77, 0xa4, 0xf6, 0xf1, 0x98, 0x53, 0x1c, 0xd5, 0x2f, 0xd5, 0xe5, 0x33, 0x67, 0xef, 0x8e, 0x06, 0xfd, 0x07, 0x85, 0x4e, 0xc8, 0x92, 0xe8, 0xab, 0xe1, 0x6d, 0xca, 0xe2, 0x05, 0x8e, 0x01, 0x2e, 0x2c, 0x9b, 0x9f, 0xa8, 0x79, 0x4f, 0x45, 0x3a, 0xf0, 0xbd, 0xf9, 0xdf, 0xa5, 0xda, 0x33, 0x28, 0x43, 0xde, 0x3d, 0x45, 0x20, 0x60, 0x2b, 0x08, 0x4e, 0x44, 0xf6, 0xa5, 0x48, 0xdb, 0x8c, 0x2d, 0x31, 0xd1, 0xda, 0xf1, 0xd2, 0xbd, 0x20, 0x5a, 0xb6, 0x7e, 0x1d, 0xed, 0x22, 0xaf, 0xda, 0x6e, 0xcc, 0xe2, 0x1e, 0x6c, 0x74, 0x65, 0xe5, 0xaa, 0xe0, 0xcb, 0x53, 0x1d, 0xd4, 0x78, 0x00, 0x86, 0xfa, 0xe2, 0x97, 0xe0, 0xe9, 0x57, 0x2b, 0x13, 0xaf, 0x66, 0xb7, 0xba, 0x91, 0x4a, 0xa6, 0xec, 0xe5, 0xf1, 0x61, 0x4a, 0x44, 0x7c, 0x3e, 0xc1, 0x62, 0x52, 0x51, 0xd7, 0x56, 0x20, 0xea, 0x61, 0x2c, 0x70, 0xdb, 0xee, 0xf7, 0x9b, 0xba, 0x64, 0xc1, 0x48, 0xc1, 0x87, 0x16, 0xc8, 0x10, 0x5e, 0x10, 0xef, 0x55, 0xc7, 0x03, 0x45, 0x35, 0x9f, 0x51, 0xac, 0xf2, 0x48, 0xed, 0xd5, 0x2f, 0x89, 0xa3, 0x20, 0xc0, 0xf6, 0x29, 0xca, 0xf4, 0x74, 0x81, 0x7a, 0xc8, 0x79, 0x4d, 0x8c, 0xe4, 0x20, 0xff, 0xc3, 0x5e, 0x32, 0x18, 0x24, 0x99, 0xba, 0xde, 0x33, 0xd0, 0xc6, 0x2f, 0xda, 0x03, 0x6d, 0x6d, 0x9a, 0x72, 0x39, 0xa0, 0xe9, 0xd5, 0x8a, 0x3d, 0xd4, 0xef, 0x9a, 0x43, 0x3d, 0x43, 0x34, 0x9c, 0x57, 0xf1, 0x3f, 0xdf, 0x3f, 0x12, 0xae, 0xef, 0xc2, 0x15, 0x8e, 0x22, 0xb8, 0xf2, 0x23, 0xcd, 0x8c, 0x32, 0x5c, 0x71, 0xc3, 0x2c, 0x13, 0xf2, 0xb7, 0xeb, 0xd7, 0x7b, 0xc4, 0xa1, 0x41, 0x04, 0x9a, 0x9b, 0x02, 0xa5, 0x82, 0x18, 0x38, 0x1e, 0xb8, 0x83, 0xbd, 0x44, 0x3d, 0xd9, 0x61, 0x39, 0xa6, 0x55, 0x66, 0xa6, 0xe4, 0x9c, 0xa0, 0x56, 0x03, 0x07, 0x01, 0xea, 0x51, 0xc6, 0x8f, 0x87, 0x80, 0xf9, 0xf6, 0xaf, 0x9c, 0xf8, 0x3d, 0xb9, 0xfb, 0x6c, 0x57, 0x84, 0x77, 0xeb, 0x83, 0x5c, 0x9d, 0x43, 0xc4, 0x3a, 0x9d, 0x9d, 0xe6, 0xd0, 0x1e, 0x1f, 0xce, 0xfc, 0x56, 0xcf, 0x0d, 0xa9, 0x00, 0xbf, 0xf9, 0x33, 0x02, 0xd5, 0xc2, 0xc0, 0xf1, 0xb8, 0x44, 0x46, 0xbc, 0xaf, 0x89, 0x14, 0x2c, 0x7a, 0x45, 0x20, 0x05, 0x7a, 0xbd, 0x7a, 0xf2, 0xa6, 0xd6, 0x8d, 0x89, 0x2c, 0x4c, 0x24, 0x14, 0xb3, 0x4e, 0x5c, 0xeb, 0xa2, 0xf3, 0xea, 0x87, 0xe3, 0x4e, 0x62, 0xa4, 0xfe, 0x16, 0x74, 0x0d, 0x8a, 0x1e, 0x3d, 0xf5, 0x52, 0x22, 0x26, 0xee, 0xa2, 0x96, 0xf0, 0xe5, 0xa1, 0x81, 0xe3, 0xbb, 0xb1, 0x9a, 0x4a, 0x51, 0x2a, 0x1d, 0xa0, 0x2d, 0xfe, 0x25, 0x25, 0x0b, 0x07, 0x73, 0xc3, 0x03, 0x19, 0xe8, 0x69, 0x0a, 0x19, 0x37, 0x56, 0x03, 0xac, 0x71, 0xea, 0xa9, 0x47, 0x88, 0x08, 0xf9, 0xa6, 0xe8, 0x10, 0xf5, 0x0a, 0xb4, 0x00, 0xd6, 0xac, 0x5d, 0x4f, 0x13, 0x4d, 0x8a, 0x7b, 0xd3, 0xde, 0x9e, 0x72, 0xa6, 0x96, 0x3e, 0x42, 0xa7, 0xf3, 0xab, 0xb7, 0x56, 0x8a, 0xdd, 0xe7, 0xd4, 0x97, 0xa6, 0xb4, 0x5b, 0xb3, 0x4f, 0xdb, 0xfc, 0x24, 0x6b, 0x13, 0x1f, 0xa5, 0xed, 0x4b, 0x44, 0xa8, 0xa1, 0x19, 0xee, 0x65, 0xa2, 0xd5, 0xd4, 0x38, 0x6d, 0x05, 0xb3, 0x2a, 0xa2, 0x08, 0x58, 0x9a, 0xa7, 0x33, 0xc8, 0x6b, 0xa7, 0xb6, 0x99, 0x33, 0xac, 0x1a, 0xd8, 0x3a, 0xcd, 0x15, 0x25, 0x56, 0xb5, 0x13, 0xcc, 0xf4, 0xef, 0xb0, 0x0b, 0x77, 0xc4, 0xf4, 0x1b, 0x3c, 0x9c, 0x29, 0x93, 0xd9, 0x20, 0x7a, 0x4a, 0x4a, 0x9d, 0xcd, 0x2d, 0x39, 0x5f, 0x7f, 0x2b, 0x8b, 0x04, 0xf0, 0x46, 0xde, 0x02, 0x08, 0xed, 0x87, 0xd6, 0x25, 0x46, 0xa8, 0xa3, 0x1c, 0xec, 0x28, 0x36, 0x3a, 0x98, 0x93, 0xac, 0x6d, 0xae, 0x3f, 0x32, 0x0b, 0xbd, 0x29, 0xa6, 0xd4, 0x47, 0x69, 0x0d, 0x27, 0x7d, 0x48, 0x15, 0x97, 0xc3, 0x36, 0x2b, 0x3d, 0x13, 0x3b, 0xde, 0x86, 0xa9, 0xaa, 0x7e, 0x5f, 0x7e, 0x1c, 0x49, 0xe4, 0x8a, 0x0b, 0x8d, 0x13, 0xd1, 0x8b, 0x8a, 0x1b, 0xa2, 0xfb, 0x08, 0x38, 0xa2, 0xb1, 0xdd, 0x50, 0x82, 0xeb, 0xe7, 0xb3, 0x79, 0x9c, 0x2d, 0xb1, 0xd7, 0xd3, 0x24, 0xf1, 0x60, 0xda, 0x59, 0xa8, 0x34, 0x42, 0xf9, 0x3b, 0x75, 0x7b, 0xf5, 0xce, 0xf3, 0xbc, 0xb7, 0xd6, 0x91, 0x4b, 0xae, 0xb8, 0x26, 0x67, 0x27, 0xf6, 0x06, 0x6f, 0x30, 0x8f, 0x93, 0x07, 0x7f, 0x7c, 0x5e, 0x49, 0xa3, 0x7a, 0xc8, 0x4f, 0xe6, 0x8b, 0x37, 0xa9, 0xb7, 0xd8, 0x38, 0x7a, 0x84, 0xe7, 0x2d, 0x5a, 0x42, 0x49, 0x6a, 0x3c, 0x2c, 0x2a, 0xcc, 0xf1, 0x66, 0x85, 0x39, 0xff, 0x89, 0xc2, 0x99, 0xf6, 0x50, 0x0c, 0x25, 0x6e, 0xe4, 0xc2, 0x2e, 0x59, 0x83, 0x99, 0xb1, 0x57, 0x7a, 0x87, 0x5a, 0x36, 0xb4, 0x6e, 0xd1, 0xd2, 0x5a, 0x28, 0x61, 0xed, 0x35, 0x6f, 0x6d, 0xc6, 0xde, 0xb6, 0x3a, 0x85, 0xef, 0x06, 0xef, 0xb2, 0xac, 0x50, 0xf0, 0x62, 0xf0, 0xe6, 0xe2, 0xc9, 0x48, 0x03, 0x02, 0x4d, 0x85, 0x8b, 0xa0, 0x64, 0x3a, 0x79, 0xde, 0xc6, 0xe6, 0x99, 0x15, 0xbe, 0xc1, 0x82, 0x6b, 0xac, 0x72, 0x03, 0x8d, 0xfe, 0x17, 0x5d, 0x99, 0x31, 0x78, 0x06, 0x93, 0x9b, 0x42, 0xdd, 0x10, 0x1f, 0x98, 0xf3, 0xe0, 0x02, 0x79, 0x5f, 0xe3, 0x72, 0xa6, 0xc6, 0x5b, 0x9a, 0x18, 0x82, 0x5b, 0x37, 0x2f, 0x91, 0x2b, 0x0e, 0x25, 0xc0, 0xca, 0xc4, 0x7d, 0xb6, 0xd2, 0xeb, 0x60, 0xce, 0x76, 0x42, 0x36, 0xf0, 0x5f, 0x8e, 0xe7, 0xcc, 0x91, 0x7b, 0x87, 0x2c, 0xaf, 0x63, 0x6c, 0x46, 0x3d, 0x04, 0xe1, 0x34, 0xb8, 0x6d, 0xf9, 0x08, 0xa6, 0xb1, 0x40, 0x25, 0xee, 0x2b, 0x3d, 0xbf, 0x29, 0x5e, 0x0b, 0xbf, 0xaf, 0xc1, 0x79, 0x68, 0x8d, 0xfe, 0x7e, 0x76, 0xc1, 0x74, 0xec, 0x93, 0x47, 0x06, 0xa5, 0x62, 0xe8, 0x7e, 0xd8, 0x77, 0xd5, 0x1f, 0xe9, 0xf9, 0x7d, 0x23, 0x1a, 0xcf, 0x22, 0x30, 0x27, 0x90, 0x24, 0x25, 0x48, 0x8f, 0x03, 0xae, 0x64, 0xc1, 0x8a, 0x80, 0x67, 0x63, 0xb6, 0x44, 0xff, 0x88, 0x31, 0x75, 0x2e, 0x02, 0x84, 0xca, 0x83, 0x48, 0x56, 0xeb, 0xda, 0x51, 0x5f, 0x89, 0x00, 0x8a, 0xd9, 0x1a, 0x91, 0x50, 0x9f, 0xcf, 0xf6, 0x9f, 0x43, 0x89, 0x56, 0xe0, 0xc8, 0xd9, 0xd4, 0x04, 0xd1, 0x5d, 0x8a, 0x52, 0x62, 0x01, 0xfd, 0x9f, 0x96, 0xf3, 0x05, 0xca, 0xdf, 0x4d, 0x6b, 0xc5, 0xaa, 0xd3, 0xb4, 0x6f, 0x93, 0x3d, 0xd6, 0x17, 0x6a, 0xe9, 0xd0, 0x6d, 0xbf, 0xf3, 0x6e, 0x29, 0xc5, 0x11, 0x9e, 0xc6, 0xa3, 0xa9, 0x2b, 0xfe, 0x9e, 0xfd, 0xc7, 0xf7, 0xa7, 0x77, 0xa7, 0x4e, 0x3a, 0x58, 0x37, 0x64, 0x97, 0x65, 0x88, 0xa2, 0xc3, 0x4a, 0x94, 0x9c, 0xe4, 0xd6, 0x7b, 0x3e, 0xd2, 0x45, 0x41, 0x6e, 0xff, 0x39, 0xc4, 0xd9, 0x11, 0x1f, 0xee, 0xc4, 0xc2, 0x11, 0x53, 0x26, 0xee, 0x84, 0xc1, 0x59, 0xe3, 0x48, 0x76, 0x2f, 0x54, 0xaf, 0x04, 0x39, 0x80, 0xd8, 0x0f, 0x7f, 0x7e, 0x7d, 0x6d, 0x11, 0xb3, 0xbe, 0x63, 0x18, 0xd9, 0xc4, 0xef, 0x56, 0x3c, 0x3e, 0x74, 0x42, 0xef, 0x06, 0x1f, 0x2f, 0x36, 0x7d, 0xed, 0x20, 0x66, 0x6b, 0x25, 0x3d, 0xe3, 0x65, 0x9e, 0x1a, 0x17, 0x12, 0x42, 0x28, 0x7e, 0xd6, 0x87, 0x18, 0x22, 0xa9, 0xe3, 0x02, 0x25, 0x32, 0x71, 0x8d, 0x2a, 0x61, 0x43, 0x7a, 0xd2, 0x2e, 0x1f, 0x4b, 0x8a, 0x27, 0xa1, 0xdb, 0x60, 0xfa, 0x04, 0x32, 0xaa, 0x32, 0x02, 0xe0, 0xa3, 0xb6, 0x93, 0xa8, 0x5d, 0xe2, 0x83, 0x53, 0x93, 0x35, 0x17, 0xe1, 0x52, 0xee, 0x40, 0x81, 0x7c, 0x17, 0x20, 0xf9, 0x90, 0xde, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x79, 0x01, 0x00, 0x30, 0x40, 0x7b, 0x72, 0x2a, 0xee, 0x84, 0xd7, 0xa4, 0x09, 0x4a, 0x05, 0xac, 0x4a, 0xac, 0x61, 0xf7, 0xf9, 0x62, 0xd3, 0x8d, 0x35, 0xe0, 0x7d, 0x1e, 0x7c, 0x57, 0xe5, 0xe0, 0x7c, 0x5a, 0x5d, 0x7e, 0xa1, 0xf1, 0xa4, 0x26, 0xe4, 0x34, 0xf2, 0xc7, 0xc8, 0x9d, 0xfc, 0xfe, 0x9e, 0xc3, 0x98, 0x51, 0x60, 0x29, 0x10, 0xab, 0xd4, 0x3b, 0x52, 0x44, 0xb9, 0xd0, 0x7e, 0x60, 0x3b, 0xa1, 0x93, 0x91, 0xe2, 0x9d, 0x2f, 0x66, 0xbf, 0x15, 0x9e, 0xbc, 0x97, 0x12, 0xbf, 0x0b, 0x37, 0x64, 0x6d, 0x74, 0x45, 0x29, 0x6f, 0x64, 0x2f, 0xf0, 0x2f, 0x02, 0x14, 0xa2, 0xa8, 0xde, 0xbe, 0xe4, 0x53, 0x7a, 0x0d, 0x9d, 0x0c, 0xa3, 0x6f, 0xbc, 0x23, 0xcb, 0x42, 0x8c, 0x20, 0xc5, 0x36, 0x16, 0xf0, 0x97, 0x14, 0x6d, 0x7a, 0x47, 0x7a, 0xdc, 0xcf, 0xda, 0x7d, 0x5a, 0x85, 0xe7, 0x2b, 0xb6, 0xdf, 0x68, 0x74, 0x63, 0xd7, 0xc5, 0xeb, 0xd3, 0x2d, 0x32, 0x5c, 0xc2, 0x13, 0xd5, 0x43, 0xfa, 0x18, 0x62, 0x80, 0x50, 0x5d, 0x19, 0xed, 0xf4, 0x4f, 0x44, 0xa5, 0x59, 0x5c, 0xbc, 0x2a, 0x3f, 0x60, 0x00, 0xac, 0xb7, 0xcf, 0xed, 0x2b, 0x15, 0xcc, 0x22, 0x3a, 0x3f, 0xb1, 0x95, 0x86, 0xbf, 0xbc, 0xf5, 0x80, 0x82, 0xeb, 0xd3, 0xc1, 0x3d, 0x33, 0xac, 0x06, 0xd4, 0x98, 0x53, 0xe6, 0x3b, 0xdf, 0x5a, 0x8b, 0xb1, 0xd8, 0x6c, 0x2b, 0x55, 0x75, 0xc0, 0xf5, 0x64, 0x36, 0x15, 0xae, 0xad, 0x9a, 0xe1, 0x4f, 0x08, 0x99, 0xa1, 0x36, 0xd4, 0x5f, 0x6f, 0xdb, 0xd6, 0xc7, 0x55, 0x0f, 0xf9, 0x4d, 0x02, 0x30, 0xc1, 0x7a, 0xca, 0xee, 0x76, 0x00, 0x25, 0x6b, 0x62, 0x04, 0x19, 0xed, 0x9d, 0x54, 0x2d, 0x6a, 0x3a, 0x82, 0xe4, 0x8f, 0xe6, 0x1f, 0xe1, 0x22, 0x3b, 0x9c, 0x21, 0xd9, 0x5e, 0x7c, 0xf8, 0xfb, 0xa8, 0xe1, 0xc0, 0x77, 0x71, 0xa9, 0x5f, 0x3d, 0x42, 0x9f, 0x19, 0xf9, 0xfd, 0x6f, 0x52, 0x95, 0xc5, 0x62, 0x31, 0x13, 0xb6, 0x21, 0x4a, 0xa0, 0xb5, 0xef, 0xc8, 0xfc, 0xe2, 0x24, 0xb0, 0x8f, 0x7e, 0xdb, 0x3d, 0xd0, 0x54, 0x10, 0x6d, 0xd1, 0xdf, 0xb0, 0x40, 0x0b, 0xce, 0x53, 0x3f, 0xd5, 0xa9, 0x9c, 0x4f, 0x0d, 0x9c, 0x76, 0xe4, 0xdc, 0xc9, 0xb9, 0x0f, 0xb5, 0x8f, 0xe1, 0x13, 0xd6, 0xad, 0xde, 0x65, 0x06, 0x40, 0x39, 0x47, 0x50, 0xe9, 0x03, 0x6d, 0xe2, 0xa7, 0x4f, 0x56, 0x76, 0x39, 0x35, 0x3d, 0xcb, 0x02, 0x95, 0xde, 0x22, 0xd1, 0x19, 0x70, 0xc2, 0x06, 0x30, 0x7c, 0xfc, 0xf2, 0x00, 0x8c, 0x2a, 0x68, 0x8d, 0xd3, 0xa7, 0xe1, 0x89, 0x35, 0xbf, 0xb2, 0x93, 0x6d, 0x05, 0x20, 0xd7, 0x2a, 0xa2, 0x67, 0x59, 0x5c, 0x80, 0xf9, 0x53, 0x18, 0x69, 0x7b, 0x76, 0xbb, 0x71, 0x61, 0xfe, 0x3f, 0x51, 0x16, 0xd8, 0xf0, 0x89, 0x21, 0x58, 0xdf, 0x6a, 0xac, 0x34, 0xcd, 0x55, 0x58, 0xd0, 0x7a, 0xe7, 0x5e, 0xff, 0x75, 0xcb, 0x43, 0xcc, 0xea, 0x71, 0xb6, 0xf9, 0x14, 0xea, 0x5f, 0x36, 0x3c, 0x93, 0xa8, 0x4a, 0x6f, 0x6b, 0xd3, 0xa6, 0x66, 0x2a, 0xe7, 0x2d, 0x36, 0x7d, 0x33, 0x12, 0xc8, 0xf5, 0x8e, 0x2a, 0x33, 0x99, 0x85, 0x10, 0x7a, 0x26, 0x12, 0xe5, 0x41, 0x5f, 0xa7, 0xae, 0x75, 0x0e, 0x8c, 0x77, 0x15, 0x85, 0xf7, 0xd3, 0x7a, 0xd0, 0x48, 0x59, 0xd9, 0xd7, 0x54, 0x31, 0xde, 0x2c, 0xb1, 0xe0, 0x96, 0x47, 0x67, 0xcd, 0x13, 0x58, 0x80, 0x4a, 0x6c, 0x0e, 0x47, 0x0c, 0x10, 0xe2, 0x49, 0x58, 0x9a, 0xd6, 0x60, 0x5d, 0x7f, 0xab, 0x4b, 0x7a, 0x5c, 0x01, 0xb4, 0x69, 0xbe, 0xef, 0x96, 0x8b, 0x91, 0xf4, 0x68, 0xd6, 0xb2, 0x5b, 0x83, 0x1a, 0x36, 0x75, 0xa2, 0x9c, 0x6a, 0x35, 0x78, 0x48, 0xac, 0x1f, 0xb5, 0xea, 0x8c, 0x94, 0xfc, 0x36, 0xda, 0xdf, 0x9f, 0x96, 0x9c, 0xa5, 0x21, 0xf9, 0x0b, 0x83, 0xd8, 0x21, 0x08, 0x07, 0x33, 0x2c, 0xb2, 0x5a, 0x6e, 0x4e, 0x0f, 0x30, 0xc4, 0x09, 0xed, 0xe6, 0x71, 0x43, 0x6d, 0xe2, 0xfe, 0x15, 0xe0, 0x96, 0xb6, 0x3a, 0xe1, 0xb8, 0x47, 0x5d, 0xdf, 0x9b, 0xdd, 0xca, 0x7c, 0xb8, 0x3c, 0x3c, 0x6a, 0xc6, 0xb5, 0xb6, 0xc3, 0xff, 0xf0, 0xbe, 0xf0, 0x73, 0xe5, 0x54, 0xa1, 0x75, 0x86, 0x86, 0x70, 0x91, 0xed, 0x7c, 0x29, 0x98, 0x15, 0x4c, 0xdd, 0xa9, 0x70, 0x0f, 0x26, 0x4e, 0xde, 0xe9, 0x59, 0x04, 0xd5, 0x0c, 0x7c, 0xd4, 0xcf, 0xef, 0x40, 0xd5, 0x33, 0x2e, 0x5d, 0xaf, 0x5e, 0xd8, 0x01, 0x7e, 0x8c, 0x24, 0x46, 0xb7, 0xa8, 0xc2, 0xc6, 0xdc, 0x5f, 0x53, 0xd4, 0x2d, 0xec, 0xb6, 0xef, 0xa5, 0x82, 0x2a, 0x65, 0xe3, 0x4b, 0x88, 0x59, 0xdd, 0x53, 0x05, 0x87, 0x75, 0xe4, 0x42, 0x7d, 0x50, 0x30, 0xa0, 0x3b, 0x8c, 0x34, 0x1c, 0x53, 0x26, 0x4a, 0x1c, 0x09, 0x3c, 0xce, 0x0a, 0x10, 0x7e, 0xc1, 0x92, 0xdd, 0x66, 0x61, 0xdb, 0xad, 0x20, 0x0f, 0x33, 0xbb, 0x31, 0x0a, 0xdc, 0x42, 0x3e, 0xc9, 0x03, 0x42, 0x93, 0x00, 0x1c, 0x2f, 0x40, 0xa8, 0x16, 0xf9, 0xe9, 0x0b, 0x77, 0x15, 0xa7, 0x8d, 0x65, 0x75, 0x99, 0x21, 0x9a, 0xa0, 0xf8, 0x08, 0x34, 0x49, 0xd1, 0x56, 0xa4, 0x21, 0xc1, 0x9b, 0x02, 0xc6, 0x4b, 0x65, 0xe9, 0xf8, 0xa5, 0xc1, 0x0f, 0x8e, 0x22, 0x94, 0x5b, 0xc9, 0x7c, 0xb4, 0x6d, 0xf5, 0xbd, 0xb0, 0xdf, 0x8c, 0x82, 0xb1, 0xa9, 0x35, 0xc8, 0xe1, 0x7b, 0x62, 0x99, 0x3e, 0xf6, 0x69, 0x36, 0xd4, 0x0c, 0x41, 0x95, 0xb3, 0xf9, 0x66, 0x5c, 0x2b, 0x99, 0x6c, 0x9f, 0x18, 0x16, 0x58, 0x18, 0x47, 0x25, 0xbd, 0xa0, 0x51, 0x56, 0x35, 0x0b, 0x5a, 0x26, 0xbe, 0xc8, 0xa0, 0xde, 0xfe, 0xdb, 0xcf, 0x75, 0x93, 0x13, 0x70, 0xec, 0xd2, 0x8e, 0xfe, 0xe3, 0xb4, 0xf3, 0x6f, 0x6d, 0xcb, 0xf3, 0x33, 0x4d, 0x75, 0xf8, 0x03, 0x25, 0xb6, 0x14, 0x02, 0x4e, 0x63, 0x93, 0x01, 0x5b, 0x90, 0xc5, 0xed, 0x76, 0x67, 0xe6, 0xbc, 0x21, 0xd8, 0x35, 0x59, 0x15, 0xc7, 0xa1, 0x65, 0x29, 0xb2, 0x99, 0xd5, 0x9b, 0xe9, 0xf2, 0xb7, 0x22, 0xd7, 0xe2, 0xaf, 0x81, 0xf3, 0x87, 0xf3, 0xb3, 0x59, 0x84, 0xd8, 0xc3, 0x2d, 0x9a, 0x31, 0xf9, 0x31, 0x51, 0x1b, 0xed, 0x42, 0x15, 0xf7, 0x9f, 0xa2, 0x5d, 0xa1, 0xb8, 0x42, 0xbc, 0x30, 0x7d, 0x6c, 0xf5, 0xcb, 0x30, 0x84, 0x70, 0x61, 0xcf, 0xcb, 0xaa, 0x50, 0x79, 0x48, 0x7f, 0x3c, 0xf5, 0x4b, 0x66, 0xb8, 0x10, 0x34, 0x00, 0x78, 0xcc, 0x67, 0x93, 0x21, 0xae, 0x9e, 0x48, 0x06, 0x8c, 0xfc, 0x55, 0x54, 0xb0, 0xa1, 0x62, 0x87, 0x3d, 0x8b, 0xce, 0x27, 0x14, 0x10, 0xa7, 0x1e, 0xbd, 0x49, 0x7b, 0x38, 0x04, 0x23, 0x57, 0x8e, 0x50, 0x00, 0x94, 0xf1, 0xef, 0x0c, 0x4a, 0xa3, 0xc7, 0xc4, 0x8a, 0xdb, 0x3a, 0x48, 0xb3, 0xf4, 0x2f, 0x71, 0x8c, 0x44, 0x78, 0xce, 0xeb, 0xee, 0x1a, 0xfe, 0x1c, 0x38, 0x34, 0x06, 0x51, 0x33, 0x6e, 0x9e, 0xbd, 0xc3, 0x4f, 0x92, 0x3e, 0x47, 0xcb, 0xb2, 0xa4, 0x86, 0xec, 0xea, 0xfe, 0x8d, 0x7b, 0x89, 0x81, 0xa2, 0xea, 0xc3, 0xe5, 0x94, 0xfd, 0xf5, 0x5b, 0xe6, 0xef, 0x49, 0x6c, 0xb6, 0x0f, 0xa8, 0x70, 0x5a, 0x06, 0x2a, 0x5f, 0x06, 0x58, 0x6a, 0x33, 0x10, 0xc6, 0x6e, 0x21, 0x8b, 0x9b, 0x15, 0x52, 0x51, 0x15, 0x21, 0xf6, 0xce, 0x76, 0x6c, 0xc9, 0x07, 0x6a, 0xcd, 0x68, 0xba, 0xbd, 0xba, 0x10, 0x90, 0xb0, 0xc1, 0xb0, 0xc7, 0x54, 0x43, 0x4f, 0xc7, 0xaf, 0x2e, 0x3e, 0x79, 0xab, 0x88, 0xa5, 0x71, 0x06, 0x10, 0x41, 0x2c, 0xbe, 0x54, 0x80, 0xf3, 0xba, 0xe4, 0x48, 0x33, 0xa8, 0xa1, 0x08, 0x51, 0x4d, 0x37, 0xf6, 0x45, 0xc6, 0x4b, 0x91, 0x8b, 0x6e, 0xf8, 0xbd, 0x38, 0x6e, 0x8c, 0x25, 0x3c, 0x31, 0xaa, 0xad, 0x15, 0x2f, 0x52, 0x1c, 0x95, 0xdc, 0x59, 0x57, 0x6e, 0xa5, 0x60, 0xc4, 0x9f, 0x43, 0x61, 0xbb, 0x0f, 0xdd, 0x3f, 0x16, 0xd3, 0xb2, 0x0e, 0x46, 0xfd, 0x4a, 0xfc, 0x80, 0xfb, 0x6b, 0xff, 0xe5, 0xc2, 0x47, 0xc1, 0xbc, 0x6d, 0xae, 0x66, 0x1f, 0x07, 0x2a, 0x2e, 0xb5, 0x8f, 0x58, 0x09, 0x4b, 0x89, 0xe8, 0x93, 0x82, 0xa8, 0x0b, 0x26, 0xca, 0x50, 0x48, 0xea, 0x6b, 0x0d, 0xee, 0x12, 0x5a, 0x3f, 0xaa, 0xad, 0x04, 0x90, 0xf4, 0xbb, 0x73, 0xf2, 0x54, 0x76, 0x4f, 0x48, 0xb9, 0xed, 0xb9, 0xeb, 0x5c, 0x70, 0xf9, 0xa9, 0xf0, 0x6a, 0x7a, 0x0d, 0x16, 0x9a, 0x9c, 0xe5, 0x59, 0xda, 0x3e, 0x6f, 0x1e, 0xd9, 0x1d, 0xa4, 0x55, 0x7e, 0x65, 0x75, 0xe3, 0xd5, 0x0d, 0x09, 0xf7, 0xbc, 0xd9, 0x3f, 0xd2, 0xb0, 0x26, 0x08, 0xb8, 0x79, 0xcd, 0x64, 0x06, 0x85, 0xce, 0x0a, 0xaf, 0x42, 0x89, 0x07, 0x8d, 0xba, 0xb2, 0xe6, 0x5c, 0x45, 0x4f, 0x2a, 0x39, 0x1f, 0x6b, 0x21, 0x05, 0x1c, 0x46, 0x64, 0x06, 0xe4, 0x37, 0x89, 0xa1, 0x64, 0x7d, 0xdb, 0x0d, 0x58, 0xc0, 0x17, 0x54, 0x28, 0xf7, 0x90, 0x07, 0x79, 0xf3, 0x26, 0x78, 0x1d, 0xcd, 0x00, 0x5f, 0x5a, 0xe9, 0xf7, 0x3c, 0xa6, 0x5d, 0x0f, 0xda, 0x4f, 0xdd, 0x88, 0xcd, 0xb1, 0x89, 0x48, 0xc6, 0xf2, 0x34, 0xbb, 0x13, 0x61, 0x07, 0x67, 0xbe, 0xf5, 0x94, 0xc7, 0xfd, 0x86, 0xc0, 0x38, 0x01, 0xc0, 0x0e, 0x01, 0x58, 0xe7, 0x3f, 0xc7, 0x52, 0xe8, 0x50, 0xf2, 0x41, 0x5b, 0x33, 0xd9, 0x6d, 0x69, 0xf3, 0xb8, 0x1c, 0xb3, 0xfc, 0xbe, 0x09, 0xbe, 0xce, 0xc1, 0x21, 0x75, 0x4b, 0x6a, 0x6e, 0xc1, 0x61, 0xce, 0x79, 0x61, 0xd2, 0xe6, 0x97, 0x5b, 0x48, 0x48, 0xe5, 0xd0, 0x02, 0x0e, 0xe5, 0x05, 0xc6, 0xe5, 0xff, 0xda, 0xdf, 0x99, 0x63, 0x1b, 0x5c, 0xa1, 0x01, 0x50, 0xd8, 0x7f, 0x9a, 0xff, 0x70, 0xff, 0x23, 0x88, 0xbf, 0x9d, 0xf5, 0x08, 0x03, 0xa1, 0x88, 0xf1, 0xc0, 0xbb, 0xb3, 0x42, 0x7d, 0x2e, 0xb3, 0x84, 0x7a, 0xd4, 0x6a, 0x05, 0x7e, 0x86, 0x9b, 0xf5, 0x13, 0xb6, 0x1d, 0x51, 0xcc, 0x47, 0x40, 0xc5, 0x73, 0xee, 0xde, 0x02, 0x45, 0xa6, 0xd9, 0x16, 0x7c, 0x08, 0x01, 0xd2, 0xeb, 0x90, 0x92, 0x54, 0x5c, 0x1a, 0xe1, 0x29, 0xf8, 0x23, 0xd2, 0xb4, 0xec, 0xa1, 0x32, 0xc0, 0x09, 0x70, 0x1a, 0x77, 0x21, 0xb1, 0xe5, 0x11, 0x52, 0x96, 0x70, 0x07, 0x88, 0x73, 0x9c, 0x99, 0xe6, 0x20, 0x5b, 0xe2, 0xda, 0xed, 0xae, 0xea, 0x12, 0xc1, 0x6e, 0x50, 0x99, 0x27, 0xb9, 0x8c, 0xc1, 0x58, 0x62, 0xec, 0xbd, 0x92, 0xc4, 0xb0, 0xf4, 0x41, 0xc4, 0x04, 0x7b, 0xca, 0xf8, 0xaf, 0x4a, 0x03, 0x2f, 0xb9, 0x0b, 0xa3, 0xde, 0x5c, 0x99, 0x3c, 0x19, 0x01, 0x90, 0x81, 0x35, 0x28, 0x91, 0xed, 0x2c, 0x6c, 0x02, 0x0f, 0x57, 0x10, 0x7a, 0x0f, 0x33, 0xbd, 0x2e, 0x34, 0x28, 0x61, 0xf6, 0x74, 0x96, 0x58, 0xca, 0x64, 0x9d, 0x4a, 0xdb, 0x03, 0x64, 0x74, 0x8f, 0x3f, 0xd0, 0x39, 0x1a, 0x36, 0xf1, 0x2e, 0x6c, 0x7c, 0xa0, 0x13, 0xb6, 0xf8, 0xfe, 0x5a, 0xc2, 0x27, 0xe7, 0x30, 0xcc, 0xc3, 0x78, 0x31, 0xb7, 0x2f, 0x40, 0x31, 0xad, 0x1a, 0xc1, 0xca, 0x97, 0x43, 0x53, 0x9b, 0x00, 0x4c, 0x8d, 0x61, 0x3d, 0x00, 0xc2, 0x52, 0xfd, 0x8b, 0x4b, 0x74, 0x97, 0x70, 0x93, 0xd1, 0xb5, 0x52, 0x25, 0xad, 0x36, 0xd4, 0x3c, 0x42, 0x67, 0x19, 0x88, 0x94, 0xeb, 0xc2, 0x30, 0x5c, 0xec, 0x5b, 0x3f, 0x24, 0x7a, 0x98, 0x07, 0x17, 0x29, 0xea, 0x23, 0x1a, 0x54, 0x30, 0x2d, 0x2b, 0x99, 0x99, 0x4f, 0x25, 0x6d, 0xf9, 0x2c, 0x63, 0xe6, 0x2c, 0xf4, 0xdd, 0x15, 0x48, 0x79, 0xbf, 0x8d, 0xa3, 0xad, 0x8e, 0xed, 0x11, 0xdb, 0x63, 0x99, 0xca, 0x72, 0xcd, 0xe5, 0xdb, 0x5c, 0x5c, 0x69, 0x21, 0x0b, 0xea, 0x48, 0x17, 0xd0, 0x2e, 0x88, 0x13, 0x23, 0x20, 0xe0, 0xb2, 0xe7, 0x39, 0x91, 0x7b, 0xdf, 0xa6, 0x24, 0x0f, 0xce, 0xe8, 0x2e, 0x75, 0x0a, 0x84, 0x77, 0x3a, 0x68, 0xb3, 0x18, 0x8a, 0xd4, 0x3e, 0x77, 0x7b, 0x09, 0xf0, 0x32, 0x22, 0x1a, 0x4e, 0x5d, 0x34, 0xd5, 0x77, 0xb0, 0x4a, 0x3f, 0x6c, 0x70, 0x0a, 0x97, 0x10, 0x4f, 0xc9, 0xa1, 0xa9, 0x7d, 0x68, 0x3f, 0xb6, 0x9c, 0x86, 0x89, 0x59, 0x6d, 0x48, 0xdf, 0xac, 0x4b, 0x40, 0xbf, 0xc9, 0xe1, 0x52, 0x42, 0x56, 0xa0, 0x8d, 0xa0, 0xce, 0xe6, 0x4d, 0x0d, 0xf4, 0xe5, 0x37, 0xcf, 0x19, 0xad, 0xd6, 0x74, 0x1e, 0xf1, 0xdd, 0x6b, 0x64, 0x61, 0x71, 0x7d, 0x15, 0xc1, 0xe9, 0xdd, 0x6b, 0x04, 0xe9, 0xd3, 0xe9, 0x20, 0xd6, 0x35, 0xb3, 0x60, 0xf8, 0x2d, 0x66, 0x5e, 0xc7, 0x12, 0x28, 0x02, 0x48, 0x3b, 0xd6, 0x14, 0x69, 0x20, 0x81, 0x50, 0xc1, 0x30, 0x97, 0x02, 0x2d, 0x25, 0x7f, 0xa3, 0x25, 0xd0, 0x77, 0xf1, 0xc9, 0x96, 0xf4, 0x7b, 0xfd, 0x18, 0xe8, 0xac, 0x11, 0xcb, 0x9a, 0xba, 0xd7, 0x70, 0x00, 0x0b, 0x1a, 0xb4, 0xc1, 0xf8, 0xd5, 0x6c, 0x4f, 0x03, 0xb1, 0x28, 0xc6, 0xde, 0x8a, 0x23, 0x7a, 0xd7, 0x20, 0xbf, 0x5d, 0x99, 0x24, 0x13, 0xb1, 0x46, 0x44, 0x3f, 0xaa, 0x58, 0xef, 0x8e, 0xf0, 0xda, 0xf1, 0x93, 0x2c, 0xdd, 0x1f, 0xc7, 0x0e, 0x3c, 0xab, 0x5f, 0x74, 0x19, 0xed, 0x5e, 0xa1, 0x9b, 0xa6, 0x12, 0xb0, 0xdf, 0x09, 0x85, 0xaf, 0x25, 0x20, 0x97, 0x07, 0xa3, 0x50, 0xb9, 0x2e, 0x8e, 0x06, 0x91, 0xbd, 0x46, 0xe2, 0xfc, 0x5a, 0xa9, 0xe7, 0x24, 0x30, 0xfd, 0x7a, 0xb2, 0xce, 0x0b, 0x3d, 0x51, 0xa2, 0x37, 0x1a, 0xfd, 0x7f, 0xc7, 0xfd, 0xe1, 0xd2, 0xa4, 0x0f, 0xb5, 0x78, 0x36, 0x84, 0xe4, 0x62, 0x40, 0x3a, 0xeb, 0x6c, 0xc9, 0xc7, 0xb7, 0x17, 0x76, 0xad, 0xf9, 0x18, 0xf6, 0xd9, 0xa5, 0xdc, 0x4e, 0x9c, 0x2b, 0x77, 0x2e, 0xc4, 0x0e, 0xa1, 0xaa, 0x95, 0xed, 0xbd, 0xe3, 0xa9, 0x25, 0x00, 0x99, 0x13, 0x94, 0x32, 0xa1, 0x3c, 0x3b, 0xb9, 0xb6, 0x5b, 0xad, 0xca, 0x33, 0x84, 0x9b, 0xfb, 0x96, 0xa4, 0xe2, 0x9c, 0xe1, 0xf2, 0xf3, 0x7f, 0x47, 0x9c, 0x6e, 0x23, 0xae, 0xc9, 0x53, 0x6d, 0xe5, 0x2f, 0x21, 0x4e, 0xb8, 0xd0, 0xb7, 0x1a, 0x30, 0xa9, 0xf0, 0x62, 0x9a, 0x5a, 0x22, 0x91, 0x43, 0x20, 0x1d, 0xac, 0xe8, 0x9a, 0x49, 0xe9, 0x53, 0x36, 0xeb, 0x02, 0xb1, 0x4a, 0xd1, 0x74, 0x7b, 0x23, 0xda, 0x15, 0x1b, 0x9e, 0x17, 0xb2, 0x9c, 0x11, 0x83, 0x93, 0x09, 0x8c, 0x8f, 0x21, 0x51, 0xce, 0xf8, 0x15, 0xd2, 0x62, 0xae, 0xd2, 0xe8, 0xc8, 0xb7, 0xe6, 0x0b, 0xa7, 0x63, 0xd4, 0x77, 0x57, 0x2f, 0x91, 0x59, 0x55, 0x29, 0x6e, 0xf8, 0x61, 0xd0, 0x43, 0x5f, 0x5f, 0x9a, 0x26 }; +constexpr AccessUnit AC3_SKIP_BYTES_EXPECTED_AU = { 0x15f90, 0x153d5, false, 0, {}, { 0x8e, 0x59, 0x01, 0x62, 0x21, 0xbd, 0x77, 0x65, 0x7b, 0xfe, 0x1e, 0xb1, 0x20, 0x49, 0xce, 0x3f, 0xed, 0x98, 0xe4, 0x99 } }; + +const std::vector LPCM_SKIP_BYTES_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xf3, 0x3b, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0x7a, 0x01, 0xe0, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x1a, 0x00, 0x80, 0x20, 0x90, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xbd, 0x07, 0x5a, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xa7, 0xab, 0x1e, 0x73, 0x3b, 0x40, 0xe6, 0xa3, 0x12, 0x99, 0xcf, 0x16, 0x2e, 0x6d, 0x67, 0x2a, 0xa2, 0xb4, 0xf7, 0xa2, 0x3c, 0xdf, 0x11, 0xe7, 0x98, 0x98, 0xef, 0x5c, 0x93, 0xbf, 0x51, 0x56, 0xaa, 0x5c, 0x26, 0x2d, 0x8e, 0xc3, 0x34, 0x23, 0x45, 0x68, 0x25, 0x5c, 0x60, 0x1a, 0xa9, 0x35, 0x12, 0xa7, 0x95, 0x8f, 0x35, 0x23, 0x2e, 0x00, 0x85, 0x49, 0x0c, 0xe8, 0xa6, 0xbc, 0x42, 0xe5, 0xb8, 0x18, 0xb0, 0x29, 0x86, 0x1c, 0xb6, 0x9d, 0xa0, 0x5c, 0xa9, 0xea, 0xee, 0x40, 0xc2, 0xbc, 0x80, 0x4c, 0x63, 0xe7, 0xab, 0xe4, 0xf1, 0x41, 0xc0, 0x15, 0x9e, 0x52, 0xeb, 0x12, 0xd9, 0x34, 0x02, 0x6b, 0x50, 0x3c, 0x4c, 0x38, 0xa5, 0x53, 0x99, 0xac, 0x57, 0x0b, 0x29, 0xd9, 0x6f, 0xd8, 0x3c, 0x96, 0xfa, 0x05, 0x45, 0xc7, 0x66, 0x43, 0x1e, 0x88, 0x3b, 0xe5, 0xbe, 0xed, 0xd0, 0x3b, 0x42, 0x59, 0xf8, 0x84, 0x52, 0xab, 0xc8, 0x7e, 0x2f, 0xb5, 0xdd, 0x8c, 0xf7, 0xc2, 0xe1, 0xe1, 0xeb, 0x1a, 0x25, 0x47, 0xbf, 0xd1, 0x8c, 0x5f, 0x49, 0x51, 0x2c, 0x71, 0x0e, 0x5c, 0x51, 0x36, 0x86, 0x89, 0xcf, 0x21, 0x1c, 0x6d, 0xd6, 0x1c, 0x36, 0xf9, 0xa1, 0xc0, 0xd2, 0xbc, 0xc0, 0x77, 0x85, 0x11, 0xe7, 0x11, 0xe8, 0x6b, 0x56, 0xb6, 0xbe, 0x41, 0x6f, 0x4b, 0x5f, 0x52, 0xfc, 0xa7, 0x30, 0x48, 0x30, 0x39, 0x44, 0xdc, 0x7d, 0xed, 0x56, 0x1b, 0xb8, 0x7c, 0xc7, 0x6d, 0x26, 0x7c, 0x56, 0x5b, 0x72, 0xca, 0xa2, 0x65, 0xab, 0x2b, 0xcf, 0x50, 0xb6, 0x49, 0xc9, 0xa8, 0xe7, 0x52, 0xf8, 0x84, 0xa9, 0xf5, 0x76, 0xb6, 0x5f, 0x78, 0x09, 0xe5, 0xef, 0x1b, 0x79, 0x5d, 0xa0, 0x17, 0xfe, 0x77, 0x31, 0xdc, 0xe4, 0xf1, 0x66, 0x67, 0xa1, 0x98, 0x66, 0xc8, 0xf8, 0x16, 0x99, 0x3f, 0xe7, 0xd2, 0xfc, 0x81, 0x72, 0x20, 0x0f, 0x06, 0xa0, 0x44, 0xc6, 0x7a, 0x1d, 0xfa, 0x30, 0xb1, 0x73, 0x8d, 0xbf, 0xb7, 0xb8, 0xa4, 0x57, 0xd3, 0x2d, 0x58, 0x98, 0xa7, 0x2c, 0x3e, 0x0d, 0xba, 0x5b, 0x6a, 0x21, 0x0f, 0x0f, 0xa3, 0x18, 0xa5, 0x3c, 0x47, 0x70, 0xfc, 0x7e, 0x95, 0x4d, 0xfa, 0xfc, 0x65, 0xed, 0xcd, 0x3f, 0x7a, 0x3f, 0xa0, 0x40, 0xf3, 0x1b, 0x4c, 0x38, 0xa2, 0xb5, 0x55, 0x07, 0x27, 0x41, 0xd3, 0x34, 0x2a, 0xf6, 0x25, 0xd6, 0x24, 0xd4, 0x86, 0xf8, 0x64, 0xe1, 0xe4, 0x35, 0x6e, 0xbf, 0x96, 0xaa, 0xcf, 0xd7, 0xc1, 0x7c, 0xf0, 0x70, 0x9e, 0x85, 0xa9, 0x74, 0xe4, 0xf2, 0x88, 0xbc, 0x07, 0xdf, 0x07, 0x1b, 0x1d, 0x3a, 0x33, 0x8f, 0x82, 0x7e, 0x7f, 0x4a, 0xa5, 0x10, 0xba, 0x6f, 0x8c, 0x41, 0x67, 0xc9, 0xee, 0x56, 0xf9, 0xcd, 0x08, 0x0e, 0x9f, 0xa3, 0x7e, 0x75, 0xb2, 0x24, 0xe7, 0x20, 0xec, 0xea, 0xe5, 0x06, 0xf1, 0xef, 0xde, 0x96, 0xe4, 0x59, 0xb8, 0xcf, 0xfd, 0x69, 0x2e, 0x5e, 0x68, 0xb5, 0xa1, 0x18, 0xdd, 0x1a, 0x7b, 0x63, 0xb3, 0x0d, 0x81, 0x40, 0x6d, 0x3f, 0xb5, 0x1c, 0xf3, 0xbf, 0x9c, 0xad, 0xff, 0xf9, 0x0d, 0x5a, 0x73, 0x56, 0xdb, 0x0d, 0x91, 0x4d, 0x00, 0x6f, 0x5b, 0x2e, 0x1c, 0xdf, 0x8e, 0xf6, 0x6b, 0xa8, 0xf8, 0xf2, 0x8d, 0x53, 0x23, 0x09, 0xb5, 0x0d, 0x97, 0xe5, 0x23, 0x77, 0x22, 0x64, 0x04, 0x77, 0xf3, 0xf9, 0x11, 0xb4, 0x75, 0xf0, 0x88, 0xf9, 0x30, 0xba, 0x60, 0x9c, 0x24, 0xb3, 0xd0, 0x95, 0x65, 0x07, 0x87, 0x07, 0xe5, 0xb0, 0x30, 0x3e, 0xb9, 0x9e, 0x1e, 0x80, 0x42, 0x9c, 0x3d, 0x2f, 0x0c, 0x72, 0xa0, 0x06, 0x4a, 0x5b, 0x52, 0x92, 0x38, 0xd5, 0x36, 0x15, 0xd9, 0x55, 0x25, 0x76, 0xd6, 0x74, 0x96, 0x04, 0x67, 0x96, 0x73, 0x11, 0x9c, 0x1f, 0xf9, 0xb7, 0x6c, 0xbf, 0xb7, 0x58, 0x4c, 0x62, 0x13, 0x97, 0x56, 0xca, 0xeb, 0xe5, 0x2a, 0xee, 0x28, 0xe2, 0x0c, 0x97, 0x6b, 0x2a, 0x09, 0xd5, 0x28, 0x4a, 0xff, 0x52, 0xd0, 0xfa, 0xea, 0x91, 0xe0, 0xdf, 0xd0, 0xa3, 0xf2, 0x5c, 0x24, 0xe0, 0x38, 0x4e, 0x83, 0xad, 0xe8, 0xaf, 0x1f, 0x68, 0x87, 0x72, 0x40, 0xe6, 0x25, 0x26, 0xa2, 0x3a, 0xed, 0x2a, 0xab, 0xae, 0x9b, 0x83, 0xae, 0x11, 0xc4, 0x8f, 0xc5, 0xcd, 0xf6, 0x39, 0xe9, 0x74, 0x22, 0x69, 0x5d, 0xab, 0xe0, 0xc6, 0x96, 0x9b, 0x66, 0x05, 0x1b, 0x63, 0x5c, 0x70, 0x29, 0x27, 0xd9, 0x4c, 0x09, 0xaa, 0x2d, 0x48, 0x59, 0xb1, 0x5b, 0x33, 0xc1, 0x7b, 0x4b, 0x80, 0xd3, 0x1f, 0x27, 0x78, 0x18, 0x9a, 0x6c, 0x0e, 0x72, 0xd0, 0x9c, 0xb2, 0x68, 0xe5, 0x9c, 0xa6, 0x08, 0x93, 0x25, 0xa9, 0x5e, 0x78, 0xe4, 0xfb, 0xbf, 0x74, 0x1f, 0x0a, 0x62, 0x9b, 0x01, 0x58, 0x02, 0x51, 0xe1, 0x5f, 0x88, 0x87, 0x2d, 0x84, 0xf7, 0x48, 0xc5, 0x60, 0x15, 0xf5, 0xf4, 0xf6, 0x8e, 0xec, 0x4d, 0x90, 0x90, 0x7e, 0x1f, 0x5f, 0x18, 0x55, 0x4d, 0x27, 0x69, 0xd2, 0xa9, 0x7a, 0x75, 0xf1, 0x2f, 0x56, 0x28, 0xb4, 0xc4, 0x35, 0xd2, 0x35, 0x41, 0xcf, 0x36, 0xd0, 0xf9, 0x26, 0xef, 0x12, 0x12, 0xa3, 0x2c, 0x57, 0x45, 0x4e, 0xff, 0x40, 0xe7, 0x73, 0xba, 0x76, 0x58, 0x34, 0x12, 0x59, 0x34, 0xea, 0x15, 0x95, 0xda, 0x45, 0x0f, 0xbf, 0x32, 0x8e, 0x01, 0x68, 0xc2, 0x8b, 0x42, 0x58, 0x78, 0xd8, 0x62, 0xd1, 0xbe, 0xb5, 0x77, 0x17, 0xb1, 0xa7, 0x5d, 0x93, 0xaa, 0x69, 0xa2, 0x57, 0x56, 0xfb, 0x10, 0xd2, 0x19, 0xeb, 0x22, 0x00, 0x80, 0x03, 0xd1, 0x63, 0xec, 0x14, 0x83, 0x86, 0xc8, 0x7a, 0x05, 0xf0, 0xf6, 0x94, 0xe2, 0xae, 0x36, 0x54, 0x81, 0xea, 0xbb, 0x8d, 0xd3, 0x2c, 0x3f, 0xbe, 0x80, 0x48, 0x30, 0x71, 0xdf, 0x08, 0xd7, 0x69, 0x25, 0x1a, 0x96, 0x3e, 0x90, 0xd9, 0x8f, 0x27, 0x8d, 0xe9, 0x60, 0x01, 0x09, 0xd0, 0xc3, 0xdd, 0x75, 0xed, 0x2f, 0xaa, 0x35, 0x90, 0xdf, 0xba, 0x6f, 0x07, 0xd2, 0x36, 0x83, 0xda, 0xa6, 0xcb, 0x9f, 0x9a, 0x64, 0x1e, 0x2d, 0x00, 0x9b, 0xd2, 0x15, 0x28, 0x70, 0x24, 0x18, 0x38, 0x69, 0x79, 0xaf, 0xc4, 0x2a, 0x60, 0x3e, 0xac, 0x66, 0xcd, 0x89, 0x55, 0xb6, 0xad, 0xa9, 0x6c, 0x21, 0x0c, 0x06, 0xa7, 0x7f, 0x5d, 0x00, 0x20, 0x03, 0xc0, 0x5e, 0x4b, 0x9f, 0x39, 0x9f, 0x98, 0xff, 0x34, 0xc6, 0x4b, 0x57, 0xde, 0x47, 0x1f, 0x4d, 0x26, 0x21, 0xa9, 0x97, 0x5e, 0x56, 0xab, 0x3f, 0xe0, 0x44, 0xb4, 0x92, 0x35, 0x96, 0xd2, 0x1f, 0x8d, 0xcb, 0x24, 0x69, 0x93, 0x93, 0x95, 0x1c, 0xec, 0x78, 0x11, 0xe4, 0xec, 0x8d, 0xfa, 0x4c, 0x4a, 0x2d, 0xb1, 0x33, 0xe2, 0xef, 0x74, 0xbb, 0xd1, 0x6a, 0xec, 0xcd, 0x77, 0x5d, 0x20, 0x8a, 0x26, 0x63, 0xba, 0x51, 0x95, 0x4c, 0xc8, 0x1f, 0x56, 0xa5, 0x5a, 0x83, 0xe3, 0x32, 0xc3, 0x64, 0x11, 0x45, 0x4d, 0x4f, 0xe9, 0x3f, 0x9c, 0x16, 0x3d, 0xa8, 0x2c, 0xe4, 0x86, 0xa8, 0x8b, 0x27, 0xce, 0xd3, 0x48, 0xda, 0xb9, 0x85, 0xbe, 0x2a, 0xf8, 0x52, 0x1d, 0x69, 0xb1, 0x3a, 0x75, 0xd6, 0xa8, 0xa9, 0x91, 0xb0, 0x35, 0x73, 0xe9, 0x92, 0x54, 0x56, 0x06, 0x10, 0x5b, 0xb0, 0x07, 0x18, 0x1c, 0x6b, 0x3d, 0x8f, 0x8b, 0x60, 0xf9, 0x21, 0x2e, 0xa8, 0x07, 0x51, 0xd7, 0x8f, 0x7e, 0x28, 0x8e, 0x39, 0xc6, 0x23, 0x9d, 0x1e, 0x17, 0x37, 0x1d, 0xef, 0xbf, 0x0c, 0x81, 0x8e, 0xfd, 0xc6, 0xf8, 0x1d, 0x3a, 0xfb, 0xad, 0x61, 0xed, 0xae, 0x27, 0xf4, 0x76, 0x79, 0x6c, 0xff, 0xbf, 0x26, 0x99, 0x7b, 0x69, 0x75, 0x0d, 0x36, 0xd3, 0xd0, 0x70, 0x11, 0x51, 0x18, 0x17, 0x43, 0x48, 0xdf, 0xa3, 0x82, 0x17, 0xaf, 0xd2, 0x6f, 0x03, 0x40, 0xe7, 0xa5, 0x7f, 0xa2, 0x1a, 0x39, 0x8f, 0xdd, 0xf0, 0x99, 0x2a, 0x79, 0x83, 0x15, 0xc3, 0xed, 0xfb, 0x80, 0x6a, 0xf8, 0xd3, 0xb1, 0x38, 0x51, 0xae, 0xd5, 0xde, 0x42, 0xc5, 0xd7, 0x99, 0x06, 0x45, 0x52, 0xe8, 0x13, 0x1d, 0xd5, 0xb9, 0xa1, 0x10, 0x61, 0xef, 0x08, 0x11, 0x79, 0x7c, 0xe2, 0x3e, 0x21, 0x6b, 0xf4, 0xfb, 0x9f, 0x92, 0x53, 0xff, 0xf6, 0xce, 0x4b, 0x61, 0x48, 0x00, 0xf7, 0xec, 0xb2, 0x2e, 0x96, 0x49, 0x49, 0x79, 0x07, 0xc9, 0x45, 0xce, 0xfb, 0xdf, 0x86, 0x89, 0xc5, 0x91, 0xff, 0x6a, 0xd9, 0x6c, 0xba, 0x8d, 0x5c, 0xd1, 0x69, 0x58, 0x68, 0x98, 0xd9, 0x7c, 0xcc, 0x5c, 0xa3, 0x80, 0x78, 0x03, 0xf5, 0x83, 0xea, 0x40, 0x59, 0x16, 0x32, 0x28, 0xc0, 0x6b, 0x73, 0x1b, 0x4a, 0x30, 0xf5, 0x95, 0x8f, 0xd6, 0x29, 0xb3, 0x56, 0x25, 0x3a, 0x6e, 0xff, 0x47, 0x02, 0xe8, 0x25, 0xc2, 0x8b, 0x44, 0x1a, 0xfb, 0x68, 0xed, 0x59, 0x47, 0x90, 0x3a, 0x12, 0x93, 0x8b, 0xda, 0x54, 0x3b, 0x1d, 0x7b, 0x93, 0x8d, 0xba, 0x86, 0x88, 0x0e, 0x65, 0xfd, 0x99, 0x8f, 0xdb, 0xb7, 0x5c, 0x8b, 0x26, 0x9c, 0xdb, 0x7e, 0xe5, 0x9c, 0xa1, 0x14, 0xfb, 0x79, 0xcb, 0x6a, 0x6f, 0xa0, 0x93, 0xbc, 0xaa, 0xb4, 0x1d, 0x46, 0x54, 0x81, 0x6f, 0x23, 0x92, 0x71, 0xe5, 0x73, 0x5d, 0xc4, 0x92, 0x26, 0x23, 0x2a, 0x43, 0x17, 0x06, 0x6e, 0x34, 0x68, 0x5e, 0x5a, 0x9c, 0x49, 0x49, 0x11, 0xa3, 0x9a, 0x76, 0x6d, 0x67, 0x09, 0x7f, 0x2f, 0x1e, 0xa5, 0x70, 0x0a, 0x89, 0x09, 0x51, 0xe0, 0x33, 0x94, 0xdf, 0xa6, 0x3f, 0x4a, 0xb6, 0xd7, 0xb6, 0x5e, 0xa9, 0x69, 0x9c, 0x81, 0x03, 0xa8, 0x42, 0x6e, 0xe2, 0x66, 0x91, 0x52, 0x08, 0x6d, 0x4e, 0x0b, 0xae, 0x1f, 0x8c, 0x5b, 0x45, 0xad, 0xd1, 0x89, 0x3c, 0x59, 0xa0, 0x0d, 0x24, 0x9f, 0x72, 0x47, 0xcf, 0x45, 0x45, 0x54, 0x4c, 0xb1, 0x53, 0x84, 0xd2, 0xf3, 0x9f, 0x11, 0xff, 0x6e, 0x5a, 0x00, 0x01, 0x17, 0x5b, 0x65, 0x89, 0xa3, 0x1e, 0x6a, 0xa1, 0x21, 0x1c, 0xca, 0xc1, 0xe2, 0x56, 0xa8, 0xc6, 0xa1, 0x75, 0xf9, 0x98, 0x4e, 0xdc, 0xe0, 0xae, 0xfb, 0x76, 0xaa, 0xb8, 0xb8, 0x42, 0x62, 0x23, 0x70, 0xc5, 0x19, 0x33, 0x0d, 0xf6, 0x55, 0xf7, 0x70, 0x4b, 0x5e, 0x45, 0x12, 0xf3, 0x38, 0x8a, 0x43, 0x6f, 0x9c, 0x1f, 0x75, 0x08, 0x36, 0x61, 0xfb, 0xe4, 0xf6, 0xcd, 0x26, 0xa9, 0x45, 0xd0, 0xba, 0x00, 0x5b, 0x1e, 0x0a, 0x53, 0x19, 0xac, 0x4c, 0xaa, 0x1c, 0xaa, 0xf2, 0x7f, 0xe6, 0x19, 0x07, 0xd9, 0x5b, 0xdd, 0xed, 0x27, 0xf0, 0x5d, 0x01, 0x96, 0x40, 0x19, 0xe6, 0xd8, 0xee, 0xc9, 0x9b, 0xa2, 0x04, 0xe6, 0x8e, 0x57, 0x39, 0xb2, 0x4e, 0x9c, 0xca, 0x2d, 0x9a, 0xd4, 0xd1, 0x76, 0xda, 0xbc, 0x4a, 0x8f, 0x56, 0xaa, 0x2c, 0x94, 0xb3, 0x20, 0x49, 0xbd, 0x7b, 0xba, 0xd9, 0xd4, 0xca, 0xaa, 0xe2, 0xec, 0x60, 0x47, 0xee, 0x80, 0xa5, 0x65, 0xa3, 0x53, 0x78, 0x6e, 0x4f, 0xa9, 0xc1, 0x87, 0x70, 0xbb, 0x20, 0x29, 0xbc, 0x7f, 0x47, 0xfa, 0x44, 0x1e, 0xba, 0xde, 0xb3, 0xb9, 0x15, 0x76, 0xb6, 0x57, 0x1b, 0x8b, 0x21, 0x0f, 0x12, 0x2e, 0x53, 0xe1, 0x4b, 0x71, 0xe7, 0xbc, 0xd1, 0x0d, 0xc8, 0xa7, 0x91, 0x5d, 0x24, 0x19, 0x8a, 0x7e, 0xdb, 0xe3, 0xce, 0x79, 0x5f, 0x46, 0x5d, 0xcb, 0x35, 0x0f, 0x2f, 0xb0, 0x74, 0xdd, 0xeb, 0x05, 0xfe, 0xe1, 0x28, 0xa2, 0x56, 0xbe, 0x36, 0x83, 0x40, 0x5f, 0xc1, 0x27, 0x9f, 0xe3, 0xdb, 0xec, 0x28, 0xfa, 0x35, 0x62, 0xf5, 0x4b, 0x97, 0xd1, 0x08, 0xc3, 0xdf, 0x67, 0x3a, 0xec, 0x1a, 0xda, 0x39, 0xa3, 0x77, 0x6a, 0x8c, 0xc3, 0x2e, 0x84, 0xbd, 0xb2, 0x9f, 0x88, 0x19, 0xe1, 0x2f, 0x67, 0xbc, 0x93, 0xc2, 0x15, 0xbe, 0x9d, 0xcb, 0x14, 0xcc, 0xe3, 0x43, 0x84, 0x7a, 0xc3, 0x1c, 0x84, 0x0f, 0xb8, 0xf4, 0xd8, 0xb0, 0xe0, 0x0d, 0x0e, 0x15, 0x35, 0xeb, 0xa7, 0x36, 0x9a, 0x0d, 0xf5, 0x9b, 0x23, 0x9c, 0xb2, 0x3a, 0x15, 0x16, 0x85, 0x13, 0xa5, 0x45, 0x00, 0xf0, 0x6a, 0x04, 0xbb, 0xfd, 0xf8, 0xb0, 0x9c, 0x18, 0x32, 0x39, 0x83, 0x13, 0x3d, 0x3b, 0xd0, 0x49, 0x1b, 0x91, 0x84, 0x3d, 0x61, 0x3b, 0xfb, 0x1a, 0x90, 0xaa, 0x78, 0x60, 0x03, 0xa5, 0xf8, 0x0c, 0x71, 0x78, 0x1c, 0xf6, 0x7c, 0x0f, 0x0d, 0x52, 0xd7, 0x2d, 0xaa, 0x76, 0xe8, 0xf9, 0x70, 0x5e, 0xf4, 0x6a, 0xe1, 0x8e, 0x4a, 0x70, 0x5a, 0x45, 0xf0, 0xca, 0xa5, 0x2e, 0xba, 0xf7, 0xad, 0xf1, 0xe8, 0xb1, 0x2a, 0x60, 0xa3, 0xc9, 0x25, 0x1e, 0xf3, 0x78, 0xac, 0xf1, 0x14, 0x61, 0x1a, 0x31, 0x38, 0xde, 0xbf, 0xee, 0x1f, 0x5b, 0xda, 0xd7, 0x19, 0xd0, 0x28, 0xe9, 0x4b, 0xa2, 0x83, 0x76, 0x66, 0x7d, 0x48, 0x14, 0x0f, 0xeb, 0x80, 0x70, 0xab, 0xbc, 0x18, 0x2d, 0x64, 0x85, 0x86, 0x34, 0x7f, 0xc3, 0xb7, 0x32, 0x65, 0x74, 0x2a, 0x1d, 0xf3, 0x29, 0x81, 0xf3, 0xfd, 0xe1, 0x03, 0x28, 0x06, 0x3e, 0xc0, 0x62, 0xa8, 0xd6, 0x62, 0x72, 0x2b, 0xb2, 0xe0, 0xc2, 0x41, 0x4b, 0x8e, 0x8c, 0xe6, 0x86, 0x43, 0xa2, 0xe3, 0x85, 0x9e, 0x9a, 0x6d, 0x55, 0x96, 0xa0, 0xd8, 0xc3, 0xda, 0x46, 0x64, 0xea, 0xbf, 0x0a, 0x96, 0x3c, 0xaf, 0x81, 0xa3, 0x22, 0x5a, 0x42, 0xd5, 0x6b, 0x30, 0x14, 0x0c, 0x25, 0xc2, 0xf9, 0xa6, 0xac, 0x2e, 0x05, 0x77, 0xea, 0xad, 0x3a, 0xa9, 0x2d, 0xd8, 0xc3, 0xa3, 0x0b, 0x57, 0x44, 0x4a, 0x28, 0xf1, 0x2b, 0x44, 0xed, 0x41, 0x2e, 0x11, 0x73, 0x8f, 0x59, 0x16, 0x36, 0x78, 0x68, 0xff, 0x5b, 0x76, 0x49, 0x06, 0x8f, 0x73, 0xfe, 0x03, 0xd4, 0xf3, 0x48, 0x69, 0xbe, 0x7d, 0xb9, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x79, 0x01, 0x00, 0x40, 0xbf, 0x45, 0x1f, 0x31, 0x39, 0xc2, 0x40, 0x77, 0xfb, 0x6a, 0x24, 0xa5, 0xcb, 0x6c, 0xd8, 0x05, 0xaa, 0x6f, 0x6b, 0xa1, 0x51, 0x5c, 0xbf, 0x4c, 0xc1, 0x76, 0xed, 0x59, 0x4e, 0xa6, 0xc4, 0x9e, 0x1f, 0x40, 0x72, 0xa2, 0x7b, 0xaf, 0xe7, 0x0b, 0x6c, 0xcc, 0x79, 0xb2, 0x80, 0xe2, 0xd8, 0xea, 0xbe, 0x8d, 0x61, 0xec, 0x07, 0xf7, 0x4d, 0x6d, 0x8f, 0x38, 0x63, 0xc7, 0x14, 0xc2, 0x1c, 0x4e, 0x01, 0x22, 0x5b, 0xb4, 0xb4, 0x97, 0x33, 0x82, 0x77, 0x27, 0x5f, 0x24, 0xfe, 0x41, 0x57, 0x01, 0x75, 0x26, 0x2f, 0x97, 0x5d, 0x82, 0xb5, 0xa1, 0xda, 0x10, 0x68, 0xb9, 0x2c, 0x27, 0x45, 0xfa, 0x65, 0x81, 0x8f, 0x93, 0xa9, 0xac, 0xfa, 0x5d, 0x87, 0xeb, 0xed, 0xca, 0x2d, 0x73, 0xc4, 0xde, 0x8e, 0x54, 0x38, 0xf0, 0xbe, 0x7f, 0x64, 0x6c, 0x17, 0x9f, 0x09, 0xe0, 0xe9, 0xd0, 0x08, 0xf6, 0xd1, 0x67, 0x2a, 0x32, 0xf0, 0x43, 0xc1, 0xa1, 0x9a, 0x6f, 0xac, 0xb8, 0x4a, 0x04, 0xc5, 0x17, 0xdd, 0x97, 0xd3, 0x0b, 0x6e, 0x95, 0x7b, 0xd6, 0x4c, 0x6d, 0xce, 0x31, 0xf1, 0x5f, 0x64, 0x9b, 0xe4, 0x46, 0x3f, 0x47, 0xf5, 0xd4, 0xc6, 0xda, 0x42, 0xeb, 0x9b, 0x42, 0xe4, 0x28, 0x32, 0x47, 0x48, 0xd0, 0x4b, 0xbf, 0x80, 0x90, 0xd1, 0x6a, 0x17, 0xe6, 0xac, 0xe3, 0x3e, 0x15, 0x8c, 0x46, 0x4e, 0xf2, 0xd3, 0x4a, 0xf7, 0xfc, 0xf7, 0x15, 0xa4, 0x7c, 0x2c, 0x04, 0xe0, 0xb4, 0x17, 0x0e, 0xcb, 0x45, 0xe0, 0xa8, 0xdf, 0x5d, 0xef, 0x38, 0xa7, 0x58, 0x10, 0x74, 0x20, 0xdc, 0xe7, 0x58, 0xd4, 0xa3, 0xdd, 0x79, 0x09, 0x7b, 0xf9, 0xe4, 0x7a, 0x24, 0x44, 0xdb, 0x77, 0x20, 0xb5, 0x0d, 0x73, 0xa1, 0xc4, 0x26, 0x47, 0x0f, 0x12, 0xd5, 0xbf, 0xf7, 0xdb, 0xa4, 0x37, 0x3e, 0x0e, 0x36, 0x4f, 0xf6, 0x4c, 0xd5, 0x14, 0x37, 0x22, 0x5d, 0x13, 0xc8, 0x3e, 0xec, 0x34, 0x8c, 0x81, 0xed, 0x63, 0xf1, 0x1e, 0x5b, 0x4a, 0xde, 0x2c, 0x58, 0xb8, 0xda, 0x60, 0x77, 0x7b, 0x6c, 0xd1, 0x4a, 0xab, 0xe9, 0x01, 0x25, 0xd1, 0x37, 0x7f, 0x1a, 0x4f, 0x31, 0xe8, 0x9b, 0xf9, 0xb9, 0x24, 0x57, 0xd4, 0xa9, 0x0a, 0x2f, 0x4d, 0x24, 0xe3, 0x5e, 0x7e, 0xfd, 0x67, 0x35, 0x35, 0x39, 0x33, 0xff, 0xea, 0xe3, 0xd0, 0xf1, 0xd1, 0xa9, 0xce, 0x39, 0xa5, 0x0c, 0x84, 0x94, 0xf9, 0x0c, 0x79, 0xfc, 0x0e, 0x9e, 0x97, 0x4e, 0x8b, 0x5f, 0x90, 0x06, 0x8f, 0x3d, 0x2d, 0x6c, 0x05, 0x1d, 0x69, 0xc8, 0x21, 0xaa, 0x83, 0x87, 0x77, 0xde, 0x84, 0x5b, 0x1f, 0xeb, 0xc8, 0xc5, 0xbd, 0x90, 0x93, 0x8e, 0x72, 0x0b, 0xc8, 0x27, 0x0f, 0x33, 0x41, 0xf5, 0x01, 0x60, 0x62, 0xeb, 0xdc, 0x33, 0xde, 0x18, 0x77, 0x6b, 0xd7, 0xf8, 0xfa, 0x4a, 0xc8, 0xa8, 0x5b, 0x43, 0xdf, 0x60, 0x21, 0xf1, 0xb4, 0xc3, 0x72, 0x8d, 0x93, 0xee, 0xbb, 0x65, 0xb7, 0x52, 0x7b, 0x0b, 0x2a, 0xc7, 0x01, 0x3c, 0x31, 0x6a, 0x2a, 0xb7, 0x7d, 0x1a, 0x65, 0x86, 0x76, 0xc8, 0x89, 0x6d, 0x66, 0xdc, 0x55, 0x82, 0x56, 0x58, 0x95, 0x27, 0xe4, 0x9a, 0x46, 0xe1, 0x69, 0xc9, 0x38, 0xcb, 0x1c, 0x59, 0x0e, 0x9b, 0x35, 0x39, 0x8c, 0x81, 0x1a, 0x86, 0x98, 0x4e, 0x1d, 0xea, 0x71, 0xa6, 0x6f, 0xf3, 0xdf, 0x39, 0x25, 0x0a, 0x76, 0x40, 0x9b, 0xe6, 0x37, 0xb6, 0x7f, 0x8a, 0x09, 0x0e, 0x46, 0x3d, 0xf1, 0x58, 0xf0, 0x07, 0x00, 0x22, 0x46, 0x9b, 0x47, 0x84, 0x02, 0xc0, 0x6c, 0x0f, 0x80, 0xa4, 0x95, 0xae, 0x02, 0x9e, 0xc4, 0xa0, 0x8a, 0x53, 0xec, 0x16, 0xd7, 0x4a, 0x52, 0x27, 0x26, 0x54, 0xee, 0x1e, 0x9c, 0x5a, 0xff, 0x57, 0x91, 0x78, 0xf8, 0x2c, 0x1a, 0x80, 0x68, 0xaf, 0x95, 0x31, 0xa5, 0x21, 0x02, 0xd9, 0x40, 0x78, 0x77, 0x22, 0x98, 0x58, 0x03, 0x40, 0x09, 0x4e, 0xb2, 0xc2, 0x9a, 0x3d, 0xa9, 0xb9, 0x17, 0x3e, 0x79, 0x04, 0x07, 0x6f, 0x13, 0xe3, 0xe7, 0x6d, 0x1a, 0x21, 0x8f, 0x72, 0x6d, 0x87, 0xc4, 0x58, 0x20, 0x5d, 0x3e, 0xf7, 0x48, 0x28, 0xbc, 0x9f, 0x50, 0xef, 0xdf, 0xa9, 0xb9, 0xb1, 0xe8, 0x5c, 0x75, 0xe9, 0xa3, 0x99, 0x4b, 0x28, 0xfe, 0x17, 0xf1, 0x3e, 0x27, 0x28, 0xbf, 0x76, 0x38, 0x37, 0x31, 0xcf, 0xb9, 0x91, 0xa0, 0x43, 0x8a, 0x17, 0xdf, 0x88, 0xfc, 0xfa, 0xa3, 0xd5, 0x27, 0x9b, 0xed, 0x93, 0xd0, 0x1b, 0xd7, 0x11, 0x58, 0x5e, 0x72, 0x97, 0x96, 0x6b, 0xaa, 0x7b, 0x9c, 0x70, 0x4f, 0x06, 0xb6, 0xe8, 0xb9, 0x53, 0x27, 0x9b, 0xac, 0x7d, 0x83, 0x6c, 0x70, 0xb8, 0x9e, 0x45, 0x3f, 0x34, 0x65, 0x8a, 0x7d, 0xe3, 0x32, 0xd8, 0x66, 0x7e, 0x57, 0x0a, 0x12, 0x6b, 0x04, 0xc0, 0x11, 0x56, 0xb6, 0xe5, 0xf4, 0xa1, 0xda, 0xf1, 0x7d, 0x03, 0x5b, 0xdd, 0x60, 0xf4, 0x28, 0x0b, 0xbb, 0xc2, 0x0d, 0x9f, 0xba, 0x68, 0x5e, 0xfe, 0x0a, 0x8a, 0x3c, 0x77, 0x0f, 0x22, 0x94, 0x49, 0x02, 0xd8, 0x0e, 0x91, 0x67, 0xfa, 0x80, 0xc6, 0x8a, 0x93, 0xbe, 0xd2, 0xe6, 0x26, 0xb6, 0x02, 0xa7, 0xf6, 0x48, 0x36, 0xbd, 0xf0, 0x41, 0x2d, 0x12, 0x94, 0x68, 0xc6, 0xee, 0x7f, 0x8a, 0x93, 0xa0, 0x66, 0xe8, 0x1c, 0xdb, 0xac, 0x89, 0xa7, 0x7f, 0xe8, 0x3a, 0x73, 0xa7, 0xee, 0x4e, 0xa1, 0x3d, 0x4d, 0x68, 0x51, 0x6a, 0x4b, 0xd7, 0xa6, 0xa3, 0xbc, 0x55, 0xb3, 0x30, 0x64, 0x33, 0x87, 0x5f, 0x9f, 0x41, 0xd7, 0xce, 0x8d, 0xf7, 0x09, 0x7b, 0x04, 0xb1, 0x8b, 0x7f, 0xf2, 0x08, 0xc5, 0xa8, 0x0a, 0x96, 0x13, 0x58, 0xcf, 0xac, 0x8e, 0x58, 0x64, 0xcd, 0x9a, 0x8a, 0xb9, 0xf2, 0x73, 0xa6, 0xe8, 0xeb, 0x3a, 0x72, 0xf4, 0x64, 0x42, 0x13, 0x2a, 0x5b, 0x8a, 0x7c, 0xda, 0x12, 0xae, 0x0a, 0x31, 0xcd, 0xc5, 0xd2, 0x57, 0xe3, 0xef, 0x3d, 0x33, 0xf2, 0x7e, 0xe3, 0x68, 0x3e, 0x09, 0xd1, 0x67, 0x8a, 0xe0, 0xab, 0xbc, 0xfa, 0x8e, 0x4f, 0xe3, 0xc1, 0x84, 0xe0, 0x54, 0xab, 0x00, 0x78, 0x8c, 0xdc, 0xd5, 0xda, 0x40, 0x31, 0xb6, 0xd7, 0x13, 0x38, 0x04, 0x58, 0x61, 0xa2, 0x61, 0x2d, 0x09, 0x99, 0x86, 0x15, 0x46, 0x7b, 0x0d, 0xab, 0xfd, 0xc1, 0x30, 0x23, 0x11, 0x2a, 0xc3, 0xfc, 0xa8, 0x66, 0xd3, 0x21, 0x6c, 0xe1, 0xb4, 0x1a, 0x32, 0x68, 0x75, 0x3b, 0x96, 0xbc, 0xf3, 0xff, 0x7c, 0x64, 0x10, 0xfc, 0x77, 0x38, 0xc0, 0x18, 0x86, 0x8f, 0xea, 0xee, 0xc5, 0xf5, 0x64, 0x91, 0xd7, 0xe2, 0x74, 0x10, 0x42, 0xcf, 0x9f, 0x71, 0x03, 0x9d, 0xc0, 0x0f, 0xff, 0x41, 0x9f, 0x7d, 0x35, 0x0d, 0x85, 0x61, 0xb5, 0x1c, 0x8f, 0xf8, 0xd4, 0xaf, 0xb2, 0x21, 0x29, 0x8c, 0xb3, 0x2b, 0x2f, 0x9d, 0x90, 0xc2, 0xab, 0x6e, 0x0e, 0xb9, 0x3c, 0x48, 0x76, 0x8e, 0x97, 0xf6, 0xa6, 0xd3, 0x6a, 0x89, 0x0f, 0xfc, 0xec, 0xa0, 0x47, 0x25, 0x7f, 0xfe, 0x2c, 0xcf, 0xfb, 0x7e, 0xe4, 0xac, 0x88, 0xb5, 0x24, 0x06, 0x16, 0xc4, 0x81, 0x46, 0xd8, 0x2d, 0xcd, 0xa3, 0x5b, 0xb6, 0xaf, 0x1f, 0x17, 0xa2, 0xfd, 0x34, 0x8e, 0xd6, 0x95, 0xeb, 0x64, 0xa8, 0x9e, 0x3c, 0xfb, 0x70, 0x8f, 0xf0, 0x81, 0x1e, 0x50, 0x62, 0x74, 0x6b, 0x57, 0xdc, 0x15, 0x65, 0x9f, 0x70, 0x50, 0x70, 0xc3, 0x75, 0xfc, 0xf4, 0xc2, 0x28, 0x8d, 0x61, 0x0d, 0x09, 0xa2, 0x31, 0xf6, 0xe5, 0xef, 0x1b, 0xb1, 0xc2, 0x7a, 0x9f, 0x5b, 0x0b, 0x3b, 0x8f, 0xd7, 0xb7, 0x76, 0x5c, 0x69, 0x48, 0x7d, 0x27, 0x52, 0xdb, 0x9b, 0xf2, 0xf4, 0xa9, 0x62, 0x78, 0x26, 0xb4, 0x9f, 0x6e, 0xc3, 0x78, 0x9f, 0x4c, 0xa9, 0xe4, 0x9a, 0xd3, 0xab, 0xee, 0x65, 0xf4, 0x29, 0x84, 0xc1, 0xd3, 0x4d, 0xb6, 0xec, 0xf2, 0x2d, 0x4d, 0x3d, 0xe1, 0x4f, 0x3e, 0x09, 0xe8, 0x3c, 0x93, 0x04, 0x8b, 0x38, 0xd7, 0xd8, 0xe3, 0x3c, 0x0a, 0xc9, 0x2a, 0xcf, 0xaa, 0x70, 0xef, 0x5b, 0x65, 0x01, 0xdd, 0x10, 0x74, 0xac, 0xfc, 0x8b, 0xbb, 0xed, 0xd9, 0xb0, 0x1e, 0x02, 0x11, 0x8e, 0xc3, 0xbb, 0x05, 0x2d, 0x19, 0x6c, 0xd7, 0x93, 0xdf, 0xb6, 0xe7, 0x76, 0x93, 0x5f, 0x6a, 0x5d, 0xf0, 0x85, 0xe3, 0x1e, 0x75, 0xd0, 0x83, 0x05, 0x06, 0x7b, 0xc9, 0x1a, 0x39, 0x50, 0xe5, 0x3f, 0xd5, 0xf6, 0xae, 0x1e, 0x89, 0x2f, 0x2e, 0x38, 0xff, 0xd1, 0x21, 0x76, 0xb0, 0xb6, 0xe3, 0x06, 0x30, 0xdd, 0xa2, 0x82, 0xdc, 0x6f, 0xda, 0x9a, 0x07, 0x79, 0x71, 0xb5, 0x30, 0x7b, 0xef, 0x55, 0xcb, 0x2a, 0xae, 0x2a, 0xa5, 0xfa, 0x07, 0x1e, 0xfb, 0x50, 0xc5, 0xc7, 0xbd, 0x81, 0x6c, 0x0e, 0xa3, 0xe2, 0x29, 0xf0, 0x01, 0xa5, 0x69, 0xad, 0x87, 0x40, 0x67, 0xcb, 0x57, 0x90, 0x48, 0xbd, 0x1e, 0x0f, 0x7e, 0x16, 0x20, 0xaa, 0x92, 0x97, 0x58, 0x2d, 0x90, 0x86, 0x29, 0x4c, 0xa9, 0x12, 0x3a, 0xae, 0xde, 0xbc, 0x73, 0x90, 0xa9, 0x03, 0x47, 0xea, 0x14, 0xcb, 0xba, 0x1f, 0xa1, 0x46, 0xbb, 0xa1, 0xed, 0x49, 0xe0, 0x20, 0x14, 0x5c, 0x90, 0x25, 0x17, 0xf3, 0x19, 0x2b, 0xd7, 0x94, 0x5c, 0x9e, 0x77, 0xe1, 0xf0, 0x53, 0x2b, 0xc6, 0xfa, 0x58, 0xb7, 0x47, 0x15, 0x3b, 0x3d, 0xa3, 0x01, 0x20, 0x1d, 0xcf, 0x00, 0x41, 0xe6, 0x8a, 0x0f, 0xb9, 0xc1, 0x74, 0x64, 0xb3, 0xc1, 0xf9, 0xe3, 0x56, 0x03, 0xfb, 0x6e, 0x15, 0x90, 0x86, 0x46, 0x2c, 0x5f, 0xf7, 0xda, 0x7d, 0xf6, 0x6a, 0xc4, 0x12, 0x84, 0x57, 0xcf, 0xf7, 0x75, 0xa0, 0x36, 0x30, 0xc8, 0x90, 0x95, 0xfd, 0xca, 0x8a, 0x1d, 0xbc, 0xe1, 0x4e, 0x16, 0x01, 0x90, 0x33, 0xc6, 0xcf, 0xf2, 0xb4, 0x2e, 0x00, 0x35, 0x18, 0x4d, 0x3f, 0xed, 0x35, 0xce, 0x2d, 0x41, 0x82, 0x5c, 0x92, 0x3e, 0xf6, 0xec, 0xa9, 0xe8, 0x74, 0xcb, 0xfa, 0xc5, 0xbe, 0x44, 0x46, 0xf5, 0x25, 0x0b, 0x6b, 0x2a, 0x7e, 0xec, 0x64, 0xfc, 0x0b, 0x57, 0xb3, 0x77, 0x62, 0xb6, 0xd6, 0xdf, 0x7a, 0xc8, 0xac, 0x04, 0x75, 0x5c, 0xd7, 0xa5, 0xc9, 0x25, 0x80, 0xb8, 0xd5, 0x88, 0x17, 0x9f, 0x15, 0x96, 0xf1, 0x94, 0x77, 0xa1, 0xce, 0xde, 0x87, 0x13, 0xbe, 0x93, 0x77, 0x70, 0xe5, 0xf8, 0x32, 0xb7, 0x11, 0xd2, 0x02, 0x8e, 0x2f, 0x1e, 0x7e, 0xd4, 0xfe, 0x16, 0xc1, 0xa7, 0xab, 0x7f, 0x22, 0xdf, 0x13, 0x92, 0xe6, 0x8e, 0xe5, 0x03, 0xb3, 0x25, 0xf6, 0x07, 0xb6, 0x1b, 0x55, 0x4a, 0xbc, 0x5c, 0x16, 0x34, 0xb6, 0xdc, 0xd9, 0x06, 0x6c, 0xf7, 0x6d, 0x90, 0x54, 0x9a, 0x3d, 0x9e, 0xce, 0x50, 0x49, 0x58, 0x36, 0xa9, 0xd6, 0x27, 0x9a, 0xa5, 0x32, 0xef, 0x03, 0x09, 0x21, 0xa4, 0x8c, 0xdb, 0xd5, 0x89, 0xcd, 0x56, 0x83, 0xa1, 0x50, 0x1f, 0x06, 0x29, 0x04, 0x8e, 0x0c, 0x15, 0xff, 0x4a, 0xcf, 0xf0, 0xf5, 0x9c, 0x50, 0x99, 0x2b, 0x1e, 0x8f, 0xb8, 0xe4, 0xc2, 0x4c, 0xec, 0x79, 0x4d, 0x2a, 0x04, 0xa9, 0xc1, 0x61, 0xcb, 0xcb, 0x52, 0x48, 0x3b, 0xe9, 0xe2, 0x5b, 0x14, 0x00, 0x1f, 0xa4, 0x38, 0xd7, 0xc4, 0x87, 0x3e, 0x3a, 0x92, 0x6e, 0x25, 0x85, 0xff, 0xd9, 0x1b, 0xc0, 0xbf, 0xb7, 0xac, 0xce, 0x93, 0x27, 0xf1, 0x63, 0x0b, 0xf4, 0x71, 0xc3, 0x2c, 0x71, 0xde, 0x7e, 0x17, 0x8b, 0xe0, 0xb1, 0x33, 0x33, 0x8d, 0x7e, 0x74, 0x72, 0x4d, 0xb7, 0xaf, 0xd2, 0x3d, 0x02, 0x32, 0xe2, 0x5e, 0xe5, 0xf8, 0x10, 0x14, 0x81, 0x38, 0x13, 0xcc, 0xf2, 0x34, 0x98, 0xc8, 0x8c, 0x6b, 0x0c, 0x6e, 0x7f, 0xae, 0x90, 0x92, 0x92, 0xac, 0x86, 0x98, 0xed, 0xf6, 0x43, 0x73, 0x41, 0x9c, 0xd5, 0xc7, 0xba, 0xcf, 0xda, 0xcb, 0x72, 0x3a, 0xee, 0xa0, 0x7c, 0xf6, 0x21, 0x3f, 0x9f, 0x4c, 0x73, 0x3c, 0x60, 0xaf, 0x5f, 0xed, 0xf4, 0x96, 0xd4, 0xc7, 0x3e, 0x29, 0x3f, 0xf2, 0xe8, 0xe5, 0x7c, 0x6d, 0x3e, 0xad, 0xc7, 0x40, 0x68, 0xe9, 0x13, 0x96, 0x0b, 0xa4, 0x5d, 0xc1, 0x94, 0xdd, 0xcf, 0x77, 0x95, 0x64, 0xe2, 0xd2, 0x0a, 0x03, 0xcd, 0xeb, 0x66, 0xd3, 0xd9, 0x03, 0xc1, 0xeb, 0x89, 0xa5, 0x86, 0xd9, 0x9b, 0x2f, 0x77, 0x8d, 0x56, 0xaa, 0xed, 0xa2, 0xa4, 0xe1, 0xa6, 0x34, 0xf3, 0x1f, 0x86, 0xae, 0xe3, 0x09, 0x19, 0x36, 0x26, 0x6b, 0xc6, 0xb3, 0x2b, 0x03, 0xfe, 0x7e, 0x71, 0x9b, 0xcb, 0x4e, 0xa3, 0xec, 0x98, 0xe5, 0xcc, 0x2c, 0x13, 0x88, 0x50, 0x45, 0x7a, 0x5d, 0x76, 0x0b, 0xbe, 0x22, 0xad, 0xed, 0x4d, 0xe8, 0xd8, 0x00, 0x61, 0xbb, 0x52, 0x63, 0x32, 0x65, 0x6f, 0x4f, 0x6a, 0xbd, 0xab, 0x5c, 0xaa, 0x24, 0xd0, 0xc0, 0x14, 0x24, 0xc1, 0xa9, 0x14, 0x57, 0xb6, 0xe4, 0xeb, 0x0b, 0x10, 0x6f, 0xb4, 0x45, 0x1f, 0xba, 0xde, 0x11, 0x6e, 0xa7, 0x55, 0x57, 0x80, 0x95, 0xe2, 0x88, 0x06, 0xf8, 0x6d, 0xef, 0x01, 0x5f, 0x29, 0x75, 0x5a, 0xdc, 0xdf, 0x15, 0xcf, 0x27, 0xe0, 0x66, 0x60, 0x12, 0x44, 0xec, 0x7a, 0xfa, 0x89, 0x12, 0xa5, 0x68, 0xc4, 0x02, 0x64, 0x12, 0xd9, 0xc7, 0x89, 0xcf, 0x86, 0x60, 0x41, 0x56, 0x2f, 0xb0, 0x81, 0xbf, 0xaa, 0x7d, 0xa8, 0x26, 0x94, 0xe5, 0x74, 0xee, 0xd2, 0xf3, 0xb0, 0x77, 0x52, 0x4a, 0x1f, 0x54, 0x3f, 0x07, 0xa2, 0x43, 0x18, 0x46, 0x8e, 0x83, 0x7f, 0x06, 0xb6, 0x45, 0xa8, 0x3e, 0xa2, 0x4b, 0xa6, 0x6c, 0xe6, 0x05, 0x21, 0xec, 0xaa, 0xaf, 0x19, 0xe0, 0xc7, 0x3c, 0xcd, 0x7d, 0x0b, 0x2a, 0xea, 0xfb, 0x83, 0x77, 0x8b, 0x85, 0xf4, 0x49, 0xc5, 0xe2, 0xcb, 0x1f, 0xba, 0xbc, 0x2b, 0x89, 0x6a, 0xb0, 0xf5, 0xbf, 0xc6, 0x97, 0xe1, 0x94, 0xba, 0xb1, 0x0e, 0xa6, 0x32, 0xa2, 0x97, 0xc1, 0x4e, 0x67, 0x14, 0xd1, 0x43, 0xb6, 0x1c, 0xeb, 0xa9, 0x6b, 0x2f, 0x2d, 0x30, 0xfa, 0x90, 0x9a, 0xf1, 0x0c, 0x04, 0x20, 0xe6, 0xb1, 0x7c, 0x72, 0x36, 0xd4, 0x13, 0x68, 0x5b, 0xe2, 0xfa, 0x00, 0x56, 0xc9, 0x27, 0x49, 0x74, 0xc2, 0xed, 0xc7, 0x60, 0x8a, 0xd4, 0x0d, 0x75, 0xfc, 0x48, 0xae, 0x97, 0x38, 0x08, 0xca, 0x07, 0xbe, 0x64, 0xb1, 0xf6, 0x2f, 0xac, 0x88, 0xca, 0x9d, 0x6d, 0xe4, 0x53, 0x91, 0x51, 0xab, 0x78, 0x45, 0xd0, 0xcf, 0x04, 0x9e, 0xef, 0xad, 0x9d, 0xfc, 0xcc, 0x0f, 0x20, 0xde, 0xb8, 0x32, 0xd5, 0xf2, 0x05, 0x4c, 0x45, 0x1a, 0xf2, 0x61, 0xa0, 0x64, 0x2b, 0x7f, 0xf9, 0x25, 0xec, 0x94, 0xcb, 0x8d, 0xb3, 0x89, 0x92, 0x7a, 0xfd, 0x52, 0x5d, 0x65, 0x9e, 0x15, 0xb1, 0x9e, 0x8e, 0xa2, 0x1d, 0x37, 0x4f, 0xd3, 0x52, 0x5f, 0x3f, 0xa1, 0xa8, 0x00, 0x78, 0xf5, 0x60, 0xdd, 0x16, 0x79, 0x0e, 0x9e, 0x09 }; +constexpr AccessUnit LPCM_SKIP_BYTES_EXPECTED_AU = { 0x15f90, 0x153d5, false, 3, { 0xe6, 0xa3, 0x12, 0x99, 0xcf, 0x16, 0x2e, 0x6d, 0x67, 0x2a, 0xa2, 0xb4, 0xf7, 0xa2, 0x3c, 0xdf }, { 0x97, 0xf7, 0x18, 0x4f, 0xfc, 0x6b, 0x28, 0x74, 0x44, 0x69, 0x80, 0xc1, 0x76, 0x96, 0x50, 0xe6, 0x23, 0x0d, 0xdf, 0xf2 } }; + + +const std::vector AVC_BEGIN_OF_AU_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x5c, 0xe5, 0xaf, 0x00, 0xfd, 0x0f, 0x1d, 0x27, 0x61, 0x90, 0xd4, 0x77, 0x92, 0x34, 0x4a, 0x7a, 0xdc, 0x96, 0x0d, 0x27, 0x58, 0x2f, 0xfa, 0x88, 0x0d, 0xb6, 0x88, 0xcb, 0x5f, 0xd7, 0x79, 0xc8, 0xe5, 0x46, 0xe3, 0x99, 0xc7, 0x10, 0x1d, 0xfa, 0x50, 0xd7, 0x07, 0xcf, 0xcf, 0x21, 0x1c, 0xaf, 0x1c, 0x74, 0x86, 0x02, 0x33, 0x71, 0xc2, 0x81, 0x7f, 0xd6, 0xea, 0xe0, 0xab, 0xa5, 0xf2, 0x66, 0xb1, 0x69, 0x10, 0x40, 0x36, 0x55, 0x95, 0x09, 0xba, 0x8d, 0x65, 0xc8, 0x33, 0x21, 0xa0, 0xcf, 0x1c, 0xfc, 0xa4, 0x2b, 0x3e, 0x8f, 0x92, 0x74, 0xbe, 0x8a, 0x75, 0xed, 0x8a, 0x33, 0x85, 0x42, 0xcf, 0xf2, 0x0e, 0xaa, 0xe2, 0x8f, 0x51, 0xee, 0xd9, 0x67, 0x8c, 0x24, 0x75, 0x18, 0xf5, 0x90, 0x3e, 0x74, 0xf8, 0x43, 0x4e, 0xc5, 0x5d, 0xe1, 0xd5, 0x6f, 0x97, 0x6d, 0xef, 0xd5, 0x5f, 0x12, 0xb0, 0x83, 0xcb, 0x07, 0x02, 0x8c, 0x1d, 0x91, 0x2e, 0x04, 0x2c, 0x34, 0xff, 0xa0, 0xdc, 0x27, 0xe9, 0x53, 0x9e, 0x6f, 0xe2, 0x75, 0xd6, 0x2a, 0x73, 0x17, 0x71, 0xe7, 0x5e, 0x93, 0x98, 0x9f, 0xca, 0x01, 0xd9, 0x03, 0x60, 0x6d, 0x49, 0xed, 0x54, 0x79, 0x90, 0x09, 0x1a, 0x52, 0xfa, 0x36, 0x06, 0x5f, 0x7a, 0x0a, 0xd7, 0x9e, 0xbc, 0x97, 0xbb, 0xa1, 0xc5, 0xfd, 0xaa, 0xb8, 0x62, 0x82, 0x72, 0x73, 0xfb, 0x29, 0x86, 0x35, 0x25, 0x8c, 0x2b, 0x9b, 0xdd, 0xf2, 0x73, 0xd6, 0xc0, 0x34, 0x32, 0x14, 0x43, 0x3d, 0x48, 0xe0, 0x58, 0x2e, 0x7d, 0x81, 0x6f, 0xb0, 0x05, 0xde, 0x7c, 0xff, 0xb6, 0xa2, 0xc6, 0x3d, 0x57, 0xea, 0x84, 0xa8, 0x28, 0x32, 0x51, 0x67, 0xf5, 0xa8, 0x0d, 0x58, 0x34, 0x1e, 0x59, 0x05, 0x4a, 0xff, 0x3b, 0x44, 0x0e, 0xe1, 0x21, 0x49, 0xe5, 0x4f, 0x6c, 0x6e, 0xe0, 0x52, 0xc1, 0x86, 0xec, 0x17, 0x61, 0xdd, 0xc5, 0x6a, 0x15, 0x6e, 0x76, 0x9d, 0xe0, 0x51, 0x55, 0x0c, 0x63, 0x12, 0xe4, 0x9c, 0x3c, 0xa5, 0x7c, 0xb5, 0xc1, 0xd7, 0xbf, 0xc2, 0x3c, 0x2f, 0xb9, 0xca, 0x69, 0x15, 0xfd, 0x02, 0x06, 0xb9, 0xc9, 0xa2, 0x1f, 0x25, 0xc1, 0x18, 0x54, 0x76, 0x8c, 0x7b, 0x8c, 0x12, 0x55, 0xb6, 0xa2, 0xbb, 0x08, 0xa2, 0x9b, 0xab, 0xa1, 0xfd, 0xb2, 0x1d, 0x42, 0x38, 0x71, 0x5a, 0xba, 0xc4, 0x09, 0x3b, 0x06, 0x51, 0x38, 0x16, 0xb8, 0x94, 0xab, 0x41, 0x24, 0x9e, 0x93, 0x3f, 0x82, 0x85, 0x0c, 0x97, 0xf0, 0x78, 0x21, 0xeb, 0x4f, 0xe9, 0xf3, 0xf1, 0x3a, 0x53, 0x90, 0x91, 0xe6, 0xdb, 0x5f, 0x56, 0x22, 0x1d, 0x33, 0x61, 0x83, 0xf5, 0xf2, 0xac, 0x0b, 0x9b, 0xb4, 0xda, 0x58, 0xc4, 0xac, 0xf2, 0xa6, 0xd6, 0xfb, 0x37, 0x7a, 0x97, 0x70, 0x22, 0x4c, 0x6c, 0x1d, 0x4d, 0x52, 0x29, 0x07, 0xdf, 0xc9, 0x79, 0x30, 0xd4, 0x63, 0x92, 0x15, 0xc8, 0x3c, 0xd9, 0x51, 0x56, 0xb9, 0xc9, 0x41, 0x8c, 0x45, 0xe1, 0x18, 0x99, 0xa7, 0xbf, 0xb8, 0x3b, 0x45, 0x84, 0x48, 0xdd, 0x39, 0x36, 0xb3, 0x21, 0x48, 0xf1, 0x69, 0x51, 0x62, 0x45, 0x6b, 0xf4, 0xf6, 0xed, 0x41, 0xda, 0x8f, 0x64, 0xb8, 0x39, 0xa5, 0x36, 0x58, 0x8a, 0xc1, 0xd6, 0x6c, 0x3a, 0xc6, 0xf5, 0x41, 0x9f, 0xe5, 0x7b, 0x68, 0x9e, 0xbf, 0x39, 0x55, 0x9d, 0xda, 0x14, 0xa3, 0x2e, 0x4a, 0xa8, 0x25, 0x31, 0x4c, 0x9f, 0xb6, 0xf2, 0x1d, 0x67, 0x20, 0x2a, 0x49, 0x0e, 0x65, 0x04, 0xa5, 0x3d, 0x6e, 0xb7, 0x95, 0x4d, 0x90, 0x63, 0xec, 0xa0, 0xc7, 0xd4, 0x16, 0x5e, 0xe7, 0x33, 0x77, 0xbf, 0x03, 0x09, 0xfc, 0x5e, 0xe9, 0x21, 0x3f, 0x58, 0x76, 0xdc, 0x4a, 0x19, 0x89, 0x8e, 0x05, 0x90, 0x45, 0xb1, 0x55, 0xfc, 0x79, 0x44, 0x88, 0xcc, 0xc3, 0x24, 0x1d, 0xf4, 0xc5, 0x07, 0x65, 0xcf, 0x39, 0x2e, 0xeb, 0x43, 0x70, 0x41, 0xb3, 0x56, 0x8c, 0x51, 0x64, 0xc1, 0xcd, 0x42, 0x1b, 0xfa, 0x05, 0x80, 0x6c, 0xa6, 0x15, 0xe5, 0xa2, 0x2d, 0xd3, 0x34, 0x5f, 0x9e, 0xab, 0x7b, 0xd4, 0x0f, 0x14, 0x67, 0x3e, 0x28, 0x4f, 0xab, 0x30, 0xa7, 0x02, 0xb5, 0x59, 0xcd, 0x35, 0xfa, 0x43, 0xe4, 0x77, 0xe6, 0xa5, 0x04, 0xba, 0x91, 0xf8, 0x0a, 0xc5, 0xb0, 0xef, 0x48, 0xf3, 0x8a, 0x97, 0x9f, 0x9a, 0x01, 0xd3, 0x28, 0x99, 0x70, 0xf6, 0xa2, 0x50, 0xe5, 0x75, 0xcc, 0xd4, 0x22, 0x50, 0x95, 0x6b, 0xc2, 0x95, 0xcd, 0xeb, 0x8e, 0x01, 0xa9, 0x70, 0x25, 0x9f, 0x62, 0xf4, 0x3a, 0xfe, 0xec, 0x41, 0xb3, 0x49, 0xce, 0x68, 0xfe, 0xc3, 0xe5, 0x1f, 0x7d, 0xfd, 0x7d, 0x78, 0x4c, 0xa4, 0x55, 0x8b, 0x19, 0xf0, 0x4c, 0xce, 0xb8, 0xa4, 0xb1, 0xe1, 0x86, 0x03, 0xb0, 0x46, 0xc5, 0xa4, 0xdc, 0xcb, 0x20, 0xc5, 0x55, 0xbb, 0xf4, 0xc6, 0xba, 0x70, 0x27, 0xa2, 0xd5, 0xd8, 0x05, 0x25, 0x60, 0xb6, 0x6e, 0xe0, 0xda, 0x03, 0x6c, 0x98, 0x0c, 0xa4, 0xf1, 0xe7, 0x33, 0x6d, 0xf2, 0x1d, 0xf6, 0x99, 0x4b, 0xd6, 0x84, 0x4c, 0x2e, 0xf1, 0x54, 0x42, 0x78, 0xa2, 0x2f, 0x08, 0x9e, 0x95, 0xf7, 0x1f, 0xfa, 0xe1, 0x50, 0x1a, 0x1c, 0x69, 0x98, 0x1d, 0x2b, 0x1d, 0xe0, 0xec, 0xe6, 0x28, 0xda, 0xc8, 0x76, 0xf3, 0xaa, 0x91, 0xf8, 0x63, 0x04, 0x6b, 0xa6, 0x3b, 0x8e, 0xbb, 0x45, 0x8c, 0x7b, 0x5a, 0x75, 0xe7, 0x26, 0xe0, 0x07, 0xd7, 0xb7, 0x6d, 0x6f, 0x4c, 0xc5, 0xda, 0xde, 0xc7, 0xcf, 0xf2, 0x07, 0xd8, 0xad, 0x23, 0x0e, 0xa2, 0xc2, 0xcf, 0xe7, 0xbd, 0x9e, 0x41, 0x09, 0xb2, 0x9b, 0x6b, 0xcc, 0x4d, 0xe9, 0xe1, 0x88, 0xbb, 0x12, 0x76, 0x20, 0xe9, 0x60, 0x73, 0x08, 0x87, 0x7e, 0xb8, 0x71, 0x7b, 0x7c, 0x75, 0xb1, 0x5a, 0xfb, 0x9e, 0xd1, 0xb4, 0x2b, 0x94, 0xa8, 0x5f, 0x88, 0xf2, 0xec, 0x9a, 0x21, 0x42, 0x9f, 0x70, 0xd9, 0xf5, 0x6a, 0xad, 0xbd, 0x88, 0x75, 0x86, 0xc2, 0x1e, 0xcb, 0x45, 0xe7, 0x27, 0xa2, 0xe8, 0x48, 0xd7, 0xaf, 0x22, 0x30, 0xe6, 0x47, 0x36, 0x9e, 0x5d, 0x0d, 0xa3, 0x5c, 0x84, 0xcd, 0x14, 0x63, 0xae, 0x12, 0x28, 0x6a, 0xcf, 0x75, 0xfb, 0x62, 0x84, 0x25, 0x8c, 0xda, 0x10, 0xaa, 0xf8, 0xa7, 0xfa, 0xee, 0xa5, 0x9e, 0x54, 0x62, 0xe7, 0xdd, 0x11, 0xb3, 0x3e, 0x1f, 0x9e, 0x00, 0x0a, 0x89, 0x55, 0x7c, 0x28, 0x56, 0xb9, 0xb2, 0x0a, 0xc9, 0x83, 0xc4, 0x51, 0x6b, 0x6d, 0x9f, 0xec, 0xd0, 0x49, 0x41, 0xd2, 0xcb, 0xf7, 0xc9, 0x38, 0x85, 0x2f, 0x0b, 0xd4, 0x84, 0x6c, 0xd9, 0xd3, 0x35, 0x44, 0x4d, 0x9a, 0x80, 0xee, 0xca, 0xf5, 0x77, 0x2e, 0xf5, 0xd8, 0xc0, 0xd9, 0x05, 0xfc, 0xfe, 0xaf, 0x0b, 0x62, 0x90, 0x21, 0x73, 0x2f, 0x3f, 0x39, 0x44, 0x74, 0x7f, 0x18, 0x20, 0xa1, 0x34, 0x49, 0xeb, 0x1f, 0x69, 0x50, 0xa5, 0x1c, 0x51, 0x3b, 0x4c, 0xeb, 0x1e, 0xc9, 0x5f, 0xe9, 0xe4, 0xed, 0x6e, 0x37, 0x3d, 0x44, 0xd9, 0x86, 0x8e, 0x5c, 0x05, 0x48, 0x4a, 0x64, 0x9d, 0x9e, 0x6c, 0x26, 0x03, 0x1d, 0xa3, 0x2d, 0xa0, 0x7c, 0x51, 0xf6, 0xaf, 0xe1, 0xaf, 0xeb, 0x05, 0xdc, 0x6a, 0x05, 0xc7, 0x15, 0x0e, 0xc8, 0xd6, 0x99, 0x9b, 0xdf, 0x7f, 0x9b, 0x25, 0x40, 0x17, 0x96, 0x97, 0xa7, 0x15, 0x6a, 0xbd, 0x70, 0x11, 0x64, 0x26, 0x90, 0x55, 0x80, 0x7d, 0xed, 0xd5, 0xb5, 0xc3, 0x86, 0x9a, 0x5b, 0xb5, 0x31, 0x83, 0x35, 0x69, 0x81, 0x59, 0x32, 0x1a, 0x72, 0xf8, 0xae, 0xe0, 0xfa, 0x1e, 0x34, 0xa1, 0xc3, 0xfd, 0x88, 0xa1, 0xa8, 0x27, 0xa9, 0x95, 0x61, 0x09, 0xfb, 0xc5, 0xd5, 0x48, 0x97, 0x19, 0x1e, 0xfb, 0xd5, 0x03, 0xdf, 0xa4, 0x59, 0x82, 0x12, 0x5e, 0x63, 0x93, 0xe3, 0x8b, 0xd2, 0x3c, 0x13, 0x4d, 0x14, 0x90, 0xe0, 0x28, 0x95, 0xb3, 0x79, 0xcb, 0x62, 0x7d, 0x80, 0xfd, 0xa8, 0xbd, 0xdc, 0x69, 0x07, 0x0e, 0x59, 0xc3, 0x57, 0xca, 0xbe, 0xd9, 0xfb, 0xd0, 0x34, 0x26, 0x98, 0x7c, 0x6a, 0xa7, 0x3f, 0x4f, 0x70, 0x8f, 0x9c, 0x63, 0x3e, 0xa0, 0x84, 0x14, 0x95, 0x59, 0xe6, 0xb3, 0x38, 0x99, 0xf7, 0xb4, 0x9d, 0x34, 0x50, 0x35, 0xe2, 0x74, 0x90, 0xa4, 0x1a, 0x93, 0xe1, 0xd1, 0x46, 0x68, 0xa7, 0x4d, 0x02, 0x48, 0x32, 0x49, 0x39, 0xd8, 0xd1, 0x57, 0x85, 0xc5, 0x36, 0xd7, 0x87, 0x08, 0x7a, 0xca, 0xb8, 0xb5, 0x4a, 0x02, 0x1a, 0x98, 0x5e, 0x5b, 0x57, 0xb5, 0x14, 0x8f, 0x10, 0x33, 0xbe, 0xbd, 0x43, 0x17, 0xf3, 0x0e, 0x15, 0x49, 0x84, 0xc9, 0xcd, 0xbb, 0xe6, 0x19, 0x0b, 0x2e, 0xf4, 0xfc, 0xdf, 0x48, 0x3e, 0xe4, 0x5f, 0x72, 0x8a, 0x8d, 0x08, 0x90, 0x93, 0x0d, 0x64, 0xd6, 0xa2, 0xf6, 0x28, 0x63, 0x73, 0x56, 0x8a, 0xfb, 0xd5, 0x6f, 0xf9, 0x80, 0x88, 0xeb, 0xe4, 0x42, 0x7c, 0x62, 0x7e, 0xd7, 0xe2, 0x8c, 0x1f, 0x68, 0x5b, 0xae, 0x6c, 0xba, 0x3a, 0x43, 0xc5, 0x52, 0x55, 0xe0, 0x3c, 0x7d, 0x52, 0x75, 0xd5, 0x6a, 0x0f, 0xd8, 0xdd, 0x53, 0x1d, 0xcb, 0x61, 0xa7, 0x80, 0x2a, 0x82, 0x70, 0x25, 0x8e, 0xb5, 0xdf, 0xea, 0xb1, 0x2a, 0xab, 0x1f, 0x6b, 0xad, 0x86, 0x78, 0xba, 0x98, 0x9b, 0x3a, 0x64, 0xf2, 0xdd, 0x5b, 0x65, 0x89, 0x20, 0xc4, 0xa6, 0x98, 0x67, 0x67, 0x3c, 0xe6, 0xaf, 0x1c, 0x3a, 0xd9, 0xf0, 0x1e, 0x14, 0x96, 0xbe, 0x08, 0x21, 0xad, 0xa1, 0x44, 0xa1, 0xed, 0xdf, 0x52, 0xad, 0x3d, 0x84, 0x4d, 0x2c, 0x7d, 0xd9, 0xe5, 0xed, 0x80, 0xda, 0x3f, 0x22, 0xd7, 0xe6, 0xb3, 0xa5, 0xc6, 0xe9, 0x50, 0x3b, 0xbc, 0xf8, 0xc5, 0xc6, 0x7e, 0x7f, 0xce, 0x40, 0x69, 0x91, 0xe9, 0xc1, 0x8b, 0xfb, 0xa7, 0xca, 0xae, 0xab, 0xee, 0x14, 0x2b, 0x3c, 0x35, 0x01, 0xfa, 0x91, 0x2f, 0xea, 0xcf, 0x8c, 0xc7, 0x01, 0xed, 0x9b, 0x86, 0xff, 0xea, 0x7d, 0xb6, 0xf2, 0x43, 0x46, 0xf7, 0x3f, 0xf1, 0x96, 0x02, 0x00, 0xde, 0xfc, 0x3b, 0xc5, 0x0a, 0x6e, 0xe8, 0xd6, 0x47, 0x4e, 0xb9, 0x65, 0xcb, 0x59, 0xe9, 0x05, 0x08, 0xb6, 0x67, 0x13, 0x02, 0x8a, 0x61, 0xbe, 0x20, 0x15, 0x87, 0x7a, 0x8e, 0x56, 0xc4, 0x04, 0x18, 0xd4, 0xa0, 0x48, 0x24, 0x73, 0x90, 0xe0, 0x0f, 0xbb, 0xca, 0x98, 0xeb, 0x77, 0xc9, 0x70, 0x7a, 0x8e, 0x1a, 0xd1, 0x57, 0xc8, 0x09, 0xe7, 0x6f, 0x54, 0xd9, 0xe5, 0xf9, 0xc3, 0x79, 0xb8, 0xb7, 0xa3, 0x11, 0x3b, 0x08, 0xc7, 0x7e, 0xe2, 0xcb, 0xc8, 0x5e, 0x87, 0x68, 0x3a, 0xee, 0x78, 0x45, 0x67, 0x8b, 0xed, 0x22, 0xde, 0x7f, 0x4b, 0xad, 0xc3, 0xc8, 0x88, 0xa8, 0x54, 0x86, 0xbe, 0x82, 0x08, 0xaa, 0xee, 0x81, 0xd0, 0xa6, 0x29, 0xf0, 0x66, 0x91, 0xa5, 0xa7, 0xc4, 0x2f, 0x26, 0x72, 0x10, 0xea, 0x92, 0x9c, 0xde, 0x23, 0x90, 0x9e, 0x4e, 0x01, 0x7f, 0x93, 0x13, 0x7f, 0x95, 0x89, 0x22, 0x8e, 0x53, 0xcd, 0xa7, 0x68, 0x7f, 0xa4, 0x78, 0xef, 0xaf, 0x30, 0x3e, 0xfe, 0xbe, 0x62, 0x22, 0x10, 0x8e, 0x52, 0xbd, 0xbe, 0x30, 0x5c, 0x5d, 0x84, 0xbe, 0x1d, 0xeb, 0x27, 0x4a, 0x8c, 0x17, 0xd8, 0x91, 0x97, 0x85, 0x7b, 0xb8, 0x65, 0x11, 0x84, 0xe2, 0x6f, 0x4f, 0x61, 0x3e, 0x05, 0x5d, 0x53, 0x60, 0x8b, 0xe8, 0x35, 0x4d, 0x58, 0x12, 0x60, 0x3a, 0xaf, 0x7a, 0x2a, 0xe4, 0xb3, 0x82, 0x33, 0x02, 0x15, 0x1b, 0xc9, 0x37, 0xd9, 0xa5, 0x81, 0xe3, 0x91, 0xf3, 0x08, 0xb4, 0x8d, 0xad, 0x90, 0x96, 0xb5, 0xb0, 0xe9, 0x23, 0xba, 0xb7, 0x25, 0x38, 0xb9, 0x07, 0x0f, 0xc1, 0x4c, 0xdc, 0x6d, 0x3c, 0x85, 0x6b, 0xea, 0x96, 0x04, 0xf0, 0xca, 0xfb, 0xb7, 0xdc, 0x45, 0xcb, 0x11, 0x5b, 0x7e, 0x14, 0xcc, 0x2d, 0xc4, 0x23, 0xcb, 0x68, 0xeb, 0x56, 0xe9, 0xaa, 0x7a, 0x44, 0x5b, 0x92, 0xc1, 0x3b, 0xff, 0xfd, 0x16, 0x5a, 0xf3, 0x4c, 0xbc, 0x38, 0x1e, 0x36, 0x68, 0xd4, 0xa2, 0x4d, 0xcb, 0xc7, 0xee, 0x3a, 0x1d, 0xa5, 0x69, 0x67, 0xd8, 0xd7, 0x34, 0x7a, 0xe9, 0x2b, 0x6d, 0xb0, 0xe4, 0x47, 0x81, 0x1f, 0xef, 0xf6, 0xd4, 0x60, 0x07, 0x92, 0x1d, 0xd1, 0x61, 0xbb, 0x8f, 0x3f, 0x4a, 0x0b, 0xbd, 0xae, 0x6f, 0x77, 0xf2, 0x46, 0x64, 0x77, 0x34, 0xf1, 0x93, 0xa5, 0x3a, 0x2b, 0x98, 0x79, 0x93, 0x54, 0xc2, 0x7b, 0x63, 0xad, 0xdb, 0xb8, 0x9e, 0xa2, 0x9c, 0xba, 0xe6, 0x7c, 0xf1, 0x0f, 0x0e, 0x68, 0x04, 0xba, 0x63, 0xf2, 0xe5, 0xbd, 0x85, 0xf3, 0x6c, 0x96, 0x40, 0xb0, 0xf2, 0x71, 0x2f, 0x50, 0xe8, 0x20, 0x38, 0xac, 0xe6, 0xc9, 0x26, 0x7a, 0xca, 0xeb, 0xec, 0xd0, 0x40, 0x65, 0x34, 0x4b, 0x70, 0x07, 0x23, 0xee, 0x65, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x3e, 0x95, 0xcd, 0x33, 0x75, 0xc9, 0xd6, 0x9d, 0x2c, 0xad, 0x4c, 0x70, 0xfc, 0x00, 0x01, 0x09, 0x40, 0x7f, 0x53, 0xed, 0xb3, 0xc2, 0xfd, 0xff, 0x4c, 0x6a, 0x04, 0x34, 0xc8, 0x0f, 0xc1, 0xcf, 0x3b, 0xdf, 0xb1, 0x07, 0xa8, 0x0e, 0x59, 0xb2, 0xc9, 0x3c, 0x27, 0x51, 0x67, 0xb2, 0x07, 0x0b, 0x30, 0xd3, 0xa0, 0x73, 0x14, 0xda, 0x1b, 0xd1, 0xbc, 0xf8, 0x42, 0xca, 0xe5, 0xab, 0x6b, 0x49, 0x7a, 0xe7, 0xe5, 0x3a, 0xf1, 0x9d, 0x4a, 0x8b, 0x34, 0x18, 0x12, 0xcb, 0x1c, 0x10, 0x5e, 0x2c, 0x53, 0x16, 0xfc, 0x65, 0x00, 0x49, 0x27, 0x30, 0xb2, 0x5e, 0xc8, 0x35, 0x44, 0xab, 0x9e, 0x18, 0xc8, 0x0c, 0xda, 0x5b, 0xc2, 0xb8, 0xf3, 0x2b, 0xcc, 0xc8, 0x5c, 0x0c, 0x14, 0x79, 0x58, 0x4d, 0x69, 0xd2, 0xff, 0x06, 0x58, 0x20, 0xca, 0xe4, 0xac, 0x1a, 0x3f, 0x5a, 0x53, 0x82, 0x3b, 0x5b, 0xd3, 0x8f, 0x6c, 0x63, 0xc0, 0xf0, 0x84, 0x9e, 0x4b, 0x61, 0x67, 0xd6, 0xc3, 0xd3, 0x61, 0xb2, 0xec, 0xd5, 0xb0, 0xdf, 0x41, 0x13, 0xcb, 0x66, 0x4c, 0x13, 0x69, 0x69, 0x8d, 0x27, 0xa7, 0x06, 0x1b, 0xca, 0x00, 0xf6, 0x82, 0xfb, 0xeb, 0x1b, 0xc1, 0x36, 0x95, 0x9d, 0x44, 0x98, 0x33, 0x8f, 0x26, 0x7a, 0x41, 0x9c, 0x00, 0x2c, 0xeb, 0xcc, 0xc0, 0x05, 0x5a, 0xf5, 0x58, 0xec, 0x23, 0x4f, 0x44, 0x79, 0x97, 0x8d, 0x0c, 0xe0, 0xa5, 0xc9, 0x14, 0xcf, 0x2b, 0xe3, 0xa1, 0x3f, 0x12, 0x8d, 0xde, 0xbf, 0x46, 0x4e, 0xca, 0x9c, 0xe4, 0xa5, 0x1c, 0x61, 0x35, 0x57, 0xae, 0xa8, 0xfa, 0x3a, 0x55, 0x11, 0x05, 0x7b, 0x55, 0xb7, 0x90, 0x5c, 0x03, 0xb3, 0x00, 0x31, 0xfa, 0xa0, 0x16, 0xa7, 0x03, 0x99, 0xc1, 0x5d, 0xfe, 0x7e, 0xc7, 0x61, 0x7e, 0xb1, 0x4b, 0x4d, 0x05, 0x65, 0xdf, 0x14, 0x47, 0x81, 0xd1, 0xe7, 0xd9, 0x5e, 0x8a, 0xbd, 0xa5, 0xfb, 0x48, 0x2f, 0x7f, 0x33, 0x90, 0x26, 0x1e, 0x28, 0xbb, 0x45, 0xd0, 0x8d, 0x98, 0x83, 0x5f, 0x4c, 0xe4, 0xa6, 0x20, 0x2b, 0xc2, 0x7b, 0x11, 0xf9, 0x6a, 0x9c, 0x46, 0x21, 0x5b, 0x32, 0x8c, 0x51, 0x11, 0x06, 0x00, 0xb6, 0xf6, 0xc2, 0xcf, 0x26, 0x50, 0x2c, 0xd6, 0x39, 0xa8, 0xe4, 0xf6, 0xc9, 0x97, 0x3d, 0xe2, 0x54, 0x88, 0x4b, 0x0c, 0x93, 0xbe, 0xd5, 0x17, 0xa6, 0xfc, 0x65, 0x1f, 0xa6, 0x0f, 0xe9, 0xa5, 0xcb, 0xdf, 0x61, 0xc4, 0xea, 0x87, 0x83, 0xc8, 0x50, 0xe7, 0x51, 0x96, 0x96, 0x7e, 0x2b, 0x5b, 0x58, 0x3e, 0x87, 0x3b, 0x8f, 0x92, 0x23, 0x7f, 0xb3, 0x10, 0xe8, 0xd9, 0xdd, 0x74, 0x21, 0x37, 0x7d, 0x0f, 0x91, 0x7c, 0xef, 0xaa, 0x9c, 0x1f, 0x18, 0xee, 0xe8, 0x20, 0xfe, 0xb4, 0x7e, 0x7a, 0xe6, 0x1a, 0xa3, 0x04, 0x6a, 0xfa, 0x82, 0x4c, 0xe1, 0xdd, 0xf5, 0xb0, 0x45, 0x52, 0x32, 0x71, 0x87, 0x7a, 0xd2, 0xc6, 0x38, 0xcb, 0xff, 0xce, 0x22, 0x01, 0xb5, 0x28, 0x69, 0x8d, 0xef, 0x37, 0xd2, 0xb3, 0xc4, 0x53, 0x9f, 0x49, 0x10, 0xda, 0xa4, 0x10, 0x13, 0x8d, 0x76, 0x2f, 0x0d, 0xc0, 0x24, 0x96, 0x96, 0x6d, 0xe5, 0xe9, 0x97, 0xf2, 0xce, 0x10, 0x9e, 0x53, 0xab, 0x3a, 0x46, 0xdf, 0xed, 0xab, 0x6b, 0xf3, 0xd6, 0x92, 0xba, 0x92, 0xb0, 0xb3, 0xbb, 0x2b, 0xd9, 0xd5, 0xc3, 0xbd, 0xb1, 0xeb, 0x8b, 0x86, 0x3d, 0xf9, 0xfb, 0x08, 0x64, 0x62, 0x24, 0xa5, 0x0e, 0x46, 0x27, 0x32, 0x67, 0x8d, 0x19, 0x5e, 0xe7, 0x95, 0x1d, 0x42, 0x92, 0xde, 0xaf, 0x15, 0xd3, 0x98, 0x7f, 0x08, 0xd2, 0xd5, 0xcb, 0xd6, 0x20, 0xb4, 0x3d, 0x96, 0xff, 0x3a, 0x0c, 0x1a, 0x77, 0xe0, 0x2f, 0xe1, 0x09, 0x99, 0x82, 0x00, 0x11, 0x7c, 0xe3, 0xb7, 0xc4, 0x1f, 0x97, 0xa1, 0xd9, 0xff, 0x6b, 0x1c, 0x6a, 0xd9, 0xf4, 0x28, 0x30, 0xa7, 0x06, 0xef, 0x22, 0xab, 0x6e, 0x3a, 0xc0, 0x40, 0xc0, 0x1e, 0x47, 0xb8, 0x01, 0x25, 0xfd, 0x44, 0xf6, 0x3b, 0xf1, 0xe3, 0xd5, 0x5f, 0x35, 0x4b, 0x0f, 0xe8, 0x32, 0xca, 0x7b, 0xe7, 0x73, 0xb0, 0x2a, 0xe8, 0xe5, 0x5e, 0xd5, 0x19, 0xfd, 0x7c, 0x7a, 0x3c, 0x33, 0xdb, 0x50, 0xa4, 0xec, 0x09, 0x94, 0xaa, 0xbc, 0x6f, 0xf1, 0x43, 0xa3, 0x36, 0x6f, 0xcd, 0x0b, 0x34, 0xfc, 0x5a, 0x2c, 0xee, 0x2a, 0x69, 0x98, 0x06, 0x41, 0xa7, 0x9d, 0xe1, 0x97, 0x80, 0x6e, 0x2f, 0x4b, 0x17, 0xd9, 0x39, 0xf9, 0xbd, 0x8b, 0x64, 0x1c, 0x0b, 0x51, 0xde, 0x2d, 0x73, 0x39, 0x9d, 0xed, 0x5d, 0x9f, 0x3e, 0xb9, 0xa8, 0x0d, 0xf1, 0xf7, 0x21, 0xd4, 0xf8, 0x05, 0x1c, 0x95, 0x9e, 0x5e, 0xb1, 0xc3, 0xc4, 0x45, 0x2c, 0xcc, 0x55, 0x15, 0xba, 0x4b, 0xae, 0x84, 0x7f, 0x2f, 0x23, 0xf1, 0x47, 0x46, 0x9b, 0x3a, 0xed, 0x06, 0xe1, 0xff, 0x3e, 0x55, 0x44, 0xfe, 0xdc, 0xb3, 0x8f, 0xde, 0xa6, 0x3e, 0x33, 0xf8, 0x8c, 0x52, 0x0c, 0x77, 0xa8, 0x12, 0xeb, 0xfa, 0x0d, 0x05, 0x6c, 0x5c, 0x86, 0x4f, 0x46, 0x2f, 0x9c, 0xa7, 0x58, 0x4f, 0x50, 0xa1, 0x21, 0xde, 0xda, 0x54, 0xd2, 0x51, 0x84, 0x5e, 0xa3, 0x7c, 0x55, 0xd0, 0xc7, 0x73, 0x80, 0xfe, 0x99, 0x26, 0xb2, 0x6f, 0xd8, 0x4f, 0x75, 0x09, 0xe0, 0xb7, 0xde, 0xec, 0x04, 0xc9, 0x8c, 0xc9, 0xaf, 0xb0, 0x9a, 0x41, 0x52, 0xff, 0xf9, 0x29, 0x64, 0xe8, 0xa2, 0x7f, 0x7c, 0x65, 0x81, 0xf6, 0x0d, 0x16, 0x71, 0x2f, 0xca, 0xf7, 0xac, 0xe3, 0x3e, 0x91, 0xf9, 0xdb, 0xb4, 0x0f, 0x87, 0xa6, 0x74, 0x9b, 0x5e, 0xbf, 0x6a, 0x74, 0x78, 0x75, 0x76, 0x9f, 0x5f, 0xc7, 0x75, 0x36, 0x60, 0xe5, 0xe5, 0x86, 0x2c, 0xbf, 0xf1, 0xa2, 0x68, 0x14, 0xc9, 0x44, 0x80, 0x08, 0xe6, 0x55, 0x06, 0x5e, 0xd6, 0xbf, 0x70, 0x8b, 0x2a, 0x9a, 0xa6, 0xe2, 0x79, 0xe2, 0xa7, 0x54, 0x7d, 0x59, 0xe0, 0x82, 0xc9, 0xd8, 0x72, 0x88, 0x5e, 0xe1, 0x11, 0x59, 0xa4, 0x6d, 0xaf, 0x6e, 0x97, 0xa3, 0xe3, 0xa2, 0x60, 0xe1, 0x8e, 0x02, 0x72, 0xe6, 0xcc, 0x46, 0x12, 0x15, 0x28, 0x37, 0xfc, 0x5c, 0x2b, 0x65, 0x63, 0x6a, 0x90, 0x46, 0x20, 0x6a, 0xa1, 0xca, 0xb5, 0x6d, 0x9a, 0xba, 0xb5, 0x8c, 0x77, 0x03, 0xdf, 0x28, 0x08, 0x03, 0xb1, 0x21, 0x42, 0x79, 0xbb, 0x55, 0xf1, 0x14, 0x76, 0x00, 0x04, 0xb2, 0x1c, 0x4d, 0x31, 0x5c, 0x74, 0x7a, 0xdf, 0x4a, 0xd6, 0x82, 0x7d, 0x1d, 0xe3, 0x05, 0x04, 0x9c, 0xdc, 0xe3, 0x39, 0xeb, 0x3a, 0xe9, 0xa0, 0x9a, 0x95, 0x54, 0x8f, 0x3b, 0x28, 0x98, 0x7e, 0xd3, 0x44, 0xcf, 0xf5, 0x9e, 0x98, 0xdd, 0xa9, 0x53, 0xe4, 0x2a, 0xfb, 0xb7, 0x25, 0x0a, 0x39, 0x76, 0x4b, 0x5f, 0xaa, 0x86, 0xad, 0xf2, 0x65, 0xce, 0x31, 0x90, 0xd1, 0xc7, 0x2c, 0x3b, 0x3c, 0x13, 0x91, 0x49, 0xe6, 0xb8, 0x93, 0xd9, 0x98, 0x70, 0x2b, 0x6c, 0xe2, 0xd0, 0x6a, 0xd4, 0xd8, 0x13, 0x73, 0xae, 0x77, 0x9d, 0xda, 0xe1, 0xbc, 0x23, 0x52, 0x4b, 0x43, 0x62, 0xb5, 0x46, 0xb9, 0x75, 0x40, 0x75, 0xef, 0x1e, 0x1a, 0x2b, 0xa5, 0x13, 0x9e, 0x16, 0xdb, 0x7e, 0x08, 0x35, 0xe8, 0x83, 0xc4, 0x6b, 0xfe, 0x92, 0x74, 0x9f, 0xf0, 0xfc, 0xf4, 0x0b, 0xd6, 0x98, 0x24, 0xc1, 0x4a, 0xeb, 0x91, 0xc4, 0x21, 0x71, 0x4b, 0x36, 0x2c, 0xe8, 0xb2, 0xc5, 0xd9, 0xd0, 0x59, 0xbe, 0x1d, 0xcc, 0x23, 0x52, 0xc8, 0x27, 0x36, 0x95, 0x53, 0xf9, 0x2a, 0xb9, 0x17, 0x03, 0xa8, 0xbc, 0x22, 0x03, 0x62, 0x0d, 0x98, 0xec, 0xd2, 0x4e, 0x2f, 0x42, 0x52, 0x52, 0x47, 0xc6, 0x68, 0x8b, 0xa6, 0x5d, 0x58, 0x53, 0x1a, 0xf3, 0x82, 0x7c, 0xea, 0xdd, 0xda, 0x4f, 0x88, 0x66, 0x62, 0x58, 0x05, 0xf8, 0x82, 0x95, 0xa5, 0x6f, 0x15, 0x1b, 0xcf, 0xaa, 0x7c, 0x64, 0xd4, 0xd0, 0xf3, 0x5d, 0x8a, 0xce, 0xf9, 0x53, 0x87, 0x03, 0xf9, 0xc9, 0x8c, 0x16, 0x43, 0xd6, 0x92, 0x83, 0x7f, 0xb3, 0x03, 0x8f, 0x7e, 0xc7, 0xec, 0x90, 0x2f, 0xc6, 0xf3, 0x1d, 0xd8, 0x55, 0xf6, 0x65, 0x7e, 0xfe, 0xa1, 0x95, 0x90, 0x0d, 0xd9, 0xca, 0xd5, 0xb6, 0x3d, 0x32, 0x75, 0x47, 0xd6, 0xc4, 0x8a, 0x29, 0x34, 0x3d, 0xd8, 0xdc, 0x2e, 0xe7, 0x8b, 0xc6, 0x25, 0x0f, 0xa7, 0xd0, 0xf9, 0x86, 0x60, 0x2d, 0xa5, 0xdb, 0x90, 0xc6, 0x99, 0x63, 0xc8, 0xcd, 0xe4, 0xa0, 0x42, 0x52, 0x2a, 0xad, 0x88, 0x62, 0x9a, 0x41, 0xc8, 0x7f, 0xf3, 0x35, 0x10, 0xc5, 0xe5, 0x48, 0x6b, 0x91, 0x41, 0x58, 0x9b, 0x0e, 0x54, 0x34, 0xef, 0x09, 0x4b, 0x11, 0xf9, 0x83, 0xed, 0xd2, 0x0d, 0x7e, 0xc8, 0x03, 0xf1, 0x26, 0x04, 0xc1, 0x46, 0x18, 0xc7, 0x6e, 0xb4, 0xeb, 0x27, 0x33, 0x64, 0x23, 0x1b, 0xa1, 0xb5, 0x5d, 0xec, 0x56, 0xc0, 0x98, 0x0c, 0xde, 0x08, 0x1b, 0x2e, 0x7d, 0xad, 0xc0, 0x6c, 0x7a, 0x76, 0x48, 0xd9, 0x59, 0xca, 0x93, 0x44, 0x95, 0x74, 0x5c, 0x9d, 0x66, 0x7c, 0x3a, 0x26, 0xc0, 0x9e, 0xee, 0x49, 0xae, 0x6e, 0x28, 0x13, 0xb3, 0xb0, 0xd5, 0x1f, 0xad, 0x33, 0x00, 0xba, 0xc6, 0x1b, 0x92, 0x6b, 0xda, 0x70, 0xef, 0x61, 0x13, 0x71, 0x37, 0xe3, 0xe3, 0x1d, 0x7a, 0x10, 0xb4, 0x22, 0xed, 0xc4, 0xd0, 0x31, 0x1f, 0xc2, 0x45, 0x2c, 0xa5, 0x7d, 0x3e, 0x1f, 0xd8, 0xd0, 0xa8, 0x52, 0x5a, 0x0d, 0x6c, 0xb4, 0x0a, 0xfc, 0x3f, 0x5e, 0x4d, 0xe1, 0x5d, 0xc2, 0x2d, 0x10, 0x18, 0x9c, 0xd6, 0x3e, 0xc3, 0x48, 0x68, 0x3e, 0xd3, 0xcd, 0x87, 0x91, 0xdb, 0x9c, 0x3e, 0x86, 0x87, 0xf7, 0x28, 0xa9, 0xb5, 0xd1, 0x2c, 0x71, 0x12, 0x3e, 0x0a, 0x8d, 0x0b, 0xe9, 0x7c, 0x92, 0x1e, 0xd8, 0xbf, 0xd4, 0x9f, 0x0a, 0x1a, 0x0e, 0x5f, 0xac, 0xcd, 0x23, 0xc0, 0xa2, 0x6c, 0x43, 0xa2, 0x00, 0x1c, 0x7e, 0x6a, 0x7b, 0xf5, 0x46, 0x47, 0xd4, 0x4e, 0x3c, 0x37, 0x36, 0x79, 0x52, 0xfb, 0xa0, 0x7d, 0x13, 0x73, 0x7f, 0xe2, 0xff, 0xbf, 0x0b, 0x68, 0xdd, 0x81, 0xcf, 0x48, 0x40, 0x1e, 0x16, 0x06, 0x26, 0x87, 0xd1, 0xa6, 0x2c, 0xec, 0x10, 0x6d, 0x2c, 0xcc, 0x95, 0x79, 0x1f, 0xb7, 0x41, 0x30, 0x01, 0x34, 0x30, 0x00, 0x31, 0x90, 0xce, 0x59, 0x4d, 0x85, 0xda, 0x51, 0x1e, 0x08, 0x81, 0x06, 0x1c, 0x71, 0x41, 0x5d, 0xac, 0xf2, 0x75, 0x27, 0x81, 0xe7, 0xa6, 0x8b, 0x6d, 0x84, 0x44, 0x32, 0xb1, 0xfb, 0xf2, 0x45, 0xfd, 0x9e, 0xb5, 0xa7, 0x9e, 0xf9, 0x3f, 0xa0, 0x0b, 0x03, 0x21, 0x90, 0xa0, 0x4a, 0x83, 0x39, 0x81, 0xa7, 0x90, 0xe0, 0xfd, 0xd1, 0x1a, 0xea, 0xaf, 0xea, 0x72, 0x5a, 0xfc, 0xe4, 0xfe, 0xbb, 0xf2, 0x3a, 0xbb, 0x75, 0x3c, 0x9f, 0xed, 0xcb, 0xbe, 0x2c, 0x8e, 0xd8, 0x18, 0x0c, 0x58, 0x39, 0x98, 0x9c, 0x9e, 0x92, 0x1f, 0x3f, 0x80, 0xe0, 0xda, 0x61, 0x54, 0x07, 0xe0, 0x65, 0x66, 0x12, 0x29, 0x09, 0x4d, 0x47, 0x8f, 0x8d, 0x26, 0x6c, 0xbe, 0x30, 0x71, 0x51, 0x0a, 0x65, 0x94, 0x74, 0x87, 0x32, 0xf8, 0x4d, 0xc0, 0x57, 0x4d, 0x31, 0x42, 0xc2, 0xc0, 0xf2, 0x2c, 0x29, 0x15, 0xc1, 0xa0, 0x93, 0xf2, 0x36, 0xd2, 0x9b, 0x4c, 0xf3, 0xb5, 0x40, 0xff, 0xad, 0x9e, 0xd5, 0x28, 0x63, 0xfd, 0xfc, 0x1f, 0x40, 0xdb, 0x6d, 0x91, 0x90, 0x39, 0xc5, 0x98, 0x00, 0xb9, 0x29, 0x74, 0x68, 0xba, 0xbb, 0x8b, 0x5d, 0x27, 0x8c, 0x75, 0x2d, 0xa6, 0x27, 0xed, 0xd5, 0x62, 0x48, 0x65, 0x70, 0xb3, 0xef, 0xd8, 0x19, 0x23, 0x49, 0x33, 0x94, 0x9c, 0xb2, 0x08, 0xcf, 0x51, 0x72, 0x47, 0x44, 0x07, 0x9a, 0x14, 0x40, 0x8f, 0xbd, 0x36, 0x90, 0xc5, 0x9a, 0xcb, 0x8d, 0xcd, 0xae, 0xe4, 0xb5, 0x4b, 0x63, 0x81, 0xbb, 0x27, 0x55, 0xb5, 0x17, 0xf0, 0x66, 0xb6, 0x87, 0xc6, 0xc1, 0xc7, 0x1c, 0x73, 0xa0, 0xb4, 0xcb, 0xb8, 0xd4, 0xf9, 0xf4, 0xbb, 0x1b, 0x1b, 0x4e, 0x59, 0xf6, 0x99, 0x8d, 0xa2, 0xb7, 0x5b, 0x34, 0x58, 0x7d, 0x09, 0x99, 0xa0, 0x44, 0x7d, 0xa6, 0xf6, 0xc9, 0xe8, 0x8a, 0x74, 0xfe, 0xd1, 0xcd, 0xa4, 0xad, 0xa0, 0x3e, 0x8b, 0xde, 0x25, 0x92, 0xc9, 0x92, 0x34, 0xee, 0x01, 0x3d, 0xe9, 0xe2, 0x4d, 0x8a, 0xcb, 0xc6, 0x88, 0xe7, 0x09, 0xb7, 0x7d, 0x9f, 0xf6, 0x6e, 0xd9, 0x20, 0x62, 0x0b, 0x06, 0x7b, 0xa3, 0x94, 0xfb, 0x26, 0x8b, 0x3f, 0x13, 0x71, 0x77, 0xeb, 0x0e, 0x19, 0xd5, 0xb0, 0x71, 0x22, 0xec, 0xf5, 0x92, 0xda, 0x16, 0x14, 0x88, 0xa6, 0xc5, 0x88, 0xd7, 0x0f, 0x1f, 0x73, 0xbd, 0xec, 0x5c, 0xc4, 0x64, 0xf6, 0x82, 0x31, 0x00, 0x8b, 0x96, 0xee, 0x4a, 0x38, 0x88, 0x85, 0x2d, 0x3b, 0x0b, 0xaa, 0x0e, 0x75, 0xc6, 0xff, 0x94, 0xaf, 0x7c, 0xce, 0x4c, 0x5b, 0xdd, 0x00, 0x00, 0x01, 0x09 }; +constexpr AccessUnit AVC_BEGIN_OF_AU_SPLIT_EXPECTED_AU = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x8d, 0x36, 0x09, 0x27, 0xb3, 0xab, 0x69, 0x2f, 0x0f, 0x43, 0xb5, 0x3e, 0x2d, 0x6d, 0x54, 0x1a, 0x9f, 0x91, 0x90, 0xbd } }; + +const std::vector M2V_BEGIN_OF_AU_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x5c, 0xe5, 0xaf, 0x00, 0xfd, 0x0f, 0x1d, 0x27, 0x61, 0x90, 0xd4, 0x77, 0x92, 0x34, 0x4a, 0x7a, 0xdc, 0x96, 0x0d, 0x89, 0x63, 0xef, 0x89, 0xa1, 0x9a, 0x65, 0xc3, 0x28, 0xba, 0x93, 0x62, 0x56, 0x1b, 0xfc, 0x5e, 0xac, 0xaf, 0x7d, 0x30, 0xaa, 0x20, 0x5f, 0x98, 0xf7, 0x81, 0x50, 0xa1, 0x73, 0xa2, 0xd1, 0x35, 0x49, 0x93, 0xed, 0xdf, 0xc4, 0x4b, 0xb7, 0xc3, 0x26, 0x8d, 0xaa, 0x93, 0xb6, 0x62, 0x9a, 0xd4, 0xc8, 0x2c, 0x35, 0x7b, 0x38, 0x78, 0x5c, 0x8c, 0xb8, 0x93, 0x40, 0x3c, 0x0a, 0x11, 0x77, 0x63, 0x33, 0x4b, 0xe0, 0xfd, 0x79, 0x75, 0x87, 0x30, 0x65, 0xbd, 0x20, 0x28, 0x8c, 0x98, 0x4a, 0x60, 0x44, 0xfa, 0xfc, 0x13, 0x31, 0xa5, 0x6f, 0x0b, 0xea, 0x2d, 0x4b, 0xf6, 0x21, 0xd8, 0xa2, 0x0f, 0x19, 0x82, 0x2f, 0x39, 0x45, 0x86, 0xea, 0x54, 0x21, 0xcf, 0xcb, 0xce, 0x75, 0x05, 0x75, 0x96, 0xe8, 0x40, 0x3f, 0x0b, 0x28, 0x96, 0xe2, 0x2a, 0x4a, 0x21, 0xb7, 0xb5, 0xaf, 0x16, 0xce, 0xfe, 0xdd, 0xf4, 0x67, 0x26, 0xcc, 0x95, 0xd3, 0xc3, 0x19, 0x73, 0xeb, 0xce, 0x67, 0x4e, 0x1e, 0x0c, 0xf6, 0x68, 0xbe, 0xde, 0x22, 0x61, 0xf8, 0x87, 0x3e, 0xdf, 0x9b, 0xbf, 0x57, 0x36, 0x19, 0x18, 0x02, 0x49, 0xb4, 0xcc, 0x17, 0xe8, 0x64, 0x03, 0x01, 0x8d, 0xbd, 0x18, 0x60, 0xcc, 0x3f, 0x8f, 0xe8, 0x89, 0xe3, 0x40, 0x4b, 0x3e, 0xf5, 0x0c, 0xa3, 0xd1, 0x32, 0x9f, 0x6c, 0x2e, 0xbd, 0xd4, 0xb7, 0x38, 0x09, 0x40, 0x43, 0x0d, 0xd5, 0x7a, 0x85, 0xf5, 0x30, 0xd7, 0x22, 0xe2, 0x17, 0x7c, 0x7e, 0x26, 0xa0, 0x4b, 0xc4, 0xcf, 0x95, 0xe9, 0x99, 0xbe, 0xc8, 0x1a, 0xda, 0x14, 0x61, 0x4e, 0x49, 0x89, 0x54, 0x8d, 0x0b, 0x0a, 0x27, 0x67, 0x45, 0xd0, 0xb6, 0x18, 0x70, 0x47, 0x11, 0x13, 0x77, 0x46, 0x4b, 0xc4, 0x87, 0x7e, 0x7e, 0x5c, 0x05, 0x4a, 0x2d, 0x2e, 0xf4, 0xbf, 0x0b, 0xf4, 0xd2, 0x7c, 0xa7, 0x9b, 0x29, 0x50, 0x60, 0xc5, 0x3b, 0xa2, 0x72, 0x45, 0x3d, 0xe7, 0x0e, 0x83, 0x68, 0x17, 0x92, 0xc8, 0x80, 0xf4, 0x04, 0x74, 0x5c, 0x61, 0xfc, 0x17, 0x77, 0x32, 0x72, 0xd7, 0xde, 0xcb, 0x3e, 0x00, 0x2c, 0x0b, 0x6b, 0x7c, 0xf1, 0xf6, 0x57, 0x4a, 0xe7, 0x84, 0x38, 0x3c, 0x0e, 0xcd, 0x47, 0xc1, 0x29, 0xa4, 0xab, 0x0f, 0x1a, 0x77, 0x15, 0x5b, 0x90, 0xe4, 0x14, 0xee, 0x03, 0xf2, 0xda, 0x1f, 0x08, 0xd4, 0x2b, 0x1b, 0xa5, 0x35, 0x76, 0x2b, 0x13, 0x8a, 0xe8, 0x70, 0x43, 0x96, 0x86, 0x1d, 0xeb, 0x85, 0x7c, 0x52, 0x8f, 0x22, 0x6b, 0xaf, 0x2d, 0xab, 0xd9, 0x0f, 0xdb, 0x2d, 0xed, 0xd1, 0xd0, 0x2c, 0xa9, 0x7c, 0xcd, 0x66, 0x1d, 0x45, 0x6d, 0x0e, 0x60, 0xd7, 0xa7, 0xca, 0xcd, 0xf5, 0x46, 0x07, 0xcb, 0x60, 0xbb, 0x45, 0x75, 0xe3, 0x61, 0xa2, 0x11, 0x97, 0x05, 0x80, 0xc6, 0x95, 0x76, 0xff, 0x4c, 0x62, 0x86, 0x58, 0xa4, 0x20, 0x14, 0x24, 0x57, 0xa3, 0x10, 0x21, 0x16, 0x42, 0xd6, 0x96, 0x00, 0x0a, 0x15, 0x2e, 0x69, 0x6a, 0x7e, 0x1a, 0x3b, 0x4e, 0x23, 0xc3, 0xb5, 0x41, 0x1b, 0x0b, 0xa3, 0x11, 0xfb, 0xd2, 0x22, 0x79, 0x38, 0xb8, 0xa9, 0x90, 0x31, 0x9e, 0x2d, 0x94, 0xdd, 0x45, 0x1b, 0x3e, 0x2c, 0xbc, 0x43, 0x42, 0x39, 0x00, 0x17, 0xce, 0x9d, 0xb5, 0x25, 0x02, 0x03, 0x9f, 0xb8, 0xdc, 0x18, 0x5d, 0xdc, 0x68, 0xa2, 0xd1, 0xf8, 0xca, 0xdd, 0xce, 0xf8, 0xe1, 0xa5, 0xe9, 0xec, 0xf1, 0x1a, 0xcd, 0xa0, 0x6d, 0xd7, 0xcc, 0xc9, 0xd5, 0x60, 0x59, 0xe6, 0xc7, 0x5b, 0x56, 0x31, 0x83, 0x58, 0x30, 0x7d, 0x54, 0x66, 0x7b, 0x34, 0xc9, 0x4c, 0xda, 0xab, 0xcf, 0x5c, 0xae, 0x82, 0x75, 0x28, 0xa1, 0xed, 0x4a, 0x55, 0xca, 0x8d, 0x2c, 0xd3, 0x52, 0x58, 0xb6, 0xf8, 0x2d, 0x1d, 0x00, 0x82, 0x0f, 0xff, 0x7f, 0x6d, 0x80, 0xe0, 0xa1, 0x77, 0x23, 0x77, 0x3e, 0x67, 0xff, 0x82, 0x18, 0xff, 0x17, 0x00, 0xeb, 0xa9, 0x92, 0x3c, 0x2e, 0x16, 0x27, 0x36, 0xde, 0xef, 0x72, 0x42, 0xb8, 0x9a, 0xbb, 0xa7, 0x46, 0x9b, 0xa6, 0x75, 0xce, 0x8b, 0x71, 0x1c, 0x76, 0x4e, 0x84, 0xaa, 0x15, 0x24, 0xe4, 0xf5, 0x93, 0x4f, 0x19, 0xf3, 0x7b, 0x57, 0xd7, 0x3f, 0x70, 0xfe, 0xb4, 0x75, 0x52, 0x4e, 0x52, 0x88, 0x75, 0xfe, 0x4a, 0x16, 0x22, 0x00, 0xe8, 0xa7, 0x41, 0x7a, 0x8a, 0xb4, 0x15, 0x30, 0xda, 0x3f, 0x5c, 0x54, 0xc3, 0x00, 0xef, 0x4e, 0x65, 0x14, 0xa2, 0xca, 0x8d, 0x4c, 0x3a, 0x4c, 0xba, 0x07, 0xaf, 0xdc, 0x7b, 0x2c, 0x5b, 0x95, 0x79, 0x6e, 0x0b, 0xc4, 0xf3, 0x09, 0x80, 0x5e, 0xc1, 0x18, 0x23, 0x49, 0xe6, 0x81, 0xcd, 0x8b, 0x5d, 0xfc, 0xa2, 0xed, 0xd2, 0x46, 0x30, 0x6d, 0x21, 0x77, 0xde, 0xa3, 0x1f, 0xeb, 0x29, 0x51, 0xd0, 0xae, 0x06, 0x92, 0x1c, 0xd3, 0x80, 0x4f, 0x85, 0x3e, 0xbc, 0xf1, 0xb9, 0x59, 0x1a, 0x25, 0xe2, 0xdb, 0x0a, 0x51, 0xad, 0x2f, 0x62, 0xbd, 0xf6, 0x1a, 0x59, 0xd7, 0x84, 0x48, 0xc7, 0xd3, 0x82, 0xd8, 0xb8, 0x63, 0x02, 0xf4, 0x77, 0x0b, 0x7e, 0xe9, 0x54, 0xc7, 0x5f, 0x04, 0xcd, 0x38, 0xf9, 0xb3, 0xc1, 0x29, 0x7e, 0x69, 0x01, 0x7b, 0xa7, 0x03, 0x4d, 0xd0, 0x2a, 0x3e, 0x5f, 0x06, 0xf2, 0xcb, 0x15, 0x5a, 0x91, 0xe8, 0x02, 0xbc, 0x9c, 0xfb, 0x54, 0x26, 0xb3, 0xec, 0xe1, 0xb7, 0x8b, 0x14, 0x71, 0xc2, 0xc7, 0x8b, 0x61, 0x91, 0x25, 0xcd, 0x51, 0x79, 0x90, 0xcf, 0x26, 0x34, 0x1b, 0x1b, 0xc9, 0x8d, 0xc7, 0x60, 0x15, 0x41, 0x06, 0x48, 0x08, 0xbd, 0x30, 0x28, 0xfc, 0x5e, 0x06, 0x5a, 0x58, 0x89, 0xd1, 0x0c, 0xb6, 0x4c, 0x23, 0x6a, 0xe5, 0x10, 0x97, 0xba, 0x97, 0x01, 0xee, 0x9d, 0x3e, 0x2e, 0x2a, 0x88, 0xa6, 0x86, 0xdc, 0xb1, 0xd8, 0x6a, 0xc0, 0x1c, 0xa8, 0x64, 0xb6, 0x7f, 0x65, 0x7c, 0x5d, 0x91, 0xdf, 0x64, 0x93, 0x93, 0xcf, 0xa7, 0xc6, 0xf9, 0xd3, 0x76, 0xc1, 0x89, 0x90, 0x48, 0xd2, 0x24, 0xa2, 0x68, 0x2f, 0xa8, 0x32, 0xd6, 0x28, 0x27, 0x74, 0x44, 0xdf, 0x56, 0x0d, 0x6a, 0x85, 0xf7, 0xe7, 0x5c, 0x33, 0xcc, 0x2c, 0xa1, 0x55, 0x93, 0xe8, 0x9e, 0x18, 0x08, 0xd3, 0x11, 0x69, 0xb8, 0xb6, 0x03, 0x50, 0x80, 0x2b, 0xce, 0x66, 0x67, 0x13, 0xd8, 0x88, 0x67, 0xcd, 0xb8, 0x51, 0x48, 0xd3, 0xd7, 0x8e, 0x0f, 0x11, 0x5f, 0x89, 0xdd, 0x84, 0xe2, 0xb0, 0x5b, 0x1e, 0xb9, 0x0f, 0x41, 0x6e, 0xfb, 0x3c, 0x13, 0x56, 0xcd, 0x4b, 0x06, 0x05, 0x4d, 0x82, 0xed, 0xa3, 0xa5, 0x37, 0xfb, 0x4f, 0x14, 0x3b, 0x20, 0xdf, 0x13, 0xf1, 0x34, 0x14, 0x31, 0xea, 0xd3, 0x17, 0x4c, 0xa3, 0x7f, 0xf6, 0x9b, 0x13, 0x08, 0x3c, 0x31, 0x85, 0xb2, 0xae, 0xf3, 0x3f, 0x46, 0x70, 0x75, 0x26, 0x77, 0x58, 0xb8, 0x4c, 0x33, 0xad, 0x4c, 0xb1, 0x1b, 0xc7, 0x93, 0xde, 0xd1, 0xaf, 0xfe, 0xc6, 0x96, 0x82, 0x58, 0x0a, 0xfb, 0x70, 0xfd, 0xa4, 0x8f, 0x7d, 0x4b, 0x9b, 0xbf, 0x1f, 0xc4, 0x50, 0x7d, 0x4a, 0x11, 0x10, 0x69, 0x68, 0x23, 0xa4, 0xfe, 0xbe, 0x39, 0x3b, 0xc2, 0x4c, 0x66, 0x4d, 0xed, 0x71, 0x66, 0x96, 0x9c, 0xc0, 0x0b, 0xc5, 0x02, 0x75, 0x79, 0xf6, 0x24, 0xc7, 0x2e, 0x5c, 0x7f, 0x17, 0x16, 0x78, 0x8d, 0x9f, 0xcc, 0xe2, 0x58, 0x62, 0x74, 0x0d, 0xbf, 0xea, 0x9b, 0xc8, 0x65, 0x8a, 0x44, 0x24, 0xcf, 0x8e, 0x79, 0x20, 0x4a, 0x4e, 0x74, 0xc2, 0xef, 0x31, 0x31, 0xe7, 0x73, 0xeb, 0xbe, 0x28, 0x5b, 0x58, 0xb5, 0x4b, 0xd7, 0x36, 0xf5, 0xda, 0x4b, 0x75, 0xb4, 0xbd, 0x81, 0xd0, 0x52, 0x7d, 0xd7, 0xfa, 0x6c, 0x59, 0xbd, 0x02, 0x8d, 0x28, 0x41, 0x21, 0xe9, 0xdb, 0x45, 0x7d, 0xf3, 0x23, 0xc8, 0x9f, 0xf2, 0xed, 0x2e, 0xfa, 0x6f, 0x22, 0x0e, 0x58, 0x6c, 0x96, 0x94, 0xde, 0xa3, 0xce, 0x14, 0x6c, 0xb9, 0x21, 0x43, 0xd1, 0x6d, 0x26, 0x11, 0x80, 0xb2, 0xdf, 0xc9, 0x64, 0xb7, 0xd5, 0xf7, 0x4b, 0xb8, 0x04, 0x29, 0x23, 0x4c, 0xb3, 0x4b, 0x0a, 0x03, 0xc9, 0x22, 0xfc, 0x05, 0xa6, 0x2d, 0x99, 0xf3, 0xc1, 0x19, 0xb4, 0xf6, 0x1c, 0xeb, 0x9b, 0xa0, 0xb6, 0x98, 0x28, 0x04, 0x54, 0x12, 0x8d, 0x4d, 0xc7, 0xa7, 0x2a, 0x55, 0x28, 0xe6, 0x6b, 0xd7, 0xaa, 0x00, 0x31, 0x5e, 0x9b, 0xa1, 0xfc, 0xcd, 0x86, 0xe7, 0xd1, 0x4e, 0xea, 0x93, 0x5a, 0x02, 0x2c, 0xa7, 0x3a, 0x48, 0xde, 0xb0, 0xe3, 0x35, 0x2c, 0x53, 0x9e, 0x65, 0xe2, 0xaf, 0x2f, 0xb7, 0xe4, 0x62, 0xb8, 0x26, 0xb9, 0x2f, 0x2f, 0x4c, 0xd7, 0xda, 0xaf, 0x3d, 0xbe, 0x1c, 0x0a, 0xcb, 0x64, 0xb3, 0xcb, 0xc9, 0xd1, 0xf1, 0xdf, 0x8f, 0xa1, 0xd7, 0xba, 0x1d, 0xf8, 0xdd, 0x68, 0xf6, 0x54, 0x9c, 0x59, 0x90, 0x93, 0x7a, 0x10, 0x88, 0x97, 0x0a, 0xc8, 0x34, 0xfc, 0xd0, 0x30, 0xea, 0xd2, 0x2d, 0x39, 0x3a, 0xe0, 0x5c, 0x05, 0xc1, 0x35, 0x1e, 0xfb, 0x77, 0x38, 0xb7, 0xb3, 0xf8, 0x84, 0x75, 0xfd, 0x11, 0xec, 0x6a, 0xef, 0xc6, 0xd6, 0x8b, 0x5f, 0xb3, 0xf7, 0x05, 0x05, 0x36, 0x94, 0x02, 0x7a, 0xf2, 0xc1, 0x40, 0x46, 0xf9, 0x38, 0xb6, 0x37, 0xc5, 0xec, 0x00, 0xe3, 0xd0, 0x6f, 0xfb, 0xa5, 0x0a, 0x05, 0xc7, 0x97, 0x20, 0xe5, 0xd7, 0x8f, 0x33, 0x05, 0x18, 0xc3, 0x14, 0xed, 0x72, 0x00, 0x1d, 0x7a, 0x5e, 0xa1, 0xb4, 0x32, 0x2d, 0xe4, 0xf1, 0xd7, 0x43, 0xb2, 0x27, 0xf8, 0x43, 0x41, 0x9d, 0x02, 0xf8, 0xc4, 0xb8, 0x7d, 0x84, 0x1f, 0xc3, 0xb6, 0xcf, 0x73, 0xdf, 0x6b, 0xad, 0xda, 0x7b, 0xe6, 0xa0, 0x55, 0xa4, 0x5a, 0x48, 0x8a, 0xd0, 0xe3, 0xe1, 0x62, 0x86, 0xe3, 0x7d, 0xab, 0x23, 0x2b, 0x1e, 0x57, 0x64, 0x25, 0xf7, 0x67, 0x71, 0x07, 0x90, 0x7f, 0xf5, 0x59, 0xc1, 0x89, 0x3e, 0x9f, 0xfe, 0x16, 0xbc, 0x5e, 0xc9, 0xcd, 0x6d, 0x60, 0x97, 0x00, 0x33, 0x4c, 0x10, 0x9f, 0x24, 0xcc, 0x7f, 0x9f, 0x43, 0x4c, 0x80, 0x7e, 0x94, 0x0d, 0x5d, 0xb4, 0x00, 0x6b, 0xbf, 0x3a, 0xb4, 0xee, 0x9a, 0x75, 0xa4, 0x2a, 0x20, 0xa0, 0x1a, 0x04, 0x5d, 0xf5, 0x06, 0x19, 0x9a, 0x1a, 0xd8, 0xb4, 0xca, 0xd7, 0xbb, 0xe5, 0x8b, 0x0d, 0x34, 0x30, 0x9e, 0xf4, 0x45, 0xa5, 0xd5, 0x2d, 0x0d, 0x68, 0x3a, 0xb9, 0xef, 0x86, 0x47, 0x38, 0xda, 0xc7, 0x05, 0xd4, 0x60, 0xc8, 0x99, 0x2f, 0xb7, 0x34, 0x44, 0x1c, 0x5b, 0xa2, 0x97, 0x2a, 0xb2, 0xa5, 0xe1, 0x24, 0x44, 0x01, 0x79, 0x60, 0x0f, 0x12, 0xe3, 0x9b, 0x01, 0xe1, 0x23, 0x94, 0x0d, 0x46, 0x59, 0x78, 0x53, 0xe1, 0x39, 0x7e, 0x3e, 0xe3, 0x80, 0xe3, 0xe9, 0xf1, 0xa9, 0x29, 0xf0, 0xc4, 0x96, 0xd5, 0x8d, 0xe6, 0x40, 0xc5, 0x40, 0x22, 0x8f, 0x96, 0xa0, 0xc5, 0x90, 0xa9, 0x8b, 0xba, 0xb4, 0xcc, 0x77, 0x07, 0x95, 0xb7, 0x37, 0xe3, 0x84, 0xc5, 0xb0, 0xc8, 0x8d, 0x53, 0xa9, 0x57, 0xa5, 0x73, 0xbb, 0xea, 0x5a, 0xcc, 0x79, 0x22, 0x6e, 0x65, 0x63, 0x5c, 0xd5, 0xb4, 0x35, 0xf9, 0xed, 0x95, 0xfa, 0xad, 0x73, 0x7c, 0x20, 0x53, 0x45, 0xac, 0x76, 0x36, 0x50, 0x65, 0xe0, 0x63, 0x14, 0x1e, 0xa2, 0x82, 0x73, 0x43, 0x22, 0xe4, 0xce, 0xbb, 0x6f, 0xb5, 0xa3, 0x99, 0xd8, 0x0a, 0x8d, 0xc2, 0x0d, 0xb7, 0xa6, 0x56, 0xbf, 0x13, 0x84, 0x63, 0x18, 0x8f, 0xaf, 0x15, 0xc9, 0x21, 0xe3, 0xf6, 0x08, 0x48, 0x90, 0xe2, 0x95, 0xf9, 0x69, 0x7f, 0xce, 0xa7, 0x83, 0xdb, 0x5c, 0x35, 0x24, 0x3e, 0x8c, 0x98, 0x3d, 0xd7, 0xe6, 0xc2, 0xe8, 0x23, 0xde, 0xf5, 0x35, 0xa5, 0x98, 0x2a, 0x96, 0x9c, 0xe3, 0xf7, 0x97, 0x17, 0x16, 0x24, 0x46, 0xd2, 0x30, 0x5f, 0x38, 0xd4, 0x63, 0x7c, 0x9e, 0xa1, 0x92, 0xa8, 0xbb, 0x20, 0x79, 0x25, 0xe6, 0x79, 0x6a, 0x73, 0x2a, 0xb9, 0xe8, 0x8b, 0x4d, 0xd4, 0x97, 0x37, 0x5f, 0x05, 0x86, 0xb5, 0x91, 0x0e, 0xc9, 0xd5, 0x75, 0xa0, 0xb4, 0xb4, 0xe7, 0x6f, 0x9a, 0xf5, 0xb9, 0x24, 0x22, 0x21, 0x15, 0x0c, 0x18, 0x4a, 0x65, 0x18, 0x80, 0xa6, 0x11, 0x67, 0x8f, 0x97, 0x6a, 0x68, 0x5a, 0x4d, 0xca, 0xae, 0x2a, 0x05, 0x40, 0xe7, 0x01, 0xef, 0xa5, 0xdb, 0xa3, 0x96, 0x19, 0x59, 0xa7, 0x7c, 0x0f, 0xae, 0xc3, 0xd1, 0xf5, 0x8e, 0x4a, 0xa3, 0xc7, 0x8c, 0x54, 0x85, 0x01, 0x14, 0x3b, 0x44, 0x16, 0xe0, 0xa0, 0xdb, 0x0b, 0x66, 0xe8, 0x9d, 0x2c, 0xea, 0xc3, 0xf5, 0x43, 0xaf, 0xfd, 0xec, 0x3d, 0x1a, 0x83, 0x96, 0x4a, 0xfb, 0x5a, 0x7c, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0xc3, 0xa9, 0xb9, 0x73, 0x50, 0xe3, 0x6a, 0x08, 0xb4, 0x2e, 0x64, 0x6d, 0x05, 0x00, 0x01, 0xb3, 0xd5, 0x92, 0x5f, 0xdd, 0xe1, 0xe6, 0xd0, 0x9d, 0xc5, 0x1c, 0xa6, 0xe6, 0x19, 0xb0, 0x16, 0x15, 0xa1, 0xc3, 0xa6, 0xdb, 0xdb, 0x47, 0x92, 0xa0, 0x40, 0x59, 0x85, 0x23, 0xde, 0x43, 0x26, 0x81, 0x72, 0xab, 0xd9, 0x0b, 0x02, 0xc4, 0x4e, 0x6d, 0xc8, 0x02, 0x67, 0x4a, 0x2f, 0x79, 0x49, 0x22, 0x44, 0xbf, 0x58, 0xec, 0xef, 0x55, 0x29, 0xc6, 0x17, 0xba, 0xf0, 0xcf, 0x1b, 0x94, 0x1d, 0x83, 0x10, 0x85, 0x07, 0x90, 0xda, 0xb9, 0x45, 0xa5, 0x1f, 0xc0, 0x79, 0x00, 0x6d, 0x0b, 0x14, 0xbc, 0xed, 0xde, 0x1f, 0xd4, 0x4a, 0x0c, 0x6e, 0x82, 0x26, 0xeb, 0x37, 0xb8, 0x0b, 0xd0, 0xa5, 0xb3, 0x5f, 0xc1, 0x8e, 0xb8, 0x3d, 0x6d, 0x39, 0x17, 0x64, 0x86, 0x7b, 0x56, 0x01, 0x8d, 0x54, 0x17, 0x5a, 0x16, 0xec, 0x64, 0x3b, 0x4a, 0xce, 0x4a, 0x1d, 0xd7, 0x57, 0xbe, 0x0e, 0x8b, 0x2e, 0xad, 0xd4, 0xbd, 0xab, 0x6b, 0x58, 0xa3, 0xee, 0xd3, 0x2e, 0x38, 0x3c, 0x34, 0x68, 0xe5, 0x37, 0x3b, 0x1d, 0xff, 0xb6, 0x08, 0x3a, 0xed, 0x46, 0x70, 0xc4, 0x85, 0xcd, 0x1e, 0xce, 0xcd, 0x90, 0xa5, 0x7e, 0x42, 0x21, 0xe4, 0x1b, 0x0a, 0xe9, 0xda, 0x9f, 0x42, 0x12, 0xec, 0x89, 0xb8, 0xd3, 0x3e, 0x3e, 0x5e, 0xa0, 0x5e, 0xae, 0x9e, 0x13, 0xa4, 0x7f, 0x89, 0x52, 0x92, 0x36, 0x87, 0x2e, 0x34, 0xaf, 0x3b, 0x0d, 0xaa, 0xe2, 0xfe, 0x85, 0xe5, 0x96, 0x49, 0x2f, 0xf3, 0x28, 0x8a, 0x00, 0xe4, 0x67, 0x9e, 0xf8, 0xc9, 0x70, 0xbd, 0x7c, 0x05, 0x6a, 0x57, 0x81, 0x6f, 0xbc, 0x59, 0x59, 0xc0, 0xce, 0x04, 0xe5, 0x67, 0xc4, 0xac, 0xba, 0xda, 0xd3, 0xe1, 0xbc, 0xf0, 0x79, 0xbb, 0x53, 0x4b, 0xc7, 0x85, 0x63, 0xbf, 0xf0, 0x4f, 0x2f, 0xfa, 0x8d, 0xcf, 0xd7, 0x75, 0x7b, 0x1d, 0x05, 0xea, 0x00, 0x00, 0x01, 0x00, 0x19, 0x48, 0xbb, 0x1d, 0x3e, 0xd9, 0x98, 0x87, 0x8e, 0x14, 0x43, 0x97, 0xd5, 0xae, 0x1f, 0xcc, 0x45, 0x84, 0x6b, 0x27, 0xad, 0x5d, 0x2f, 0x93, 0x5f, 0xac, 0xca, 0x18, 0x34, 0x36, 0x1e, 0x99, 0xf7, 0x9c, 0xf2, 0x93, 0x6a, 0x9c, 0x39, 0xe8, 0x70, 0x87, 0xce, 0x64, 0xf2, 0xa4, 0x70, 0x40, 0x50, 0x49, 0xc2, 0xa7, 0xa9, 0xe9, 0x78, 0xe7, 0xec, 0x6b, 0x33, 0xca, 0x7a, 0xfa, 0x49, 0x4c, 0x39, 0xe4, 0x8d, 0xe5, 0x3d, 0x3f, 0x63, 0xd4, 0xf6, 0xc2, 0x45, 0xc8, 0x93, 0xb6, 0xf9, 0xaa, 0x4d, 0xd2, 0xbc, 0x7e, 0x56, 0x99, 0x6f, 0x43, 0x98, 0x4f, 0xfa, 0xdc, 0x4f, 0x15, 0x30, 0xcf, 0x70, 0x9d, 0x47, 0x0b, 0xb7, 0x42, 0xf8, 0xa6, 0xd3, 0x00, 0x75, 0xff, 0x3a, 0xe4, 0x2f, 0x13, 0xa1, 0xc9, 0xc6, 0x11, 0xa1, 0x51, 0xbb, 0xd4, 0x3d, 0x69, 0x7e, 0xfc, 0xec, 0xa5, 0x77, 0xa4, 0x04, 0x5b, 0xd0, 0x6c, 0x78, 0xe7, 0xbe, 0x10, 0x4c, 0xfc, 0xa2, 0x1f, 0x03, 0x5c, 0x28, 0x57, 0x2f, 0x95, 0xff, 0xdd, 0x65, 0x0b, 0x38, 0xcd, 0x2e, 0x72, 0xcc, 0xcd, 0x2d, 0x80, 0x80, 0x5a, 0xa3, 0x09, 0xaa, 0xd8, 0x9e, 0xe3, 0x96, 0xc2, 0x86, 0xed, 0xe7, 0x55, 0xd6, 0x9e, 0xce, 0xfc, 0x3c, 0x28, 0x40, 0xc8, 0x21, 0xbf, 0x9b, 0x51, 0x64, 0xce, 0x21, 0xe8, 0xc4, 0xab, 0x72, 0xc2, 0x07, 0x5d, 0xa5, 0x26, 0x0e, 0xdc, 0xfb, 0xa4, 0xec, 0x63, 0x00, 0x08, 0x50, 0x4e, 0x27, 0xd6, 0xf7, 0x7f, 0x92, 0xe9, 0xe0, 0x11, 0x50, 0xea, 0xbe, 0xf8, 0x53, 0x5d, 0x02, 0xec, 0x8f, 0x0a, 0xb0, 0xbd, 0x33, 0x22, 0x37, 0x0f, 0x80, 0xff, 0x45, 0xcf, 0x71, 0xdc, 0x00, 0xad, 0x25, 0x1b, 0xee, 0x88, 0x71, 0x69, 0xa5, 0x06, 0x07, 0x21, 0x55, 0x10, 0x43, 0xe0, 0xdb, 0x1a, 0x99, 0xdd, 0xa6, 0xdf, 0xd4, 0x63, 0x2c, 0x1b, 0x0c, 0x17, 0x61, 0xd5, 0x97, 0x2c, 0x71, 0xcf, 0xd7, 0x15, 0x5a, 0x49, 0x83, 0x2a, 0x32, 0x29, 0x19, 0x75, 0x65, 0xc3, 0x6f, 0x17, 0xbb, 0xd2, 0x94, 0x76, 0x2f, 0x7a, 0x96, 0xb5, 0x1f, 0xa1, 0xce, 0xa1, 0x63, 0x0b, 0x29, 0x1c, 0x84, 0x73, 0x37, 0x5f, 0x00, 0x22, 0x41, 0x24, 0x78, 0xb0, 0x34, 0x6e, 0xcf, 0xe7, 0x26, 0x49, 0x61, 0x5b, 0x04, 0x81, 0xe6, 0x15, 0x18, 0x81, 0xc9, 0xd7, 0x2f, 0x28, 0x64, 0xea, 0x30, 0x08, 0x8e, 0x7b, 0x7c, 0x09, 0x79, 0x43, 0x27, 0xa8, 0x9d, 0x38, 0x01, 0xbe, 0xbd, 0xe5, 0xeb, 0xea, 0x83, 0xbd, 0x37, 0x77, 0x71, 0xf2, 0x1d, 0x24, 0x1b, 0x64, 0x57, 0xd7, 0x30, 0x20, 0xa6, 0xa9, 0x3d, 0xe7, 0xd1, 0x34, 0x53, 0x72, 0x3a, 0xb8, 0xe1, 0x39, 0x3e, 0xef, 0x46, 0x94, 0x97, 0xb4, 0x2c, 0xf6, 0x5f, 0xd6, 0x8d, 0xb5, 0x77, 0xf4, 0x38, 0x25, 0x90, 0xc7, 0x21, 0x9d, 0xa7, 0x4a, 0xd2, 0x09, 0xf1, 0xb9, 0x64, 0xed, 0x88, 0xb5, 0xfa, 0xce, 0x60, 0x44, 0x46, 0xf5, 0xb1, 0x02, 0x8e, 0x0f, 0x44, 0xe9, 0x2d, 0x93, 0x4c, 0xd7, 0xa5, 0x03, 0xb1, 0xff, 0x3d, 0xad, 0xf3, 0x7f, 0x00, 0xbb, 0x70, 0x34, 0x74, 0xd7, 0x89, 0x19, 0xb7, 0x17, 0x6a, 0xf1, 0xdb, 0x6c, 0x7a, 0xb1, 0x9f, 0x34, 0xff, 0x51, 0x68, 0x41, 0x9c, 0xea, 0x2b, 0x69, 0x7e, 0x73, 0xf0, 0xb6, 0xa9, 0x3e, 0x65, 0x00, 0xd9, 0xf1, 0xb4, 0x95, 0xdc, 0xdf, 0x89, 0xbc, 0x97, 0xf2, 0x56, 0xf0, 0xa6, 0x01, 0xfa, 0x67, 0x16, 0x0f, 0x38, 0xb1, 0x28, 0x23, 0x0b, 0xef, 0xaa, 0x5f, 0x43, 0xd3, 0x3b, 0xad, 0xe7, 0xf7, 0xe3, 0xa6, 0xdb, 0x84, 0x78, 0x12, 0xda, 0x7d, 0xcb, 0x59, 0xda, 0x76, 0x7f, 0x23, 0x88, 0xe4, 0x9b, 0x7b, 0x4d, 0xb4, 0x29, 0xce, 0xd7, 0x81, 0xa7, 0x0a, 0x12, 0xbb, 0x4f, 0x31, 0x2a, 0x45, 0x6f, 0xbb, 0x68, 0x0a, 0x8b, 0xe2, 0xba, 0xe4, 0x49, 0xa0, 0x13, 0x45, 0x7b, 0xd4, 0x65, 0x01, 0xc8, 0x68, 0x8c, 0xe4, 0x00, 0x4f, 0x15, 0xdf, 0x0a, 0x08, 0x0f, 0x2c, 0x2d, 0x8a, 0x2b, 0xfc, 0xa2, 0x37, 0x96, 0xfb, 0xaf, 0x92, 0x7d, 0xcf, 0x2a, 0x71, 0xec, 0x47, 0x9d, 0x44, 0x49, 0x23, 0x84, 0x3e, 0x4d, 0x97, 0x36, 0x1a, 0xf8, 0xc6, 0x0c, 0x6e, 0x52, 0x29, 0xeb, 0xc1, 0xbd, 0x74, 0xf1, 0x9e, 0x02, 0xf6, 0x21, 0xd0, 0x87, 0x67, 0x29, 0x2a, 0xcd, 0xfc, 0xfb, 0xd5, 0x6e, 0xe1, 0xe3, 0xec, 0xdd, 0x0b, 0x64, 0x16, 0xe8, 0xf6, 0x4b, 0x0f, 0x1e, 0x49, 0x92, 0xd4, 0x5d, 0x0c, 0xcb, 0x1b, 0x41, 0x85, 0x30, 0x42, 0x91, 0xe8, 0x4a, 0x31, 0xbc, 0x0d, 0x4f, 0x3e, 0xd4, 0x9f, 0x9b, 0x51, 0xaa, 0x84, 0x9a, 0x25, 0x85, 0x5e, 0x87, 0x4b, 0x95, 0x12, 0x52, 0x69, 0x54, 0x31, 0x45, 0xde, 0xe2, 0x58, 0xf6, 0xde, 0x8f, 0xce, 0xa1, 0x66, 0x0e, 0x35, 0xd6, 0xc5, 0x7c, 0x70, 0x83, 0x71, 0xe7, 0x96, 0x06, 0x06, 0x75, 0xcd, 0x0b, 0xeb, 0x9b, 0x98, 0x8d, 0x79, 0xc2, 0x33, 0xad, 0x4b, 0x1c, 0x08, 0x67, 0x63, 0x65, 0xd0, 0xbd, 0x67, 0x56, 0x7a, 0x0a, 0x46, 0x9c, 0xe8, 0x10, 0x25, 0x9d, 0xb1, 0x97, 0x4c, 0x20, 0xe8, 0x5a, 0x07, 0xc7, 0x82, 0x36, 0x9b, 0xfd, 0x32, 0x15, 0xf2, 0xe6, 0x86, 0x20, 0x61, 0xb8, 0xc9, 0xc5, 0x86, 0xcb, 0x84, 0x35, 0x86, 0x96, 0xb2, 0x5e, 0xcc, 0x00, 0x2e, 0x14, 0x1c, 0x64, 0xd0, 0xdb, 0x59, 0x0e, 0x5e, 0x53, 0x07, 0x94, 0x05, 0xa8, 0xa8, 0x5e, 0x9f, 0xb6, 0x44, 0xbd, 0x7d, 0x03, 0x47, 0xf7, 0xb2, 0xbf, 0x21, 0xf6, 0xc6, 0xe5, 0xe3, 0xaa, 0x1a, 0xab, 0xca, 0x79, 0x0d, 0x72, 0xa7, 0xc4, 0x48, 0x97, 0x1e, 0xbc, 0x8c, 0xf9, 0xbf, 0xe5, 0xc2, 0xfa, 0x64, 0x0f, 0xa6, 0x1c, 0x98, 0xa8, 0x74, 0x47, 0x51, 0x55, 0xc3, 0x53, 0x64, 0xc6, 0x17, 0xed, 0x44, 0x02, 0x25, 0x33, 0xcd, 0x13, 0xa8, 0x1e, 0x9c, 0x3f, 0x49, 0xf1, 0xac, 0x6a, 0xd5, 0xfb, 0xb3, 0xde, 0xcc, 0xf5, 0x3e, 0xb7, 0x73, 0x2e, 0xb2, 0x0e, 0x0c, 0x03, 0x5c, 0xbb, 0xf6, 0x0e, 0x57, 0x0a, 0x15, 0xd5, 0x84, 0xdb, 0x3c, 0x6c, 0x64, 0xca, 0xe7, 0x41, 0x52, 0xb3, 0x62, 0xb8, 0xf5, 0xd0, 0xdd, 0xc5, 0xba, 0x1a, 0x26, 0x6b, 0xb7, 0xe5, 0xb5, 0x9d, 0xdb, 0x21, 0x4a, 0x28, 0x1a, 0xe4, 0x6a, 0xd0, 0x32, 0x71, 0xf0, 0x7d, 0x02, 0x67, 0x75, 0x9d, 0xe0, 0x0f, 0x61, 0x2b, 0x60, 0xb2, 0xc0, 0x1f, 0x73, 0x72, 0x10, 0x43, 0x7e, 0xcc, 0x28, 0x52, 0xb0, 0xa9, 0x75, 0x20, 0x79, 0xf8, 0xd6, 0x20, 0x6e, 0x3d, 0x38, 0x0e, 0x5d, 0x61, 0xe6, 0x32, 0xfc, 0x34, 0xa6, 0x6d, 0xd9, 0xd0, 0x59, 0x7b, 0xc7, 0xdb, 0xb7, 0x23, 0x7c, 0x4a, 0x66, 0x2d, 0xae, 0x6c, 0xde, 0x6d, 0x50, 0x14, 0x83, 0xb3, 0x28, 0xa3, 0x4c, 0x7e, 0xde, 0x3b, 0x24, 0x6b, 0xb7, 0x5f, 0x08, 0xa2, 0x06, 0x0f, 0x31, 0x13, 0x66, 0x1e, 0xf9, 0x8e, 0x85, 0x61, 0xb9, 0xbb, 0x67, 0x28, 0x2a, 0xe7, 0xd9, 0xb4, 0x7e, 0xab, 0x1b, 0xb2, 0xdb, 0x2d, 0x7e, 0xb9, 0x96, 0x10, 0x82, 0x20, 0xa9, 0xa2, 0x44, 0x72, 0xb3, 0xe7, 0x97, 0x63, 0x3e, 0xdc, 0x81, 0x2a, 0xbf, 0x2b, 0xf5, 0x02, 0x37, 0xe8, 0x77, 0x3b, 0x8b, 0xe1, 0x11, 0xcf, 0xab, 0x26, 0xbd, 0x07, 0x62, 0x45, 0x0a, 0x5f, 0x55, 0x10, 0x7a, 0x52, 0xa0, 0xea, 0x1c, 0x84, 0xdf, 0xa2, 0x31, 0xaf, 0x2a, 0xe5, 0x50, 0x39, 0x58, 0xc0, 0x65, 0x3f, 0xad, 0x3b, 0x27, 0xa1, 0x3b, 0x26, 0x91, 0x02, 0x82, 0xaf, 0xfc, 0x36, 0xc3, 0x42, 0xc7, 0x2b, 0x40, 0xd1, 0xf1, 0xde, 0x6d, 0x0c, 0x35, 0x28, 0xa1, 0x7d, 0x62, 0x51, 0xeb, 0x04, 0xca, 0xdb, 0x81, 0x8e, 0x4e, 0x2a, 0x41, 0xb9, 0x6e, 0x2f, 0x58, 0x53, 0x1b, 0xa6, 0x34, 0x06, 0x50, 0x56, 0xa2, 0x66, 0x8e, 0xc5, 0xfb, 0xe1, 0x38, 0x54, 0x10, 0x98, 0x56, 0xda, 0xda, 0x24, 0xb9, 0xc9, 0xba, 0x3e, 0xcf, 0xa9, 0x89, 0x52, 0xcb, 0x6c, 0x21, 0x37, 0xdc, 0xdb, 0xdc, 0x86, 0x0e, 0xa3, 0x6e, 0xe4, 0x56, 0x03, 0xbc, 0x7c, 0x61, 0xd8, 0x12, 0xeb, 0x7e, 0x92, 0xe4, 0xfc, 0xc9, 0xbc, 0x3b, 0x18, 0x5b, 0x09, 0xdb, 0x97, 0xd6, 0xd6, 0x6f, 0xa1, 0xbd, 0x17, 0xfb, 0x18, 0xc1, 0x8e, 0xf2, 0x03, 0x32, 0x4d, 0x18, 0x38, 0x31, 0x50, 0xe7, 0x56, 0xc6, 0xaa, 0x1c, 0x27, 0xb9, 0xb6, 0x0f, 0x5c, 0x11, 0x0d, 0x7d, 0xd2, 0xdd, 0x72, 0xe4, 0x30, 0xbb, 0xa9, 0x7a, 0xa4, 0x17, 0xeb, 0x0e, 0x8d, 0xe4, 0xfd, 0x3c, 0xd5, 0x81, 0xea, 0x53, 0x05, 0xbb, 0xa5, 0x5a, 0xdc, 0xfe, 0x58, 0x40, 0x4d, 0xf0, 0xdb, 0xc8, 0x48, 0x05, 0x2e, 0x06, 0xb4, 0x21, 0x43, 0x10, 0x3d, 0x3d, 0x66, 0xfe, 0x47, 0x91, 0x5b, 0x93, 0xde, 0x27, 0x60, 0x9e, 0x15, 0x23, 0xc7, 0x24, 0xeb, 0xa3, 0x1b, 0x4c, 0xff, 0x32, 0x95, 0xb5, 0xd2, 0x96, 0x1c, 0x1d, 0xa9, 0x02, 0x57, 0xbe, 0x93, 0xd0, 0x35, 0x3d, 0xc9, 0xeb, 0xd9, 0x6a, 0x3e, 0x9b, 0x0d, 0x33, 0x20, 0xa2, 0x44, 0x5f, 0x81, 0x75, 0x8c, 0xd7, 0x92, 0xbc, 0xb6, 0x57, 0x84, 0xce, 0xe8, 0xe4, 0x7e, 0x6b, 0xed, 0x95, 0x69, 0x25, 0x96, 0xae, 0x78, 0x67, 0x90, 0x02, 0xee, 0xe5, 0x11, 0x2d, 0x6c, 0x68, 0x02, 0x49, 0xb1, 0x00, 0xda, 0x84, 0x07, 0x7a, 0x53, 0x24, 0x9d, 0xb4, 0xfc, 0xf3, 0x38, 0x3b, 0xc2, 0xed, 0x36, 0x66, 0x62, 0x84, 0xee, 0x53, 0x37, 0x48, 0xb2, 0xb8, 0xfa, 0x1a, 0x40, 0xf7, 0xa1, 0x10, 0x49, 0x32, 0x97, 0xf8, 0xee, 0x64, 0x94, 0x20, 0x82, 0xac, 0x19, 0x34, 0x6a, 0x33, 0xce, 0x1a, 0x14, 0xb3, 0x9e, 0x62, 0x83, 0xea, 0xc5, 0x29, 0xf1, 0xed, 0xa4, 0xae, 0xb8, 0x54, 0x72, 0xd1, 0xce, 0x94, 0xfc, 0x94, 0xf6, 0x52, 0x6b, 0xbb, 0xde, 0x34, 0x37, 0xec, 0xdd, 0x82, 0x94, 0xae, 0xae, 0x20, 0x0b, 0x4a, 0xa2, 0xc5, 0x89, 0x96, 0xbd, 0x07, 0xf1, 0x02, 0xf5, 0x45, 0x9c, 0xb3, 0xa4, 0x91, 0xcd, 0xf5, 0xb3, 0x7c, 0xaf, 0x82, 0xe8, 0xeb, 0xd7, 0xc9, 0xd8, 0x72, 0x46, 0x2e, 0xd5, 0x4e, 0x89, 0x96, 0x3f, 0x67, 0xe4, 0xba, 0x6c, 0x7f, 0xef, 0x49, 0x39, 0xef, 0x17, 0x33, 0x4b, 0x24, 0xf6, 0xb2, 0x5d, 0x01, 0x58, 0x91, 0x95, 0x80, 0xfe, 0xd8, 0x99, 0xc6, 0x0c, 0xfa, 0x85, 0x77, 0xc8, 0x18, 0x44, 0x2e, 0xa6, 0xbb, 0x2b, 0xfb, 0xa4, 0x23, 0x8e, 0xbe, 0xde, 0x19, 0xff, 0x71, 0x83, 0x72, 0x4e, 0xbb, 0x84, 0xae, 0x8a, 0x0a, 0x52, 0xa4, 0x0a, 0x90, 0x7b, 0xb3, 0x11, 0xf3, 0xe8, 0xb3, 0x6f, 0x91, 0xf3, 0xca, 0xd0, 0x9e, 0xf8, 0xfb, 0x7a, 0x1f, 0x4a, 0x9a, 0x26, 0x3c, 0x5f, 0x96, 0xf4, 0x58, 0x2a, 0x27, 0x8c, 0x00, 0x00, 0x01, 0xb7 }; +constexpr AccessUnit M2V_BEGIN_OF_AU_SPLIT_EXPECTED_AU = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x82, 0x81, 0xd3, 0x81, 0x99, 0x42, 0xa6, 0x9c, 0xe1, 0x8b, 0xab, 0x3e, 0xdb, 0x1c, 0x00, 0x03, 0xae, 0x8a, 0x24, 0x51 } }; + +const std::vector ATRACX_BEGIN_OF_AU_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xa7, 0x0b, 0x60, 0xfe, 0xb5, 0x2e, 0x3b, 0x4e, 0x6b, 0xaf, 0x90, 0x57, 0xc4, 0x99, 0xd0, 0x4e, 0xfa, 0x04, 0x29, 0x4c, 0x23, 0xcd, 0x8a, 0x9a, 0xac, 0x64, 0x27, 0x65, 0x27, 0xa2, 0x5c, 0xe2, 0xfd, 0x1d, 0x15, 0xcf, 0x72, 0x70, 0x1e, 0xb5, 0x08, 0x9f, 0x6f, 0x3d, 0x0b, 0x22, 0x22, 0x99, 0xbe, 0xcc, 0xb6, 0xdd, 0x99, 0xb9, 0x2b, 0xba, 0xa6, 0x32, 0xf0, 0x11, 0xc3, 0x4f, 0xc9, 0x06, 0xb1, 0x27, 0xee, 0x0b, 0xc6, 0xa6, 0x26, 0xf8, 0x02, 0x35, 0x7f, 0x64, 0x4a, 0x5d, 0x87, 0x1e, 0x20, 0xc9, 0x2a, 0x48, 0x0a, 0x57, 0x90, 0x65, 0x5a, 0x14, 0x62, 0x31, 0xbd, 0x5c, 0x28, 0xc6, 0x17, 0xcc, 0x3f, 0xde, 0x22, 0x35, 0xcf, 0xe2, 0xdc, 0xbe, 0x9b, 0xcb, 0x22, 0x96, 0xf1, 0xe1, 0xe9, 0x74, 0x7f, 0xc4, 0x79, 0xca, 0xe4, 0xeb, 0x68, 0x16, 0xeb, 0x39, 0x57, 0x65, 0xed, 0xd1, 0xc3, 0x6b, 0x21, 0x3a, 0xca, 0x94, 0xa2, 0xf7, 0x5f, 0x8e, 0x02, 0x47, 0x02, 0x35, 0xe4, 0x65, 0x3a, 0x34, 0x09, 0x15, 0x63, 0x8d, 0x0b, 0x1f, 0xdc, 0x1e, 0x8d, 0x6b, 0xfd, 0x16, 0xe7, 0xf6, 0x12, 0x2f, 0x75, 0x30, 0x31, 0x72, 0xd1, 0x8e, 0x68, 0x15, 0x5a, 0xbc, 0xf7, 0x0e, 0x89, 0x07, 0x20, 0xa0, 0x9b, 0xae, 0x14, 0x2a, 0xe7, 0x74, 0xa5, 0xf0, 0x15, 0xec, 0xda, 0x9a, 0x6e, 0xe2, 0x80, 0xc6, 0x98, 0xac, 0x8e, 0xc4, 0xfb, 0xdc, 0x73, 0x5b, 0x97, 0xcd, 0xa4, 0x99, 0xea, 0x92, 0x39, 0x50, 0xcc, 0xdc, 0x09, 0x89, 0x09, 0xed, 0x61, 0x44, 0x7a, 0xa3, 0x9b, 0x70, 0x86, 0x36, 0x0e, 0x81, 0x1d, 0xc5, 0x7a, 0x6a, 0xcf, 0x2e, 0x3f, 0x17, 0xbb, 0xf3, 0xe1, 0x4b, 0x44, 0xe9, 0xdb, 0x1b, 0x69, 0x59, 0x4e, 0xd2, 0x37, 0x1f, 0xe1, 0x22, 0x9a, 0x10, 0xdd, 0x72, 0xc7, 0x56, 0x7c, 0x6f, 0xc4, 0xb3, 0x36, 0xa7, 0xce, 0x69, 0xad, 0x7c, 0xc4, 0x1c, 0xed, 0xa0, 0x55, 0x8d, 0x44, 0x37, 0x96, 0x41, 0x3c, 0x06, 0xe1, 0xbb, 0x58, 0x35, 0x43, 0x5b, 0x0b, 0x10, 0xed, 0x13, 0x02, 0xe2, 0xb2, 0xeb, 0x2f, 0x7d, 0x89, 0x63, 0x2e, 0x52, 0x51, 0xc5, 0x05, 0x06, 0xbd, 0x64, 0xc0, 0x16, 0xfe, 0x41, 0xc9, 0x36, 0xb1, 0xe6, 0xf3, 0x14, 0x06, 0x6e, 0x05, 0x04, 0x02, 0x70, 0x1f, 0xa7, 0xed, 0x2b, 0x80, 0x94, 0x7f, 0x73, 0xb6, 0xf8, 0xa6, 0x16, 0x10, 0x6d, 0x1d, 0xe2, 0xf4, 0x9e, 0x5c, 0x48, 0x1f, 0x00, 0x9d, 0xb4, 0xc1, 0x9f, 0xd4, 0x1a, 0x69, 0x3d, 0xbc, 0x1c, 0x2b, 0x07, 0xeb, 0xe4, 0xe4, 0xdc, 0xf1, 0x82, 0x5b, 0xba, 0xab, 0x9f, 0xf2, 0xdc, 0x21, 0x0c, 0xcd, 0xef, 0x70, 0x1b, 0xf4, 0xbd, 0x9a, 0x7d, 0xde, 0xad, 0x0e, 0x58, 0x68, 0xd2, 0x1b, 0x9b, 0x23, 0x4d, 0xe6, 0x94, 0x6c, 0xe3, 0x75, 0x4f, 0x7e, 0x0e, 0x89, 0x14, 0x79, 0x54, 0x2c, 0x93, 0x4f, 0x05, 0x52, 0x1d, 0x92, 0x15, 0x80, 0x58, 0x8d, 0x42, 0xb6, 0xf4, 0x14, 0x9c, 0x46, 0x45, 0x69, 0x9f, 0xbd, 0x74, 0xd8, 0xe4, 0x30, 0x31, 0x23, 0x78, 0xce, 0x4b, 0xb7, 0x2c, 0x51, 0x2d, 0x76, 0x21, 0x83, 0x41, 0x64, 0x29, 0xce, 0x29, 0x09, 0x4c, 0xe8, 0x0a, 0xbe, 0x12, 0x77, 0xaf, 0x31, 0x0e, 0x6c, 0xc8, 0x4f, 0x29, 0xe4, 0x84, 0xfa, 0x05, 0xe2, 0x1c, 0xdb, 0x56, 0x64, 0xe2, 0xb4, 0x28, 0x6e, 0x51, 0x4b, 0xc4, 0x90, 0xad, 0x5d, 0x8f, 0x90, 0x64, 0x78, 0xf9, 0x7b, 0x3e, 0xd4, 0xf7, 0x2a, 0xdc, 0x40, 0xc0, 0xee, 0x48, 0x69, 0x61, 0x53, 0xe7, 0x76, 0x2e, 0xcb, 0x73, 0x4b, 0xad, 0xe5, 0x93, 0x45, 0x3f, 0x4a, 0x8c, 0x1d, 0x02, 0x2f, 0x02, 0xb7, 0xb3, 0xf7, 0xbe, 0x95, 0x6e, 0x48, 0x63, 0x55, 0x1d, 0xe2, 0xdb, 0xf0, 0x17, 0x22, 0x5f, 0xda, 0xb3, 0xf2, 0x54, 0x08, 0xbc, 0x8b, 0x08, 0x7b, 0x99, 0x37, 0xef, 0xfb, 0x10, 0xc6, 0x7b, 0xdd, 0x43, 0x98, 0xa2, 0x67, 0x55, 0x41, 0xd6, 0x43, 0x5b, 0xfe, 0x59, 0xfa, 0xd1, 0x1c, 0xb5, 0x18, 0x1b, 0x50, 0x68, 0xbd, 0x8f, 0x4a, 0x6f, 0x81, 0xfd, 0x6e, 0x85, 0x76, 0xe3, 0x43, 0x8d, 0x18, 0x2a, 0x1f, 0x8d, 0x75, 0x78, 0xa5, 0xaa, 0xb1, 0x6a, 0xa1, 0x59, 0xa1, 0x7e, 0x40, 0x62, 0x2c, 0x8d, 0x5b, 0xda, 0xa7, 0x32, 0x1c, 0xe2, 0xb9, 0xdd, 0x8d, 0x77, 0x6d, 0xcc, 0x13, 0x5f, 0x0a, 0x40, 0x74, 0xf6, 0xe1, 0x66, 0xda, 0xc3, 0x9c, 0x5c, 0x60, 0x61, 0xed, 0x2f, 0x2c, 0x89, 0x72, 0x7a, 0x11, 0xc6, 0x3a, 0x5d, 0x45, 0x55, 0xd8, 0xa8, 0x03, 0xc6, 0x6d, 0x78, 0xe7, 0xb9, 0x54, 0xb3, 0x6b, 0xc9, 0xcb, 0xc1, 0xac, 0x41, 0x1c, 0x4a, 0x10, 0x21, 0x56, 0x17, 0xa3, 0x1d, 0x1e, 0x78, 0x40, 0x6f, 0x0c, 0x3b, 0x9e, 0xcc, 0x7b, 0xc4, 0xa3, 0x07, 0x90, 0xa3, 0x6c, 0xa4, 0x63, 0xdf, 0xc3, 0xea, 0xf0, 0x85, 0xbc, 0x14, 0xda, 0x31, 0xd8, 0x49, 0x2f, 0x70, 0x85, 0x5c, 0x7b, 0x6d, 0x92, 0x3c, 0x0d, 0x35, 0x61, 0xe7, 0x8d, 0x65, 0xee, 0x37, 0xa3, 0x9a, 0xdb, 0x9c, 0x44, 0x18, 0x7c, 0x01, 0x90, 0xc2, 0xae, 0x37, 0x34, 0x07, 0x9e, 0xb9, 0xf2, 0x53, 0x86, 0x09, 0x9b, 0xc4, 0xda, 0xf8, 0xe2, 0x0e, 0x52, 0x8d, 0xb5, 0xe8, 0xd5, 0x0c, 0x75, 0xe9, 0x1d, 0x9e, 0x52, 0xa3, 0x60, 0x15, 0x50, 0x94, 0xcd, 0x1c, 0x7d, 0xfe, 0x75, 0x61, 0x30, 0x6b, 0xc9, 0x4f, 0xcd, 0xe1, 0x97, 0xa0, 0x9d, 0xaf, 0xfc, 0x57, 0xdf, 0xca, 0xff, 0xd6, 0x23, 0x8d, 0x0a, 0x38, 0x89, 0xdd, 0x9c, 0x60, 0x1e, 0xaf, 0xed, 0x83, 0xac, 0x84, 0x6b, 0xd8, 0xc2, 0x06, 0x5f, 0xc0, 0xef, 0xac, 0x59, 0x96, 0xcc, 0xc4, 0x2f, 0xb7, 0x57, 0x73, 0x9f, 0xee, 0x70, 0x82, 0xe9, 0x3c, 0x54, 0xdf, 0x2c, 0x35, 0xfe, 0xa4, 0x78, 0x0c, 0x75, 0xb4, 0x90, 0x12, 0xd3, 0x1f, 0xbf, 0x92, 0x7b, 0xd7, 0x10, 0xa6, 0x98, 0xb2, 0x0e, 0x9f, 0xfd, 0x3d, 0xd5, 0x4e, 0x4d, 0x55, 0xa8, 0xf0, 0xa8, 0xa4, 0x74, 0x74, 0xf7, 0x8b, 0x7f, 0xda, 0xfe, 0xe3, 0xc2, 0xf7, 0x31, 0xe4, 0x0a, 0x20, 0xf2, 0x2e, 0x0b, 0x47, 0x5c, 0x29, 0x2c, 0x33, 0xd7, 0xf7, 0x7d, 0x02, 0x0b, 0x17, 0x01, 0xf4, 0x0b, 0x1e, 0xa2, 0x63, 0xaa, 0x80, 0xbc, 0xb9, 0x21, 0xd7, 0xfa, 0x7c, 0x2a, 0xa1, 0xa6, 0x90, 0x30, 0x8e, 0xd1, 0x94, 0x75, 0x78, 0xc1, 0x6e, 0x78, 0xdc, 0x8a, 0xd8, 0x65, 0x00, 0x2e, 0xf7, 0x99, 0x67, 0xfe, 0x5e, 0x49, 0x3e, 0x87, 0xd5, 0x92, 0x7b, 0x2d, 0x23, 0xfe, 0xcc, 0xce, 0x44, 0xe4, 0x94, 0x1b, 0xa6, 0xd3, 0x48, 0x88, 0x17, 0x71, 0x2b, 0x94, 0xd8, 0x47, 0xc6, 0x68, 0xc2, 0x89, 0xa7, 0xab, 0x65, 0x9a, 0xa0, 0x9a, 0xcd, 0xee, 0x36, 0x8c, 0x1d, 0xba, 0xcb, 0x75, 0x8d, 0xbe, 0x09, 0x1e, 0x48, 0xad, 0xd4, 0xc6, 0x16, 0xf3, 0xfe, 0x6a, 0x77, 0xa9, 0xed, 0x2c, 0xd3, 0x7e, 0xc0, 0x16, 0xa9, 0x11, 0x57, 0xfc, 0x36, 0xa8, 0x68, 0xb1, 0xb0, 0x57, 0x59, 0x1b, 0xea, 0x4c, 0xe9, 0x47, 0xf7, 0xa9, 0xa1, 0x88, 0xfc, 0x47, 0x84, 0x28, 0xd6, 0xca, 0x39, 0xc4, 0xde, 0x88, 0xad, 0x8c, 0xff, 0x68, 0xe1, 0x81, 0x83, 0x8b, 0x71, 0x0e, 0xda, 0x98, 0xf8, 0x63, 0xd7, 0x25, 0x81, 0x57, 0x12, 0x19, 0x8e, 0x03, 0xf3, 0x3a, 0x58, 0xfb, 0xf5, 0x34, 0x93, 0xc0, 0x1f, 0xd5, 0x43, 0xac, 0x92, 0x13, 0x48, 0x7e, 0x9a, 0x66, 0x69, 0x2e, 0x0c, 0x77, 0x00, 0xa3, 0xe1, 0x16, 0x76, 0x51, 0x7a, 0xc7, 0x5f, 0xf4, 0x66, 0x3f, 0xe6, 0x2f, 0x90, 0x6a, 0xfd, 0xba, 0x0b, 0x87, 0x29, 0x3e, 0xa4, 0xc4, 0xde, 0x6b, 0x25, 0xce, 0x45, 0x16, 0x9f, 0x54, 0x10, 0x20, 0xea, 0xb5, 0xd7, 0x9b, 0xc0, 0x79, 0xef, 0x90, 0x0e, 0xca, 0x5e, 0x4c, 0x1a, 0x73, 0x5a, 0xc2, 0xfb, 0x7a, 0x1a, 0x6b, 0x6b, 0x51, 0x55, 0x85, 0x0b, 0xf3, 0x60, 0x6c, 0x92, 0x94, 0x37, 0x45, 0x89, 0x48, 0xb8, 0x17, 0xa3, 0xa4, 0x70, 0x33, 0xdb, 0x12, 0x39, 0x48, 0x6e, 0x8f, 0x83, 0x9c, 0xea, 0x24, 0x46, 0x50, 0x15, 0xa4, 0xe5, 0x57, 0x5f, 0x73, 0xdc, 0xbb, 0xad, 0xc9, 0x08, 0x03, 0x8d, 0x7a, 0x89, 0x17, 0x91, 0x9e, 0x7e, 0x1c, 0x9f, 0xdc, 0xb3, 0x61, 0x0a, 0x0b, 0x16, 0x2c, 0x5a, 0xbf, 0xab, 0x25, 0x66, 0xdc, 0x21, 0x4a, 0xd6, 0xb9, 0x22, 0xa1, 0x0b, 0xed, 0x54, 0xf9, 0xf3, 0xc6, 0xe9, 0xf5, 0xd8, 0x39, 0x90, 0xa2, 0xad, 0xd8, 0xa4, 0xdf, 0x6e, 0xe0, 0x07, 0x3b, 0xe2, 0x6c, 0x04, 0x92, 0x03, 0x05, 0x6a, 0x54, 0x2c, 0xfb, 0xb3, 0xcb, 0xe8, 0xd0, 0x19, 0x0a, 0x4d, 0xdd, 0xf6, 0xf8, 0x84, 0xb6, 0xe8, 0xae, 0xd9, 0x73, 0xbe, 0xca, 0x44, 0x59, 0x2c, 0x7a, 0x83, 0xf4, 0xd3, 0x45, 0x72, 0x78, 0x50, 0xd8, 0xc7, 0xcd, 0xb6, 0x93, 0x1f, 0x87, 0x56, 0xc3, 0xf8, 0xb1, 0xb7, 0x6f, 0xd5, 0xda, 0x98, 0xa4, 0x84, 0x59, 0x69, 0x6d, 0xa0, 0xcc, 0xcf, 0x29, 0xac, 0x6a, 0x1a, 0xd8, 0x08, 0x73, 0x2a, 0x70, 0x2e, 0x76, 0xc0, 0x87, 0xc5, 0xb7, 0x06, 0xec, 0x9d, 0x1d, 0xce, 0xbe, 0x99, 0x1c, 0xcf, 0x45, 0x2d, 0xdf, 0x35, 0x14, 0xad, 0xa6, 0x9e, 0xcb, 0x86, 0xe8, 0x24, 0xaa, 0x79, 0x36, 0x84, 0xe1, 0x78, 0x1e, 0xdd, 0x41, 0x67, 0x74, 0x45, 0x24, 0x41, 0x62, 0x59, 0x77, 0xf1, 0xaf, 0xbf, 0xca, 0x21, 0x85, 0xf9, 0xc8, 0xb2, 0xf6, 0x07, 0x91, 0x54, 0x98, 0x25, 0xc8, 0x66, 0x3b, 0xb7, 0x1b, 0xcf, 0x3e, 0xe7, 0xb0, 0x53, 0x6b, 0x11, 0x6f, 0xb1, 0x79, 0xd5, 0xdb, 0xbd, 0x72, 0x0a, 0xdb, 0x79, 0x86, 0x4a, 0x22, 0x55, 0x09, 0xf2, 0x0d, 0x19, 0x90, 0xc9, 0x0a, 0x20, 0x7a, 0x67, 0x7e, 0x8b, 0x26, 0x47, 0x04, 0x60, 0xd7, 0x04, 0x6b, 0x9b, 0x85, 0x32, 0x12, 0xc6, 0x3e, 0xbb, 0x2d, 0xd3, 0x0f, 0x1a, 0x33, 0x6d, 0x4d, 0x88, 0xda, 0xd8, 0xb5, 0xe3, 0x0c, 0xc6, 0x12, 0x4d, 0x7b, 0x77, 0x55, 0x5c, 0xf6, 0xfd, 0xaa, 0xed, 0xa5, 0x13, 0x3e, 0x8b, 0xce, 0x37, 0xc3, 0x21, 0xe2, 0x80, 0x25, 0x35, 0x55, 0xae, 0x03, 0x38, 0x60, 0x8f, 0x57, 0x05, 0x65, 0xd8, 0x35, 0x5c, 0x8a, 0xd7, 0x9b, 0x6b, 0x7c, 0x31, 0xe0, 0x82, 0xbf, 0xf5, 0x21, 0x41, 0x6c, 0xab, 0xe3, 0x44, 0xd0, 0x64, 0x80, 0xce, 0x9a, 0x28, 0x50, 0x5d, 0x71, 0x28, 0xab, 0x2a, 0x1f, 0x5b, 0xca, 0x16, 0xc4, 0x81, 0x52, 0xa1, 0x39, 0xa6, 0x08, 0xb4, 0x31, 0x38, 0x0d, 0xe6, 0xc6, 0x2a, 0xaf, 0x1f, 0xd9, 0x52, 0x43, 0xd8, 0xb5, 0xb9, 0xc9, 0x84, 0x08, 0x53, 0x91, 0xd9, 0x5d, 0xa8, 0x78, 0x21, 0x2c, 0x2c, 0xa5, 0x49, 0x8c, 0xf5, 0x0d, 0xee, 0xdc, 0xb7, 0xdf, 0xf3, 0x66, 0x40, 0x68, 0xc9, 0xa4, 0x94, 0xbc, 0x37, 0x16, 0x2d, 0x61, 0xb5, 0x58, 0x47, 0x09, 0x95, 0xc5, 0xf0, 0xbb, 0x43, 0xee, 0x60, 0x32, 0xa4, 0xd1, 0xbf, 0xe1, 0xf1, 0xd5, 0x54, 0xbc, 0xd3, 0x81, 0xc5, 0x26, 0xbb, 0xb4, 0xd8, 0xd6, 0x3d, 0x4a, 0x86, 0x50, 0x90, 0xbd, 0x8b, 0x36, 0xfb, 0xe3, 0x78, 0x94, 0xb2, 0x3a, 0x76, 0x1b, 0x72, 0x5a, 0x29, 0x20, 0x31, 0x12, 0xf3, 0xaa, 0x03, 0xcb, 0x2c, 0xdf, 0x59, 0x78, 0x8e, 0x99, 0x1f, 0x23, 0x9d, 0x13, 0xd1, 0xac, 0xef, 0x2e, 0xfb, 0x0b, 0x86, 0xfa, 0x28, 0xc6, 0x62, 0x82, 0x9b, 0xf2, 0x75, 0x13, 0x24, 0xfe, 0x2f, 0x06, 0x0c, 0xf1, 0x4f, 0x92, 0xda, 0xda, 0x67, 0x58, 0x5e, 0x52, 0x85, 0xbf, 0xa0, 0x6d, 0xdb, 0xb2, 0x2f, 0xf0, 0xe9, 0x98, 0x97, 0xd1, 0x4c, 0x53, 0x93, 0xf9, 0x44, 0xc6, 0x84, 0x0e, 0x8a, 0xcd, 0xfb, 0x60, 0xf3, 0xfe, 0x75, 0xbc, 0x46, 0xef, 0x00, 0x5c, 0xfa, 0xbc, 0xf7, 0x60, 0x30, 0xc3, 0xe7, 0xc0, 0x10, 0xa4, 0xd4, 0x69, 0xf3, 0xea, 0x10, 0x54, 0x9e, 0xd1, 0x1d, 0xd7, 0x09, 0xcc, 0x0f, 0x7b, 0x28, 0xec, 0x75, 0x82, 0x3c, 0x18, 0xb4, 0x5d, 0x1b, 0xbb, 0x90, 0xe0, 0xd3, 0xed, 0x99, 0x67, 0x72, 0x2d, 0xa6, 0x35, 0xf4, 0x92, 0x2d, 0x77, 0x62, 0x67, 0x32, 0x1d, 0xba, 0xd6, 0xb2, 0x97, 0xe9, 0xd7, 0x83, 0x0d, 0x37, 0xe9, 0xad, 0x3a, 0xd8, 0x7b, 0xfb, 0xd3, 0xc8, 0xeb, 0xd2, 0xb1, 0x3a, 0xab, 0xc9, 0xd6, 0x61, 0x8f, 0x90, 0xbc, 0xa5, 0x1b, 0xa9, 0xc6, 0x47, 0x8d, 0x75, 0xb7, 0x59, 0x84, 0xb7, 0xb4, 0x07, 0x22, 0x66, 0xac, 0x7f, 0xbf, 0xbb, 0xe2, 0x13, 0x6d, 0x41, 0x74, 0xcf, 0x1e, 0x67, 0xd3, 0x01, 0x9a, 0xd8, 0xe9, 0x3c, 0xcc, 0xde, 0x08, 0x5b, 0x32, 0xa5, 0xf2, 0x8b, 0x0f, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0xc3, 0xa9, 0xb9, 0x73, 0x50, 0xe3, 0x6a, 0x08, 0xb4, 0x2e, 0x64, 0x6d, 0x05, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0xd8, 0x1d, 0xe7, 0x46, 0x25, 0x7e, 0x8c, 0x8e, 0xd0, 0xf5, 0xbe, 0x16, 0xfa, 0x95, 0x4f, 0xf2, 0x70, 0xa3, 0xbb, 0x44, 0x58, 0x07, 0x72, 0xef, 0x92, 0xaf, 0x0e, 0x5b, 0xcb, 0x5f, 0x84, 0x33, 0x71, 0xad, 0x81, 0x00, 0x39, 0xab, 0x5c, 0xfa, 0x36, 0xfd, 0xcd, 0x41, 0xdb, 0x64, 0xfc, 0xba, 0x97, 0x46, 0x3f, 0x10, 0x92, 0xe6, 0xa1, 0xb4, 0xc4, 0x2d, 0x53, 0x2c, 0x11, 0xea, 0x7a, 0x8b, 0x82, 0x44, 0x7d, 0xdf, 0xf6, 0x7c, 0x8b, 0xf4, 0xd5, 0x1e, 0xcf, 0xb7, 0x49, 0xdd, 0x14, 0x81, 0x08, 0x6d, 0x2b, 0x90, 0x99, 0x57, 0x44, 0xfe, 0xb2, 0xf2, 0xaa, 0x3e, 0x9a, 0xac, 0x55, 0x30, 0x73, 0x3e, 0x97, 0xcd, 0x99, 0x08, 0x37, 0x65, 0x14, 0x55, 0xf2, 0xaf, 0xfd, 0x2f, 0x02, 0xbc, 0x80, 0x52, 0x16, 0x46, 0xd2, 0xae, 0xcc, 0x8c, 0xd1, 0x1a, 0x3d, 0xd6, 0x6a, 0x53, 0xdb, 0xcf, 0x75, 0x55, 0x39, 0x97, 0x1b, 0x21, 0x38, 0x04, 0xbe, 0xb2, 0xfb, 0xb2, 0x5b, 0x4d, 0x50, 0x41, 0xf4, 0x8a, 0xc4, 0xb2, 0xcd, 0xba, 0x98, 0xf3, 0x87, 0x58, 0xdc, 0xc7, 0xdf, 0x70, 0xc6, 0x91, 0xa2, 0x67, 0x0f, 0xe4, 0xe0, 0x61, 0xfa, 0xa8, 0xc6, 0x0c, 0xf9, 0xfe, 0x3d, 0xee, 0xb7, 0xdc, 0x94, 0x02, 0xd1, 0x62, 0x76, 0x7f, 0xa2, 0xf5, 0xca, 0xfb, 0x7d, 0x00, 0x92, 0xf0, 0x50, 0xc9, 0xac, 0x39, 0x53, 0x59, 0x67, 0x2f, 0x55, 0x00, 0x8d, 0x07, 0xdb, 0x6d, 0x0b, 0x32, 0xe3, 0x18, 0x55, 0xc4, 0x8d, 0xb7, 0x1b, 0x28, 0xf3, 0x65, 0xb7, 0x1c, 0x8c, 0xf5, 0x39, 0x7e, 0xa4, 0x29, 0x31, 0x28, 0x4f, 0x23, 0x44, 0xd6, 0xbd, 0x46, 0x00, 0x18, 0x0d, 0x2a, 0x2c, 0xcc, 0x4f, 0xb3, 0x1b, 0x78, 0x43, 0x36, 0x41, 0x4a, 0x9c, 0xd7, 0x02, 0xfc, 0x80, 0xfb, 0x2b, 0xcc, 0x0f, 0x51, 0x78, 0x1e, 0x82, 0xf5, 0x75, 0xb8, 0x1c, 0xf6, 0x43, 0xd0, 0x50, 0x27, 0x66, 0x18, 0x2d, 0x99, 0x4e, 0x16, 0x52, 0x1e, 0x62, 0x17, 0x87, 0x3e, 0xeb, 0xa6, 0x02, 0xa8, 0xc3, 0x3e, 0x03, 0x3b, 0x1a, 0x59, 0xe4, 0xe3, 0xfa, 0xb2, 0x9b, 0xae, 0x91, 0x0d, 0x45, 0x18, 0xac, 0x25, 0x52, 0x07, 0xf4, 0x15, 0xcc, 0x8b, 0xe3, 0xc2, 0xce, 0x63, 0xc6, 0x2c, 0xc9, 0xa0, 0x7c, 0xa1, 0x98, 0x31, 0x97, 0xc5, 0x5e, 0x48, 0xbb, 0x0e, 0x52, 0x14, 0xf3, 0x36, 0xcf, 0x2c, 0x4d, 0x6d, 0xaa, 0x73, 0x67, 0x63, 0x0a, 0xcb, 0x11, 0xe1, 0x6d, 0xf9, 0x78, 0x1c, 0x46, 0x38, 0xd3, 0xea, 0x1e, 0xe0, 0x92, 0xfa, 0xc1, 0x9e, 0x6c, 0x8f, 0x30, 0x96, 0x50, 0xd6, 0x3c, 0x19, 0x04, 0xdb, 0x72, 0x1b, 0x52, 0xd0, 0x6c, 0x59, 0x59, 0x29, 0x92, 0xdb, 0x75, 0x9c, 0xbf, 0x84, 0x60, 0x02, 0x31, 0x4f, 0x67, 0x6a, 0x1e, 0x2d, 0x6a, 0x2c, 0x0e, 0xc3, 0x7f, 0xa3, 0x34, 0xaa, 0x58, 0x08, 0xd7, 0xc2, 0xf5, 0xef, 0x9a, 0xd0, 0x72, 0xda, 0xb1, 0xb8, 0xd4, 0xd0, 0x69, 0x13, 0x81, 0x48, 0x7e, 0x99, 0x65, 0x39, 0x63, 0x4b, 0x66, 0x69, 0x34, 0x26, 0xb4, 0x52, 0xc0, 0xce, 0x47, 0x9a, 0x2c, 0xdf, 0x17, 0x7f, 0x78, 0xbf, 0x69, 0x8e, 0x54, 0x70, 0x9d, 0xb1, 0x87, 0x2a, 0xa7, 0x7c, 0x32, 0x84, 0xc5, 0xf7, 0x91, 0x5b, 0xd3, 0x8f, 0xf9, 0x3a, 0x03, 0xfa, 0xf0, 0x20, 0x9e, 0xe0, 0xc9, 0x0d, 0xb1, 0x03, 0x07, 0x62, 0xd8, 0xbc, 0x48, 0x42, 0x42, 0x81, 0x29, 0x14, 0x84, 0x44, 0x0a, 0x66, 0x8e, 0xc5, 0xb6, 0xea, 0x0d, 0xdc, 0x7c, 0xde, 0xd3, 0xfc, 0xcb, 0x9b, 0xc2, 0xcc, 0x1d, 0xe4, 0x65, 0xe8, 0xae, 0xe6, 0x82, 0x50, 0xfe, 0x8c, 0x7a, 0x34, 0xdb, 0x0f, 0xa7, 0x6e, 0x02, 0x9b, 0x85, 0xc1, 0xed, 0xa0, 0x4c, 0x68, 0x91, 0x5d, 0xd5, 0xae, 0x7c, 0x18, 0xbd, 0xb1, 0x04, 0x5f, 0x28, 0xe6, 0x75, 0x25, 0x22, 0xe0, 0x6e, 0xb1, 0xe7, 0xc5, 0xfb, 0x69, 0x91, 0x39, 0x59, 0x4f, 0x5f, 0xda, 0xc9, 0x39, 0x30, 0xad, 0x5d, 0x2d, 0x4c, 0x88, 0xc5, 0xff, 0x17, 0xc9, 0x76, 0x30, 0x25, 0xda, 0x86, 0x37, 0x1c, 0x7e, 0x97, 0xc3, 0xf1, 0xea, 0xcc, 0xef, 0x20, 0xc0, 0xf3, 0xbd, 0xdf, 0xbf, 0x92, 0x28, 0xba, 0x93, 0x5f, 0x4a, 0xae, 0xc0, 0xa3, 0xbb, 0xbb, 0xaf, 0xa0, 0x8e, 0x3e, 0x5a, 0xb5, 0x44, 0x7a, 0x08, 0x33, 0x60, 0x3a, 0xf1, 0xcd, 0x52, 0x05, 0xb8, 0x16, 0x3b, 0xab, 0xde, 0xd1, 0x3d, 0x7b, 0x3d, 0xc5, 0x44, 0xda, 0xdc, 0xa5, 0xe2, 0x80, 0x0b, 0x7f, 0xfa, 0xb9, 0xc9, 0xa9, 0x32, 0x46, 0xf3, 0x89, 0x0f, 0xe3, 0xeb, 0x68, 0xac, 0x96, 0x13, 0xff, 0xef, 0x76, 0xec, 0x19, 0xca, 0x09, 0x1a, 0x9a, 0x49, 0x4d, 0xa8, 0x54, 0xfa, 0x74, 0x85, 0x80, 0x3d, 0xb8, 0x61, 0x75, 0x13, 0xc2, 0x2e, 0xe9, 0x4c, 0x9a, 0x69, 0x41, 0xcb, 0x72, 0xce, 0x9e, 0x30, 0x4b, 0x1d, 0x3f, 0x8d, 0xc6, 0xfe, 0xe4, 0x87, 0xb9, 0x29, 0x1a, 0xdc, 0xb8, 0x57, 0xd0, 0xe8, 0xbf, 0x04, 0xb7, 0x06, 0x97, 0x38, 0x21, 0xb7, 0xd8, 0x17, 0xb1, 0xef, 0xb6, 0xfc, 0x09, 0x74, 0xdf, 0x73, 0x4a, 0x42, 0x1f, 0x13, 0x49, 0x48, 0x7b, 0x28, 0x0d, 0x3e, 0x55, 0x02, 0x93, 0x39, 0x1c, 0x87, 0x66, 0x7b, 0x2e, 0x10, 0x75, 0x1e, 0x85, 0x64, 0xf9, 0xd6, 0x2f, 0x40, 0x18, 0x86, 0xf3, 0xa7, 0x81, 0xb7, 0xb0, 0x1e, 0x95, 0x57, 0x02, 0x3e, 0x0f, 0xe5, 0x87, 0x9f, 0x72, 0x30, 0x80, 0xaa, 0x63, 0xf1, 0xdd, 0xb0, 0xd5, 0x83, 0x3b, 0x58, 0x19, 0x42, 0xc6, 0x27, 0xdf, 0x6b, 0x26, 0x07, 0x15, 0x4d, 0xc1, 0x83, 0x40, 0xa0, 0x36, 0xbb, 0xaf, 0xf7, 0x7a, 0xcf, 0x9e, 0x37, 0x9d, 0x32, 0xec, 0x64, 0x49, 0xd5, 0xe0, 0x17, 0x2d, 0x25, 0x67, 0xce, 0x31, 0xb7, 0x1e, 0x09, 0x2f, 0x2a, 0x6e, 0x7c, 0xcd, 0xf4, 0x1c, 0xc4, 0x74, 0x63, 0x89, 0xc1, 0xd8, 0xda, 0x33, 0x6c, 0x46, 0x44, 0x74, 0x7c, 0xa4, 0xf0, 0x4f, 0x03, 0x16, 0xd5, 0x27, 0x38, 0xda, 0x36, 0x08, 0x62, 0xd0, 0xbc, 0xa2, 0x00, 0x7a, 0x58, 0x2e, 0x1a, 0x7b, 0x2d, 0xf6, 0x02, 0xf1, 0x41, 0xce, 0x60, 0x32, 0xdd, 0x11, 0xd9, 0x7f, 0x2b, 0xbe, 0x40, 0x1b, 0xdb, 0xe5, 0x65, 0xc4, 0xa2, 0x7f, 0xc6, 0x78, 0x38, 0x16, 0xe2, 0x13, 0x29, 0x34, 0x1c, 0xda, 0x36, 0xae, 0xc3, 0x05, 0xc9, 0xf2, 0x5c, 0xa5, 0xa2, 0x5b, 0xae, 0xb6, 0xe3, 0x5d, 0x6e, 0xa6, 0x36, 0x9e, 0x5b, 0x11, 0x1f, 0x0a, 0xa4, 0xf0, 0x35, 0x70, 0x3d, 0x82, 0xee, 0xa2, 0x9f, 0xd9, 0x7b, 0xec, 0xe8, 0xaa, 0xee, 0xb9, 0x05, 0x2f, 0xca, 0xdd, 0x80, 0x19, 0x0f, 0x81, 0x6e, 0xdd, 0x8f, 0x71, 0xc1, 0x0b, 0x36, 0x2d, 0xcf, 0x8e, 0xfa, 0xb9, 0x8a, 0x70, 0xf5, 0x20, 0x61, 0x9f, 0x20, 0xde, 0xe7, 0xed, 0xd6, 0x24, 0x4a, 0xd7, 0x29, 0xb7, 0x3a, 0xe1, 0x88, 0x64, 0x20, 0x0c, 0x43, 0x57, 0xa5, 0x18, 0x85, 0x52, 0x92, 0xb1, 0xc5, 0x98, 0xf6, 0x6e, 0x4c, 0x3d, 0x60, 0x03, 0xb7, 0x82, 0x01, 0xec, 0x7d, 0xcf, 0xe3, 0x4e, 0xcb, 0x58, 0x49, 0xdb, 0xb1, 0xb3, 0xd3, 0xfc, 0x31, 0x9d, 0x1d, 0xb1, 0xcd, 0x50, 0x64, 0x2b, 0x2c, 0x30, 0x0f, 0xd7, 0x11, 0x42, 0xa5, 0x1f, 0x45, 0x33, 0xf8, 0xc6, 0x97, 0x9f, 0xc7, 0xce, 0x96, 0xb0, 0x0c, 0xf2, 0xcd, 0x5f, 0x65, 0x9e, 0x81, 0x58, 0x41, 0xfa, 0xf8, 0xe2, 0x79, 0xa6, 0x73, 0x65, 0xf6, 0xbe, 0x15, 0x98, 0x20, 0xe5, 0xda, 0xd3, 0x31, 0x9d, 0x97, 0x13, 0x47, 0x14, 0xf6, 0x2c, 0xd8, 0xbc, 0xea, 0xbb, 0x80, 0x60, 0x9d, 0x1f, 0x50, 0x59, 0x9f, 0x82, 0x4f, 0x6f, 0x18, 0x4d, 0x79, 0x48, 0x99, 0x6b, 0x55, 0xcb, 0x1a, 0xac, 0x4c, 0x8c, 0x38, 0xbf, 0x80, 0xad, 0x0b, 0x7c, 0xc5, 0x72, 0xe7, 0x60, 0x0e, 0xbf, 0xc3, 0x78, 0x73, 0xd7, 0x98, 0x96, 0xc1, 0x31, 0x16, 0xd5, 0x92, 0x06, 0x09, 0xd6, 0x92, 0x85, 0x1a, 0xa6, 0xd1, 0x77, 0x8e, 0x0f, 0xbe, 0x82, 0x40, 0x25, 0x97, 0x7b, 0x10, 0xfc, 0x1f, 0x65, 0x40, 0x58, 0x19, 0x7d, 0x08, 0x28, 0xfa, 0x8a, 0x85, 0xfa, 0x4b, 0x9b, 0xe6, 0xa0, 0xea, 0x62, 0xa9, 0x64, 0xd5, 0x3c, 0x60, 0x6b, 0x33, 0x33, 0x95, 0x97, 0xc2, 0x6f, 0x9e, 0x9d, 0xe2, 0x85, 0x83, 0x10, 0x7d, 0x56, 0x69, 0x68, 0x07, 0x2e, 0xb6, 0x84, 0x79, 0x1a, 0xc6, 0x7e, 0x75, 0x89, 0x42, 0xc7, 0xdf, 0x46, 0x35, 0x82, 0x3d, 0x42, 0x35, 0x95, 0x41, 0x33, 0x8b, 0xdd, 0xf7, 0xc2, 0x27, 0xbd, 0x3a, 0xc4, 0xb2, 0x5d, 0xc5, 0xc6, 0xa9, 0xea, 0x05, 0x33, 0x3c, 0x3a, 0xe0, 0xe5, 0x0e, 0x44, 0xfd, 0xc8, 0xb0, 0x90, 0x29, 0x70, 0xae, 0x3a, 0x55, 0x42, 0xd0, 0x08, 0x7e, 0xc2, 0xc8, 0xf2, 0x1e, 0xd9, 0x2e, 0x9d, 0xc8, 0xa0, 0x8a, 0x77, 0x3e, 0xf4, 0xa0, 0xfb, 0x0a, 0xbd, 0xaf, 0x12, 0xde, 0xc9, 0x5a, 0xa8, 0xcd, 0xa8, 0x3c, 0xb0, 0x6d, 0x27, 0x9c, 0xed, 0xb5, 0x41, 0x84, 0x55, 0x4e, 0x61, 0x30, 0x15, 0x71, 0x7a, 0x19, 0xd9, 0x79, 0x78, 0x9a, 0x9e, 0xd8, 0xed, 0x9e, 0x24, 0x2c, 0x6b, 0x7d, 0x8c, 0x2c, 0x3c, 0x70, 0x5d, 0x16, 0x56, 0x19, 0x0c, 0xac, 0xde, 0x76, 0xef, 0xb3, 0xaa, 0xe7, 0xac, 0xac, 0x27, 0x75, 0xd9, 0xb9, 0x47, 0x4d, 0x86, 0x8d, 0xdd, 0xc5, 0xd6, 0x70, 0xd1, 0xd3, 0x00, 0xfa, 0xf6, 0x84, 0x60, 0x16, 0x53, 0x4b, 0x35, 0x74, 0xd9, 0x0d, 0xd5, 0xa1, 0x13, 0x1a, 0x08, 0xdd, 0x73, 0x9b, 0xf0, 0x44, 0xf3, 0xdd, 0x0a, 0x5b, 0xbb, 0x01, 0xf1, 0x74, 0x81, 0x79, 0x4d, 0x80, 0x5f, 0xfd, 0x0d, 0x7a, 0x1b, 0x7b, 0x78, 0xde, 0x1a, 0x95, 0x53, 0xf1, 0xf7, 0x91, 0x5d, 0xac, 0xa2, 0x53, 0x10, 0xe8, 0xd0, 0x86, 0x77, 0x83, 0x6f, 0x92, 0x0b, 0x84, 0x6c, 0xb3, 0x1a, 0xfa, 0x14, 0x25, 0xbb, 0x72, 0xbc, 0xd1, 0xa9, 0xae, 0xc0, 0xb8, 0x1b, 0x42, 0x32, 0x25, 0x30, 0xc2, 0xfa, 0xb1, 0x63, 0xbf, 0x7e, 0x81, 0xb8, 0xa9, 0x0a, 0x8c, 0x18, 0x1b, 0x44, 0x02, 0xa8, 0xe3, 0xc0, 0xff, 0xbf, 0x62, 0xf0, 0x18, 0x08, 0xdc, 0xfa, 0x0a, 0xe6, 0x1c, 0x04, 0xff, 0xd8, 0x08, 0x0c, 0x08, 0x62, 0xaf, 0x3c, 0x0e, 0xde, 0x24, 0x54, 0x47, 0x3e, 0x2c, 0x8c, 0xec, 0xe7, 0xcd, 0x5a, 0x04, 0x90, 0x7a, 0x70, 0x6f, 0x66, 0x44, 0xab, 0x57, 0x08, 0x70, 0x17, 0xb8, 0xf0, 0xc2, 0xff, 0x2f, 0xa2, 0x2d, 0x6e, 0x5f, 0xbd, 0x8c, 0x8a, 0xf0, 0x28, 0x37, 0xff, 0x04, 0x01, 0x5f, 0xac, 0x11, 0x53, 0x25, 0xc1, 0x52, 0xf3, 0x27, 0xed, 0xac, 0x60, 0x99, 0xd8, 0x25, 0x8e, 0x54, 0x7f, 0x9c, 0xf1, 0x3f, 0x4e, 0xc8, 0x57, 0xf6, 0x2b, 0x2d, 0x6d, 0xe9, 0xa4, 0xd8, 0x4b, 0x2e, 0x7a, 0xc3, 0x63, 0xcd, 0xe1, 0xf0, 0xf0, 0x39, 0xf0, 0x0a, 0xbb, 0x0c, 0x82, 0xd3, 0x0e, 0x49, 0x9e, 0x22, 0xcb, 0x5c, 0xd7, 0x3d, 0xd3, 0x58, 0x76, 0x84, 0x2d, 0x8a, 0x5a, 0x02, 0xee, 0x2a, 0xbc, 0xc1, 0xc4, 0x57, 0x5d, 0x06, 0x04, 0x6c, 0x93, 0x70, 0x26, 0x2b, 0x5c, 0xc9, 0xff, 0x22, 0x51, 0x25, 0xa2, 0xec, 0xdc, 0x29, 0xf2, 0x72, 0x41, 0x8c, 0x47, 0x70, 0xa9, 0xe3, 0x4c, 0xf5, 0xef, 0x16, 0xbf, 0x6d, 0x7d, 0xc1, 0xad, 0x1f, 0x14, 0x9e, 0x86, 0x43, 0xd1, 0x7e, 0xac, 0x67, 0x6f, 0x4c, 0x84, 0xdc, 0x68, 0x25, 0xd3, 0xfc, 0x5f, 0x5e, 0x01, 0xb4, 0xe6, 0x6b, 0xf0, 0x19, 0x54, 0x5a, 0xc7, 0x1c, 0xff, 0x0b, 0x4a, 0x73, 0xda, 0xc4, 0xb5, 0xd4, 0x79, 0xc4, 0x79, 0x7c, 0x13, 0x61, 0xd4, 0x77, 0x86, 0x57, 0x90, 0x91, 0x4b, 0x27, 0x81, 0x2a, 0xd6, 0x52, 0x33, 0x04, 0x2e, 0xc5, 0xa9, 0x56, 0xbf, 0xbc, 0x44, 0x40, 0x0f, 0x6b, 0x92, 0xda, 0xb0, 0x39, 0xe5, 0x45, 0x51, 0x21, 0x5d, 0x26, 0xb4, 0x4e, 0xe5, 0x2f, 0x4e, 0x7a, 0x02, 0x7c, 0x20, 0xa0, 0xe3, 0x74, 0x8c, 0xdb, 0x76, 0xf2, 0xcd, 0xdc, 0x29, 0x13, 0x63, 0x84, 0x54, 0xe7, 0x3e, 0xb2, 0x14, 0xf4, 0x90, 0x98, 0x51, 0x67, 0x66, 0xbd, 0x36, 0xc7, 0x5f, 0x00, 0x61, 0x93, 0x30, 0xe5, 0x9f, 0xe9, 0xb1, 0x15, 0x4e, 0xf3, 0x55, 0x7b, 0x34, 0x41, 0xa4, 0xc0, 0xc1, 0xa7, 0xe3, 0x58, 0xb3, 0x6b, 0x13, 0x4e, 0xca, 0x54, 0xca, 0x31, 0xe7, 0xc3, 0x5b, 0xfa, 0x58, 0x83, 0x5e, 0xf5, 0x82, 0xe8, 0x67, 0xb8, 0x33, 0xe1, 0x71, 0x5d, 0x6c, 0xa9, 0xc1, 0x3a, 0x4a, 0x7f, 0xa7, 0x02, 0xac, 0x96, 0xc2, 0x06, 0x89, 0x0f, 0xd0, 0x13, 0x34, 0xd9, 0x12, 0x6c, 0xf7, 0x0f, 0xd0, 0x46, 0x29, 0x4a }; +constexpr AccessUnit ATRACX_BEGIN_OF_AU_SPLIT_EXPECTED_AU = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x35, 0x1b, 0x6a, 0x2a, 0x8e, 0x4d, 0xf1, 0x87, 0x92, 0xa9, 0xff, 0x8c, 0x7f, 0xcc, 0x5c, 0x1c, 0x5a, 0x7a, 0x05, 0xdd } }; + +const std::vector AC3_BEGIN_OF_AU_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x6e, 0xc9, 0xfb, 0xc5, 0x67, 0xe9, 0x8d, 0x68, 0x46, 0x00, 0x0d, 0x37, 0x95, 0xba, 0x1f, 0xda, 0x13, 0x05, 0xa0, 0x64, 0xd4, 0x9f, 0x4f, 0xdb, 0x14, 0x4d, 0x18, 0x4e, 0xb1, 0x3c, 0x2c, 0x9e, 0xca, 0x40, 0x57, 0xbd, 0x5e, 0xce, 0xf5, 0xd7, 0xae, 0x0d, 0xce, 0x9f, 0x77, 0xc5, 0xbf, 0xff, 0x00, 0x19, 0xbf, 0xe2, 0x98, 0x6a, 0x77, 0xd7, 0x78, 0x6a, 0xe4, 0x97, 0x5a, 0x98, 0xd1, 0xe2, 0x55, 0x64, 0xff, 0x08, 0x0b, 0xe5, 0xab, 0x41, 0xb5, 0x30, 0x25, 0xa9, 0x10, 0xd4, 0x4c, 0xd6, 0x33, 0xb0, 0x14, 0x2d, 0x2e, 0xb4, 0xc8, 0x9b, 0x5b, 0x9b, 0xd8, 0x1a, 0x88, 0xab, 0xf2, 0xdb, 0x6f, 0xc1, 0x99, 0xd6, 0x5c, 0x3a, 0xc5, 0xcf, 0xf7, 0x30, 0x90, 0x76, 0x26, 0x8f, 0x22, 0x20, 0xc7, 0xdb, 0xec, 0xad, 0xee, 0x45, 0x12, 0x52, 0x01, 0x8e, 0x1c, 0xa7, 0xb5, 0x71, 0x76, 0x33, 0x44, 0xf8, 0x54, 0xf6, 0x5c, 0x92, 0x38, 0xfc, 0xf3, 0x2d, 0x53, 0x73, 0xbe, 0x7a, 0x7d, 0x26, 0xb1, 0x93, 0xda, 0x46, 0xae, 0xae, 0xf2, 0xc7, 0x1c, 0xc2, 0x57, 0xfd, 0x5d, 0xaf, 0xdd, 0xf0, 0x4d, 0xad, 0xb6, 0x70, 0x8c, 0x09, 0xd7, 0xbd, 0x53, 0x9e, 0xbc, 0x64, 0x78, 0x0d, 0xe0, 0x7d, 0xf9, 0xd7, 0x6f, 0xf9, 0x31, 0x71, 0xc5, 0xef, 0xfe, 0xaf, 0x50, 0x74, 0x3a, 0x62, 0x82, 0x4f, 0x72, 0x9d, 0x68, 0xf7, 0x12, 0xd9, 0x3a, 0x0e, 0xc9, 0x77, 0x86, 0x9d, 0xe8, 0x86, 0x78, 0x03, 0xc2, 0x1a, 0x97, 0xa8, 0xfc, 0xac, 0x41, 0x9f, 0x58, 0x5c, 0x33, 0xf0, 0x04, 0x11, 0xd6, 0x8d, 0x09, 0x5e, 0xb3, 0xee, 0x99, 0x89, 0x33, 0xdc, 0x76, 0x4a, 0xf5, 0x4a, 0xb7, 0x14, 0x95, 0x31, 0x7e, 0x0f, 0xf4, 0xac, 0x89, 0xdb, 0x24, 0x9b, 0x92, 0x08, 0x3b, 0xca, 0xd4, 0x87, 0x84, 0x65, 0xad, 0x8b, 0x77, 0xb7, 0x81, 0xec, 0x1b, 0xcd, 0x9f, 0x8f, 0x38, 0x65, 0xbe, 0xda, 0x7a, 0x78, 0x9a, 0xbf, 0x9a, 0xc7, 0x24, 0x97, 0x37, 0x6b, 0x56, 0x30, 0xc4, 0xa9, 0xe7, 0xd1, 0x15, 0x47, 0xe6, 0x8d, 0xce, 0x25, 0xc6, 0xc3, 0x2c, 0xb9, 0xa1, 0x65, 0xda, 0x26, 0x25, 0x5c, 0x66, 0x22, 0x95, 0x5d, 0xa4, 0xcb, 0x9c, 0x72, 0xd5, 0xd6, 0xd6, 0x02, 0xe9, 0xa2, 0x10, 0xe7, 0xf6, 0xbe, 0x10, 0x03, 0x1a, 0xee, 0xdb, 0x60, 0xc2, 0x0f, 0x09, 0x1c, 0x56, 0x48, 0x04, 0x72, 0x95, 0x5d, 0x88, 0x7d, 0x77, 0xe0, 0x22, 0x3d, 0xc9, 0x15, 0x3f, 0x9c, 0x12, 0x9f, 0xf2, 0xcc, 0xc7, 0xc5, 0xb8, 0x1c, 0x76, 0x26, 0x87, 0x61, 0x3b, 0xe2, 0x31, 0x22, 0x33, 0x4e, 0x3f, 0xb1, 0x7f, 0x2d, 0x31, 0xd7, 0x0f, 0x93, 0x1d, 0x91, 0xc2, 0x3a, 0xb1, 0xdb, 0xbe, 0xf3, 0x16, 0x5a, 0x64, 0x52, 0x3d, 0x33, 0x7b, 0x6c, 0xa9, 0xf2, 0x26, 0x69, 0xb7, 0xb8, 0xcd, 0x1d, 0xde, 0x8b, 0x88, 0xc5, 0xdc, 0x55, 0x05, 0x6f, 0x17, 0x61, 0x60, 0x44, 0xf8, 0x87, 0xba, 0xd2, 0xa3, 0x66, 0x00, 0xf5, 0x4d, 0xc1, 0x74, 0x6d, 0x51, 0x5b, 0x3d, 0x95, 0xbb, 0x89, 0xb5, 0xf5, 0x05, 0xf5, 0x67, 0x65, 0x2a, 0xc8, 0x86, 0xe6, 0x45, 0x10, 0x09, 0x81, 0xce, 0x19, 0x94, 0x57, 0xe1, 0xeb, 0xde, 0xa9, 0xda, 0x44, 0xd6, 0x33, 0xd5, 0xaf, 0x2c, 0x77, 0xa5, 0x2d, 0xe9, 0xa7, 0xce, 0xe5, 0xc2, 0x49, 0x30, 0x53, 0x04, 0x1d, 0xa9, 0xa3, 0xf4, 0x8e, 0x05, 0xf1, 0x8a, 0x7f, 0x0d, 0xc4, 0x0f, 0x80, 0x0f, 0x67, 0x29, 0x44, 0x17, 0x7d, 0x4d, 0x28, 0x20, 0xf2, 0x05, 0xcd, 0x33, 0x05, 0xac, 0x5d, 0x65, 0xbd, 0xe3, 0x5e, 0xdc, 0x08, 0xf4, 0x80, 0x11, 0x73, 0x39, 0x31, 0x15, 0xe1, 0x24, 0xd0, 0x4d, 0xd5, 0xf5, 0xa4, 0x02, 0x84, 0x34, 0x74, 0x25, 0x7c, 0x4e, 0x4a, 0x93, 0xa6, 0x84, 0x38, 0x88, 0x0a, 0x07, 0x68, 0xab, 0xa2, 0xe9, 0x06, 0x86, 0xfc, 0x17, 0x3b, 0x2d, 0xf6, 0xef, 0x99, 0x41, 0xdc, 0x35, 0xb2, 0xb2, 0x0a, 0x00, 0x11, 0xcb, 0x26, 0x8a, 0xa1, 0xab, 0xe1, 0xea, 0x40, 0xb2, 0xa6, 0xf2, 0x6d, 0x19, 0x8a, 0xb1, 0x57, 0xe4, 0x27, 0xb5, 0x4e, 0x11, 0xa8, 0xc5, 0x39, 0x44, 0xca, 0x6b, 0x8c, 0xfa, 0x35, 0x19, 0xfa, 0x91, 0xfe, 0xb5, 0xc8, 0x5b, 0xc4, 0x42, 0x39, 0x8a, 0xfe, 0x4e, 0xd3, 0x8b, 0xcc, 0x80, 0xf0, 0x15, 0xa1, 0xa8, 0x61, 0x2a, 0xb2, 0x4a, 0x7c, 0xf3, 0x0e, 0xda, 0x91, 0xfa, 0x30, 0xdf, 0x21, 0xda, 0x43, 0x42, 0x21, 0xf4, 0x5a, 0x89, 0xcc, 0xef, 0xda, 0xb3, 0xae, 0x16, 0xc8, 0x98, 0xc9, 0x47, 0xc5, 0xf0, 0x6a, 0xac, 0xaf, 0x16, 0x6b, 0x44, 0x77, 0xa6, 0x89, 0x87, 0x3d, 0x21, 0xb8, 0x2e, 0x4a, 0xc2, 0x53, 0xe7, 0xdc, 0x2f, 0x93, 0x35, 0x37, 0xf7, 0xf3, 0x83, 0xdf, 0xa2, 0x56, 0x14, 0x43, 0x4e, 0x0e, 0x8d, 0x09, 0x5c, 0x6c, 0x5b, 0x63, 0xbc, 0xe8, 0xa1, 0x55, 0x0b, 0x66, 0xdd, 0x44, 0x2e, 0x16, 0x08, 0xf2, 0x96, 0x28, 0x71, 0x28, 0xa3, 0xe8, 0xb8, 0x4a, 0xfb, 0x22, 0x00, 0xbe, 0x01, 0x79, 0x2d, 0x82, 0x88, 0xb7, 0xfa, 0xcb, 0xe0, 0xdf, 0x22, 0xe0, 0x8b, 0xe1, 0x78, 0xcb, 0x08, 0xd1, 0x2e, 0x93, 0xf7, 0x28, 0xbc, 0x43, 0x27, 0x57, 0x55, 0x2c, 0x11, 0x81, 0xe0, 0xc6, 0xd6, 0x28, 0x60, 0x80, 0x66, 0x01, 0x68, 0x47, 0x7b, 0x7b, 0x83, 0xa3, 0x0c, 0x34, 0x9b, 0x3b, 0x54, 0xc6, 0x59, 0x38, 0x56, 0x22, 0xc9, 0xa1, 0xc6, 0x7f, 0xc5, 0x1a, 0x77, 0xec, 0x13, 0x90, 0x2d, 0x56, 0x16, 0x59, 0x6a, 0x26, 0x48, 0x81, 0x3a, 0x25, 0xfe, 0xd2, 0x08, 0x7f, 0x04, 0x10, 0xd1, 0x48, 0xa1, 0x08, 0x26, 0xb8, 0x6f, 0x5a, 0xbe, 0x93, 0x77, 0x6f, 0x9e, 0x8c, 0x2d, 0x5f, 0xf6, 0xf0, 0xa0, 0x72, 0xa3, 0xad, 0x5e, 0x8b, 0x7a, 0x84, 0x47, 0x49, 0xcc, 0x72, 0xf8, 0x5e, 0x5a, 0xdf, 0x62, 0x11, 0x5c, 0x25, 0x8d, 0xde, 0x32, 0x00, 0x3b, 0x0f, 0xe1, 0x26, 0x7b, 0x93, 0xa9, 0xf1, 0x4c, 0x1b, 0x7e, 0x98, 0x14, 0xc8, 0xbf, 0x79, 0x34, 0x93, 0x6c, 0x9f, 0x8c, 0x9d, 0x98, 0x17, 0x40, 0x14, 0x9f, 0x9d, 0x09, 0x07, 0xd2, 0x3f, 0x9f, 0x25, 0xa9, 0x4c, 0x3b, 0x3f, 0x5c, 0x94, 0x7b, 0xa8, 0x49, 0x29, 0x6c, 0xd9, 0xc2, 0x26, 0xe7, 0xce, 0x90, 0x20, 0x96, 0x5e, 0xd8, 0x87, 0x2e, 0x02, 0xf8, 0xc4, 0xf2, 0xf2, 0x3e, 0x0b, 0x9f, 0x1c, 0xcc, 0x4b, 0x3f, 0x7d, 0x56, 0x41, 0xb3, 0x47, 0xbb, 0xd7, 0x52, 0xc4, 0xdd, 0x0f, 0xeb, 0x4c, 0xd8, 0x84, 0x3e, 0xdd, 0xd9, 0xad, 0xc3, 0xf2, 0xdc, 0xaa, 0xd9, 0xfd, 0x19, 0xdc, 0xf1, 0x02, 0xb4, 0x6e, 0xdd, 0xe5, 0x99, 0xc2, 0x09, 0xbc, 0x98, 0x6a, 0x48, 0xcb, 0x49, 0x89, 0x8c, 0xd2, 0x59, 0x4e, 0x55, 0xbc, 0x6b, 0xee, 0x1d, 0xf4, 0x30, 0x91, 0x67, 0x27, 0x05, 0x55, 0x97, 0xb9, 0x68, 0x52, 0x82, 0xc3, 0x57, 0xd1, 0xf7, 0xee, 0xd4, 0x80, 0x12, 0xd1, 0x6c, 0xa7, 0x03, 0xc9, 0x10, 0x63, 0xce, 0x20, 0x63, 0x05, 0x03, 0x77, 0xdc, 0xe2, 0xe3, 0x37, 0x6d, 0x43, 0x47, 0xd6, 0x83, 0xea, 0x09, 0xdf, 0xd3, 0x57, 0x86, 0x86, 0xee, 0x86, 0x01, 0x6b, 0x5e, 0xe9, 0x24, 0x5e, 0x6f, 0x8a, 0xba, 0xda, 0x79, 0x44, 0x0d, 0x42, 0xe6, 0x69, 0x43, 0xb3, 0x5d, 0xc4, 0x9a, 0x2d, 0x87, 0x5e, 0xb2, 0x4c, 0xb4, 0xe8, 0x06, 0x02, 0x73, 0x3f, 0x8e, 0x15, 0x37, 0x68, 0x8c, 0x97, 0x14, 0xb2, 0xbc, 0x28, 0x4c, 0xb9, 0x09, 0x4b, 0x7b, 0xae, 0xf6, 0x08, 0xd1, 0xf2, 0x2f, 0x0b, 0x98, 0x2a, 0xb0, 0xeb, 0xed, 0xf8, 0x71, 0xd9, 0x5b, 0xdf, 0xdd, 0x87, 0x9b, 0xdf, 0x2a, 0x62, 0x8a, 0x00, 0x4b, 0x03, 0xae, 0x37, 0x38, 0xf1, 0x94, 0x59, 0x1b, 0x2e, 0x79, 0x56, 0x8d, 0xcc, 0x36, 0xe5, 0xcc, 0xec, 0x50, 0x38, 0x37, 0x15, 0xb8, 0x84, 0x07, 0x5a, 0x6e, 0xb1, 0xda, 0xa1, 0x52, 0xe6, 0x32, 0x08, 0x4a, 0x91, 0xce, 0x0e, 0x2e, 0x78, 0xe2, 0xcc, 0xac, 0xb3, 0xc1, 0xeb, 0xce, 0x3e, 0x51, 0x21, 0x18, 0x5d, 0x96, 0xf9, 0x31, 0x18, 0xab, 0x54, 0x67, 0x61, 0xa5, 0x5c, 0x5b, 0x4b, 0x27, 0xa4, 0x61, 0xe1, 0x82, 0x58, 0xfd, 0xa7, 0x18, 0x1c, 0x8e, 0xdc, 0xbe, 0xd3, 0xdf, 0x3f, 0xdf, 0x2e, 0xbf, 0xe5, 0x5c, 0xb1, 0x5a, 0xcf, 0x49, 0xac, 0x66, 0x3b, 0x90, 0xf0, 0xba, 0x41, 0x3f, 0x6d, 0x4f, 0x1c, 0x60, 0x27, 0x76, 0xfe, 0x1a, 0xbf, 0x32, 0x8c, 0x81, 0xec, 0xe0, 0x56, 0xd3, 0x8b, 0xac, 0x17, 0x67, 0x7e, 0x8b, 0x22, 0x4a, 0x61, 0x38, 0xf8, 0xa6, 0x37, 0xcb, 0x1f, 0x29, 0x80, 0x0b, 0x48, 0x19, 0xff, 0x9f, 0x83, 0x48, 0x83, 0x62, 0x33, 0xa6, 0xd8, 0xac, 0xf7, 0xe8, 0x10, 0x01, 0xea, 0x6d, 0x0b, 0x2f, 0x2d, 0x57, 0x02, 0x89, 0xcc, 0x07, 0x2a, 0x79, 0x6d, 0x22, 0x1f, 0x1c, 0xb8, 0xe8, 0x89, 0xcb, 0x24, 0x3a, 0x90, 0x30, 0xd2, 0xc1, 0xf1, 0x6f, 0x26, 0xea, 0x91, 0xfb, 0xcb, 0xa1, 0xb1, 0x0f, 0xd9, 0x22, 0xd9, 0x53, 0x14, 0xa2, 0x12, 0x8c, 0x0f, 0x9a, 0x38, 0x53, 0x34, 0x43, 0x54, 0x77, 0x6c, 0x60, 0xc0, 0xca, 0xf2, 0x88, 0xc0, 0xba, 0x96, 0x15, 0xf7, 0xd9, 0x11, 0x44, 0x5b, 0x57, 0x9b, 0xc9, 0x72, 0x6d, 0x93, 0xda, 0xc6, 0xaa, 0xb2, 0x01, 0x0b, 0x0e, 0x44, 0x0d, 0xb4, 0x1e, 0xff, 0xf4, 0x7e, 0x3e, 0xe3, 0x1a, 0xa1, 0xae, 0x5c, 0x02, 0xe4, 0x89, 0x29, 0x56, 0x4d, 0xc8, 0x13, 0x43, 0x56, 0x72, 0x65, 0xda, 0x4f, 0x2a, 0xb4, 0xb9, 0x7a, 0x6a, 0x93, 0x1c, 0x23, 0x6d, 0x77, 0x19, 0x82, 0x26, 0x2e, 0xc0, 0x5c, 0x9c, 0x5c, 0x2f, 0xeb, 0x19, 0x19, 0x7a, 0x62, 0x3b, 0x0f, 0xa5, 0xde, 0xb6, 0x56, 0x68, 0xb3, 0x06, 0x01, 0x81, 0x1d, 0x89, 0x23, 0xd5, 0xa4, 0xa1, 0xd6, 0xd2, 0x81, 0x0d, 0x0e, 0xcf, 0xb7, 0x5d, 0xe8, 0x57, 0x78, 0xbc, 0x09, 0x5d, 0xd4, 0x0f, 0x91, 0x66, 0xad, 0x4f, 0xc3, 0x0b, 0x37, 0x9d, 0x7d, 0xb5, 0x3d, 0xc5, 0x66, 0x63, 0x49, 0x40, 0xa8, 0x85, 0xcb, 0x4b, 0x74, 0xec, 0x4d, 0xc9, 0xee, 0x0f, 0xc4, 0xf8, 0x73, 0x29, 0xf2, 0x5e, 0xa0, 0x84, 0x95, 0x7f, 0x98, 0x65, 0x9f, 0x20, 0x1d, 0x12, 0x60, 0x9a, 0xec, 0x33, 0xf5, 0x66, 0x33, 0x32, 0xa8, 0x98, 0x7c, 0x91, 0xf5, 0x9f, 0x63, 0xeb, 0xf1, 0x77, 0x1c, 0xc6, 0x0f, 0x15, 0xc7, 0x18, 0xf8, 0x38, 0xe1, 0x87, 0x2b, 0xaf, 0x89, 0x1d, 0xb4, 0xe2, 0x76, 0x35, 0x51, 0x02, 0xf6, 0x4e, 0xd5, 0xd3, 0xda, 0xbe, 0x03, 0x3a, 0x0d, 0xaa, 0xf0, 0xe9, 0x0e, 0x3a, 0xaa, 0x5f, 0x8f, 0x56, 0x2e, 0x08, 0x10, 0x3c, 0x37, 0x81, 0xae, 0xfc, 0xae, 0x21, 0x44, 0x92, 0x88, 0x4f, 0xd8, 0x98, 0xf7, 0x08, 0x1c, 0x37, 0x62, 0xb5, 0xad, 0x4b, 0x03, 0x63, 0x4a, 0x05, 0x65, 0x31, 0xf8, 0xd6, 0x3c, 0x26, 0x6c, 0xf4, 0x26, 0x08, 0xaa, 0xfe, 0x5c, 0xb7, 0x62, 0x73, 0x1e, 0xc8, 0x48, 0xcf, 0x04, 0xb8, 0x16, 0x7c, 0x27, 0x91, 0x45, 0x7a, 0x88, 0xb8, 0x0f, 0xa3, 0x7f, 0x00, 0x4f, 0xf3, 0xc7, 0x09, 0xef, 0x99, 0xae, 0x05, 0x93, 0x6a, 0xd5, 0xd7, 0x2f, 0x94, 0xc8, 0xb5, 0x5a, 0x87, 0x7b, 0xaf, 0x7c, 0x62, 0xe5, 0x85, 0x3a, 0x95, 0x58, 0xeb, 0xf0, 0x77, 0x6b, 0x97, 0x4a, 0xc7, 0xb8, 0xc8, 0x36, 0x0e, 0x8f, 0xf5, 0x61, 0x82, 0xcf, 0x91, 0x4b, 0xd5, 0x76, 0xab, 0xb6, 0x00, 0x92, 0xcd, 0x6c, 0x71, 0x69, 0x7a, 0x10, 0x9d, 0x0b, 0xa8, 0xff, 0x34, 0x4c, 0x7f, 0xab, 0x4e, 0xc2, 0x4f, 0xba, 0x4b, 0xe9, 0xe2, 0xc5, 0x8e, 0x18, 0xa1, 0x8f, 0x91, 0x3e, 0x38, 0x8b, 0x9a, 0xac, 0xe1, 0x4f, 0x67, 0xf7, 0x23, 0xab, 0x4f, 0xa7, 0x47, 0x72, 0xed, 0xfc, 0x90, 0xa0, 0x3a, 0x67, 0x69, 0x7d, 0xea, 0xa5, 0x70, 0x3b, 0x65, 0xc5, 0xb7, 0xa4, 0x30, 0x19, 0x8e, 0x10, 0x70, 0xe3, 0x8a, 0x79, 0xf6, 0xae, 0xa0, 0x51, 0x17, 0xfa, 0xdc, 0x93, 0xe7, 0x38, 0x81, 0xd0, 0xe2, 0xed, 0xf6, 0x23, 0x5e, 0xb4, 0x73, 0x09, 0x89, 0xf7, 0x9e, 0x18, 0x0e, 0x42, 0xdf, 0x74, 0x36, 0x9d, 0x28, 0xd6, 0xea, 0x8f, 0x6a, 0xfa, 0x03, 0x44, 0x1d, 0x0b, 0x70, 0x72, 0xea, 0x2c, 0x50, 0x8f, 0xcb, 0x58, 0x14, 0x7e, 0x3d, 0x4a, 0x2a, 0xbf, 0x1e, 0xf8, 0x94, 0xa8, 0x8b, 0xd9, 0xcd, 0x92, 0x19, 0xe0, 0x01, 0x49, 0xa2, 0x55, 0x4e, 0x28, 0xb0, 0x64, 0xf0, 0x7f, 0x4b, 0x2f, 0x5d, 0x96, 0xa7, 0x40, 0x54, 0x56, 0x1b, 0xe1, 0x13, 0x30, 0xa0, 0x48, 0x2c, 0xb6, 0x30, 0xe9, 0xc8, 0x0b, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0xc3, 0xa9, 0xb9, 0x73, 0x50, 0xe3, 0x6a, 0x08, 0xb4, 0x2e, 0x64, 0x6d, 0x05, 0x30, 0x00, 0x00, 0x00, 0x77, 0x82, 0x23, 0x5c, 0x1a, 0x92, 0xad, 0x54, 0xb4, 0x09, 0xb7, 0x88, 0x9e, 0x52, 0x6e, 0x19, 0xc5, 0xfa, 0xfe, 0x28, 0x20, 0x5a, 0x4d, 0xcf, 0xd3, 0xbc, 0x46, 0xbe, 0x0e, 0x52, 0xef, 0x4d, 0xad, 0x71, 0xdb, 0x51, 0x79, 0x70, 0x29, 0xd9, 0x13, 0x91, 0x58, 0x41, 0x68, 0x62, 0x25, 0x52, 0xf9, 0x8e, 0xc9, 0xca, 0x46, 0x94, 0x70, 0xc4, 0xa4, 0x78, 0xad, 0xc5, 0xd4, 0x07, 0x07, 0x0f, 0xd5, 0x15, 0x7b, 0x4e, 0x8d, 0x13, 0x9f, 0x26, 0x02, 0xb1, 0x1a, 0x95, 0xc9, 0x89, 0xbc, 0x38, 0xbb, 0x3f, 0xb3, 0x41, 0x8e, 0xc9, 0x76, 0x7e, 0x97, 0xeb, 0xb3, 0xcc, 0x4a, 0x3b, 0xf9, 0x97, 0xbc, 0x7e, 0xd3, 0x9e, 0x6e, 0x0c, 0x76, 0x85, 0x6f, 0xff, 0x4a, 0x56, 0x67, 0xe7, 0x51, 0xc0, 0x91, 0xa0, 0xc9, 0xa8, 0xef, 0xe0, 0x98, 0x69, 0x41, 0x6b, 0x86, 0x16, 0x94, 0x2a, 0x37, 0x31, 0xfa, 0x54, 0x7d, 0x73, 0x6f, 0x81, 0xff, 0xdd, 0xc3, 0x8c, 0x89, 0xa6, 0xb7, 0x8f, 0xbf, 0x1d, 0x7c, 0xab, 0x18, 0xef, 0x49, 0x0b, 0xa1, 0x59, 0x42, 0x2d, 0x51, 0xec, 0x36, 0xdd, 0xb9, 0x24, 0x48, 0xee, 0xa4, 0xbb, 0x42, 0xfd, 0x5a, 0x27, 0x41, 0x70, 0xb7, 0xe5, 0x2c, 0xb7, 0x68, 0x62, 0x6c, 0x9c, 0xe0, 0x1c, 0xf0, 0x59, 0x1b, 0xd7, 0x8f, 0x0e, 0xc4, 0x9f, 0x55, 0x23, 0x3c, 0x8d, 0x4d, 0x6a, 0xbe, 0x10, 0xb4, 0xa9, 0x18, 0x9c, 0xd1, 0x23, 0x5f, 0xb8, 0x8f, 0xc0, 0x8e, 0x65, 0xec, 0x2c, 0x39, 0x10, 0x31, 0x0e, 0xb9, 0x5a, 0xad, 0xeb, 0x26, 0x1a, 0x62, 0xc1, 0xd4, 0xa2, 0xdf, 0x09, 0x2b, 0xc6, 0x8b, 0x0c, 0xa3, 0xf8, 0x0f, 0x21, 0xc3, 0x9a, 0x7f, 0x4d, 0xc3, 0xe8, 0xc9, 0xa5, 0x46, 0x67, 0xfc, 0x2d, 0x76, 0x85, 0xa4, 0x8a, 0xa7, 0x49, 0xed, 0xf8, 0x45, 0xb4, 0xab, 0xbe, 0x48, 0xff, 0xe1, 0x4c, 0x25, 0x0a, 0x2d, 0x85, 0x8b, 0x75, 0x1a, 0x7e, 0x21, 0xf6, 0xf5, 0x91, 0x12, 0xae, 0xc9, 0x9c, 0x27, 0x4e, 0x8f, 0x29, 0xd7, 0x01, 0xa1, 0x3c, 0x32, 0xf4, 0xda, 0xf7, 0x25, 0x24, 0xfa, 0xfb, 0x9c, 0xa5, 0x96, 0xd2, 0x99, 0x9c, 0xcf, 0xba, 0x12, 0x40, 0x93, 0x9b, 0xf3, 0x40, 0xf6, 0x86, 0xaf, 0xcd, 0xe7, 0x53, 0xa4, 0x7d, 0x02, 0xeb, 0x91, 0x1b, 0x8c, 0xbc, 0xe4, 0xfb, 0x7e, 0x3e, 0x40, 0x14, 0x0d, 0xe2, 0x79, 0x97, 0x18, 0x1c, 0x7d, 0x58, 0x9d, 0xe2, 0x9e, 0x83, 0x81, 0xf7, 0x23, 0x68, 0xae, 0xcd, 0x2f, 0x1f, 0x54, 0x8e, 0xbb, 0x4a, 0x41, 0xc9, 0x19, 0xfd, 0x93, 0xe9, 0x65, 0x4f, 0x2d, 0xaa, 0x1e, 0x04, 0x67, 0x99, 0xfa, 0xe4, 0x58, 0xe2, 0x03, 0x9d, 0xd0, 0x76, 0x2b, 0x69, 0x15, 0x23, 0x19, 0x13, 0x8d, 0xa5, 0x61, 0x08, 0x3b, 0x91, 0xe5, 0x64, 0xd1, 0xa8, 0xb7, 0xfb, 0xa5, 0xc6, 0xac, 0xd8, 0x2a, 0xf1, 0xbb, 0xb2, 0x40, 0x5a, 0x40, 0xab, 0x57, 0xcb, 0x96, 0x55, 0x41, 0x04, 0x90, 0x1f, 0x40, 0xe8, 0xc6, 0x05, 0xd0, 0x78, 0x16, 0x81, 0x6b, 0xe3, 0xbb, 0x8a, 0xc8, 0xd4, 0x61, 0x7b, 0x16, 0xef, 0x09, 0xf5, 0x38, 0x2f, 0xf4, 0xa0, 0x6f, 0x4d, 0x0b, 0x04, 0x47, 0xdd, 0xf9, 0x7f, 0x24, 0x6a, 0x21, 0x18, 0x2f, 0xcf, 0xc9, 0xba, 0x22, 0x11, 0xdb, 0x45, 0xbd, 0xe3, 0x20, 0x48, 0xac, 0xa2, 0x83, 0x5c, 0xa4, 0xbd, 0xb7, 0xc3, 0x08, 0xd0, 0x90, 0xb1, 0x6e, 0xce, 0x1c, 0x7f, 0xc1, 0xff, 0xed, 0x5d, 0xbd, 0x38, 0x26, 0x39, 0x97, 0x22, 0x26, 0xf4, 0x71, 0x80, 0xd6, 0xae, 0xf3, 0x17, 0x98, 0x30, 0x36, 0xf8, 0x53, 0xf3, 0x66, 0x93, 0xf3, 0x7c, 0x3d, 0x4b, 0x6d, 0x8b, 0xb0, 0xa1, 0x52, 0xb5, 0x33, 0x4f, 0x71, 0x93, 0xfa, 0x11, 0xd2, 0xb1, 0x70, 0x92, 0x20, 0x19, 0x83, 0x8f, 0xb5, 0xc0, 0xa0, 0x94, 0x5c, 0xcf, 0x85, 0xcd, 0x46, 0xef, 0x79, 0xb9, 0xd1, 0xdf, 0xaa, 0x87, 0x71, 0x8e, 0x8c, 0x0b, 0x50, 0x0f, 0x8f, 0x1d, 0x78, 0x1f, 0x89, 0x44, 0x37, 0x67, 0xe1, 0x9d, 0xb5, 0x88, 0xee, 0x07, 0xe6, 0x59, 0x87, 0xcf, 0x49, 0xce, 0xab, 0x3f, 0x59, 0x83, 0x4e, 0xe1, 0x49, 0x97, 0x05, 0x67, 0x03, 0xff, 0x1e, 0x4a, 0x00, 0xcc, 0x1d, 0x3c, 0x6f, 0x14, 0x70, 0xa7, 0x1d, 0xc0, 0x0c, 0x02, 0x49, 0x62, 0xb6, 0x18, 0xaf, 0x08, 0xb4, 0xf7, 0xe8, 0xfe, 0x1c, 0x1c, 0x07, 0x1e, 0x13, 0x4d, 0xbd, 0x5d, 0x98, 0x02, 0x31, 0xb0, 0x88, 0x69, 0x14, 0x0e, 0x75, 0xa0, 0xc0, 0xb8, 0x0e, 0xe2, 0xe7, 0x43, 0x43, 0x80, 0x9b, 0x3a, 0x6e, 0xde, 0x33, 0xd7, 0xca, 0xba, 0x6e, 0x11, 0x56, 0x87, 0x71, 0x86, 0xa6, 0xf4, 0xf7, 0x43, 0xfe, 0x88, 0x76, 0xed, 0x65, 0x62, 0x2c, 0xc0, 0x93, 0xe5, 0x67, 0xf9, 0x03, 0xf3, 0x47, 0x14, 0xa3, 0xd6, 0xe5, 0x3e, 0x4d, 0xc4, 0x17, 0x4f, 0x20, 0xaf, 0x3e, 0x4a, 0x40, 0x4c, 0x1b, 0x77, 0x5b, 0x02, 0xac, 0x9e, 0xd6, 0x95, 0xf0, 0xf7, 0x49, 0xc8, 0x6e, 0x9b, 0x6d, 0x0f, 0x30, 0x48, 0x8a, 0x56, 0xcd, 0xd1, 0x73, 0x04, 0x97, 0x5a, 0x89, 0x17, 0x80, 0x0f, 0x60, 0x1a, 0x34, 0x77, 0x83, 0x57, 0x95, 0xda, 0x35, 0xda, 0x69, 0xef, 0xb8, 0x01, 0x31, 0x47, 0x4f, 0x19, 0x6f, 0x46, 0x0c, 0x3b, 0x8c, 0xe1, 0xb0, 0x47, 0x38, 0xe8, 0x72, 0x7d, 0x87, 0x14, 0x48, 0x46, 0x39, 0x35, 0x22, 0xc5, 0x53, 0x3f, 0x4e, 0x98, 0x81, 0xb5, 0x0c, 0x29, 0x5e, 0x0e, 0x28, 0x4e, 0xe1, 0x33, 0xb1, 0x8d, 0x22, 0x65, 0x24, 0x38, 0x2d, 0xac, 0xdf, 0xbc, 0x76, 0x67, 0xfe, 0x91, 0xae, 0x6f, 0x45, 0x1c, 0xce, 0xa8, 0xdc, 0xde, 0x96, 0x53, 0x49, 0xf9, 0x2b, 0x1a, 0xf9, 0x89, 0xe3, 0xff, 0xcc, 0x83, 0xbf, 0x09, 0xa5, 0x88, 0x26, 0xb4, 0x96, 0xd5, 0x1f, 0x12, 0x26, 0x5a, 0x5a, 0xd3, 0x82, 0xf1, 0xe0, 0xe3, 0x97, 0xf7, 0xc7, 0x5c, 0x1f, 0x80, 0x8b, 0x8e, 0x03, 0x7c, 0x51, 0x15, 0x10, 0x79, 0x36, 0x84, 0x3e, 0x58, 0xc7, 0xb5, 0x37, 0xa9, 0x8d, 0xb3, 0x1a, 0x32, 0xac, 0xc4, 0x49, 0xe1, 0xaa, 0xec, 0xd2, 0xe5, 0x8d, 0x26, 0x5b, 0x07, 0x4a, 0xb0, 0x09, 0xb8, 0x7a, 0x1b, 0x0e, 0xaf, 0x4f, 0x41, 0x4f, 0x8f, 0xf8, 0x70, 0x77, 0x36, 0x0c, 0x4f, 0x8c, 0xeb, 0xda, 0x67, 0x6a, 0xa8, 0x31, 0x01, 0x00, 0x08, 0x31, 0x72, 0x9b, 0xde, 0x2b, 0x4b, 0x2d, 0xad, 0x3c, 0x53, 0x55, 0x12, 0xb8, 0x24, 0xd8, 0xb4, 0xc1, 0xed, 0xad, 0x56, 0x5e, 0x93, 0x69, 0x3e, 0xf3, 0x4d, 0xf6, 0x60, 0xa0, 0x8e, 0x3f, 0xb7, 0x43, 0x30, 0x2a, 0xbd, 0x80, 0xf4, 0x5d, 0x2d, 0xb6, 0xa2, 0xab, 0x10, 0x06, 0xd5, 0xa7, 0xac, 0xb0, 0x7e, 0x41, 0xb9, 0x4b, 0xa5, 0x94, 0x5f, 0x90, 0xa1, 0x08, 0xd6, 0x38, 0x0a, 0x2d, 0xf9, 0xed, 0xa0, 0x94, 0x7f, 0xbe, 0xd4, 0xce, 0x04, 0xaf, 0xfa, 0xdb, 0x91, 0xb0, 0xc0, 0xa9, 0xf0, 0x6f, 0x30, 0x10, 0xab, 0x6c, 0xed, 0xa5, 0x50, 0x26, 0x12, 0x1f, 0x53, 0x0c, 0xc0, 0x0c, 0x29, 0x40, 0x4b, 0xff, 0x7e, 0x26, 0x42, 0x62, 0xfb, 0xe8, 0x9c, 0xf2, 0x27, 0xbb, 0xf8, 0xf3, 0xb2, 0x93, 0x37, 0x02, 0x32, 0x88, 0x24, 0x3d, 0x5f, 0x8a, 0x04, 0x8d, 0x9b, 0x08, 0x53, 0x3e, 0x30, 0xba, 0x32, 0x25, 0x0a, 0x3f, 0x81, 0x1e, 0xf2, 0x16, 0x74, 0xf0, 0x37, 0x4d, 0x69, 0x49, 0x87, 0xa0, 0x77, 0xb5, 0x87, 0xbf, 0x5d, 0x72, 0x7b, 0xf0, 0x61, 0x73, 0xa8, 0xb3, 0x18, 0x09, 0xce, 0x29, 0x78, 0x8e, 0x48, 0xdf, 0x2a, 0xd7, 0x23, 0xa9, 0xaf, 0x46, 0x43, 0xbb, 0x9b, 0xdb, 0x06, 0x2d, 0xaf, 0x6a, 0x16, 0x15, 0x74, 0x24, 0xe5, 0xa6, 0xc8, 0x39, 0x47, 0xb3, 0x43, 0x62, 0xc9, 0xdb, 0x75, 0xc1, 0x06, 0xad, 0xee, 0x08, 0x47, 0xf5, 0x77, 0xae, 0x3d, 0x50, 0x96, 0x4f, 0x24, 0x20, 0x6b, 0x52, 0x03, 0x80, 0x72, 0x2b, 0xed, 0xdc, 0x9f, 0x24, 0xda, 0xe2, 0xba, 0x81, 0x87, 0xa9, 0x7d, 0xfc, 0x06, 0xd4, 0x23, 0xb5, 0x0a, 0x52, 0x94, 0xc7, 0x63, 0xe7, 0x51, 0xad, 0x1e, 0xac, 0xa6, 0xbe, 0x8f, 0xd2, 0x9d, 0xe5, 0xb8, 0xa3, 0xdf, 0x99, 0x7a, 0xe7, 0x5e, 0x06, 0x38, 0x70, 0x5b, 0x4d, 0x27, 0x03, 0x2c, 0xa8, 0x0a, 0x3f, 0x93, 0xbb, 0x38, 0x7e, 0xae, 0xab, 0x9a, 0x7b, 0xd2, 0xc9, 0x8b, 0x53, 0xee, 0xcb, 0x80, 0x6f, 0x1d, 0x83, 0xdd, 0x81, 0xb8, 0xa0, 0xb9, 0xb6, 0xdc, 0x5e, 0xf1, 0x6b, 0x54, 0x0d, 0x32, 0xd7, 0xb0, 0xd5, 0x2b, 0xa2, 0xe5, 0xf7, 0x18, 0xa5, 0x28, 0x54, 0xb6, 0x7c, 0xea, 0x47, 0x8c, 0x7a, 0xb5, 0xce, 0x9d, 0x0f, 0xd8, 0x89, 0xfa, 0xd7, 0x21, 0xd8, 0x4b, 0x14, 0x5a, 0x86, 0x32, 0xd1, 0x40, 0x21, 0x75, 0x4b, 0xbf, 0x1c, 0x66, 0x54, 0x84, 0xb2, 0x1f, 0xd4, 0x32, 0x06, 0x7a, 0x52, 0x1f, 0x7d, 0xd8, 0x59, 0x99, 0x86, 0xb9, 0x6c, 0x26, 0xec, 0x5e, 0x74, 0x38, 0x5d, 0xb9, 0x38, 0xdd, 0xf6, 0x9c, 0x28, 0xbe, 0xb6, 0x87, 0xb7, 0xaf, 0x5b, 0x47, 0x7a, 0xbb, 0x79, 0x55, 0x53, 0x9c, 0xc1, 0x74, 0x73, 0x01, 0xde, 0xdf, 0xae, 0x0f, 0x63, 0xb2, 0xab, 0xc6, 0x01, 0x63, 0xea, 0xf2, 0xb5, 0x9a, 0x57, 0x2b, 0x62, 0x8b, 0x35, 0x21, 0x4d, 0xbc, 0x06, 0xb8, 0x7c, 0x31, 0x98, 0xc4, 0xbb, 0xd5, 0x83, 0x45, 0xd8, 0xc3, 0xa9, 0x2b, 0xab, 0x3e, 0x10, 0xfc, 0x60, 0x63, 0x6f, 0xbb, 0xbf, 0x90, 0x54, 0xe8, 0x63, 0x3f, 0x78, 0xf8, 0x8b, 0xa2, 0xa0, 0x75, 0x26, 0x21, 0x8d, 0xa4, 0xb2, 0xde, 0xa8, 0xaf, 0xb3, 0x3b, 0x65, 0x90, 0xac, 0xba, 0xad, 0x37, 0xac, 0xaf, 0x6a, 0xc1, 0x0a, 0x36, 0x5d, 0x95, 0x86, 0x13, 0x15, 0xbc, 0xf9, 0x7b, 0xc6, 0x62, 0x27, 0x88, 0xdb, 0x50, 0x16, 0x1a, 0x16, 0xe0, 0x5c, 0x3c, 0x0a, 0xf7, 0x5c, 0x69, 0xb8, 0xfe, 0x2a, 0x3c, 0x54, 0x3c, 0x57, 0x7e, 0xb5, 0xbb, 0x30, 0x32, 0x23, 0x59, 0x98, 0x0f, 0x83, 0x81, 0x3c, 0x2c, 0xaa, 0xdf, 0x28, 0xf3, 0xa0, 0x97, 0x28, 0xee, 0xad, 0x9a, 0xb5, 0x22, 0x2a, 0x43, 0x99, 0x51, 0x08, 0x82, 0x04, 0x9d, 0x9f, 0x56, 0x77, 0xfd, 0x8f, 0xaa, 0xb9, 0x17, 0xfb, 0xd0, 0x3b, 0x20, 0xc6, 0x31, 0xf4, 0x4f, 0x8b, 0x5d, 0x4b, 0x7c, 0x5e, 0x87, 0x9b, 0x75, 0x21, 0x31, 0x98, 0x05, 0xa8, 0x4c, 0xac, 0xde, 0x2b, 0x10, 0x4a, 0xc9, 0x79, 0x75, 0xd2, 0xb1, 0xf4, 0x23, 0x10, 0x80, 0x99, 0x52, 0xa6, 0x9c, 0xcb, 0x70, 0x75, 0xa2, 0x7a, 0x8b, 0x12, 0x50, 0xa4, 0x2c, 0x00, 0xe0, 0x86, 0x39, 0xda, 0x57, 0x10, 0x80, 0xe6, 0x4a, 0xc7, 0x0a, 0x9e, 0x40, 0x53, 0x22, 0xf3, 0xca, 0x19, 0x7c, 0xa2, 0xb2, 0xab, 0xa8, 0x2c, 0x32, 0xd5, 0x5e, 0xce, 0x54, 0x67, 0x02, 0x66, 0xe1, 0x00, 0x01, 0x60, 0xf8, 0xa5, 0x58, 0xd9, 0x44, 0x9d, 0xa2, 0x26, 0x2b, 0xd0, 0x9c, 0x99, 0xf3, 0x0c, 0x33, 0x57, 0xc0, 0xcf, 0x83, 0x02, 0xdb, 0x8f, 0x06, 0xa9, 0x12, 0x4b, 0xa9, 0x35, 0x00, 0x14, 0xab, 0xd5, 0x9f, 0x66, 0x4c, 0x57, 0xb8, 0xfc, 0xa9, 0x47, 0xb4, 0xae, 0xd3, 0xaa, 0xc8, 0x39, 0x70, 0x82, 0x93, 0x7d, 0xfb, 0xa3, 0x67, 0x33, 0x44, 0x2b, 0xf1, 0x09, 0xa7, 0x24, 0x5a, 0x66, 0x64, 0x72, 0xa3, 0xb8, 0x29, 0x65, 0xfc, 0xbe, 0xfa, 0xc9, 0x6b, 0x8e, 0x3d, 0xcf, 0x0f, 0x6f, 0x75, 0x30, 0xcf, 0xa7, 0x92, 0x7c, 0x5a, 0xcd, 0x0f, 0xd1, 0xcb, 0xa2, 0x9f, 0x75, 0xb9, 0x59, 0x67, 0x54, 0x24, 0xc0, 0xc1, 0x64, 0x14, 0xfa, 0xee, 0x14, 0xb8, 0x80, 0x56, 0x66, 0x18, 0xc3, 0xb4, 0xd2, 0x74, 0x83, 0x28, 0x8d, 0xe8, 0x1a, 0xb7, 0x5f, 0x6a, 0xb6, 0x9e, 0x2e, 0x27, 0xdd, 0xa1, 0xfb, 0xac, 0xeb, 0x9a, 0x76, 0xc3, 0x61, 0xf2, 0x2b, 0x70, 0x26, 0xf5, 0x35, 0x6b, 0x68, 0x12, 0x20, 0x1c, 0xa5, 0x6b, 0x51, 0x8a, 0xcc, 0xb4, 0xf8, 0x33, 0xbf, 0x00, 0x01, 0x46, 0x2d, 0x31, 0xc3, 0xd5, 0x98, 0x8f, 0xc5, 0x05, 0x39, 0x77, 0xde, 0x18, 0x8d, 0x0b, 0x77, 0x5a, 0x6a, 0x68, 0xe0, 0x27, 0x99, 0xdd, 0x6f, 0x79, 0x2c, 0xcb, 0x00, 0x9b, 0x1b, 0xf3, 0xf5, 0x76, 0x7b, 0x7c, 0xc2, 0xea, 0xb9, 0x60, 0xcc, 0x03, 0xbb, 0x9c, 0xa7, 0xc6, 0xad, 0x78, 0x26, 0xac, 0xa8, 0xfb, 0xdf, 0xaa, 0x1e, 0xab, 0x6f, 0x6c, 0xe3, 0xd6, 0x8f, 0x94, 0x5c, 0x30, 0x82, 0xba, 0xc9, 0xe5, 0xd2, 0x80, 0xe1, 0x30, 0xb4, 0x30, 0x24, 0xae, 0xb4, 0x6b, 0xcd, 0xf7, 0x17, 0x68, 0x65, 0x26, 0x0c, 0xa2, 0x8b, 0x9d, 0x7c, 0x03, 0xf2, 0xcd, 0xec, 0xee }; +constexpr AccessUnit AC3_BEGIN_OF_AU_SPLIT_EXPECTED_AU = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xa6, 0x64, 0x73, 0xed, 0x20, 0xed, 0x51, 0x95, 0x8a, 0xc7, 0xee, 0xd3, 0x6f, 0x52, 0x8c, 0x0b, 0xcd, 0xe2, 0x4f, 0x51 } }; + + +const std::vector ATRACX_SIZE_MISMATCH_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0x00, 0xbf, 0xa6, 0x85, 0x42, 0x98, 0xc5, 0x19, 0x4a, 0xdc, 0xcf, 0x38, 0x32, 0x5d, 0x7d, 0x6f, 0x99, 0xb2, 0x66, 0x6a, 0x9c, 0xe6, 0x6d, 0xaa, 0x5a, 0xbc, 0xcb, 0x31, 0x5c, 0xc9, 0x53, 0x87, 0x6c, 0x69, 0x2d, 0x3e, 0x35, 0xe6, 0xba, 0x7b, 0x05, 0x66, 0xfe, 0xea, 0xfe, 0x76, 0x9e, 0x0e, 0x53, 0xfe, 0xdc, 0x52, 0x31, 0x7a, 0xea, 0x93, 0xab, 0x90, 0xba, 0x50, 0x17, 0xc9, 0xe8, 0xa4, 0xdc, 0x3a, 0x10, 0xdc, 0x91, 0xed, 0x0d, 0x95, 0xdd, 0x15, 0x21, 0x8e, 0xf3, 0xd3, 0xfc, 0x6b, 0xb5, 0xc6, 0xac, 0x63, 0x72, 0x78, 0x72, 0xfe, 0x04, 0xc3, 0x55, 0xa3, 0x65, 0x7e, 0x50, 0x83, 0xfe, 0x92, 0xdd, 0x47, 0xa0, 0x5b, 0x10, 0x8f, 0xb6, 0x30, 0xb6, 0xac, 0x5e, 0x9a, 0x0b, 0xb0, 0xea, 0x43, 0xcf, 0x4c, 0xc5, 0x64, 0xe1, 0x14, 0x58, 0x5e, 0x4a, 0x4b, 0xc5, 0x14, 0xf0, 0xe7, 0xbc, 0xeb, 0x10, 0xc5, 0xf1, 0x98, 0x25, 0xab, 0x77, 0x04, 0xb2, 0xaf, 0x2c, 0xa1, 0x7e, 0x3f, 0x59, 0x9d, 0x6d, 0xc0, 0x64, 0xea, 0x1d, 0x98, 0x8f, 0x00, 0xfd, 0xc5, 0x8e, 0x57, 0x38, 0x71, 0x64, 0x9f, 0xd7, 0x57, 0x7d, 0xc4, 0x6c, 0x0f, 0x15, 0x8d, 0x84, 0xaa, 0xf3, 0xef, 0xd2, 0x66, 0x5b, 0xc4, 0xf0, 0xcf, 0x6b, 0x89, 0xd5, 0x9b, 0x55, 0x87, 0x5d, 0x63, 0xf6, 0x24, 0x17, 0x28, 0x33, 0xb8, 0xcd, 0x78, 0x9f, 0x2c, 0x00, 0x91, 0xe1, 0x79, 0x45, 0xe6, 0x8b, 0x3e, 0xab, 0xf5, 0xc4, 0x98, 0x00, 0xb7, 0xc7, 0x2a, 0x34, 0x47, 0xd6, 0xd3, 0x29, 0xd2, 0x2b, 0x4c, 0x3f, 0x6e, 0x06, 0x43, 0x60, 0x60, 0x69, 0xf1, 0x1b, 0xd4, 0x3f, 0xb8, 0x47, 0x7f, 0x2f, 0xc9, 0x4b, 0x23, 0xdd, 0x83, 0x6e, 0x4f, 0x69, 0x21, 0xc4, 0x48, 0x98, 0x53, 0x81, 0xd9, 0xfa, 0xba, 0xb6, 0xf9, 0x38, 0x64, 0x27, 0x24, 0xc9, 0xcb, 0x5f, 0xd8, 0x4f, 0x97, 0x06, 0x8e, 0xce, 0xa2, 0x88, 0xe2, 0x8b, 0x4c, 0xb6, 0x76, 0x49, 0xf6, 0x0c, 0x2a, 0xab, 0x06, 0x59, 0xde, 0x51, 0x73, 0xd6, 0x33, 0xe7, 0x4a, 0x85, 0x4a, 0x46, 0x83, 0x4e, 0xe4, 0x73, 0x19, 0xc4, 0x6d, 0x3c, 0xea, 0x36, 0xb8, 0xdb, 0x0d, 0xc7, 0x67, 0xe3, 0x72, 0x52, 0x08, 0x9d, 0x88, 0xd4, 0xb2, 0xec, 0x24, 0x0b, 0x9f, 0x2a, 0x9c, 0x34, 0xf2, 0x20, 0x6d, 0x7a, 0xbd, 0x2e, 0x9c, 0x22, 0x52, 0x34, 0xc6, 0xa6, 0x7a, 0x88, 0x76, 0xe4, 0x7a, 0x6d, 0x23, 0xba, 0xd7, 0x12, 0x3f, 0xf3, 0x31, 0x8b, 0x6d, 0xd8, 0xdc, 0x23, 0xf1, 0x21, 0x45, 0xdb, 0x2b, 0x92, 0x3f, 0x52, 0xbc, 0xf6, 0x1f, 0x57, 0x91, 0x5c, 0xef, 0xde, 0x64, 0x60, 0xcb, 0xfc, 0x27, 0x54, 0x9b, 0xf3, 0x94, 0x6a, 0x88, 0xed, 0x7c, 0xaf, 0x0c, 0x01, 0xc6, 0xb6, 0xe1, 0x98, 0x61, 0xbd, 0x17, 0xd8, 0x41, 0xc3, 0x89, 0x81, 0x55, 0x01, 0x80, 0xb7, 0x39, 0x0e, 0x18, 0x46, 0xea, 0xdb, 0x41, 0x59, 0xc0, 0x89, 0x11, 0x49, 0x99, 0x37, 0xcb, 0x1f, 0xe5, 0x21, 0xbf, 0xa0, 0x4d, 0xf9, 0x48, 0x8d, 0xef, 0xb3, 0x48, 0x90, 0xa5, 0xa1, 0x6a, 0xd6, 0x2b, 0xf2, 0x7e, 0x55, 0x34, 0xa9, 0xe6, 0x44, 0x8d, 0x26, 0xf3, 0x4c, 0xe4, 0x2c, 0xe5, 0x95, 0xc4, 0x63, 0x1c, 0x8d, 0x44, 0x81, 0x6a, 0x11, 0x16, 0xa9, 0xe3, 0x26, 0x49, 0xe3, 0x24, 0x04, 0x5d, 0x2d, 0xe0, 0x50, 0xfd, 0x47, 0x4c, 0x47, 0xfa, 0x8a, 0xa8, 0xf5, 0x82, 0x45, 0xff, 0x13, 0xda, 0x71, 0x93, 0x3b, 0x1c, 0xcc, 0x04, 0x75, 0x17, 0x2f, 0x2e, 0x5d, 0x0f, 0xdd, 0x33, 0xfa, 0x9c, 0xfa, 0x50, 0x9e, 0xa8, 0x29, 0x84, 0xee, 0x9c, 0xb2, 0xb2, 0xc4, 0xa9, 0xc0, 0x85, 0xb1, 0x42, 0x54, 0x4c, 0xd2, 0x62, 0x0d, 0xa4, 0xdf, 0xb3, 0xb7, 0x70, 0xe4, 0x9e, 0x8e, 0xa1, 0x9d, 0x4c, 0x1d, 0xdd, 0xc5, 0xfa, 0x8e, 0x67, 0x06, 0x17, 0x7d, 0xc6, 0xef, 0xb4, 0x5c, 0x1b, 0xac, 0xfd, 0xf7, 0x89, 0x36, 0xd0, 0x45, 0xf5, 0x95, 0xaa, 0xad, 0x23, 0x61, 0x4f, 0xd5, 0xdb, 0x52, 0x83, 0xa0, 0xb3, 0xba, 0xd1, 0x66, 0x0d, 0xe0, 0xa2, 0xb9, 0xd6, 0x73, 0xfa, 0xed, 0xe6, 0x96, 0xaf, 0x8b, 0x27, 0xf9, 0xe9, 0x24, 0xcb, 0x18, 0xc2, 0xa3, 0x41, 0x70, 0x89, 0xe9, 0x99, 0xb4, 0x58, 0x53, 0x80, 0x79, 0x55, 0x60, 0x88, 0x1e, 0xd7, 0x5d, 0x06, 0x5d, 0x67, 0x16, 0x48, 0xef, 0x25, 0xff, 0x76, 0x1d, 0x76, 0x94, 0x73, 0xf4, 0x48, 0xcd, 0x88, 0x58, 0xda, 0x46, 0x26, 0xf2, 0x0a, 0x0e, 0xc5, 0x59, 0x1c, 0xc4, 0xbd, 0xae, 0x00, 0x90, 0xe2, 0xed, 0xc8, 0xe7, 0xc4, 0x36, 0x5c, 0x5f, 0x1a, 0x72, 0xce, 0xbe, 0x7f, 0x9a, 0x25, 0xf1, 0x7d, 0x62, 0x78, 0x21, 0xe9, 0x8a, 0xca, 0x6f, 0x08, 0x91, 0x26, 0x9c, 0xa8, 0xeb, 0xf4, 0x56, 0xc9, 0x4d, 0x04, 0xaa, 0x36, 0x05, 0x4f, 0x67, 0x03, 0xf0, 0x7d, 0xd5, 0x60, 0x19, 0xd9, 0x5d, 0xf7, 0x05, 0xa1, 0x7c, 0xe9, 0xa2, 0x5b, 0xc7, 0x9b, 0x8e, 0x3d, 0xae, 0xc5, 0x89, 0x06, 0x4a, 0x4e, 0x66, 0x7d, 0x22, 0xbc, 0x98, 0x54, 0x7e, 0x95, 0xa5, 0x6d, 0xce, 0x09, 0xbc, 0x8e, 0x59, 0xda, 0x34, 0x7d, 0x9e, 0x83, 0x99, 0xf6, 0x0b, 0xa3, 0x69, 0xc3, 0xf1, 0xc7, 0x50, 0x1a, 0xde, 0xe3, 0xe3, 0x85, 0xf2, 0xc5, 0x7f, 0x01, 0x96, 0xb9, 0x68, 0x83, 0xd8, 0xb6, 0x62, 0x12, 0x52, 0x09, 0xf0, 0xf6, 0x73, 0xad, 0xe4, 0x40, 0xaa, 0x21, 0x7b, 0x5c, 0xf7, 0x1a, 0x39, 0x7d, 0x41, 0xed, 0x9b, 0x42, 0x3a, 0x48, 0xa9, 0xac, 0x5c, 0x16, 0x9c, 0x52, 0x7b, 0xcb, 0x5b, 0x48, 0xf0, 0x3c, 0x30, 0xeb, 0xae, 0x9e, 0xc0, 0xc9, 0xa7, 0xb7, 0x18, 0x84, 0x4e, 0x55, 0x44, 0xe1, 0xf1, 0x2b, 0x80, 0xfd, 0x4f, 0x63, 0xa7, 0x57, 0x35, 0x39, 0xba, 0xaa, 0xb4, 0xc7, 0x22, 0x08, 0xed, 0x0e, 0x2a, 0x24, 0x83, 0x62, 0xc9, 0x59, 0x19, 0xec, 0xa5, 0xb7, 0x36, 0xff, 0x10, 0xe9, 0x67, 0x82, 0x27, 0x38, 0xdc, 0x66, 0x66, 0x4f, 0xb9, 0x03, 0xb3, 0xd8, 0x6f, 0xc4, 0x7f, 0x61, 0xac, 0x72, 0x29, 0x71, 0x4b, 0x49, 0x99, 0xbc, 0x01, 0x6c, 0x30, 0x78, 0x94, 0x06, 0x7d, 0xd6, 0x75, 0xbb, 0xa4, 0x1b, 0x4a, 0xc9, 0xd4, 0x6c, 0x41, 0x65, 0xac, 0x7f, 0x47, 0xf6, 0x59, 0x75, 0xda, 0xfe, 0x0c, 0xf6, 0xa9, 0xb2, 0xf3, 0xfb, 0xac, 0xdd, 0x77, 0x02, 0x3b, 0x28, 0xd4, 0x0b, 0xa1, 0x1e, 0x2c, 0xef, 0xf9, 0x0d, 0x5b, 0x31, 0x8c, 0xeb, 0xbe, 0x07, 0x19, 0x2b, 0x67, 0xb1, 0x78, 0xe9, 0x0e, 0x08, 0x20, 0x51, 0xf1, 0xc2, 0x55, 0xa1, 0x33, 0xfe, 0x28, 0xc2, 0x75, 0xc0, 0xeb, 0x41, 0x0b, 0xaa, 0x98, 0x98, 0x92, 0x1d, 0xd6, 0xbf, 0xbd, 0xa9, 0x9e, 0xc8, 0x34, 0xd8, 0xeb, 0x3b, 0x9a, 0x65, 0x8f, 0x5f, 0xdd, 0x0d, 0x8b, 0xc5, 0x77, 0x31, 0x1b, 0x04, 0x42, 0x97, 0x16, 0x96, 0x89, 0x39, 0xac, 0xc3, 0x06, 0xe8, 0x9d, 0x36, 0x83, 0xf9, 0x8d, 0x71, 0x83, 0xe2, 0x5c, 0x0e, 0xc1, 0xc0, 0x12, 0x21, 0x0e, 0xae, 0x40, 0x67, 0xbd, 0x0c, 0xe0, 0xf6, 0x8b, 0x18, 0x77, 0x1a, 0x19, 0x8f, 0x1b, 0x9f, 0x6e, 0x5b, 0xfa, 0xf7, 0xf5, 0x93, 0xaf, 0xe6, 0xd2, 0x80, 0x4d, 0x11, 0x33, 0xc6, 0xff, 0x0c, 0x1b, 0x92, 0x99, 0x2e, 0xc3, 0x33, 0xc1, 0x89, 0x51, 0x36, 0x35, 0xda, 0x52, 0x60, 0x7c, 0x94, 0x33, 0xff, 0xd8, 0x46, 0x70, 0xd5, 0x6d, 0x0f, 0x17, 0x42, 0x20, 0x50, 0xc7, 0xb6, 0xa4, 0xa9, 0x35, 0x91, 0x8b, 0x4c, 0xdf, 0xe4, 0xd1, 0x5d, 0xfc, 0x45, 0x27, 0x5a, 0x66, 0x99, 0x63, 0xa2, 0x6b, 0x01, 0x84, 0x7a, 0x28, 0x34, 0x74, 0x29, 0xa6, 0x1e, 0xbf, 0x47, 0x3a, 0x90, 0x93, 0x62, 0xc1, 0xf1, 0xbc, 0xd3, 0x8b, 0x16, 0x45, 0xd5, 0xd0, 0xf9, 0xab, 0x58, 0x75, 0x0e, 0xa2, 0x10, 0xfe, 0xa3, 0xcc, 0x56, 0x8b, 0x2a, 0x9d, 0x62, 0x9e, 0x80, 0x68, 0xd4, 0x35, 0xd8, 0xd5, 0x0d, 0x73, 0x2b, 0xac, 0x90, 0x0c, 0xbe, 0xd3, 0x36, 0xd7, 0x0b, 0xfc, 0x10, 0x0e, 0x3d, 0x49, 0x7b, 0xa8, 0x64, 0xad, 0xa5, 0x2f, 0x04, 0x8d, 0x9d, 0x42, 0xee, 0x7e, 0x24, 0xb6, 0xd8, 0x8a, 0x47, 0x23, 0x87, 0xf9, 0xee, 0x6d, 0x39, 0x5c, 0x4a, 0x7e, 0xdc, 0xfa, 0x03, 0x5f, 0xe9, 0x18, 0xbe, 0x0b, 0x12, 0x10, 0x64, 0xae, 0x5a, 0x17, 0x20, 0x41, 0xaf, 0x82, 0xb1, 0x6c, 0x14, 0xa8, 0x9b, 0x1e, 0x43, 0x7c, 0x45, 0x24, 0xe0, 0x81, 0xf5, 0x13, 0xe0, 0x92, 0xc1, 0x77, 0xb2, 0x7c, 0xd6, 0x54, 0xad, 0x8f, 0x69, 0x32, 0xcf, 0x87, 0x8e, 0x72, 0xa5, 0xac, 0x8c, 0x89, 0xec, 0x22, 0x99, 0x84, 0x08, 0x70, 0x9e, 0xcb, 0x48, 0x0d, 0xe3, 0x2e, 0x06, 0x16, 0xe3, 0x4a, 0x08, 0x24, 0xf7, 0xfb, 0xda, 0x91, 0x7b, 0xd5, 0x95, 0xf0, 0x8a, 0x2f, 0x23, 0x40, 0xaf, 0x64, 0x7b, 0xab, 0x46, 0x41, 0x49, 0x01, 0xd1, 0xd3, 0x08, 0xf9, 0x07, 0x69, 0x4d, 0x78, 0x69, 0xbf, 0x4c, 0x6c, 0x12, 0x7c, 0xb1, 0xc2, 0xaf, 0x7c, 0x23, 0x30, 0x29, 0x70, 0xc4, 0x79, 0xcc, 0x97, 0xe1, 0x23, 0x01, 0xeb, 0x02, 0xe8, 0x01, 0x53, 0xbb, 0x37, 0x3b, 0xf5, 0x46, 0x9e, 0x00, 0xba, 0xf6, 0x5d, 0xae, 0xeb, 0x02, 0xae, 0xf6, 0x45, 0x22, 0x00, 0xac, 0x7a, 0x3b, 0x53, 0xbd, 0x6a, 0x6c, 0x59, 0xd5, 0x24, 0x4a, 0xb3, 0x41, 0xf1, 0x27, 0x0f, 0x5e, 0x12, 0x33, 0x91, 0xad, 0xc8, 0xac, 0x2a, 0x06, 0x73, 0x5a, 0x94, 0x19, 0x7a, 0x8b, 0x0f, 0x8a, 0xd6, 0x86, 0x9d, 0x18, 0x22, 0x5f, 0x7d, 0x7d, 0xd9, 0x8e, 0x0f, 0x36, 0xcc, 0x6d, 0x39, 0xe9, 0x9d, 0xd7, 0xfd, 0xe3, 0xdc, 0xbe, 0xff, 0x72, 0x67, 0xa8, 0x27, 0xb8, 0x56, 0xcd, 0xde, 0x79, 0x11, 0x0d, 0xf7, 0x8e, 0xaf, 0xad, 0xd3, 0x32, 0x57, 0x2a, 0xb0, 0xaa, 0xe5, 0xf3, 0x9a, 0xc4, 0xa6, 0x62, 0x89, 0x53, 0x5a, 0x89, 0xd7, 0x04, 0x96, 0xfd, 0x3d, 0x78, 0x61, 0x44, 0xfe, 0x43, 0x8d, 0xda, 0x00, 0xc2, 0x95, 0xcf, 0x4d, 0x6b, 0xd4, 0x17, 0x0d, 0xec, 0x4a, 0x84, 0x1c, 0xc1, 0x6f, 0x29, 0xe5, 0xf8, 0x40, 0x1a, 0x5f, 0x29, 0x97, 0x7a, 0xa3, 0x1c, 0x2d, 0x7a, 0x31, 0x9b, 0xd1, 0x7f, 0x44, 0x0b, 0x7d, 0xa9, 0xbf, 0xb8, 0xf8, 0xdb, 0x2b, 0x94, 0x32, 0x21, 0xa5, 0x8f, 0xb8, 0x13, 0x13, 0x43, 0x84, 0x18, 0x90, 0xc9, 0x0c, 0x5a, 0x6d, 0x07, 0x8b, 0xff, 0xe1, 0x67, 0xec, 0x10, 0x51, 0x25, 0xe3, 0x2a, 0xd9, 0x7a, 0xaa, 0x82, 0x17, 0xb8, 0x4d, 0xa5, 0xd9, 0xb8, 0x3f, 0x55, 0x88, 0xa1, 0x1c, 0x7f, 0x07, 0x06, 0x43, 0xce, 0xf5, 0x1e, 0x5d, 0x31, 0x02, 0x12, 0xfc, 0x5d, 0xd6, 0x9b, 0xfb, 0xb7, 0xf7, 0x0c, 0xd5, 0x57, 0xac, 0xbe, 0x28, 0x62, 0xc3, 0xfa, 0xa0, 0x4c, 0x39, 0xaf, 0xfa, 0x65, 0xe2, 0x12, 0x11, 0x7a, 0x42, 0x11, 0x07, 0xb6, 0x66, 0x23, 0xb5, 0xa5, 0xbc, 0xbc, 0xa5, 0x04, 0x97, 0x6d, 0xc7, 0x25, 0x36, 0xa8, 0x44, 0xaa, 0x84, 0x38, 0xec, 0xe4, 0x54, 0xd2, 0x2b, 0xaa, 0x8c, 0x06, 0x21, 0xed, 0x40, 0x3b, 0x02, 0x02, 0x38, 0xa8, 0xbf, 0x41, 0x74, 0xbe, 0x78, 0x76, 0x2f, 0xb9, 0x85, 0x32, 0xf6, 0xca, 0x93, 0x1f, 0x2e, 0xfd, 0xe9, 0x4c, 0xcc, 0x09, 0x9d, 0x32, 0x9c, 0xec, 0xb5, 0x1c, 0x96, 0xe9, 0x09, 0xea, 0x6d, 0x64, 0x12, 0xd6, 0x45, 0x3a, 0x57, 0x19, 0x51, 0x5f, 0x27, 0x30, 0x0a, 0x28, 0xbd, 0x65, 0x25, 0xbb, 0xc8, 0x28, 0x9d, 0x95, 0x7c, 0xd6, 0x03, 0x2c, 0xaf, 0x01, 0x3d, 0x68, 0x38, 0x3f, 0x92, 0xee, 0x7e, 0xe8, 0x39, 0xfc, 0x39, 0x4f, 0xb8, 0x3b, 0x1e, 0x00, 0xef, 0x00, 0x5a, 0x0e, 0x2d, 0xf9, 0x3e, 0x74, 0x57, 0x91, 0x03, 0xa0, 0x33, 0x4a, 0xea, 0x07, 0x3b, 0x1e, 0x3d, 0x48, 0x7d, 0xb1, 0x01, 0xd1, 0xf7, 0xbf, 0x89, 0x3f, 0x2d, 0x3e, 0x81, 0x41, 0xd8, 0xc0, 0xf6, 0x2d, 0x4a, 0x26, 0xe0, 0x2b, 0x0f, 0xee, 0x42, 0xc5, 0x47, 0x88, 0xa9, 0x81, 0x6b, 0xbc, 0xb3, 0x13, 0x66, 0xc5, 0x9f, 0x18, 0x41, 0xdb, 0xd4, 0xff, 0x1c, 0x9a, 0x4a, 0xb9, 0x3e, 0x29, 0xd0, 0xaf, 0xd1, 0xf6, 0xce, 0x64, 0x46, 0xc4, 0xcb, 0x95, 0xeb, 0x90, 0x31, 0xb1, 0xd9, 0xf2, 0x2c, 0x6c, 0xee, 0x96, 0x9b, 0xee, 0x0c, 0x46, 0x18, 0xa7, 0xa8, 0xaa, 0x0b, 0xfe, 0x30, 0x94, 0x00, 0x51, 0x48, 0xd8, 0x6b, 0xe5, 0x4d, 0x87, 0x46, 0x10, 0x8f, 0x50, 0x1c, 0xec, 0xe0, 0xc7, 0xf7, 0x24, 0x16, 0xf5, 0xa8, 0xa2, 0xd4, 0x71, 0xd7, 0x1f, 0x26, 0xa6, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xc5, 0x39, 0x13, 0xe5, 0x6a, 0x03, 0x84, 0xdc, 0x27, 0x67, 0xc2, 0x48, 0xe4, 0xb1, 0xab, 0x7b, 0x3f, 0x94, 0xdd, 0x91, 0x15, 0x9e, 0xd7, 0xdb, 0x7a, 0x60, 0xc4, 0x79, 0xa0, 0x79, 0x4f, 0x93, 0x16, 0xb0, 0x48, 0x25, 0x38, 0x29, 0x1e, 0x45, 0x14, 0x77, 0x05, 0x1d, 0x29, 0x39, 0x03, 0xdd, 0xcd, 0xff, 0x2d, 0x6a, 0x02, 0xf1, 0x26, 0x6a, 0xd4, 0x7e, 0x3c, 0x19, 0xae, 0x69, 0xf7, 0xc4, 0xc6, 0xa5, 0xe6, 0x21, 0x31, 0x08, 0xc8, 0x05, 0x0e, 0xf2, 0x7a, 0x53, 0x86, 0x3e, 0xe7, 0xf4, 0x57, 0x6b, 0x44, 0x1d, 0x10, 0xdf, 0xfb, 0x77, 0x15, 0x5d, 0x65, 0xf8, 0x59, 0x95, 0xbd, 0x66, 0xbc, 0x00, 0xec, 0xbf, 0xf8, 0xa3, 0x15, 0x99, 0x7b, 0x7f, 0xea, 0x11, 0x8d, 0x0b, 0x77, 0xee, 0x8e, 0x0b, 0x34, 0xb9, 0x39, 0x70, 0xb7, 0x2d, 0x2d, 0x58, 0x54, 0x34, 0x7b, 0x4c, 0x5f, 0x8d, 0x23, 0xe0, 0xa6, 0xc6, 0xb9, 0xc4, 0x77, 0x0f, 0xfc, 0x55, 0xb7, 0x3f, 0xd8, 0x39, 0x61, 0x37, 0xa4, 0xb8, 0xf2, 0x8a, 0xc8, 0x17, 0x82, 0x42, 0x08, 0xee, 0x26, 0x1b, 0x75, 0xb7, 0xdc, 0x44, 0x60, 0x57, 0x85, 0x8e, 0x3b, 0xaa, 0x71, 0xb5, 0x73, 0xb9, 0x1f, 0x59, 0x35, 0x35, 0xe6, 0x3d, 0x56, 0x61, 0x20, 0xc5, 0x4e, 0xf0, 0xc2, 0x4b, 0xa9, 0x01, 0xfb, 0xd0, 0xba, 0xa1, 0x7e, 0xf7, 0x00, 0x4b, 0xe1, 0x56, 0x22, 0x16, 0xd3, 0xbf, 0x1d, 0x17, 0xb6, 0x8d, 0xac, 0xdb, 0xba, 0x5a, 0x09, 0x15, 0x06, 0x2f, 0x77, 0x8a, 0xd5, 0xbd, 0xc4, 0x3c, 0x2d, 0xe3, 0xcc, 0x4e, 0x42, 0x68, 0xad, 0x44, 0xf9, 0x05, 0x13, 0xf2, 0x4d, 0x70, 0x50, 0x74, 0x62, 0xcd, 0xfa, 0xc8, 0xba, 0x19, 0x51, 0x38, 0xcc, 0x37, 0x63, 0x27, 0x94, 0xbc, 0x8f, 0x3d, 0x64, 0xba, 0xfd, 0x3f, 0x11, 0xcd, 0x6c, 0x45, 0x28, 0xf3, 0xf9, 0x65, 0x92, 0xd3, 0x05, 0xdb, 0xc5, 0xc4, 0x2a, 0xe0, 0x99, 0xbe, 0x26, 0x9e, 0xf5, 0xc3, 0x0b, 0xd1, 0x03, 0x45, 0xaf, 0xc6, 0x8f, 0x37, 0x25, 0x6b, 0xf0, 0x1a, 0x04, 0x6e, 0x8e, 0x4c, 0x82, 0x8a, 0x9b, 0x02, 0x10, 0x4a, 0x02, 0xf5, 0x25, 0x56, 0xbb, 0x5e, 0x24, 0x95, 0x94, 0x69, 0x8a, 0x98, 0xd3, 0x62, 0x9c, 0x5f, 0x5e, 0xe1, 0x3c, 0xc7, 0x20, 0x7c, 0xd9, 0xcd, 0x17, 0x90, 0x53, 0xa0, 0xb7, 0x8b, 0x87, 0x8c, 0x14, 0x54, 0xdd, 0x46, 0x70, 0xfc, 0x43, 0x9d, 0xb3, 0xb1, 0xe9, 0x58, 0xcd, 0x7b, 0x72, 0x4c, 0xf1, 0x6e, 0x56, 0x61, 0x1b, 0xaf, 0xda, 0x58, 0xee, 0xaa, 0x81, 0x72, 0xe6, 0xa5, 0x9e, 0xee, 0xde, 0x76, 0x2d, 0x71, 0x23, 0x7c, 0x54, 0x03, 0x46, 0x19, 0x5b, 0x3d, 0x08, 0x5e, 0x87, 0x30, 0x89, 0xb2, 0xdb, 0x79, 0x52, 0x80, 0xd9, 0x58, 0xb4, 0x74, 0x2b, 0x83, 0xa1, 0x8d, 0x41, 0x59, 0xd4, 0x75, 0xbe, 0xe6, 0xf5, 0x9e, 0x65, 0x82, 0x38, 0x4c, 0x5a, 0xae, 0x3b, 0x37, 0x5e, 0xe1, 0xcc, 0xac, 0x69, 0xf0, 0x38, 0x64, 0x1f, 0xfe, 0xdf, 0xff, 0xf6, 0x6f, 0x07, 0x55, 0x18, 0x8f, 0xab, 0x52, 0x4a, 0x5d, 0xbd, 0x4f, 0x31, 0xa5, 0x87, 0xda, 0x25, 0xf3, 0xbf, 0xcf, 0x70, 0xae, 0xa3, 0x97, 0xb9, 0x33, 0x2c, 0xb7, 0xc9, 0x7f, 0x1b, 0x82, 0xe2, 0x19, 0x97, 0x0b, 0xab, 0xf8, 0xbc, 0x53, 0x75, 0xcd, 0x7e, 0x07, 0x4b, 0xea, 0x60, 0x05, 0xfb, 0x0a, 0xde, 0xcc, 0xe2, 0x18, 0xf7, 0xb6, 0x92, 0x75, 0x4b, 0x10, 0x6f, 0x04, 0x33, 0x08, 0xfb, 0x03, 0x0a, 0x02, 0x28, 0xb2, 0xe8, 0xcd, 0x03, 0xf0, 0x9c, 0x22, 0xa3, 0x2e, 0x5c, 0x99, 0x7d, 0xa5, 0xd2, 0xf2, 0xf4, 0x00, 0x60, 0xf0, 0xe0, 0x67, 0x1b, 0xe4, 0x1a, 0x79, 0xea, 0xa0, 0x68, 0xe8, 0x6e, 0xd5, 0x75, 0xa2, 0xbb, 0xca, 0x5d, 0x66, 0xe8, 0x0f, 0x1e, 0x1a, 0xd5, 0x16, 0xe7, 0x99, 0x13, 0x69, 0x0a, 0xec, 0x43, 0x9e, 0x66, 0x44, 0xc4, 0x89, 0xfe, 0x87, 0x9c, 0x34, 0x7e, 0x3c, 0x5b, 0x9c, 0x95, 0x9c, 0x88, 0x56, 0xd2, 0x16, 0xa3, 0x49, 0x0e, 0x30, 0x50, 0x2e, 0x84, 0x79, 0xe0, 0xdb, 0x82, 0x68, 0x37, 0x96, 0x0d, 0x85, 0x0c, 0x47, 0x85, 0xbd, 0xb5, 0x27, 0xb7, 0x70, 0x91, 0xad, 0x7f, 0x81, 0xb4, 0x04, 0xd3, 0x78, 0x0b, 0xab, 0xd4, 0xf0, 0xe4, 0x6d, 0xcd, 0xa4, 0x1a, 0xd2, 0xdb, 0x58, 0x10, 0x36, 0x92, 0xe2, 0xdd, 0xc8, 0xb1, 0xda, 0xc4, 0x00, 0xe5, 0x0c, 0xdc, 0x25, 0xdc, 0xac, 0x95, 0xff, 0x0a, 0xaa, 0x2b, 0xa3, 0x28, 0x34, 0xbd, 0x66, 0xd4, 0xaa, 0x76, 0x31, 0x05, 0x04, 0x70, 0xc1, 0x3a, 0x46, 0x6c, 0x98, 0x24, 0x74, 0x02, 0xd4, 0xd3, 0xb0, 0x0c, 0x5b, 0x4f, 0x8d, 0x83, 0x74, 0xa2, 0x72, 0x58, 0xc2, 0xa2, 0x43, 0x11, 0x13, 0x45, 0xe6, 0x50, 0xc7, 0x3e, 0x80, 0x45, 0x43, 0xf8, 0x8a, 0x03, 0xa3, 0x29, 0x6c, 0x9a, 0x03, 0x64, 0x05, 0xf9, 0xd9, 0x59, 0xfc, 0xbc, 0x29, 0xd5, 0x6d, 0xb2, 0x94, 0xeb, 0xbc, 0x23, 0xc1, 0x4f, 0xba, 0xaa, 0x08, 0x7b, 0x73, 0x0c, 0x51, 0x36, 0xef, 0xaf, 0xb4, 0x06, 0xf1, 0x9f, 0xbd, 0x03, 0x95, 0xcb, 0x16, 0xf0, 0xc1, 0xab, 0x94, 0xc6, 0xd2, 0xc9, 0xf9, 0xe4, 0x84, 0x49, 0xd3, 0x9a, 0x58, 0x11, 0x98, 0x69, 0x48, 0xcb, 0xc2, 0xfb, 0x73, 0x5b, 0xc6, 0x9d, 0xdc, 0x27, 0x81, 0xca, 0x8c, 0xf2, 0x00, 0x6a, 0x19, 0xc3, 0xc2, 0x89, 0xbe, 0x01, 0x2f, 0xda, 0x6a, 0xad, 0x6f, 0x93, 0x4c, 0x0e, 0xc9, 0x0b, 0x99, 0xc0, 0xaf, 0xc0, 0xa9, 0x7a, 0xc9, 0x68, 0x2c, 0xca, 0x94, 0xae, 0xfa, 0xcc, 0xbe, 0x59, 0x5f, 0xe7, 0xc3, 0x41, 0xa4, 0x13, 0xf0, 0x64, 0xa5, 0x7c, 0xd1, 0x96, 0x22, 0x1a, 0x79, 0x81, 0x3d, 0x28, 0x22, 0xfe, 0xa1, 0x4f, 0x87, 0x17, 0x0b, 0xa3, 0x75, 0x91, 0xae, 0x9d, 0xa7, 0xfc, 0xfc, 0xba, 0x02, 0xe1, 0xcb, 0x0d, 0x20, 0xae, 0x53, 0xa3, 0x93, 0x10, 0xc5, 0x58, 0xd8, 0x01, 0xc1, 0xc9, 0x62, 0x5a, 0xc4, 0x5a, 0x77, 0xd8, 0x67, 0x3f, 0x2c, 0xd3, 0x2d, 0x0d, 0x16, 0x2f, 0xbe, 0x14, 0x66, 0x63, 0xd6, 0x7a, 0x52, 0xb6, 0xbf, 0x22, 0x69, 0xc4, 0xad, 0x20, 0x66, 0x0e, 0x65, 0x4a, 0x33, 0x8a, 0x74, 0x0b, 0x67, 0xe9, 0x72, 0x1d, 0x67, 0x48, 0xcb, 0xde, 0x02, 0xb0, 0xd3, 0xc3, 0x5e, 0x3c, 0xe8, 0xd2, 0x9d, 0x36, 0x9c, 0x66, 0x1c, 0xa9, 0x54, 0x3e, 0x3c, 0x7d, 0x77, 0x2e, 0x63, 0x8c, 0x07, 0x77, 0x69, 0xf4, 0x0a, 0x24, 0x9a, 0x06, 0x04, 0x9a, 0xa9, 0xcc, 0x4b, 0x3d, 0x23, 0x4a, 0x34, 0x14, 0x67, 0x16, 0xb0, 0x9b, 0x77, 0xa2, 0x59, 0xa2, 0x31, 0xda, 0xd6, 0xa9, 0x68, 0x2f, 0xa3, 0xea, 0x29, 0xd0, 0xab, 0x2c, 0x10, 0xde, 0x65, 0x57, 0x15, 0x70, 0xdc, 0xa9, 0x3c, 0x87, 0x07, 0x13, 0x1a, 0x10, 0xfb, 0x57, 0xac, 0xb3, 0x03, 0x76, 0x5a, 0xc7, 0x8e, 0x38, 0xf3, 0xce, 0x00, 0xf1, 0x68, 0x5a, 0xc6, 0x92, 0x74, 0x21, 0x81, 0xa9, 0x0f, 0x98, 0x22, 0x2b, 0xa5, 0x00, 0x5d, 0x63, 0x6a, 0x89, 0xc6, 0xfa, 0x6c, 0x87, 0x2c, 0xe6, 0x07, 0x1e, 0x6e, 0x99, 0xa2, 0x44, 0xa8, 0x8b, 0xef, 0xdb, 0x03, 0x02, 0x7e, 0x44, 0x4b, 0xdc, 0xeb, 0xe7, 0x90, 0xc7, 0x11, 0x91, 0xd3, 0x80, 0xd3, 0x4e, 0x46, 0x20, 0x67, 0xbe, 0xbb, 0x30, 0x0f, 0x4c, 0x2a, 0xdc, 0x58, 0x4a, 0xf8, 0xed, 0x56, 0x6d, 0x4e, 0xe2, 0x1b, 0xea, 0x2c, 0x09, 0x72, 0x83, 0x95, 0xb3, 0xe5, 0x53, 0x15, 0x66, 0x31, 0xcb, 0x32, 0x10, 0xac, 0xe2, 0xab, 0xa7, 0x33, 0xeb, 0xcc, 0xeb, 0xb5, 0xd4, 0xbf, 0x1d, 0x47, 0xd3, 0x61, 0x08, 0x87, 0x48, 0xa9, 0x5e, 0xa7, 0xa6, 0x06, 0xfd, 0xc5, 0xb4, 0xe6, 0x60, 0xcc, 0xf0, 0xcf, 0x35, 0xaf, 0x41, 0xee, 0xa2, 0x1e, 0x72, 0xd5, 0xda, 0x16, 0x33, 0xd6, 0xd5, 0x03, 0x05, 0xec, 0x6e, 0x3d, 0x51, 0x7d, 0x22, 0xf3, 0x9d, 0x2a, 0xef, 0x45, 0xb9, 0x61, 0x5f, 0x53, 0xcf, 0x9c, 0xd3, 0xeb, 0x46, 0x36, 0xf3, 0xf5, 0xe8, 0xcc, 0xec, 0xcf, 0x9b, 0xf6, 0x83, 0x52, 0xd4, 0x12, 0x88, 0x0d, 0xbd, 0x65, 0x41, 0x5a, 0x11, 0x37, 0x64, 0xad, 0xbc, 0x15, 0xb1, 0xd6, 0x37, 0x3d, 0xcd, 0xca, 0x07, 0xa1, 0x0d, 0x65, 0x42, 0x56, 0xae, 0x86, 0x0d, 0xec, 0xc1, 0x6c, 0x4b, 0x52, 0x7b, 0x42, 0x3d, 0x4b, 0xf9, 0x04, 0x86, 0xb1, 0xdf, 0x34, 0x24, 0xd7, 0x8e, 0xc4, 0x51, 0x0e, 0x37, 0x7b, 0xfc, 0x5d, 0xf8, 0x3c, 0x18, 0x69, 0xaa, 0xce, 0xca, 0x3c, 0xce, 0x76, 0xbf, 0x98, 0x91, 0x9b, 0xcc, 0x07, 0x9c, 0x0a, 0x9a, 0xa4, 0x21, 0x95, 0x91, 0xee, 0x73, 0xc3, 0xc9, 0x4a, 0xf2, 0x4e, 0x46, 0x32, 0x51, 0xd2, 0xd9, 0x5f, 0xb5, 0x31, 0x4f, 0x33, 0xc7, 0x14, 0xe2, 0x23, 0xe3, 0x22, 0xbe, 0xe0, 0xe2, 0xa5, 0x95, 0x2f, 0x2a, 0xf8, 0x7f, 0x6e, 0x96, 0x88, 0x36, 0x9b, 0xca, 0x66, 0x6b, 0xac, 0xd3, 0x93, 0x5f, 0x93, 0xfb, 0x5c, 0xf3, 0xb7, 0xb2, 0x16, 0xfb, 0x95, 0x21, 0xcc, 0xdc, 0xdb, 0xe9, 0xbf, 0x87, 0x9b, 0x23, 0xf9, 0x50, 0x8f, 0x58, 0xfa, 0x4e, 0xe5, 0x8c, 0xcd, 0xda, 0x0e, 0x3a, 0xca, 0x8a, 0x5e, 0x12, 0xc5, 0xdb, 0x08, 0xec, 0x36, 0x4a, 0xac, 0x5b, 0xf0, 0x53, 0x30, 0x47, 0xbf, 0xa7, 0x45, 0xb3, 0x37, 0x7b, 0x1b, 0xad, 0x47, 0x85, 0x4d, 0xdd, 0xcb, 0x11, 0x08, 0x26, 0x31, 0x5d, 0x33, 0xa1, 0x02, 0xba, 0xe1, 0x9c, 0x53, 0x0e, 0xee, 0xaa, 0xc0, 0x96, 0x37, 0xc0, 0xf5, 0xec, 0xa4, 0x89, 0xd9, 0xaf, 0x18, 0x2a, 0x24, 0x36, 0x07, 0xff, 0x1c, 0x56, 0x08, 0x06, 0x8f, 0xb5, 0xb0, 0x04, 0x49, 0x36, 0xa4, 0xcb, 0x66, 0x69, 0xae, 0x48, 0xd1, 0xc6, 0x60, 0x7b, 0x51, 0x06, 0x34, 0xe9, 0x25, 0x5e, 0x41, 0xfc, 0x8a, 0xf3, 0xbb, 0xe3, 0xa4, 0xc0, 0x45, 0xed, 0x12, 0x8e, 0x47, 0xdb, 0x94, 0x4f, 0x1d, 0x23, 0xfe, 0x97, 0x7d, 0x05, 0x11, 0x78, 0x67, 0x46, 0xcd, 0x01, 0x2e, 0x22, 0x3b, 0x48, 0x87, 0x08, 0xb1, 0x2d, 0x5d, 0xe4, 0xd8, 0x3d, 0xe2, 0x10, 0xab, 0xf1, 0xcd, 0xd6, 0x5f, 0x5c, 0xde, 0x11, 0x5f, 0xd3, 0xf4, 0x8d, 0xcd, 0xb7, 0xd1, 0x44, 0xd5, 0xf7, 0x10, 0x64, 0x00, 0x7c, 0xf7, 0xcd, 0xfb, 0x24, 0x03, 0x7a, 0xd4, 0x70, 0x16, 0x2f, 0x02, 0x0b, 0xca, 0x81, 0x9f, 0x6e, 0x9e, 0x9e, 0x22, 0x29, 0x24, 0x23, 0xdf, 0xe5, 0x8f, 0xba, 0x82, 0x7b, 0x50, 0xfe, 0x91, 0x3c, 0x22, 0x4d, 0xbc, 0xd8, 0xec, 0x4a, 0x66, 0xa8, 0xf0, 0x0e, 0xbb, 0x13, 0x12, 0x82, 0x38, 0x82, 0x9f, 0xa0, 0x99, 0x20, 0x9f, 0x4d, 0x3b, 0x69, 0x50, 0xeb, 0x78, 0x51, 0x6d, 0xaf, 0x09, 0xdb, 0x72, 0xb3, 0x16, 0x80, 0x61, 0xc4, 0x1b, 0x2f, 0x46, 0x0a, 0xbf, 0xda, 0x67, 0x44, 0xd2, 0xd8, 0xbf, 0xca, 0x1a, 0x50, 0x01, 0x47, 0x78, 0x05, 0x2f, 0x8a, 0x88, 0x11, 0xd0, 0xe3, 0x93, 0xd5, 0x3f, 0xe7, 0xe9, 0xc3, 0x3b, 0xe0, 0x6e, 0x63, 0xf6, 0x77, 0x1f, 0x90, 0xa7, 0x62, 0xe6, 0x33, 0x98, 0x16, 0xdd, 0x3c, 0x8a, 0xa6, 0x35, 0x43, 0x0a, 0x16, 0xb9, 0x08, 0x4d, 0x24, 0x60, 0xe8, 0x1c, 0x47, 0x21, 0x38, 0x6e, 0xd1, 0x74, 0x7c, 0x40, 0x07, 0x92, 0xc4, 0x0b, 0x07, 0x91, 0x74, 0xc2, 0x10, 0xe9, 0x50, 0xf9, 0xe7, 0x68, 0x44, 0x16, 0x99, 0x96, 0x67, 0x2b, 0xa3, 0x8b, 0x60, 0x90, 0xdc, 0x63, 0xcc, 0x8c, 0xf5, 0x29, 0xdc, 0x19, 0xe5, 0xda, 0x95, 0x9a, 0x35, 0x2a, 0xa8, 0x3c, 0x36, 0xb1, 0x47, 0xff, 0xcd, 0xeb, 0xc5, 0x01, 0xa6, 0x41, 0x79, 0x2d, 0x9e, 0x4b, 0x22, 0xa0, 0x4f, 0x37, 0x62, 0x10, 0xc5, 0x70, 0x1b, 0x8a, 0xa0, 0xd9, 0x81, 0xdf, 0xf7, 0x33, 0x4d, 0xa1, 0x88, 0x92, 0x07, 0xee, 0xcb, 0xa1, 0x23, 0x1d, 0x8c, 0xd7, 0xbb, 0x1f, 0xbb, 0xa7, 0xa8, 0xe1, 0xbc, 0xcf, 0x7d, 0x8e, 0x79, 0xf6, 0x7b, 0x60, 0x76, 0x86, 0xba, 0x23, 0x7a, 0x4b, 0x18, 0x4c, 0xac, 0xc5, 0xdf, 0xc8, 0xab, 0x98, 0xab, 0x17, 0x1a, 0x5c, 0x76, 0x06, 0x14, 0xc3, 0x69, 0xde, 0x66, 0x95, 0x5b, 0x3a, 0x03, 0xb0, 0x83, 0x9e, 0x5d, 0x4d, 0x8f, 0x4e, 0x60, 0x77, 0x2e, 0x79, 0xbe, 0x05, 0x2a, 0x2e, 0x24, 0xe2, 0x9f, 0x62, 0x93, 0x28, 0x97, 0x3f, 0x82, 0x5a, 0x1a, 0x15, 0xa6, 0x74, 0x1d, 0x38, 0x9d, 0xab, 0x48, 0x93, 0x44, 0x0e, 0xc3, 0x58, 0xb9, 0x22, 0xa1, 0x9a, 0x75, 0x95, 0x32, 0x82, 0xd4, 0x61, 0x1f, 0xc5, 0x06, 0x8f, 0x89, 0xb6, 0x17, 0xfd, 0x01, 0x27, 0xff, 0x92, 0x0f, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x9f, 0xb4, 0x80, 0x33, 0x18, 0xed, 0x17, 0xb5, 0xc4, 0xac, 0xb0, 0xba, 0xa8, 0x13, 0xe4, 0x96, 0x6f, 0x61, 0xe8, 0xce, 0xdf, 0x72, 0xb2, 0x56, 0xaa, 0xa4, 0xe7, 0xd1, 0x0b, 0x8c, 0xa4, 0x7e, 0x94, 0x28, 0x2c, 0xba, 0x69, 0x66, 0xdc, 0x96, 0x79, 0xab, 0x7f, 0xcc, 0x41, 0xf6, 0xd7, 0x48, 0x8a, 0x15, 0x40, 0xf3, 0x4f, 0x31, 0x90, 0x1e, 0xb6, 0xfd, 0xda, 0x34, 0xe5, 0xbb, 0x69, 0x1c, 0xf4, 0x17, 0x18, 0xd0, 0x89, 0x17, 0xe6, 0x83, 0xfa, 0x3d, 0xd6, 0x28, 0x3c, 0x92, 0x2d, 0x58, 0x46, 0xcb, 0x4f, 0x4c, 0x29, 0xa5, 0xdb, 0x56, 0xfb, 0xce, 0xf9, 0x0a, 0xe3, 0x4e, 0x3d, 0x2e, 0xdc, 0x42, 0x47, 0x15, 0x3a, 0xea, 0x66, 0xc8, 0x79, 0xc3, 0xd5, 0x93, 0x8d, 0xc9, 0xa1, 0xae, 0x8c, 0xed, 0x35, 0xd6, 0xcb, 0xea, 0x15, 0x72, 0xb5, 0x54, 0xf2, 0x10, 0xbb, 0x01, 0x5e, 0x68, 0x3b, 0xdb, 0x17, 0xf3, 0x18, 0x49, 0x72, 0xbc, 0x24, 0xba, 0xc3, 0x2f, 0x30, 0xf6, 0x79, 0x7f, 0x38, 0x6a, 0x36, 0x36, 0x04, 0xdb, 0xd3, 0x17, 0xd1, 0x34, 0x81, 0x4d, 0xcf, 0x67, 0x74, 0xb3, 0x21, 0x94, 0xd9, 0xb1, 0x1d, 0x3a, 0x1c, 0x22, 0x24, 0xd2, 0xe3, 0x3b, 0xf5, 0x60, 0x97, 0xaa, 0xdf, 0xba, 0x16, 0xf8, 0x27, 0xf4, 0xcd, 0xc1, 0x3b, 0xc1, 0xe6, 0x0a, 0x6a, 0x59, 0xa7, 0xff, 0xef, 0x5d, 0xc8, 0xd3, 0x4c, 0xb4, 0xa8, 0x86, 0x00, 0x53, 0x50, 0x6b, 0x1c, 0x7b, 0xa5, 0x61, 0x20, 0xe3, 0x01, 0x1b, 0x66, 0x1a, 0x4e, 0xf4, 0x80, 0xdc, 0x46, 0xb6, 0x94, 0x77, 0x43, 0xc1, 0x37, 0xf0, 0xe9, 0x7c, 0x27, 0xae, 0x30, 0x70, 0x67, 0x84, 0x3f, 0x33, 0x1c, 0x27, 0xc9, 0xda, 0xc2, 0x7d, 0xc6, 0x5d, 0x9f, 0x7a, 0xb9, 0x71, 0xbc, 0xb6, 0x3c, 0xfe, 0x4a, 0x28, 0xd3, 0x24, 0x94, 0x43, 0x7d, 0xee, 0x84, 0xb1, 0xc5, 0xe6, 0x27, 0x54, 0xb9, 0xef, 0x0a, 0xf8, 0xdb, 0xb5, 0xa8, 0x5c, 0xb8, 0x42, 0x11, 0x12, 0x94, 0xd5, 0xa6, 0xba, 0x5e, 0x54, 0xe2, 0x6f, 0x79, 0x48, 0xd2, 0xf0, 0xd7, 0x1f, 0x23, 0x90, 0x95, 0x3e, 0x8f, 0xed, 0x2b, 0xf7, 0xe6, 0x65, 0xfe, 0x1d, 0x68, 0x4a, 0xb8, 0xef, 0x9f, 0xce, 0x74, 0x92, 0xa9, 0xb0, 0xa4, 0x83, 0x91, 0x2b, 0xa8, 0x90, 0xa3, 0x23, 0x09, 0x58, 0x7a, 0x51, 0x36, 0x6b, 0xaa, 0x06, 0x73, 0x46, 0xd2, 0x38, 0x6e, 0x2c, 0x87, 0x2c, 0x20, 0x6f, 0xf3, 0x13, 0xf3, 0x49, 0x2b, 0xc8, 0x0c, 0x1d, 0xfe, 0x0d, 0xa1, 0x20, 0x13, 0x0b, 0x5a, 0xac, 0x16, 0xac, 0x0e, 0xb1, 0x1f, 0xc9, 0x14, 0xf7, 0xbc, 0xda, 0x48, 0xd3, 0x5d, 0xf5, 0x4b, 0x3d, 0x9c, 0xc8, 0x56, 0xd8, 0x9e, 0x88, 0xbc, 0x60, 0xae, 0xe6, 0xfc, 0xaa, 0xba, 0x3d, 0xb1, 0xe1, 0x07, 0x8c, 0xc8, 0x05, 0xae, 0x2d, 0x4c, 0x1b, 0x2a, 0xec, 0xad, 0xe6, 0x2b, 0x34, 0xb2, 0x29, 0xf2, 0x19, 0x51, 0x5e, 0xb6, 0x55, 0x8e, 0xa5, 0x4d, 0x74, 0x1c, 0x5f, 0xa0, 0xc8, 0xae, 0x21, 0x2d, 0x48, 0x15, 0x04, 0x78, 0x0e, 0xd0, 0xce, 0xfd, 0x6b, 0x80, 0xcf, 0xc5, 0xa2, 0x32, 0x15, 0xfb, 0x8c, 0xa8, 0x38, 0xc3, 0xab, 0x70, 0x04, 0x04, 0xcc, 0x75, 0x40, 0x2c, 0x5b, 0x78, 0x2e, 0x1d, 0xfc, 0x71, 0xff, 0x38, 0x63, 0x1b, 0x77, 0x3b, 0x0c, 0x65, 0x8f, 0xc9, 0x21, 0xdd, 0x28, 0x40, 0x5c, 0xaa, 0xf2, 0x9e, 0x5a, 0x24, 0x7b, 0x44, 0xc0, 0xdb, 0x7c, 0x82, 0x1e, 0x1d, 0xe8, 0xb7, 0x99, 0xe2, 0x7d, 0xfa, 0x75, 0xc9, 0x74, 0x43, 0xcf, 0x95, 0x23, 0xe2, 0xe8, 0x08, 0x49, 0x5e, 0x45, 0x2d, 0xb5, 0x5a, 0x2a, 0x57, 0xf3, 0xe0, 0x01, 0xf7, 0xd8, 0x41, 0x83, 0xae, 0xac, 0xd3, 0x1d, 0xe4, 0x3b, 0x89, 0x2f, 0x2d, 0xdc, 0x2f, 0x3c, 0xd2, 0x3b, 0x9b, 0xd5, 0x0b, 0x8c, 0x68, 0xee, 0xee, 0x72, 0x7e, 0x0e, 0x97, 0x9e, 0xd6, 0x8b, 0x57, 0xaa, 0xd8, 0x61, 0xb1, 0x10, 0xf1, 0xc1, 0x5c, 0x29, 0x72, 0x48, 0xc0, 0xaf, 0x8c, 0x58, 0x1b, 0x3d, 0xad, 0xe5, 0xe8, 0x10, 0x90, 0x35, 0x0f, 0xa6, 0xfe, 0x7b, 0xc9, 0xbf, 0x2f, 0x3d, 0x60, 0xc5, 0x1f, 0xc2, 0x27, 0x14, 0xff, 0x14, 0xd3, 0x10, 0x1d, 0xa0, 0x96, 0xa6, 0xb4, 0x5f, 0x93, 0xd5, 0xc5, 0xd9, 0x5f, 0xea, 0x99, 0xac, 0x4b, 0xa7, 0x89, 0x09, 0x59, 0x94, 0xb2, 0x77, 0x37, 0xa9, 0x85, 0xc6, 0xa5, 0xb9, 0x2c, 0x1d, 0xe8, 0x7e, 0x16, 0xa1, 0xb5, 0xbe, 0xfa, 0x12, 0x54, 0x32, 0xb9, 0x55, 0xf8, 0x0b, 0x77, 0x89, 0xf6, 0xc5, 0xd7, 0x8f, 0x8f, 0x0b, 0xa1, 0x3c, 0x08, 0x08, 0x90, 0xe9, 0xdd, 0x97, 0xc4, 0xb0, 0xdd, 0x23, 0x55, 0x69, 0x8a, 0x80, 0x8e, 0x7f, 0x7c, 0xe1, 0x38, 0xe7, 0xff, 0xe1, 0xfd, 0x79, 0x55, 0x11, 0xbf, 0x1d, 0x94, 0x87, 0xa1, 0x38, 0x66, 0x82, 0xc6, 0x9d, 0x4d, 0x46, 0x3b, 0x64, 0x99, 0x28, 0x0c, 0x2f, 0xe1, 0x63, 0x2b, 0xdb, 0x2f, 0x08, 0xcb, 0x42, 0xa8, 0xd7, 0xcd, 0x48, 0x58, 0x64, 0xa0, 0xa4, 0x08, 0x98, 0x55, 0x9c, 0x4f, 0xcf, 0x1a, 0x83, 0xf6, 0xfa, 0x59, 0x61, 0x7c, 0x34, 0x8c, 0xb6, 0x20, 0x2e, 0xea, 0x5d, 0x3a, 0x0c, 0xc0, 0x33, 0xbd, 0xf5, 0x64, 0x26, 0x67, 0xba, 0xc5, 0x6e, 0xa5, 0x09, 0xe4, 0x95, 0x3e, 0x9b, 0x8e, 0x52, 0x0b, 0xdc, 0x31, 0x06, 0xe4, 0xc5, 0x61, 0x89, 0xa1, 0x89, 0x16, 0x47, 0x23, 0xa9, 0x51, 0x2d, 0x93, 0xd5, 0x34, 0xbd, 0x77, 0x3d, 0x02, 0x7b, 0x86, 0x42, 0xe4, 0xfc, 0xab, 0xa7, 0x20, 0xa7, 0x3e, 0xc3, 0x89, 0x35, 0xf5, 0xd8, 0x18, 0x1c, 0xa6, 0x03, 0x39, 0x6d, 0xdd, 0x82, 0xfa, 0x35, 0xaa, 0x9b, 0xfa, 0x05, 0xc5, 0x56, 0x7c, 0x09, 0xd7, 0xa9, 0x7d, 0xbf, 0xf1, 0x3d, 0xed, 0xec, 0xa3, 0x3b, 0x4c, 0x28, 0x23, 0x96, 0x8a, 0x76, 0xf5, 0x29, 0xda, 0x72, 0x01, 0x7b, 0xb7, 0x20, 0x11, 0x1d, 0xd0, 0xea, 0xdc, 0x8d, 0x96, 0x6e, 0x2f, 0x53, 0x9e, 0xb5, 0x4c, 0x8e, 0x45, 0xbf, 0xf0, 0x0d, 0x88, 0xad, 0x0b, 0x4c, 0xd3, 0x9d, 0x90, 0xef, 0x53, 0x65, 0x8d, 0xc0, 0xee, 0x3e, 0x7d, 0x8b, 0xbd, 0xc8, 0x15, 0xdf, 0x51, 0x83, 0xbe, 0x61, 0x76, 0xac, 0xfc, 0x34, 0x07, 0xc0, 0x26, 0xd1, 0x6a, 0xe4, 0xd0, 0x20, 0xfb, 0x15, 0x07, 0x5d, 0xea, 0x40, 0xca, 0x4e, 0xff, 0x8d, 0xf7, 0x44, 0xd5, 0x6f, 0x1e, 0x26, 0x1d, 0x87, 0xce, 0xdc, 0xbe, 0xc9, 0x04, 0x3f, 0x45, 0xd3, 0x36, 0x7d, 0x04, 0xa2, 0x46, 0xcd, 0xb1, 0x62, 0x82, 0x07, 0xc3, 0x76, 0x63, 0xc6, 0x2b, 0x83, 0x5a, 0xe3, 0x27, 0xb6, 0xad, 0x67, 0x3d, 0x82, 0x6f, 0x5c, 0xae, 0x09, 0xcf, 0xca, 0xc2, 0x48, 0xc8, 0x35, 0xe1, 0x2a, 0x4a, 0xf2, 0xbd, 0xa0, 0x4e, 0xe1, 0xf9, 0xb3, 0x23, 0x1f, 0x1f, 0x01, 0xd7, 0x64, 0x20, 0x1c, 0xdb, 0xfe, 0x92, 0xd2, 0x99, 0x8c, 0x26, 0x1f, 0x8e, 0x40, 0x77, 0x03, 0x72, 0x78, 0x18, 0x6f, 0xe2, 0x0a, 0x77, 0x4c, 0x55, 0x6e, 0x98, 0x08, 0x20, 0xe9, 0x44, 0x79, 0x9c, 0xbc, 0x33, 0x72, 0x6e, 0x69, 0x84, 0x6e, 0xb7, 0x2f, 0x63, 0x29, 0xe0, 0x6a, 0xd2, 0x66, 0xd3, 0x19, 0x7f, 0x03, 0x39, 0x4d, 0xee, 0x66, 0xcb, 0xca, 0xcb, 0x8f, 0xb3, 0xf8, 0x98, 0x6d, 0x37, 0xca, 0xf3, 0x5b, 0xc6, 0x5a, 0xe8, 0x6f, 0xe4, 0x7a, 0x8d, 0xb9, 0xe2, 0x28, 0x25, 0x56, 0xd1, 0x56, 0xc9, 0xb3, 0x8e, 0x12, 0xb9, 0x55, 0x9b, 0x7b, 0x19, 0xc8, 0xf5, 0x7a, 0x9c, 0x53, 0xac, 0xe9, 0xac, 0xe1, 0xce, 0xb9, 0x29, 0xca, 0x2d, 0x4e, 0xfc, 0x81, 0xfb, 0xfe, 0x0d, 0x7c, 0xec, 0x0c, 0x83, 0x6f, 0x4d, 0xba, 0xf9, 0xde, 0xc9, 0xa0, 0xf1, 0x37, 0xbc, 0x12, 0xeb, 0xcb, 0xa7, 0x95, 0x47, 0x5c, 0x78, 0x3a, 0xdd, 0x4f, 0xfa, 0xdf, 0x2b, 0x36, 0x82, 0xf8, 0x7d, 0x97, 0x8e, 0x74, 0x73, 0xc3, 0x8e, 0x43, 0xcf, 0x63, 0x40, 0xc0, 0x01, 0x99, 0x9a, 0xe8, 0x11, 0xef, 0x69, 0xd2, 0x95, 0x30, 0xee, 0x5d, 0x52, 0x94, 0x04, 0xf5, 0x53, 0xbc, 0x8f, 0x46, 0xde, 0xbd, 0x31, 0x35, 0x18, 0x74, 0x67, 0x16, 0x9e, 0x67, 0xd3, 0x47, 0x41, 0x6e, 0xb5, 0x79, 0x06, 0x6d, 0x73, 0xd1, 0xdb, 0x4a, 0x58, 0x7c, 0x1e, 0xb7, 0xb0, 0xab, 0x76, 0x81, 0x5e, 0xee, 0x3d, 0x38, 0x2c, 0xb1, 0x06, 0x25, 0xbc, 0xd6, 0x69, 0xa6, 0x41, 0xea, 0x7d, 0xfa, 0x89, 0x27, 0xd6, 0x75, 0x55, 0x08, 0x4a, 0x93, 0xe1, 0x2a, 0x2b, 0xac, 0x10, 0x86, 0xf6, 0xc8, 0x7a, 0xa4, 0xc4, 0x2c, 0x49, 0xc1, 0x80, 0x94, 0x3d, 0xc5, 0xb9, 0x9b, 0x7b, 0xee, 0xfe, 0x1d, 0x79, 0x81, 0x5a, 0x69, 0xa3, 0x02, 0x5b, 0x26, 0xbd, 0xeb, 0x28, 0xa0, 0x3e, 0x6c, 0xc7, 0xe3, 0x23, 0xb9, 0x8c, 0xd4, 0x3c, 0x61, 0x66, 0xf6, 0xb7, 0xf4, 0x3b, 0x60, 0x1f, 0xb8, 0x66, 0xcb, 0x97, 0xd8, 0x58, 0x26, 0x2f, 0x2e, 0xb2, 0xfb, 0xe0, 0xf5, 0x3e, 0xd2, 0x49, 0x87, 0xc0, 0xb6, 0xa4, 0x84, 0x38, 0xa7, 0xc6, 0x14, 0xf3, 0x98, 0x8a, 0x01, 0x70, 0xd8, 0x7c, 0x14, 0x6b, 0x5a, 0x56, 0x06, 0x39, 0xa5, 0x4c, 0x2d, 0x00, 0x91, 0x6a, 0x6b, 0x92, 0x56, 0x21, 0x18, 0x59, 0xe6, 0x2d, 0xb9, 0x78, 0xdd, 0x8e, 0xe6, 0x07, 0xfe, 0x81, 0x7f, 0x0e, 0x7c, 0xf4, 0x1b, 0x78, 0x78, 0x86, 0xbb, 0x9d, 0xb1, 0x43, 0xad, 0x78, 0x04, 0x00, 0x88, 0x8e, 0xcd, 0x7b, 0x33, 0xdc, 0x1c, 0x8b, 0x7b, 0x7e, 0x33, 0x1f, 0x03, 0xdc, 0xc7, 0x84, 0xd9, 0x9e, 0xdd, 0x41, 0x8d, 0xe1, 0xe4, 0x4d, 0x04, 0xc1, 0xd5, 0x51, 0x08, 0x5f, 0x3e, 0xf8, 0x55, 0x8c, 0x9b, 0xae, 0xe4, 0x5a, 0x6a, 0x3f, 0x42, 0xb9, 0x01, 0x6b, 0x83, 0xb7, 0x3e, 0x82, 0x0a, 0xde, 0xfd, 0x67, 0x9a, 0x76, 0xfe, 0x16, 0x38, 0x0f, 0xc3, 0x6e, 0x24, 0xe5, 0xbf, 0x25, 0xfb, 0x41, 0x00, 0x0b, 0xfb, 0xd2, 0x5d, 0x37, 0x39, 0xaa, 0xb3, 0xb8, 0x8b, 0xee, 0x74, 0xb3, 0xfb, 0x0e, 0xe3, 0xed, 0xc2, 0x00, 0x7f, 0xd9, 0xd9, 0xd1, 0x2c, 0x9e, 0x30, 0xda, 0x7a, 0x71, 0x0d, 0x28, 0x38, 0x14, 0xe7, 0x64, 0xae, 0x88, 0x28, 0x15, 0x24, 0x0f, 0x46, 0x78, 0x23, 0xdd, 0x98, 0x4a, 0xdb, 0x39, 0xd6, 0x2d, 0x2c, 0x6a, 0x34, 0xd5, 0xe7, 0xce, 0x81, 0xdb, 0x0f, 0x77, 0x5f, 0xa1, 0xcc, 0x50, 0x1f, 0xe3, 0x2a, 0x3e, 0x1b, 0xf5, 0xb8, 0x72, 0x8a, 0x73, 0xf8, 0x80, 0x64, 0x41, 0xd2, 0x35, 0xa8, 0x59, 0xa3, 0x4f, 0x46, 0xd4, 0xac, 0x9f, 0x72, 0xe2, 0x62, 0x65, 0x04, 0xfb, 0x7e, 0x4a, 0x21, 0x33, 0xcf, 0x91, 0x2e, 0x5d, 0xa9, 0xfa, 0xee, 0xb8, 0x0e, 0xe2, 0xf0, 0x57, 0x2c, 0xa9, 0x45, 0xb7, 0x6d, 0xc3, 0x96, 0x6d, 0x52, 0xae, 0x69, 0xd8, 0x1a, 0x15, 0x54, 0x3c, 0x6b, 0xa3, 0x1e, 0x51, 0x24, 0x25, 0x83, 0xb6, 0x89, 0x98, 0xc4, 0xc7, 0xa3, 0x6e, 0x50, 0xda, 0x3d, 0xaf, 0xd5, 0x32, 0x7c, 0xb8, 0xd1, 0xf4, 0x08, 0x15, 0x7f, 0x95, 0xfe, 0x8d, 0x37, 0x25, 0xe9, 0x8b, 0x0c, 0x2a, 0xd4, 0x03, 0x57, 0xec, 0xee, 0x53, 0x38, 0x29, 0xe6, 0x60, 0xa7, 0x82, 0x8b, 0xa6, 0x33, 0xee, 0xb7, 0xbc, 0x0c, 0x30, 0x5e, 0xc1, 0x92, 0x4b, 0x21, 0xa6, 0xcb, 0xf7, 0xa6, 0x77, 0xc2, 0xac, 0xc6, 0x0a, 0x1d, 0x05, 0xae, 0xee, 0xe9, 0x7d, 0x91, 0xe6, 0xce, 0xed, 0x3d, 0xcc, 0xf5, 0x67, 0xa4, 0x08, 0x49, 0xf0, 0xd8, 0x28, 0x4c, 0xb4, 0x57, 0x36, 0x79, 0xc4, 0xdf, 0xc4, 0x40, 0x10, 0xc5, 0x96, 0xb5, 0xc1, 0x43, 0xc9, 0x14, 0x3d, 0x86, 0x65, 0x5d, 0xc4, 0xb4, 0xbf, 0x69, 0x10, 0x76, 0xb5, 0xe5, 0x98, 0xe1, 0xe7, 0x19, 0x47, 0xcf, 0x9d, 0x77, 0x0e, 0xcb, 0xd1, 0x20, 0x1d, 0xee, 0x2e, 0x6e, 0x5b, 0xa5, 0xd3, 0x59, 0x28, 0x3b, 0x1b, 0xa3, 0xf4, 0xcc, 0x55, 0xfa, 0x27, 0x9e, 0xf8, 0x00, 0xe8, 0x3f, 0xa0, 0xa5, 0x14, 0x9b, 0x31, 0x13, 0x6c, 0xa5, 0xfb, 0x05, 0x04, 0xa1, 0xba, 0x1c, 0xf4, 0xfd, 0xf4, 0x30, 0x16, 0x55, 0x61, 0x4a, 0x0f, 0xda, 0x7f, 0xa1, 0x1d, 0xf6, 0xa9, 0x2d, 0x4c, 0x2d, 0xec, 0x1e, 0xac, 0xba, 0x31, 0xae, 0x28, 0xaa, 0xc9, 0xb0, 0xc8, 0x39, 0x8c, 0x4f, 0xa1, 0xb8, 0xb4, 0x92, 0x4b, 0xe7, 0xf7, 0x6c, 0xf0, 0x07, 0x5b, 0xd1, 0x70, 0x40, 0xef, 0x67, 0x7b, 0x9e, 0xde, 0x54, 0x0a, 0xb9, 0x04, 0xfd, 0xb3, 0xc4, 0xdb, 0x90, 0x9b, 0xab, 0xa9, 0xc5, 0xdd, 0xaf, 0x9b, 0x9f, 0x46, 0x1f, 0x9c, 0xe8, 0x01, 0xa3, 0x92, 0xe7, 0x3b, 0xea, 0x31, 0xef, 0xba, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x58, 0xd0, 0xfa, 0x1b, 0xf4, 0x76, 0x32, 0x3a, 0xc8, 0xd3, 0x5d, 0x75, 0x65, 0x33, 0x3a, 0x8d, 0x35, 0xc3, 0x0b, 0x5c, 0xba, 0xb8, 0xb1, 0xe5, 0x97, 0x00, 0x66, 0x7f, 0x98, 0xd3, 0xa0, 0x41, 0xb7, 0x4b, 0xd5, 0xe6, 0x54, 0x49, 0x8d, 0x21, 0x29, 0xd8, 0xbf, 0x41, 0x56, 0x2f, 0xb5, 0xe6, 0x78, 0x3c, 0x91, 0xdf, 0x78, 0x9f, 0xf3, 0x87, 0xcc, 0xce, 0x27, 0x87, 0xa3, 0x9f, 0x32, 0x62, 0x70, 0x5a, 0x9a, 0x50, 0x4e, 0xeb, 0x74, 0x4f, 0xae, 0x35, 0x19, 0x7f, 0xf8, 0x49, 0xdc, 0xbc, 0x95, 0x7d, 0x7e, 0x21, 0xdb, 0x69, 0x11, 0x4f, 0xb1, 0xd5, 0x12, 0x7b, 0x69, 0xe0, 0x60, 0x8a, 0xeb, 0x82, 0x6b, 0x92, 0xbd, 0xa4, 0x6f, 0x78, 0xb9, 0x93, 0xdd, 0x7e, 0x6c, 0x63, 0xfb, 0x91, 0xfc, 0xb1, 0x65, 0xf7, 0xbd, 0xd5, 0x7c, 0xcc, 0xb0, 0xb3, 0x95, 0x96, 0xd6, 0x90, 0x4b, 0x39, 0xd0, 0x8a, 0xf0, 0xfb, 0xae, 0x00, 0x20, 0x07, 0x81, 0x79, 0xc6, 0x03, 0x23, 0x11, 0x68, 0x97, 0x3a, 0x3a, 0x8c, 0x84, 0xa4, 0x97, 0xcf, 0x71, 0x2b, 0x2a, 0x67, 0x5b, 0x19, 0x40, 0x3e, 0xf3, 0x72, 0x68, 0x8b, 0x0f, 0x7f, 0xd7, 0x72, 0xe0, 0x61, 0x13, 0x8a, 0xfd, 0x81, 0xbb, 0x88, 0x32, 0x83, 0x70, 0xb2, 0x21, 0xf7, 0xf2, 0xf9, 0x62, 0xb6, 0x95, 0xd7, 0x86, 0xec, 0x0e, 0xdc, 0x45, 0x2b, 0x82, 0x03, 0x7e, 0x96, 0x64, 0xb8, 0x60, 0xa2, 0x34, 0xa9, 0x43, 0x1b, 0xb4, 0x1e, 0xbe, 0x50, 0x8c, 0x47, 0x15, 0x29, 0xc1, 0xa1, 0x0d, 0x0f, 0x11, 0xde, 0xa1, 0xbb, 0x79, 0x60, 0x4b, 0x3b, 0xc1, 0xf5, 0xd1, 0x32, 0x21, 0x02, 0xf3, 0x94, 0x1f, 0xa1, 0xbb, 0x10, 0x05, 0x3e, 0xcf, 0x37, 0xef, 0x16, 0x63, 0x0f, 0x5d, 0x89, 0x2b, 0x1c, 0xe9, 0x95, 0x48, 0xab, 0x1f, 0xa3, 0xfb, 0x12, 0xe6, 0xd3, 0xd8, 0xa7, 0x48, 0xa4, 0xd0, 0xc9, 0x91, 0xe4, 0xfb, 0x1a, 0xe7, 0xf2, 0x2c, 0xaf, 0x0e, 0xa4, 0x9d, 0x2e, 0xac, 0x0f, 0x6c, 0x33, 0xdb, 0xdd, 0x8b, 0x14, 0x1c, 0x98, 0x06, 0x93, 0x1f, 0x27, 0x7a, 0x35, 0xea, 0xcb, 0x89, 0x05, 0x76, 0x09, 0x23, 0x5a, 0x1a, 0x75, 0x8c, 0x1d, 0xea, 0x10, 0x91, 0xcc, 0x56, 0x29, 0x7d, 0x71, 0x38, 0x29, 0x44, 0x68, 0x8a, 0xdb, 0xf1, 0x24, 0x36, 0xb1, 0x85, 0x78, 0x6e, 0x46, 0x1e, 0xb7, 0x92, 0x99, 0x1d, 0xf3, 0x02, 0x03, 0x80, 0x84, 0x67, 0x23, 0x7c, 0xe1, 0xe0, 0x3b, 0xbf, 0x21, 0x26, 0x4f, 0xad, 0xfb, 0x1c, 0xc1, 0xc7, 0x68, 0x2b, 0xde, 0x47, 0xf6, 0x41, 0xd8, 0xc6, 0xd6, 0x39, 0x41, 0x58, 0xce, 0x60, 0x1c, 0xb6, 0x49, 0x41, 0xb8, 0x66, 0x41, 0x02, 0x0e, 0xed, 0x62, 0x44, 0x8e, 0x19, 0x2f, 0xe9, 0x19, 0x85, 0x9c, 0x17, 0xc9, 0xdf, 0xa3, 0xf5, 0xc8, 0x45, 0x7c, 0x05, 0x7f, 0x74, 0xfd, 0x77, 0x7b, 0xab, 0xc4, 0xfc, 0x36, 0xb9, 0xa6, 0xbc, 0x70, 0xbc, 0x0d, 0x88, 0x32, 0xfa, 0xeb, 0x9c, 0x98, 0x7d, 0x50, 0x09, 0x80, 0xfa, 0xfc, 0xa1, 0x16, 0xf1, 0x84, 0x4e, 0xf9, 0xca, 0x5f, 0xdc, 0x18, 0x6b, 0x2b, 0xce, 0xf6, 0xfe, 0x37, 0xa9, 0x6b, 0xf2, 0x6d, 0xa3, 0xa2, 0x37, 0xfa, 0x8d, 0xd8, 0x7d, 0xa6, 0x82, 0xe0, 0xb8, 0x2e, 0x1e, 0x3c, 0xa3, 0x9d, 0x8f, 0x5d, 0xe3, 0x45, 0xec, 0x80, 0x3d, 0x9d, 0x61, 0x43, 0xbd, 0x93, 0xca, 0x27, 0xfd, 0x6d, 0x29, 0x2d, 0xff, 0x7a, 0xe2, 0x13, 0xc1, 0xc1, 0x16, 0x62, 0x80, 0x7c, 0xa1, 0x38, 0x2b, 0x41, 0x2e, 0x3c, 0x4f, 0xf8, 0xc0, 0xd9, 0xd8, 0x96, 0x17, 0xbb, 0x42, 0x89, 0x74, 0x8c, 0x4b, 0x4c, 0x4b, 0xeb, 0x58, 0xfc, 0x12, 0x97, 0x1b, 0xc0, 0x98, 0xbe, 0x82, 0x33, 0x40, 0x92, 0x7b, 0xb2, 0x87, 0xf8, 0xca, 0x9e, 0xa8, 0x8a, 0x44, 0x49, 0xe5, 0x9d, 0x59, 0x37, 0x8d, 0xe9, 0x30, 0xaf, 0x46, 0x4f, 0xb0, 0xe3, 0xc7, 0xff, 0x89, 0x81, 0x33, 0xa7, 0x9e, 0xe2, 0x73, 0x1d, 0x97, 0x4d, 0x54, 0x62, 0xf9, 0xf6, 0x5d, 0x27, 0x56, 0xef, 0x72, 0xd5, 0x30, 0xfc, 0x5e, 0x9a, 0xc8, 0xb9, 0x32, 0x7b, 0xbd, 0x2f, 0x54, 0x2d, 0xa5, 0x40, 0x9f, 0xf8, 0xe4, 0xc8, 0x7a, 0x11, 0x6c, 0xdf, 0x39, 0xcb, 0xc1, 0x9d, 0xef, 0x40, 0x13, 0xac, 0x26, 0xb8, 0xa4, 0x21, 0xf8, 0x1d, 0x66, 0x46, 0xa7, 0xee, 0x2f, 0xa2, 0x4a, 0xf3, 0x9f, 0x0d, 0x63, 0x87, 0x6d, 0xe0, 0x4f, 0x41, 0x62, 0xad, 0xbb, 0x6a, 0x27, 0x70, 0x10, 0xd3, 0x8a, 0x84, 0x12, 0xb5, 0x17, 0xef, 0x72, 0x64, 0x87, 0xdd, 0xda, 0xca, 0x21, 0x52, 0x17, 0x83, 0x53, 0x70, 0x41, 0x7d, 0x93, 0x17, 0x9d, 0x30, 0x8a, 0x99, 0x79, 0xd1, 0xf2, 0x6a, 0x2d, 0x04, 0x65, 0x97, 0x07, 0x37, 0xc0, 0x7a, 0x16, 0xbf, 0x2a, 0x31, 0x52, 0xe2, 0x8c, 0x91, 0x70, 0xf5, 0x1c, 0xe1, 0xa3, 0xe4, 0x8d, 0x48, 0xbb, 0x41, 0xf1, 0x2f, 0x2a, 0x46, 0x9f, 0xa1, 0x20, 0x0b, 0x9e, 0xe9, 0xc5, 0x14, 0x37, 0x0e, 0x4f, 0x99, 0x3d, 0x3e, 0x6d, 0x33, 0x47, 0x02, 0x5e, 0xae, 0x29, 0x61, 0x16, 0x46, 0xe2, 0x37, 0x62, 0x44, 0xcc, 0x3d, 0xfe, 0x5e, 0xcf, 0xb6, 0x92, 0x09, 0x6a, 0x55, 0xa5, 0x20, 0x48, 0xd1, 0x37, 0x80, 0xa8, 0xf5, 0x37, 0x17, 0x36, 0x99, 0x1b, 0x49, 0x30, 0x99, 0x11, 0x6b, 0x29, 0x6b, 0x16, 0x5b, 0x63, 0x81, 0x74, 0xbc, 0xcb, 0xc8, 0x37, 0xff, 0xff, 0x61, 0x85, 0x3a, 0x50, 0xb7, 0xaf, 0x88, 0x38, 0x2f, 0xc1, 0x0b, 0xa6, 0xa8, 0xcc, 0x27, 0x19, 0x2e, 0xb0, 0x0c, 0xfb, 0x8e, 0xfa, 0xa4, 0x4f, 0xb2, 0x1c, 0x16, 0x8c, 0xc6, 0xae, 0x7b, 0x4e, 0xf4, 0x19, 0x27, 0x7e, 0xdb, 0xa6, 0x4b, 0xb0, 0x93, 0xa8, 0x46, 0x1c, 0x5b, 0xcc, 0x89, 0x37, 0x64, 0x04, 0x3c, 0x96, 0x74, 0xba, 0x60, 0x55, 0x74, 0x33, 0xbf, 0xbc, 0xad, 0x07, 0x35, 0xef, 0xbc, 0x6e, 0x49, 0x94, 0x47, 0xc3, 0xdb, 0x70, 0x53, 0x80, 0x08, 0xd1, 0x7d, 0x0e, 0xbc, 0x2c, 0x3c, 0xb1, 0x5d, 0x77, 0xae, 0x76, 0xb5, 0x5c, 0x5f, 0xf3, 0x3a, 0x5a, 0xfc, 0xad, 0x2d, 0x7b, 0x8e, 0xf5, 0x33, 0x60, 0x04, 0x6b, 0x9c, 0xec, 0x89, 0x5c, 0xa6, 0x5c, 0xb7, 0xfa, 0x2d, 0x09, 0xa7, 0x96, 0x7f, 0x84, 0xc6, 0x26, 0xae, 0x75, 0x46, 0x39, 0x2b, 0x4b, 0xd5, 0x26, 0x0c, 0x4e, 0x57, 0x30, 0xf8, 0x57, 0x3b, 0xb7, 0x2b, 0xfa, 0x7b, 0x45, 0x4e, 0xb8, 0xf0, 0x05, 0x76, 0x9d, 0xc1, 0xbe, 0x64, 0x59, 0xce, 0xc7, 0xbb, 0x55, 0xd2, 0x05, 0x15, 0x34, 0xc8, 0x52, 0x31, 0xdf, 0x43, 0x92, 0xe3, 0x3a, 0x09, 0x50, 0xe4, 0x18, 0x43, 0x0c, 0x42, 0xc0, 0x56, 0x80, 0x5c, 0xeb, 0xc0, 0x58, 0xec, 0x3e, 0x58, 0xc7, 0x0a, 0xd2, 0xb8, 0x06, 0x6a, 0xeb, 0xec, 0x30, 0xf8, 0x0a, 0xa5, 0xde, 0xa4, 0x4d, 0x87, 0xde, 0xc7, 0x36, 0x41, 0xb0, 0xea, 0xad, 0x5e, 0x00, 0x2a, 0x73, 0x9d, 0x92, 0x34, 0xae, 0x96, 0xfb, 0xb5, 0xb8, 0x05, 0xa6, 0x62, 0x33, 0xb6, 0xb5, 0xad, 0xa2, 0x0a, 0x06, 0x69, 0x5d, 0xcb, 0x47, 0xe8, 0x6a, 0xbc, 0x5f, 0x6c, 0xc8, 0xea, 0x60, 0x53, 0x9e, 0x42, 0x80, 0x37, 0x45, 0xc7, 0x3e, 0xfd, 0xa8, 0xb2, 0x3c, 0x4e, 0x77, 0xd0, 0x25, 0xb4, 0x5a, 0x24, 0xce, 0x55, 0xc9, 0xa7, 0x88, 0x83, 0x71, 0x8e, 0x67, 0xda, 0x3b, 0xd3, 0x4a, 0x45, 0xae, 0x57, 0xbe, 0x9b, 0x64, 0xf8, 0x98, 0x11, 0xbe, 0x17, 0xa9, 0xac, 0xbe, 0x79, 0x98, 0x38, 0xc7, 0x5d, 0x19, 0x9e, 0x96, 0x41, 0xa4, 0x5d, 0xc7, 0x97, 0xa6, 0x0b, 0x4d, 0xdf, 0x0a, 0xf3, 0x85, 0xb9, 0x57, 0x34, 0x4d, 0xd3, 0xb3, 0xdd, 0x69, 0x6f, 0x42, 0x5c, 0xf7, 0xb7, 0x36, 0xff, 0x1e, 0x2c, 0x7f, 0xe9, 0x6b, 0xb8, 0x44, 0x5e, 0xbe, 0xd3, 0xed, 0x1f, 0xed, 0x1d, 0x81, 0xf1, 0x5b, 0xb4, 0x10, 0xc9, 0x7f, 0x03, 0x7a, 0xaa, 0x03, 0x7f, 0x0e, 0x4e, 0xba, 0x8a, 0x6e, 0x76, 0x60, 0xd7, 0xb7, 0x9a, 0xc2, 0xbf, 0x72, 0x54, 0x39, 0x23, 0x67, 0x55, 0x31, 0x27, 0xf7, 0xb1, 0x96, 0xd9, 0x6e, 0x55, 0xeb, 0x4f, 0xd9, 0xca, 0xe6, 0x12, 0xa9, 0x12, 0xd8, 0x12, 0xba, 0x71, 0x5d, 0xff, 0x69, 0xf3, 0xc2, 0x54, 0x1e, 0xd6, 0xb8, 0x7f, 0x72, 0x0c, 0x7c, 0xa5, 0xaf, 0x74, 0xff, 0xcb, 0x35, 0x77, 0x33, 0x14, 0xc3, 0xdc, 0x4e, 0xe8, 0xd8, 0xf0, 0x95, 0x05, 0xef, 0x8c, 0xf1, 0xf3, 0x5f, 0x5a, 0xed, 0xbd, 0x1d, 0x3e, 0x8c, 0xf9, 0x51, 0xad, 0xef, 0x97, 0x57, 0xaf, 0x82, 0x3f, 0x96, 0x96, 0x4b, 0x8e, 0xe2, 0x3c, 0x80, 0x71, 0x24, 0xd7, 0x68, 0x6d, 0xda, 0x0c, 0x1f, 0xa8, 0x0c, 0x5c, 0x6c, 0x7d, 0x83, 0xab, 0x6f, 0x9f, 0x23, 0xee, 0xbb, 0xc1, 0xca, 0x4c, 0xb4, 0x04, 0xcc, 0xb6, 0x9b, 0x5b, 0x9f, 0x61, 0x57, 0xf8, 0x25, 0x10, 0xa9, 0x18, 0x9d, 0x2f, 0x77, 0xdd, 0xc4, 0xe7, 0xa7, 0x7e, 0x0b, 0x97, 0x28, 0xc3, 0x31, 0xd4, 0xd9, 0xf9, 0x18, 0x07, 0x43, 0x19, 0xdd, 0x81, 0x08, 0x43, 0x73, 0xe4, 0x69, 0x0e, 0x91, 0x0a, 0xf1, 0x88, 0xbb, 0x9b, 0xa2, 0x90, 0x9d, 0xd1, 0x95, 0xc8, 0x0f, 0xdf, 0x70, 0x36, 0x60, 0xcb, 0xb4, 0x2e, 0xca, 0x02, 0x95, 0x52, 0x64, 0x64, 0x62, 0x60, 0x3d, 0xb1, 0xaa, 0x1f, 0xbc, 0xd5, 0x56, 0x6c, 0x42, 0x92, 0xdd, 0xfc, 0xb6, 0x4c, 0x91, 0x6c, 0x33, 0x04, 0xad, 0x74, 0x89, 0x46, 0x5a, 0xef, 0xa7, 0xe8, 0x30, 0xd8, 0x63, 0x9d, 0x4f, 0xe5, 0x8e, 0xa3, 0x14, 0x31, 0x65, 0x4b, 0x37, 0xde, 0x88, 0x29, 0xa6, 0x3b, 0x6a, 0x87, 0x2b, 0x1c, 0xa3, 0x0e, 0xef, 0x6f, 0x2f, 0xa3, 0x6d, 0xad, 0x32, 0x5e, 0x69, 0xed, 0x00, 0x1b, 0x8b, 0x90, 0xc3, 0xfa, 0x52, 0xfe, 0xea, 0xb5, 0x9f, 0xc4, 0xc5, 0x46, 0x31, 0x61, 0xf7, 0xa1, 0x33, 0xf0, 0x7c, 0xbf, 0xb4, 0xa4, 0x58, 0x16, 0xd8, 0x88, 0xba, 0xef, 0xc1, 0x9b, 0x6d, 0x3c, 0x6d, 0x1a, 0x48, 0x3c, 0x4f, 0x0b, 0x2b, 0x5e, 0x67, 0xb6, 0x62, 0x17, 0x50, 0xe4, 0x69, 0xfb, 0x0c, 0x5c, 0xe7, 0x3f, 0xfa, 0x4f, 0x68, 0x6b, 0x27, 0x52, 0x7e, 0xdc, 0xa1, 0xf3, 0x8e, 0xeb, 0x67, 0x06, 0xe0, 0xee, 0xe8, 0x13, 0xab, 0xa1, 0x6c, 0xe1, 0x3b, 0x19, 0x2f, 0xed, 0xa8, 0xe0, 0x57, 0x4f, 0x28, 0xd6, 0x67, 0xd2, 0x33, 0x7d, 0xb5, 0x54, 0x41, 0x79, 0x5a, 0x8e, 0xbd, 0x74, 0xeb, 0x50, 0x01, 0xf2, 0x59, 0x0b, 0xa0, 0x84, 0xbd, 0x9c, 0xcb, 0x18, 0xf0, 0x89, 0x17, 0xef, 0x54, 0x33, 0x7b, 0x08, 0xda, 0x59, 0xaa, 0x60, 0x83, 0xa2, 0x5c, 0xdc, 0x3d, 0xae, 0x38, 0xf8, 0x2f, 0x73, 0xfb, 0x25, 0x4b, 0x97, 0xee, 0xfd, 0xc6, 0x50, 0x4a, 0x50, 0xc8, 0x40, 0x0e, 0x49, 0xd1, 0x29, 0x0a, 0xc9, 0xf3, 0x87, 0x6d, 0x0b, 0x0f, 0x90, 0x7b, 0x77, 0xeb, 0x1f, 0x31, 0x23, 0x9b, 0x7d, 0xfd, 0xa8, 0x83, 0xe8, 0x93, 0x01, 0x29, 0x52, 0x10, 0xb0, 0x9e, 0x74, 0x52, 0x87, 0x92, 0x96, 0x1a, 0xf5, 0xf2, 0x99, 0xf0, 0x96, 0xe8, 0x08, 0xd2, 0xcc, 0x54, 0x5a, 0xe1, 0xd8, 0xf6, 0x42, 0xc2, 0xb6, 0x20, 0x7e, 0x41, 0x33, 0xb5, 0xdf, 0xde, 0x20, 0x0a, 0x94, 0x8b, 0x7f, 0xec, 0x23, 0x29, 0x77, 0xfb, 0xda, 0xc9, 0x53, 0x28, 0x5e, 0x45, 0x0a, 0xd6, 0xa3, 0x13, 0x45, 0x17, 0x24, 0x22, 0xa3, 0x7e, 0x2a, 0xf2, 0x78, 0xce, 0x9b, 0x78, 0xc9, 0xe5, 0x22, 0xad, 0x6b, 0xcd, 0xcb, 0xc6, 0x7b, 0x41, 0xce, 0x38, 0x38, 0x46, 0x6a, 0xe0, 0xff, 0xc7, 0x42, 0x06, 0x1a, 0x38, 0xe0, 0xa1, 0x92, 0xab, 0x4b, 0x79, 0xf2, 0x22, 0x1b, 0x86, 0xeb, 0x9c, 0x2c, 0xcd, 0x75, 0x3d, 0xc3, 0xe8, 0x6c, 0x2f, 0xb0, 0x51, 0x70, 0x9f, 0x5f, 0x08, 0x9c, 0xb1, 0x15, 0x12, 0x75, 0x60, 0xfc, 0x15, 0x15, 0x95, 0x90, 0x55, 0x42, 0x3a, 0xc4, 0x2a, 0x25, 0x98, 0x89, 0x74, 0xbe, 0x5c, 0x4b, 0xd7, 0xcb, 0xa8, 0xed, 0x36, 0xe3, 0x82, 0x41, 0xd3, 0x7e, 0x57, 0xb7, 0x06, 0x36, 0x6e, 0xcf, 0xbb, 0x04, 0xbc, 0xa0, 0xfa, 0x61, 0xcb, 0x29, 0x8a, 0x49, 0xbb, 0x70, 0xc1, 0x9e, 0xc7, 0xea, 0xe3, 0xd5, 0xfb, 0x8c, 0xff, 0xee, 0xc4, 0x7e, 0x0f, 0xe0, 0x7a, 0xd9, 0xc3, 0x81, 0x2d, 0x97, 0x4a, 0x1f, 0x6a, 0xd2, 0x1f, 0xa3, 0x36, 0x05, 0x84, 0xda, 0xa8, 0x24, 0x8b, 0x73, 0x64, 0x18, 0xa2, 0x05, 0x5a, 0x6c, 0x87, 0xfc, 0x94, 0x4a, 0x41, 0x6e, 0x13, 0xbd, 0x5c, 0x4b, 0xa6, 0x17, 0x08, 0xaa, 0x8d, 0x99, 0xe1, 0xb2, 0x2b, 0x77, 0x37, 0x0f, 0xd0, 0x72, 0x24 }; +constexpr AccessUnit ATRACX_SIZE_MISMATCH_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x71, 0x4c, 0x99, 0x14, 0x4a, 0x0d, 0x1d, 0xe6, 0x05, 0x5c, 0x64, 0xa7, 0xa0, 0xd6, 0x4b, 0x56, 0x87, 0xe4, 0x5d, 0x61 } }; + +const std::vector AC3_SIZE_MISMATCH_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x0b, 0x77, 0x31, 0xfd, 0x1c, 0x4b, 0x30, 0xa2, 0xe6, 0x40, 0x35, 0x38, 0xe1, 0xea, 0xc9, 0xcb, 0x6d, 0x24, 0x95, 0x8e, 0x57, 0xe6, 0xfc, 0x72, 0xf4, 0x35, 0xca, 0x6d, 0x13, 0x5a, 0x24, 0xa4, 0x03, 0x6e, 0x1d, 0x22, 0x04, 0xc8, 0xdc, 0xa5, 0x99, 0x12, 0x6d, 0xc6, 0x69, 0x0e, 0x5e, 0x59, 0x09, 0x64, 0x9d, 0xa7, 0x5e, 0xc2, 0x7f, 0xe8, 0x0f, 0xe9, 0x09, 0xc5, 0x5f, 0xe7, 0x52, 0x84, 0x3a, 0xdf, 0xf7, 0x73, 0x53, 0x36, 0x46, 0xc9, 0x02, 0xf5, 0x33, 0xc9, 0x73, 0x46, 0xe2, 0x68, 0xbd, 0xf5, 0x51, 0x86, 0xd9, 0x16, 0x54, 0x38, 0x35, 0xf5, 0xf6, 0xe5, 0x0b, 0xa4, 0xe3, 0xcb, 0xea, 0x2d, 0x55, 0x22, 0xcb, 0xf8, 0xbc, 0x8f, 0x53, 0xa4, 0xf9, 0xaa, 0x85, 0x4f, 0x7e, 0xab, 0xec, 0x25, 0xca, 0x27, 0x9c, 0xc6, 0x99, 0xbf, 0xb0, 0x68, 0x5d, 0x57, 0xb8, 0x60, 0x0a, 0xa6, 0x95, 0xeb, 0xdf, 0x64, 0x11, 0x73, 0x18, 0x6e, 0x64, 0x19, 0xd3, 0x7b, 0x52, 0xc9, 0x05, 0x18, 0x39, 0x20, 0xb2, 0x07, 0xf0, 0x87, 0xe7, 0xff, 0xa3, 0x3a, 0x4b, 0xa4, 0xf2, 0xce, 0xcf, 0xf5, 0xcc, 0x0f, 0xdf, 0x67, 0x31, 0x8c, 0x77, 0x99, 0x81, 0x28, 0xa9, 0x58, 0xd3, 0x55, 0x8e, 0xdc, 0xb6, 0xae, 0x9f, 0x1f, 0x3b, 0xb8, 0x45, 0x97, 0xfb, 0x7b, 0xc1, 0x27, 0x4e, 0x65, 0xcc, 0xc7, 0xa5, 0xea, 0xd2, 0x0e, 0xbf, 0x68, 0x9a, 0xb5, 0x4e, 0xee, 0x2e, 0xc7, 0x18, 0x5a, 0x89, 0x3d, 0x54, 0x0d, 0x62, 0x6d, 0x68, 0x71, 0x91, 0xc4, 0x05, 0x4e, 0xd5, 0x11, 0x8e, 0x16, 0xe3, 0x54, 0xd2, 0xa4, 0x30, 0xf4, 0xde, 0xfc, 0xdc, 0x85, 0xf0, 0xf4, 0x0a, 0xb4, 0xd5, 0xfb, 0xc7, 0xff, 0x65, 0xfe, 0x1c, 0x4f, 0xda, 0xfc, 0x38, 0x77, 0xc4, 0xfc, 0xfe, 0xe4, 0x78, 0x25, 0xe6, 0xd4, 0x0c, 0x43, 0x51, 0xea, 0x9d, 0x46, 0xb2, 0xd6, 0x9e, 0xc2, 0x82, 0x5f, 0xbb, 0x0e, 0xfb, 0xb6, 0xf4, 0x7a, 0x54, 0x92, 0x08, 0x8d, 0xcf, 0xae, 0x37, 0x63, 0x18, 0xc1, 0xf3, 0xa9, 0xa2, 0x8f, 0x7c, 0xd1, 0x06, 0xfe, 0xfc, 0x4d, 0xdc, 0xb1, 0x6b, 0x42, 0xa1, 0xaf, 0xc6, 0x4a, 0xd4, 0x3b, 0x4a, 0xad, 0xb4, 0x16, 0x9b, 0x39, 0x85, 0x29, 0x97, 0xd0, 0x94, 0xc6, 0x48, 0x6c, 0x2f, 0xa9, 0x19, 0x48, 0x62, 0x8d, 0x3b, 0x8b, 0xec, 0x0b, 0xa7, 0xca, 0xd0, 0x11, 0x93, 0xe3, 0xb8, 0x50, 0x93, 0x16, 0x42, 0xe9, 0x4f, 0x8c, 0x43, 0xfe, 0x6b, 0xcc, 0x17, 0x06, 0x18, 0x3b, 0xd3, 0xd1, 0xb0, 0xb4, 0xa5, 0x4c, 0xb3, 0xaa, 0x04, 0xbf, 0xc3, 0x08, 0xe1, 0x7d, 0xae, 0xa4, 0x5f, 0x95, 0xf3, 0x17, 0x62, 0x9c, 0x64, 0x5f, 0x26, 0x4f, 0x06, 0xed, 0x4e, 0x79, 0x18, 0x03, 0x4b, 0xb8, 0x61, 0xbb, 0x5a, 0xae, 0x51, 0xc3, 0x32, 0x67, 0xe5, 0xc2, 0x5a, 0x03, 0x2e, 0xee, 0xf8, 0x07, 0x4b, 0x06, 0x47, 0xe2, 0x6b, 0x0e, 0x08, 0xa7, 0xab, 0x1e, 0xa0, 0xf4, 0x85, 0x87, 0xb9, 0xec, 0xf7, 0x53, 0x8b, 0xbf, 0xf3, 0x4e, 0xb6, 0x5f, 0x00, 0x32, 0x5c, 0x07, 0xce, 0xc6, 0x9a, 0x24, 0xb7, 0x9e, 0x31, 0x20, 0xb5, 0x54, 0x79, 0x0e, 0x53, 0xca, 0x95, 0x09, 0xc9, 0x12, 0x8a, 0xb5, 0xed, 0xab, 0xc8, 0xb4, 0xdb, 0x76, 0x13, 0xb5, 0x10, 0x0a, 0x45, 0x78, 0xd4, 0xc5, 0x81, 0x3a, 0x11, 0x99, 0x14, 0x44, 0x43, 0x19, 0x6f, 0x16, 0x77, 0xd7, 0x14, 0xeb, 0x59, 0xb3, 0x55, 0xae, 0x69, 0xc9, 0x72, 0xd7, 0xb6, 0x50, 0x2a, 0xc2, 0xe0, 0x27, 0x72, 0xc7, 0xcf, 0xc5, 0x42, 0x32, 0x38, 0x92, 0xf3, 0x1a, 0x46, 0x90, 0x90, 0xa5, 0x5d, 0xf6, 0x46, 0xf7, 0x3e, 0x0c, 0x1a, 0x6e, 0x71, 0x2b, 0x30, 0xe0, 0x46, 0x6b, 0x9a, 0xc6, 0x2b, 0xb2, 0x89, 0xdb, 0x52, 0xe9, 0x5a, 0x58, 0x9b, 0x50, 0xb5, 0x75, 0xe1, 0xfa, 0x66, 0xf3, 0x69, 0x1e, 0x78, 0x90, 0x8e, 0x4c, 0x0c, 0xd4, 0xe7, 0x9d, 0xbc, 0x02, 0x8b, 0x2a, 0xfb, 0xca, 0x6d, 0x68, 0x28, 0x1e, 0x47, 0x08, 0x24, 0xe3, 0xce, 0x05, 0x60, 0x0e, 0xe1, 0xf7, 0x17, 0x13, 0xbd, 0xd3, 0x97, 0x78, 0x9b, 0xd5, 0x5a, 0x61, 0x4a, 0x16, 0x41, 0xb9, 0x37, 0xa4, 0x92, 0xe5, 0xc5, 0x99, 0x73, 0xf6, 0x14, 0xcd, 0xfd, 0x7a, 0x9e, 0x6c, 0x39, 0x00, 0x9a, 0xb1, 0x77, 0x7e, 0x78, 0x11, 0xef, 0x63, 0xec, 0xcc, 0x47, 0x71, 0xed, 0xd5, 0x64, 0xa5, 0xe6, 0xc7, 0xf9, 0x6c, 0xf0, 0x6d, 0x7b, 0x3a, 0x78, 0x4e, 0x8e, 0x8e, 0x9c, 0xbd, 0x69, 0x62, 0xdc, 0xec, 0xd1, 0xe0, 0xe1, 0x8f, 0x7f, 0x4e, 0x57, 0x7a, 0x7e, 0xa6, 0x25, 0x7d, 0xfa, 0xee, 0x6a, 0x7c, 0x67, 0x79, 0x80, 0x83, 0xb7, 0x7e, 0xb0, 0x4b, 0xba, 0x2f, 0x97, 0xba, 0x90, 0xae, 0x1a, 0xe5, 0x28, 0xea, 0xf6, 0x18, 0xe8, 0xc7, 0xfb, 0xb8, 0xa9, 0xa0, 0x0f, 0x15, 0x34, 0x14, 0x92, 0xfe, 0x84, 0x9b, 0x76, 0x83, 0xba, 0xe4, 0x07, 0xd6, 0x4e, 0x7f, 0xa7, 0xfc, 0x42, 0xd2, 0x50, 0x37, 0x96, 0x25, 0xe3, 0x2e, 0xfd, 0x4c, 0xdc, 0xbe, 0x6b, 0x09, 0x49, 0xa5, 0x46, 0xa9, 0xdd, 0x96, 0x70, 0x5c, 0x30, 0x6d, 0xbf, 0x5a, 0x3c, 0xda, 0x39, 0x56, 0xe4, 0x42, 0x73, 0x99, 0xcf, 0x1c, 0x0b, 0x2d, 0x22, 0x8d, 0x6e, 0xd0, 0x1e, 0xb9, 0x6c, 0x90, 0xc8, 0xfd, 0xe2, 0xe8, 0xdc, 0x81, 0x14, 0x34, 0xdd, 0x59, 0xdf, 0xce, 0xc0, 0x05, 0x43, 0xb6, 0x49, 0xbd, 0x15, 0xd0, 0xe9, 0xea, 0x3b, 0x46, 0xe3, 0x88, 0xe8, 0xa2, 0x0a, 0xf4, 0x28, 0xf1, 0xc5, 0xa4, 0xdd, 0x8b, 0x06, 0xe2, 0x84, 0x93, 0xa2, 0xc1, 0x87, 0xdd, 0x3f, 0x49, 0x4b, 0x88, 0x58, 0x2c, 0x93, 0x3c, 0x89, 0xb9, 0x30, 0xda, 0x8b, 0x22, 0x23, 0x35, 0x57, 0x3e, 0x2c, 0xe9, 0x09, 0x2c, 0xd0, 0x3a, 0x12, 0xe7, 0x9b, 0xb0, 0xd5, 0x3c, 0x12, 0xc3, 0x7c, 0x41, 0x51, 0x5b, 0x58, 0x3e, 0xf0, 0x0c, 0x90, 0x26, 0xa5, 0xab, 0xe9, 0x50, 0x6b, 0x50, 0x89, 0x0d, 0x66, 0xc0, 0x82, 0x5e, 0x49, 0xd2, 0x55, 0xea, 0xbc, 0x8f, 0x98, 0x21, 0x91, 0xad, 0xed, 0x23, 0x58, 0xda, 0xa9, 0x7f, 0xa6, 0xd5, 0xca, 0x63, 0x37, 0x72, 0x95, 0x6e, 0x76, 0xc7, 0x0c, 0x6e, 0xe1, 0xa9, 0x5e, 0x91, 0x66, 0xab, 0xa3, 0x63, 0xa1, 0xc0, 0xd9, 0x6a, 0x28, 0x79, 0xdd, 0xf1, 0xb1, 0x8a, 0x8f, 0x3c, 0xee, 0x62, 0x22, 0x73, 0x72, 0xb4, 0xfa, 0x2d, 0x1a, 0x2e, 0x72, 0x97, 0xb0, 0x8f, 0x78, 0x8c, 0x8e, 0xd8, 0xa7, 0xfb, 0xb4, 0xfa, 0x78, 0xee, 0x16, 0x6c, 0x8c, 0x7e, 0x64, 0xc3, 0xe6, 0xef, 0x3b, 0xbb, 0x95, 0xbb, 0xc4, 0x92, 0xaf, 0x9d, 0x0a, 0xca, 0xd5, 0x29, 0xf8, 0x51, 0x2f, 0xbf, 0x53, 0xc3, 0x6f, 0x0d, 0x90, 0x7e, 0x82, 0x05, 0x01, 0xfb, 0xee, 0x15, 0x8b, 0x04, 0xcc, 0xae, 0xb6, 0x7c, 0x57, 0x58, 0xba, 0x6a, 0xfc, 0x17, 0x40, 0x3b, 0x1c, 0x08, 0xed, 0xb9, 0xdf, 0x70, 0x4f, 0x3b, 0x02, 0xbf, 0x2d, 0x5f, 0x06, 0x74, 0x34, 0x45, 0x41, 0x4f, 0xef, 0x40, 0x79, 0x02, 0x57, 0x0d, 0x74, 0xd7, 0x2a, 0x03, 0x92, 0xa1, 0xa8, 0x03, 0xc2, 0x4e, 0x34, 0x82, 0xf5, 0x70, 0x6d, 0x00, 0x6b, 0x3a, 0xc3, 0x87, 0x73, 0x74, 0xec, 0xa4, 0xf6, 0xd7, 0xda, 0x8f, 0x4d, 0xef, 0x73, 0x79, 0x3e, 0x1b, 0x45, 0xcb, 0x27, 0x10, 0x5b, 0xc8, 0xe7, 0xd4, 0x88, 0x7d, 0x45, 0xdd, 0x12, 0x26, 0xf1, 0x66, 0x7e, 0xfd, 0xa9, 0xb7, 0x71, 0xd8, 0xbd, 0x43, 0x69, 0x51, 0xe4, 0x37, 0xcd, 0x27, 0x21, 0x9a, 0x73, 0xef, 0xf0, 0x7f, 0x76, 0xbf, 0xfe, 0x15, 0xbd, 0x68, 0x6e, 0x6e, 0xbc, 0xf8, 0xad, 0x76, 0xd5, 0x19, 0xd0, 0x01, 0x0c, 0xa1, 0xe1, 0x9e, 0xdd, 0x61, 0x37, 0xe8, 0x80, 0x08, 0xcb, 0x21, 0x4a, 0xf9, 0x2c, 0x32, 0xf4, 0x30, 0x9e, 0x51, 0x2a, 0x7f, 0xda, 0x74, 0x72, 0x23, 0x7f, 0x33, 0xa7, 0xe8, 0xa6, 0x18, 0xe5, 0x3c, 0xa6, 0x11, 0x1c, 0x43, 0x1f, 0x4f, 0xb0, 0xb6, 0x15, 0x8b, 0x89, 0x6e, 0xb8, 0xc3, 0x97, 0xe3, 0xe5, 0x65, 0x32, 0x0a, 0xe4, 0xae, 0x28, 0x4d, 0x76, 0x33, 0x66, 0x8a, 0x58, 0x36, 0xce, 0xa3, 0xab, 0x36, 0x3f, 0x42, 0x21, 0xa8, 0xa9, 0x8f, 0xe5, 0x6b, 0x75, 0x36, 0x4e, 0x60, 0x8f, 0x06, 0x1d, 0x19, 0x9d, 0x99, 0xba, 0x34, 0xe7, 0xe9, 0x6c, 0xd7, 0x90, 0xc7, 0x3d, 0x12, 0x9b, 0xc8, 0x6b, 0x11, 0xb5, 0x46, 0xf0, 0x1b, 0x1d, 0xdb, 0xe3, 0xc0, 0x3d, 0x2f, 0x85, 0xa9, 0x64, 0xe2, 0x74, 0xa7, 0x2d, 0xe1, 0x81, 0x6b, 0x96, 0xa2, 0x81, 0xba, 0xd4, 0x5c, 0x95, 0xc8, 0xa3, 0xc1, 0x95, 0x65, 0x5d, 0x91, 0xca, 0xa6, 0x9e, 0x1d, 0x1b, 0x41, 0x3a, 0x9a, 0x68, 0x9f, 0x51, 0x59, 0x1a, 0x81, 0xe0, 0x46, 0x02, 0x46, 0xfd, 0x11, 0xe5, 0x48, 0x86, 0xde, 0x7d, 0xed, 0x3c, 0xb1, 0x0d, 0x81, 0x1d, 0x13, 0x47, 0x0c, 0xda, 0xd8, 0xe0, 0xac, 0x42, 0xb8, 0x0b, 0x29, 0x73, 0x36, 0xe8, 0xaf, 0x95, 0xf3, 0xce, 0xdf, 0xe1, 0xd7, 0x62, 0xe3, 0xac, 0x53, 0x8d, 0x7b, 0x63, 0x13, 0x3b, 0xdc, 0xd3, 0x9a, 0xc9, 0x3f, 0x71, 0x2d, 0x3e, 0xef, 0x48, 0x82, 0x15, 0xe6, 0xb7, 0xbb, 0x56, 0xd6, 0x7d, 0xda, 0xb3, 0x97, 0x39, 0x96, 0xc5, 0xa6, 0x66, 0x8b, 0xb1, 0x94, 0x93, 0x40, 0xa5, 0xc2, 0x52, 0x34, 0x04, 0xce, 0xeb, 0xf4, 0x93, 0x37, 0xa5, 0xa6, 0xd0, 0xef, 0x38, 0x74, 0x19, 0x82, 0x7d, 0x77, 0x47, 0x8c, 0xac, 0x33, 0x82, 0x2b, 0x23, 0x71, 0x28, 0xb0, 0xa5, 0x93, 0xc2, 0x30, 0x5b, 0x6e, 0x30, 0xa8, 0xcc, 0x42, 0x59, 0x10, 0xb9, 0x91, 0x1f, 0xe0, 0x2c, 0x5d, 0x54, 0x1e, 0xef, 0x03, 0x3d, 0x76, 0xb4, 0x6e, 0xc3, 0x0a, 0x6a, 0x35, 0xac, 0xda, 0x96, 0xfa, 0xb5, 0x33, 0x48, 0xe1, 0x2f, 0x2d, 0x7d, 0xec, 0x53, 0x6e, 0xfe, 0xa5, 0x50, 0x2f, 0x9b, 0x00, 0x22, 0xed, 0x02, 0x90, 0xe1, 0xa1, 0xb8, 0x5d, 0x86, 0x28, 0xac, 0x45, 0xee, 0xfa, 0x84, 0x72, 0x30, 0xe8, 0xe7, 0x21, 0x65, 0xe6, 0xcc, 0x3c, 0x99, 0x35, 0x97, 0x25, 0xd8, 0x86, 0x49, 0x14, 0xde, 0x2e, 0x5e, 0x1c, 0xf7, 0x8f, 0x2c, 0xd1, 0x5d, 0x83, 0x9a, 0x43, 0xf8, 0x6c, 0x93, 0xdd, 0x8a, 0x51, 0xab, 0xd4, 0x3b, 0x28, 0xa8, 0x02, 0x40, 0x94, 0x67, 0x23, 0x83, 0x7b, 0xff, 0xc2, 0xcd, 0x2a, 0x06, 0x05, 0x9e, 0xae, 0x0f, 0x5f, 0xfa, 0x80, 0x2a, 0xa9, 0x25, 0xab, 0x32, 0x38, 0x4a, 0x19, 0x2b, 0x51, 0x57, 0xb1, 0x15, 0xba, 0x1b, 0x1d, 0x0b, 0xee, 0xfb, 0xe5, 0xe1, 0x31, 0x10, 0x63, 0x36, 0x56, 0x0a, 0xd9, 0x13, 0xfe, 0x85, 0x0a, 0xf0, 0x8e, 0x2b, 0xc0, 0x9e, 0xf8, 0x90, 0xc5, 0x9d, 0xf3, 0x8c, 0x2f, 0xb8, 0x3f, 0x67, 0x46, 0x8c, 0xec, 0xab, 0xac, 0x29, 0xcf, 0x5d, 0x6b, 0x26, 0x94, 0x9a, 0x90, 0x65, 0x6a, 0x7f, 0x76, 0xad, 0xc2, 0x88, 0x31, 0xcc, 0x10, 0xaa, 0xf2, 0x26, 0xc8, 0x0c, 0x30, 0xf0, 0x9d, 0xcd, 0xf0, 0x9c, 0xfe, 0xb3, 0x34, 0x4f, 0x7f, 0x9d, 0x8d, 0xdb, 0x46, 0x04, 0x2c, 0x8a, 0xa3, 0x1a, 0xab, 0x9a, 0xa6, 0x7f, 0xad, 0xec, 0x05, 0x76, 0x43, 0xd5, 0x42, 0x94, 0x2c, 0xea, 0x4e, 0x2a, 0x89, 0x11, 0x4a, 0x0b, 0x3c, 0x80, 0xde, 0x86, 0x61, 0x90, 0x9d, 0x2a, 0x44, 0xe7, 0xcf, 0x8c, 0xae, 0xce, 0xf0, 0xa8, 0xeb, 0xaf, 0x8d, 0xd9, 0xd0, 0x09, 0xb8, 0xce, 0x28, 0x0e, 0x28, 0xe0, 0xeb, 0x7b, 0x7c, 0x44, 0xc4, 0x91, 0x02, 0x34, 0xdc, 0x27, 0xbf, 0xd4, 0x75, 0x7a, 0xa5, 0x4f, 0x6b, 0x70, 0xf5, 0x96, 0x80, 0x43, 0xe0, 0xb3, 0x93, 0x06, 0xc0, 0xdc, 0x29, 0x14, 0x3e, 0x80, 0x82, 0x95, 0x03, 0xf8, 0xe5, 0xbf, 0x95, 0xe9, 0x9c, 0xdc, 0xbf, 0xc6, 0xac, 0xb6, 0x0f, 0xb7, 0x95, 0xc9, 0x8e, 0x15, 0xc7, 0x9c, 0x1f, 0xd4, 0xae, 0xfe, 0xa1, 0xe8, 0x19, 0x72, 0xb4, 0xd1, 0x14, 0x49, 0xe3, 0x53, 0x9a, 0x3a, 0x30, 0x45, 0x2c, 0xa0, 0xf0, 0x21, 0xc8, 0xee, 0x61, 0x8e, 0x2a, 0xa3, 0x1b, 0xfd, 0xd7, 0xf4, 0x04, 0xd6, 0xa6, 0xa4, 0xb7, 0x1e, 0x13, 0x5c, 0x5a, 0x0e, 0xf8, 0x7b, 0xb6, 0x10, 0x07, 0x35, 0xc4, 0x1b, 0x50, 0xa9, 0xd9, 0x9b, 0xdb, 0xa8, 0xf0, 0x67, 0xa8, 0x3e, 0x50, 0x71, 0x32, 0xfb, 0x37, 0xfe, 0x51, 0xff, 0x18, 0x57, 0x3a, 0xce, 0x7f, 0x50, 0x5c, 0xb2, 0xd6, 0xd8, 0xc1, 0xb4, 0x71, 0xe6, 0x49, 0xf1, 0x39, 0xad, 0x9b, 0xea, 0x2e, 0x8f, 0x68, 0x6d, 0x05, 0x34, 0x30, 0x9d, 0x72, 0x7c, 0x50, 0x98, 0xcc, 0x55, 0x18, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x1d, 0x0b, 0x3f, 0xee, 0x73, 0x16, 0x75, 0x44, 0x00, 0x0f, 0x64, 0xd1, 0x17, 0xe7, 0x11, 0xdc, 0x36, 0x45, 0xe8, 0x21, 0x49, 0x4b, 0x34, 0x34, 0xc7, 0x5a, 0x5d, 0x6e, 0xbd, 0x78, 0xae, 0xcd, 0x9d, 0xe4, 0xe3, 0xfc, 0x3c, 0x3c, 0x75, 0x39, 0x2e, 0xb3, 0x7b, 0xea, 0x8f, 0xd8, 0x26, 0xca, 0x15, 0x60, 0xd2, 0x25, 0x61, 0xf9, 0x0b, 0x6a, 0x6b, 0x98, 0xc3, 0x6b, 0x8c, 0xeb, 0x17, 0xa5, 0x44, 0x7a, 0xe0, 0x82, 0xc5, 0xc8, 0xc2, 0xb5, 0xdd, 0x62, 0x10, 0xce, 0x4c, 0xa8, 0x1f, 0x5d, 0xe1, 0x84, 0xdd, 0xa4, 0x45, 0xdf, 0x0c, 0xb1, 0xb8, 0x93, 0x2b, 0x4d, 0x72, 0x4d, 0x1c, 0x4b, 0xbe, 0x9c, 0x89, 0xfa, 0xdf, 0xb4, 0x10, 0x9b, 0x67, 0x40, 0xa2, 0xaf, 0x44, 0xd2, 0x3f, 0xe1, 0x8d, 0xbb, 0xa0, 0x3f, 0x04, 0xf5, 0xd2, 0x29, 0x7d, 0x2e, 0xfa, 0x10, 0x0f, 0x1d, 0x94, 0xa1, 0x69, 0x0f, 0x42, 0x69, 0x21, 0xb0, 0xf3, 0x7a, 0x0a, 0xb3, 0xee, 0xc6, 0x31, 0x48, 0xb8, 0xda, 0xb7, 0x1a, 0xcf, 0xdb, 0x7f, 0x77, 0x5e, 0x10, 0xa3, 0x7b, 0xfa, 0x4e, 0x51, 0x9d, 0x20, 0x92, 0x11, 0x15, 0x2e, 0xed, 0x22, 0x77, 0x17, 0x3d, 0xf9, 0x98, 0x3f, 0x86, 0x9f, 0x96, 0x62, 0xbf, 0xdf, 0x1c, 0xb9, 0x46, 0xfa, 0xa0, 0xf5, 0x6c, 0x08, 0x9f, 0x61, 0x9a, 0x79, 0x6b, 0xc2, 0x4b, 0x47, 0xfc, 0x8d, 0xfd, 0x49, 0x10, 0x63, 0x32, 0x5b, 0x78, 0xd7, 0x36, 0x75, 0x42, 0x86, 0xba, 0xf4, 0x23, 0x12, 0xe1, 0xa2, 0x4d, 0x8f, 0x33, 0x0d, 0xb6, 0xe6, 0x87, 0x93, 0x8b, 0xdd, 0x01, 0x60, 0x80, 0xb3, 0xe9, 0xa5, 0x8f, 0xd4, 0x91, 0x5d, 0x8f, 0xd5, 0x52, 0x75, 0x11, 0xae, 0xb1, 0xd1, 0x3b, 0x18, 0x01, 0x6b, 0x83, 0xba, 0xa9, 0x9d, 0xa5, 0x8d, 0x4d, 0xe9, 0x7c, 0x11, 0x19, 0x45, 0x30, 0xb7, 0xbb, 0xd2, 0x07, 0x60, 0x92, 0x54, 0x2f, 0xb4, 0xe3, 0xa1, 0xb2, 0xa6, 0xf9, 0x14, 0xb5, 0xc4, 0x30, 0x7a, 0x4d, 0x27, 0x1c, 0x2f, 0xfc, 0xbf, 0x34, 0xa6, 0xa8, 0xf4, 0x78, 0x0f, 0x16, 0x27, 0xeb, 0xac, 0xd7, 0x0f, 0x6a, 0xac, 0xf4, 0x4a, 0x73, 0xff, 0x30, 0x2b, 0xeb, 0x6a, 0x92, 0xd3, 0x09, 0xc4, 0xcd, 0x8a, 0x74, 0x3c, 0x6d, 0x61, 0x18, 0xd2, 0xcb, 0x61, 0xfb, 0x0c, 0x61, 0x6d, 0xb2, 0xe9, 0x1e, 0xfb, 0x8b, 0x15, 0xc3, 0x84, 0xdd, 0x7b, 0x34, 0xd7, 0x81, 0x99, 0xae, 0x1f, 0xce, 0xc3, 0x61, 0x95, 0x27, 0x5d, 0x25, 0xb2, 0x41, 0x7f, 0x9e, 0x21, 0xc7, 0xb9, 0x56, 0x6b, 0x41, 0xcd, 0x19, 0xef, 0xaa, 0x85, 0x14, 0x62, 0x53, 0xde, 0x13, 0x52, 0x8d, 0x25, 0x4b, 0xf8, 0xad, 0x8d, 0x09, 0xfb, 0x86, 0x30, 0xcf, 0xb5, 0xb9, 0xc8, 0x4e, 0x2b, 0x45, 0x74, 0x03, 0x87, 0xde, 0x51, 0x28, 0x65, 0x20, 0xfc, 0xf1, 0x27, 0x73, 0x7a, 0xfb, 0xff, 0xa6, 0x2f, 0x82, 0xb1, 0xe1, 0xca, 0xb7, 0x92, 0x60, 0x4e, 0xfd, 0xf6, 0x4f, 0x48, 0x4e, 0xfe, 0xd8, 0x80, 0xaf, 0xc7, 0xb2, 0xc4, 0xa1, 0x82, 0x86, 0x7d, 0x4b, 0x1e, 0x3c, 0xac, 0x76, 0xc5, 0x9b, 0x9b, 0x46, 0x5f, 0xdc, 0x67, 0xde, 0xa1, 0x04, 0x2a, 0x1e, 0x6e, 0x7f, 0xf8, 0x92, 0x60, 0x4d, 0xa4, 0x09, 0x1b, 0xeb, 0x38, 0x70, 0x5a, 0xd5, 0xa0, 0x61, 0xae, 0xf7, 0x7b, 0xcd, 0xa6, 0xe8, 0x75, 0x81, 0xb4, 0x11, 0x8b, 0xa0, 0x1e, 0x3a, 0xeb, 0x3a, 0xa8, 0x57, 0xcb, 0x61, 0xa2, 0x7a, 0x59, 0x91, 0xc1, 0x4e, 0x1a, 0x17, 0x22, 0x68, 0xd9, 0x9e, 0xa1, 0x82, 0xb4, 0xf9, 0xd4, 0x22, 0x32, 0xc5, 0x2f, 0x5f, 0xd5, 0xee, 0x73, 0xef, 0x81, 0xf1, 0x86, 0x3d, 0x73, 0xc2, 0xd0, 0x39, 0x2f, 0xe8, 0x1c, 0xb4, 0xbf, 0x28, 0xdb, 0xe6, 0xc0, 0xd2, 0xff, 0x03, 0xdb, 0xa2, 0xe6, 0x68, 0x2e, 0xfa, 0x67, 0xd4, 0x21, 0x25, 0xa6, 0xce, 0x5c, 0x97, 0xb8, 0x7d, 0x5b, 0x3d, 0x68, 0x2a, 0x35, 0x47, 0xf8, 0x7d, 0x26, 0x6f, 0x1d, 0x8a, 0x34, 0x6a, 0x3f, 0x0c, 0x58, 0x93, 0xa2, 0x4b, 0x8b, 0xa2, 0xd7, 0x4f, 0x14, 0x8b, 0xac, 0x4a, 0x0e, 0xbc, 0xee, 0x97, 0x14, 0xb7, 0x43, 0x41, 0xee, 0xda, 0xb3, 0xbf, 0x30, 0x1d, 0xba, 0xdf, 0x44, 0x50, 0x17, 0x80, 0x9b, 0x63, 0x6a, 0xf5, 0x3b, 0x9c, 0x34, 0x67, 0x8d, 0x99, 0x89, 0x61, 0x41, 0xf4, 0x6a, 0x0f, 0x5e, 0x4a, 0x0a, 0x29, 0x0f, 0x35, 0x5c, 0xa1, 0x17, 0xae, 0x6e, 0xdd, 0x78, 0x0a, 0xbc, 0xfd, 0x96, 0x5c, 0x4f, 0x89, 0xdc, 0x33, 0x59, 0x38, 0xfb, 0x29, 0xd5, 0xcc, 0xa7, 0x3c, 0x3c, 0xeb, 0xfc, 0xc8, 0x11, 0xfc, 0xbe, 0xe1, 0x61, 0x97, 0xad, 0x12, 0x98, 0xed, 0xc5, 0x45, 0x6f, 0xbc, 0x49, 0xd8, 0x45, 0x32, 0xe4, 0x2a, 0xa5, 0x4d, 0x86, 0xae, 0xb4, 0xfd, 0x4a, 0xf5, 0xa0, 0x0d, 0x01, 0x61, 0x52, 0x8c, 0x43, 0x6f, 0x8a, 0xb6, 0x43, 0xd3, 0x0c, 0x53, 0x2b, 0xf1, 0x66, 0xb5, 0x3c, 0xc8, 0xde, 0xe7, 0x93, 0x08, 0x61, 0x74, 0xb4, 0x4e, 0x42, 0xfb, 0x37, 0x65, 0xa6, 0x30, 0x43, 0x59, 0x26, 0x7a, 0x9d, 0x22, 0x36, 0x1a, 0xee, 0x3f, 0x77, 0x79, 0xc6, 0xcd, 0xb6, 0xd3, 0x2c, 0x57, 0xea, 0xad, 0x14, 0x57, 0x77, 0x60, 0xae, 0x05, 0xee, 0x61, 0xa3, 0xad, 0x9c, 0x85, 0xe2, 0xe5, 0xf7, 0x6a, 0x8f, 0xf2, 0x8b, 0xed, 0xde, 0xb8, 0x2a, 0xbe, 0xaa, 0x67, 0x7f, 0xf9, 0x2a, 0x40, 0xc9, 0x8c, 0x19, 0x8d, 0x35, 0x7d, 0x15, 0x39, 0x64, 0x92, 0x02, 0x0d, 0x93, 0x48, 0x9f, 0x4a, 0xda, 0x91, 0xc7, 0x5b, 0x51, 0xba, 0xf0, 0x2e, 0x0a, 0xc0, 0xa4, 0x37, 0xd7, 0x66, 0x03, 0x43, 0xc7, 0x03, 0x40, 0x8b, 0xd1, 0x90, 0x0b, 0x96, 0x84, 0x5d, 0x25, 0x64, 0xda, 0x8c, 0xbf, 0x4d, 0x3e, 0x21, 0x2a, 0x53, 0xef, 0x33, 0xd1, 0xb5, 0xe2, 0x39, 0xbf, 0x91, 0xbf, 0x53, 0xd7, 0xef, 0xcf, 0x5d, 0xd9, 0xd7, 0x28, 0x5f, 0x8c, 0xde, 0x3e, 0x9e, 0x74, 0x64, 0x39, 0xb5, 0x3f, 0xd6, 0xaa, 0x76, 0xe8, 0x0d, 0x0c, 0xc2, 0x96, 0x74, 0x09, 0xc6, 0xc4, 0x4e, 0x15, 0x9b, 0x7b, 0x27, 0xb5, 0xcd, 0x8c, 0x12, 0x49, 0xc2, 0x3c, 0xbb, 0x40, 0x04, 0x0f, 0x02, 0x85, 0xe7, 0x48, 0x7b, 0xb8, 0xac, 0x4c, 0xf0, 0x25, 0x9a, 0xd1, 0x97, 0x41, 0x71, 0xb6, 0x53, 0xd5, 0xe7, 0xfe, 0x23, 0x97, 0x91, 0xff, 0x98, 0x7a, 0x3c, 0xfb, 0x34, 0x25, 0xef, 0x21, 0xe9, 0x46, 0x3d, 0x18, 0x84, 0x20, 0xab, 0x85, 0x1d, 0x4e, 0x0c, 0x80, 0x19, 0xf2, 0x88, 0xb5, 0xae, 0x10, 0x8f, 0x6e, 0xaf, 0x52, 0xe4, 0x42, 0x4c, 0xa5, 0xe3, 0x62, 0x73, 0x87, 0xa6, 0x46, 0x83, 0xbc, 0xba, 0x42, 0x9f, 0x9f, 0xd3, 0x04, 0xc0, 0x09, 0x21, 0xfe, 0x1d, 0x42, 0xdf, 0x01, 0xb8, 0x93, 0x11, 0x9f, 0x67, 0x4b, 0xf4, 0x0a, 0x9b, 0xf9, 0x40, 0x2c, 0x6f, 0x6f, 0x28, 0x9d, 0xb2, 0x23, 0xd1, 0x3c, 0x34, 0x86, 0x99, 0xab, 0xd1, 0x92, 0xc1, 0x18, 0xbb, 0x10, 0xef, 0xda, 0xbe, 0x66, 0xe8, 0x86, 0xdf, 0xd9, 0xff, 0x2f, 0xf6, 0x67, 0xe1, 0x91, 0xfc, 0x59, 0x11, 0xdb, 0xfb, 0x05, 0x89, 0x36, 0x25, 0x55, 0xfd, 0x98, 0xb8, 0xaa, 0x06, 0xaa, 0x39, 0x18, 0x1f, 0xcf, 0x36, 0xd3, 0x18, 0xc3, 0xd7, 0x46, 0x90, 0x6a, 0x12, 0x19, 0x10, 0xef, 0x50, 0x80, 0x7d, 0xe4, 0xcd, 0xf1, 0x91, 0xc7, 0x61, 0xfd, 0x50, 0x9b, 0xc4, 0x34, 0x47, 0x80, 0x23, 0x76, 0x05, 0x95, 0x9a, 0xff, 0xbb, 0x6d, 0xb7, 0xa1, 0xa7, 0x07, 0x42, 0x42, 0x60, 0x24, 0x5f, 0x2f, 0xbc, 0xd6, 0x77, 0x88, 0x35, 0x19, 0x50, 0x12, 0x11, 0xbc, 0xf0, 0x48, 0xd4, 0xee, 0x85, 0x26, 0xb1, 0xfb, 0x22, 0xef, 0xe0, 0x7f, 0x82, 0x7c, 0x49, 0xca, 0x9b, 0xfc, 0x30, 0x44, 0xa7, 0x10, 0xee, 0xbb, 0x5e, 0x36, 0x61, 0x65, 0xb5, 0x4a, 0xdf, 0xb2, 0x94, 0x7c, 0x87, 0x39, 0xc4, 0x46, 0x4a, 0xa4, 0x2d, 0x31, 0xe7, 0x58, 0xb9, 0xb8, 0x30, 0x6f, 0x87, 0x12, 0xc0, 0x02, 0xca, 0x5e, 0xbf, 0xae, 0xff, 0xf0, 0xd6, 0xde, 0x64, 0x4a, 0xa5, 0x75, 0x47, 0xfd, 0xd5, 0xfb, 0x6e, 0xa7, 0xce, 0x45, 0xfb, 0xf2, 0xc4, 0xe2, 0x24, 0xf9, 0x05, 0xc4, 0xbc, 0xd0, 0x79, 0xb2, 0xec, 0x8f, 0x8d, 0x29, 0x9d, 0xca, 0x68, 0xe4, 0x3a, 0x92, 0xd8, 0x9c, 0xad, 0x66, 0x2c, 0x80, 0x65, 0x93, 0x78, 0x7f, 0xd1, 0x86, 0x2d, 0xc7, 0xf9, 0x2a, 0xe1, 0x8a, 0xd1, 0xba, 0xd0, 0xf7, 0xef, 0xaf, 0x70, 0x85, 0x1a, 0xb1, 0xda, 0x78, 0x77, 0x9e, 0xa5, 0x04, 0x9a, 0xd7, 0x1d, 0x56, 0x49, 0x5d, 0xa2, 0x66, 0x0f, 0xbc, 0x6d, 0x34, 0x0c, 0x1f, 0xf3, 0xd7, 0x91, 0x58, 0xeb, 0x49, 0x1b, 0xf3, 0xf1, 0xde, 0xb1, 0xd9, 0x70, 0xf5, 0x10, 0x10, 0xf9, 0xcc, 0x80, 0x1b, 0x4e, 0xac, 0x01, 0xde, 0x54, 0x0e, 0x8b, 0xe0, 0xd2, 0xa3, 0xbe, 0x99, 0x65, 0x8f, 0x68, 0x0a, 0x97, 0x32, 0xc1, 0xeb, 0xdb, 0x8d, 0xb8, 0x7d, 0xcc, 0xe7, 0x65, 0x94, 0xf6, 0x9a, 0xc2, 0x8f, 0x93, 0xfc, 0xe5, 0xf6, 0x16, 0x0c, 0xb9, 0x5f, 0xec, 0x59, 0xae, 0x81, 0x6f, 0x83, 0x16, 0x83, 0xb7, 0xd5, 0xa4, 0x18, 0xaa, 0xff, 0x22, 0xed, 0x77, 0x6e, 0xf3, 0x47, 0x82, 0xe9, 0xd3, 0x12, 0x59, 0x6f, 0x62, 0xd3, 0xd6, 0x61, 0x24, 0x61, 0x85, 0xdb, 0x4b, 0xe0, 0x41, 0xd4, 0x87, 0x68, 0x1c, 0x22, 0xb9, 0x0a, 0x70, 0xda, 0xba, 0xe0, 0x80, 0xb4, 0x38, 0x8f, 0x68, 0x7b, 0x58, 0x5c, 0x5e, 0x45, 0xf4, 0xae, 0x6f, 0x39, 0xed, 0xbd, 0xdb, 0x16, 0xe9, 0x35, 0x05, 0xfb, 0xe4, 0x0b, 0x72, 0x89, 0xa6, 0xd1, 0x6e, 0x29, 0x54, 0xb9, 0x78, 0x94, 0x4c, 0xaa, 0xb8, 0x9f, 0x3d, 0xd6, 0x3e, 0x60, 0x4a, 0xdf, 0x14, 0xfb, 0x4f, 0x7b, 0xfb, 0xd0, 0x39, 0xbb, 0xb9, 0x85, 0x26, 0xc5, 0xae, 0xc7, 0x99, 0x43, 0xbd, 0x5a, 0x89, 0x82, 0x5b, 0x5c, 0x8a, 0xb7, 0x90, 0xe5, 0x49, 0xa4, 0xdd, 0x87, 0x16, 0x0c, 0x60, 0xe3, 0xb9, 0x1b, 0x42, 0x62, 0x9d, 0x2c, 0x2d, 0xba, 0x60, 0x13, 0x34, 0x09, 0xe2, 0x30, 0xdd, 0xf0, 0xe9, 0xbe, 0x02, 0x1f, 0xdf, 0x17, 0x18, 0x06, 0x1f, 0x66, 0xa5, 0x92, 0x0c, 0x6f, 0xee, 0xef, 0x64, 0x82, 0x4e, 0x3e, 0x98, 0xb6, 0xaa, 0xf7, 0x2f, 0xdd, 0xe8, 0xc3, 0x3e, 0xd6, 0x43, 0x8a, 0x54, 0x2f, 0xd3, 0xc9, 0x04, 0xf8, 0xa0, 0x2c, 0x0b, 0x44, 0x67, 0x0c, 0xb7, 0xe2, 0xa9, 0x7a, 0x48, 0x5d, 0x8a, 0x50, 0x67, 0xc1, 0x25, 0xde, 0x32, 0x43, 0x94, 0x37, 0xd3, 0xe2, 0x47, 0xa2, 0xe9, 0x7f, 0x99, 0x5d, 0x04, 0x9b, 0x79, 0xe2, 0x29, 0x6d, 0x21, 0x27, 0x28, 0x67, 0x75, 0xd3, 0x98, 0xbd, 0x61, 0x4f, 0xcd, 0x20, 0x5a, 0x1d, 0x17, 0xca, 0x65, 0x37, 0xb1, 0x7d, 0xb7, 0xc0, 0xc8, 0x80, 0x6c, 0x3b, 0xe7, 0xc1, 0xdf, 0xdc, 0x97, 0xe6, 0xf3, 0x20, 0xdc, 0xd9, 0x4b, 0xd9, 0xe3, 0x1f, 0x6d, 0xba, 0xf5, 0x68, 0x2d, 0x74, 0xbd, 0xb9, 0x49, 0x23, 0x2b, 0x36, 0x89, 0x10, 0x1d, 0xe2, 0x30, 0xe6, 0x3e, 0xb1, 0x6f, 0x6e, 0x50, 0x6b, 0x1b, 0x23, 0x5b, 0xcb, 0xf0, 0x3f, 0x32, 0x03, 0xf5, 0x0d, 0x37, 0x78, 0x60, 0x49, 0x86, 0x52, 0x84, 0x5a, 0xf0, 0x80, 0xf9, 0x8f, 0xfa, 0x61, 0x0d, 0x50, 0x67, 0x62, 0x5b, 0x7e, 0x41, 0x2b, 0xf3, 0x2a, 0xc4, 0xe2, 0xbc, 0x25, 0x5a, 0xb0, 0x3c, 0xe5, 0x56, 0x5c, 0x8d, 0x00, 0x5f, 0x67, 0x41, 0x35, 0x16, 0x1d, 0x12, 0x4d, 0xa1, 0x6c, 0x99, 0xe7, 0x09, 0x45, 0xd9, 0x65, 0x7d, 0x05, 0x13, 0x61, 0x84, 0xc8, 0x3b, 0x23, 0x5e, 0x72, 0xe7, 0x04, 0x4d, 0xf9, 0xf6, 0x58, 0x8d, 0x2f, 0x9f, 0x32, 0xc0, 0x1b, 0x90, 0x9e, 0xc2, 0x6f, 0x71, 0xf3, 0xe1, 0x74, 0x94, 0x9b, 0x18, 0xa7, 0xdd, 0x6b, 0xb5, 0xf4, 0xa8, 0x00, 0x2b, 0x90, 0x8f, 0x21, 0xd2, 0xd3, 0xb8, 0x09, 0xf0, 0x68, 0x61, 0x9a, 0xb2, 0x12, 0x3c, 0x52, 0x30, 0xae, 0x77, 0x25, 0x97, 0xbb, 0xa0, 0x23, 0x81, 0x41, 0x09, 0x0b, 0x91, 0x21, 0x95, 0x34, 0x55, 0x5e, 0xb2, 0x1d, 0x6f, 0xb7, 0x07, 0x5d, 0xe5, 0xd8, 0xea, 0xf9, 0xa1, 0x6f, 0x81, 0x98, 0x8c, 0x8b, 0x95, 0x15, 0x26, 0xaa, 0xf6, 0xd1, 0x27, 0xb7, 0x9c, 0x34, 0xbb, 0xe8, 0x1f, 0xa1, 0xd1, 0x92, 0xcc, 0x01, 0x77, 0xad, 0x9d, 0xba, 0x35, 0x71, 0x58, 0xdd, 0xb8, 0x8f, 0xe5, 0x34, 0xfc, 0x6b, 0x26, 0x70, 0xeb, 0x17, 0x50, 0xec, 0x66, 0x4a, 0xde, 0xdb, 0x5b, 0x3b, 0xcc, 0xae, 0x2e, 0x53, 0x66, 0xbd, 0x1e, 0xdd, 0xe5, 0xed, 0x0b, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x77, 0xd0, 0x5d, 0x32, 0xfd, 0x25, 0x3e, 0x44, 0x23, 0x3c, 0xe7, 0x13, 0xca, 0xd0, 0xef, 0x0b, 0x0c, 0xc8, 0xc4, 0xd7, 0x20, 0x45, 0x2b, 0x66, 0x0e, 0x64, 0x5d, 0x30, 0x85, 0x34, 0x31, 0x64, 0x76, 0x7a, 0x23, 0xa1, 0x02, 0xda, 0x0e, 0xf9, 0x2a, 0xa2, 0x4a, 0xc1, 0xa5, 0xfb, 0xa3, 0xb8, 0x07, 0x0d, 0x03, 0xb0, 0x33, 0xa4, 0x09, 0x49, 0xe3, 0x15, 0x4c, 0x98, 0x56, 0xef, 0xac, 0x71, 0xa0, 0xa1, 0x22, 0x1c, 0xc1, 0x26, 0xdc, 0xd8, 0xee, 0xeb, 0x71, 0xb8, 0xd7, 0x9e, 0x7a, 0xb9, 0x3e, 0x55, 0x7f, 0x9a, 0xf7, 0x4a, 0xfe, 0x75, 0x1a, 0x3a, 0x16, 0xf7, 0x69, 0xfb, 0x63, 0x5a, 0x90, 0xfa, 0xf3, 0xb4, 0x82, 0x60, 0x78, 0x96, 0x88, 0x1c, 0x3a, 0x3f, 0xb5, 0x8c, 0xda, 0x10, 0x56, 0x9c, 0x82, 0x10, 0x36, 0x9c, 0x44, 0x3a, 0xab, 0xe8, 0xfb, 0x47, 0xd9, 0xd2, 0x80, 0xfe, 0xc9, 0x2c, 0x27, 0xb4, 0xe0, 0xfc, 0xf6, 0xa4, 0x92, 0x3a, 0x4f, 0x70, 0x60, 0xe6, 0x16, 0x31, 0x71, 0x5b, 0x06, 0x6d, 0xa3, 0xc3, 0xfb, 0xe8, 0xcc, 0xfe, 0x08, 0x10, 0x22, 0x1d, 0xc4, 0x73, 0xe1, 0x79, 0xf4, 0xbf, 0x07, 0xa1, 0x8d, 0x37, 0xe2, 0x10, 0xfb, 0x89, 0x7b, 0x47, 0x3e, 0xac, 0xc8, 0x7e, 0xa0, 0xf8, 0x0a, 0x16, 0xaa, 0x4a, 0x60, 0x20, 0x4f, 0x2e, 0x1f, 0xaf, 0xd3, 0xe1, 0x97, 0xb4, 0xea, 0x60, 0x82, 0x76, 0x17, 0x77, 0x0a, 0x59, 0xb7, 0x7a, 0x41, 0x4a, 0x34, 0xd2, 0x3a, 0x4d, 0x03, 0xab, 0x4f, 0x11, 0x0a, 0x1a, 0x23, 0xc5, 0x17, 0x13, 0x5a, 0x4c, 0xca, 0x90, 0xbf, 0xa1, 0x31, 0x9c, 0xed, 0x66, 0xc3, 0x2f, 0x30, 0x9e, 0xdb, 0x3f, 0xfe, 0x0b, 0x46, 0xfa, 0xc8, 0x20, 0x61, 0x87, 0xa2, 0xb0, 0xa9, 0x41, 0x70, 0x2b, 0x6e, 0x67, 0x0c, 0x7f, 0x35, 0xbd, 0xe8, 0xa9, 0x44, 0xd3, 0xa2, 0x73, 0xa7, 0x9f, 0x15, 0xa6, 0xda, 0xba, 0x27, 0xe0, 0x43, 0x6e, 0x61, 0xd9, 0x16, 0x2a, 0x7f, 0x31, 0xad, 0xb7, 0x80, 0xad, 0x03, 0x0a, 0x34, 0x54, 0xf4, 0x85, 0x45, 0xd1, 0x9c, 0x8b, 0x87, 0xf7, 0x0c, 0xa8, 0x47, 0x07, 0x64, 0xb2, 0x18, 0x07, 0x25, 0x70, 0x14, 0xc3, 0xf7, 0xc3, 0xd6, 0xab, 0x00, 0x94, 0x17, 0x74, 0x9b, 0xa3, 0x46, 0xb3, 0x5e, 0x52, 0xf5, 0x9b, 0x04, 0xea, 0x33, 0xc8, 0xe9, 0xc9, 0xe7, 0xf9, 0x77, 0x2a, 0x15, 0xda, 0xee, 0x44, 0x70, 0xc7, 0xc4, 0xce, 0x3f, 0xea, 0x69, 0xb2, 0xab, 0xd8, 0xb0, 0xc5, 0xfc, 0x7a, 0x75, 0x12, 0x53, 0xf1, 0x95, 0xfe, 0x70, 0xfa, 0xed, 0x4f, 0xc4, 0xfd, 0xdc, 0x35, 0xea, 0x8e, 0x6e, 0x1e, 0xef, 0xe3, 0x89, 0x52, 0x7b, 0xba, 0x35, 0x85, 0x37, 0x54, 0x52, 0x0e, 0x29, 0x3e, 0xff, 0xc4, 0xb9, 0x36, 0x91, 0x8d, 0x8a, 0xdb, 0xa7, 0x3f, 0xaa, 0x47, 0x2b, 0x40, 0x35, 0xfc, 0x1c, 0xdb, 0xfa, 0x4d, 0x8a, 0x60, 0x7b, 0xba, 0xf3, 0x22, 0x3e, 0xeb, 0xfd, 0x79, 0x7b, 0x43, 0xb2, 0x91, 0x95, 0xce, 0x22, 0x49, 0xa7, 0x50, 0x12, 0xd5, 0xfe, 0x55, 0x78, 0xa8, 0xc8, 0x4a, 0x66, 0xaa, 0x5e, 0xa7, 0xc6, 0x20, 0x02, 0xab, 0x82, 0x23, 0xf2, 0xee, 0xd0, 0x6c, 0xf5, 0xa3, 0x90, 0x3f, 0x50, 0x02, 0xc8, 0xbe, 0x97, 0xac, 0x70, 0x83, 0xa5, 0xb3, 0xa0, 0x58, 0x29, 0xc7, 0x20, 0x27, 0x35, 0x3a, 0xaf, 0xa5, 0x1a, 0xaa, 0xaa, 0x87, 0x7c, 0x10, 0x2d, 0xd9, 0x04, 0xa9, 0x29, 0x8e, 0x02, 0x73, 0x70, 0x21, 0xe1, 0x71, 0xe7, 0x9d, 0xaf, 0x3d, 0xf7, 0xc1, 0x10, 0x27, 0x1a, 0x97, 0x7c, 0x68, 0xc5, 0x7e, 0xeb, 0x80, 0xbf, 0x19, 0x1d, 0x2b, 0x33, 0xd1, 0xfb, 0x90, 0xac, 0xb3, 0xf7, 0xe1, 0x7d, 0x96, 0x94, 0xea, 0xd9, 0xc6, 0x45, 0x3b, 0xaf, 0x6e, 0x70, 0xf4, 0x03, 0x00, 0x80, 0x76, 0x64, 0x1c, 0xef, 0x6e, 0x71, 0xda, 0x92, 0x59, 0x0d, 0x47, 0xbb, 0x73, 0x38, 0xec, 0x27, 0xec, 0x8a, 0x28, 0xf2, 0x42, 0xb7, 0x6d, 0xf9, 0x0c, 0xdd, 0x3e, 0xbe, 0xfe, 0x4b, 0x12, 0xeb, 0x86, 0xdb, 0x11, 0x1a, 0xf1, 0xb7, 0x41, 0x8a, 0xff, 0x30, 0x5f, 0xed, 0x2c, 0x03, 0xa4, 0xca, 0xac, 0xd8, 0xec, 0xe2, 0x3f, 0x19, 0x57, 0x91, 0x72, 0x7a, 0xf4, 0x5f, 0x37, 0x8d, 0x8c, 0x0e, 0xd1, 0x80, 0xd6, 0x6a, 0x65, 0x6c, 0x42, 0x0f, 0x3a, 0x81, 0x7a, 0x83, 0xf9, 0xf3, 0xdc, 0x52, 0x44, 0x34, 0x3a, 0xed, 0xc0, 0xb2, 0x56, 0x27, 0x4f, 0x31, 0xb1, 0x05, 0x73, 0xb0, 0x86, 0x3c, 0x3f, 0x6b, 0xe4, 0xaf, 0x83, 0x4f, 0x19, 0xae, 0x5c, 0xdf, 0xcf, 0x1d, 0x5b, 0x7e, 0x88, 0xbb, 0xa4, 0x44, 0x05, 0xcf, 0xb3, 0x4e, 0xe3, 0x42, 0xa8, 0x45, 0x44, 0x58, 0x24, 0xb9, 0xd8, 0x62, 0x12, 0x34, 0x27, 0x47, 0xc4, 0x0b, 0x30, 0x05, 0x2f, 0x2e, 0x38, 0x81, 0x9d, 0xcd, 0xd0, 0x27, 0x79, 0x3a, 0xbc, 0x27, 0x29, 0x19, 0xd6, 0xe8, 0x69, 0x2e, 0x1b, 0x4d, 0xc0, 0xf6, 0x47, 0x2a, 0x70, 0xad, 0x36, 0x37, 0xf9, 0x31, 0x0c, 0xe2, 0x95, 0x97, 0x36, 0xad, 0xd3, 0xd1, 0x46, 0x3f, 0x3c, 0x3e, 0xd0, 0xef, 0xb5, 0x1a, 0x7a, 0xf8, 0x33, 0xcb, 0xb8, 0x46, 0x23, 0x3e, 0x9d, 0x2d, 0x53, 0x65, 0x99, 0x67, 0x8f, 0x2e, 0x37, 0x6a, 0xbe, 0x22, 0x94, 0x1c, 0xc9, 0xbd, 0x87, 0x0b, 0xea, 0xfe, 0xf0, 0xe2, 0xd4, 0xf5, 0xd5, 0xcc, 0x1a, 0xbb, 0x19, 0x17, 0x73, 0x24, 0x8e, 0xa5, 0xfa, 0x07, 0x12, 0x61, 0x48, 0x32, 0x7b, 0x5b, 0x06, 0x6c, 0xf0, 0x11, 0xbb, 0xd1, 0xed, 0x4e, 0x5e, 0x4e, 0x18, 0xc3, 0x5a, 0x64, 0x00, 0xba, 0x3d, 0x0b, 0x80, 0x5c, 0x50, 0x02, 0x20, 0xcc, 0xa3, 0x05, 0x9f, 0xab, 0x4a, 0x28, 0x26, 0x78, 0xc0, 0xd0, 0x5f, 0xc3, 0x32, 0x86, 0xaa, 0x00, 0xfa, 0xfb, 0x52, 0xe0, 0x62, 0x4a, 0xa9, 0xcd, 0x49, 0x4e, 0x24, 0x64, 0xf0, 0x3f, 0x67, 0xd8, 0x96, 0xcd, 0xe4, 0xaf, 0xb4, 0xcc, 0x15, 0x1a, 0x96, 0x67, 0x3b, 0xc1, 0xd3, 0x97, 0xe4, 0x8e, 0x2e, 0xa2, 0x86, 0xd0, 0x82, 0x68, 0x3a, 0x9e, 0xf7, 0x89, 0x5c, 0x79, 0xb9, 0x92, 0x90, 0xe3, 0x28, 0x39, 0x0e, 0xc2, 0xc3, 0xd6, 0xb8, 0x39, 0x31, 0x54, 0x9a, 0x9c, 0x6c, 0x46, 0x40, 0xb1, 0xa2, 0xc1, 0x53, 0xe7, 0x12, 0x92, 0x18, 0xd4, 0x61, 0x63, 0x36, 0xd8, 0xda, 0xb3, 0xef, 0x64, 0x54, 0x5b, 0xa7, 0xce, 0x08, 0xff, 0xc6, 0xe7, 0x65, 0x1f, 0x15, 0xc3, 0xc8, 0x93, 0x56, 0xc9, 0xe0, 0x2e, 0xdb, 0x9e, 0x3c, 0x30, 0x28, 0x41, 0x15, 0x41, 0x46, 0xda, 0xb9, 0xda, 0x98, 0x6e, 0x62, 0x30, 0xc3, 0x9a, 0x87, 0x3f, 0x5f, 0x71, 0x65, 0x27, 0x80, 0x8b, 0xe5, 0xd3, 0xc3, 0x67, 0xd1, 0xab, 0x8b, 0xa7, 0xcc, 0x63, 0x75, 0xe7, 0x8e, 0x4a, 0x70, 0x1a, 0xfc, 0x5f, 0xc5, 0x25, 0x52, 0xa5, 0xaa, 0x35, 0x82, 0x03, 0xfd, 0x74, 0xb4, 0x42, 0x55, 0x6a, 0xf6, 0xc3, 0x89, 0x0f, 0x09, 0x2a, 0x1a, 0x82, 0xb3, 0xa4, 0x9e, 0x50, 0xff, 0x3c, 0x99, 0xbf, 0x98, 0x91, 0xce, 0xbf, 0x63, 0x54, 0x65, 0x07, 0xd8, 0xfe, 0x71, 0xe6, 0xb4, 0xf9, 0x45, 0x68, 0xbb, 0x08, 0xe6, 0xa7, 0x0f, 0x58, 0x9c, 0x2b, 0x01, 0xe8, 0x41, 0xe9, 0xe0, 0xb8, 0xc2, 0x96, 0xe6, 0x76, 0x9b, 0xd5, 0x3f, 0x87, 0xbb, 0x5d, 0xf4, 0x90, 0xdb, 0xa9, 0x62, 0xe6, 0x3f, 0xb6, 0xdb, 0x9a, 0xf7, 0x2c, 0xfb, 0xf5, 0xcf, 0x72, 0xbe, 0xdd, 0xd9, 0xa0, 0xde, 0xe4, 0x31, 0x12, 0x4f, 0x8c, 0x3c, 0x13, 0xfb, 0xcb, 0x77, 0x53, 0x6a, 0xdf, 0x77, 0x87, 0x6e, 0x0b, 0x2b, 0x9a, 0x0d, 0x6f, 0xe3, 0xa9, 0x20, 0x6b, 0x75, 0x57, 0x31, 0xad, 0x84, 0x2f, 0xa9, 0x51, 0xc7, 0x1f, 0xd2, 0x03, 0xc2, 0xca, 0xf9, 0xdc, 0xab, 0xf2, 0x23, 0xd6, 0x9c, 0x83, 0xce, 0x9a, 0x63, 0x92, 0x04, 0xe0, 0xc4, 0x91, 0x24, 0xb5, 0x78, 0xdb, 0x4a, 0xb6, 0x8b, 0xa5, 0x0f, 0xbd, 0x7d, 0x01, 0x6f, 0xb5, 0x79, 0x18, 0x83, 0x78, 0x65, 0x0b, 0x88, 0xd0, 0xbe, 0x8e, 0x77, 0xe0, 0x10, 0xd2, 0x2c, 0xa1, 0x7d, 0x47, 0x09, 0x63, 0x99, 0xfc, 0xec, 0x92, 0x9a, 0xee, 0x3e, 0xf0, 0x6b, 0x4f, 0xda, 0x54, 0x03, 0x5d, 0x87, 0x77, 0x13, 0x7c, 0x72, 0xf6, 0xa3, 0x45, 0x6f, 0x27, 0x74, 0xdb, 0xc9, 0x8f, 0x5e, 0xb2, 0xd9, 0x60, 0xe8, 0xf3, 0x89, 0x9d, 0x7d, 0x68, 0x23, 0xf3, 0x60, 0x7e, 0xc7, 0x96, 0x90, 0x60, 0xad, 0x2d, 0x40, 0x61, 0x4f, 0x8d, 0x1b, 0x03, 0xbf, 0x0e, 0x1f, 0x7c, 0xf8, 0x89, 0xfc, 0xa3, 0xf6, 0xff, 0x80, 0x3a, 0x5d, 0x5d, 0x79, 0x39, 0x4e, 0xad, 0xa7, 0x8a, 0xb7, 0x04, 0x68, 0x8d, 0x80, 0x51, 0xa6, 0x99, 0x06, 0xda, 0x23, 0xae, 0x31, 0xcf, 0x95, 0x4b, 0xb9, 0x5b, 0x45, 0x0c, 0x96, 0x80, 0x0e, 0x93, 0xdc, 0x0c, 0x65, 0xe2, 0x19, 0x88, 0x69, 0x18, 0x1c, 0x46, 0x8f, 0xba, 0xd5, 0xdb, 0xb2, 0xc3, 0xd2, 0xb3, 0x8a, 0xd0, 0xb2, 0x71, 0x95, 0xeb, 0x48, 0x0d, 0x70, 0x39, 0x93, 0x1e, 0x05, 0xcd, 0xc7, 0x54, 0xa3, 0xb4, 0xad, 0x88, 0xce, 0x6f, 0x53, 0x35, 0xeb, 0x5e, 0xe7, 0x83, 0xad, 0xb2, 0x9a, 0xb8, 0x17, 0x23, 0x69, 0x87, 0x77, 0xb5, 0x99, 0xb3, 0x78, 0x7b, 0x03, 0xb3, 0xfa, 0x5a, 0xa1, 0xc5, 0x6c, 0x36, 0xf5, 0x67, 0x77, 0xbf, 0x4b, 0xe7, 0x02, 0x34, 0xc5, 0xfd, 0x5e, 0xa4, 0x3e, 0x3d, 0xc9, 0x50, 0xcc, 0x15, 0x0e, 0xef, 0x09, 0x69, 0xf5, 0x4f, 0x18, 0x52, 0x21, 0xb0, 0x84, 0x59, 0x4b, 0xc3, 0x30, 0xc7, 0x7a, 0xe3, 0xfa, 0xfa, 0xfa, 0x53, 0xa4, 0x08, 0x5e, 0xd0, 0x58, 0xef, 0x93, 0x08, 0xac, 0x8a, 0x5b, 0xfa, 0x0d, 0x02, 0x4a, 0x7b, 0x23, 0x7f, 0x08, 0x72, 0xb9, 0x39, 0x1a, 0x52, 0x3d, 0x64, 0x7b, 0x49, 0x22, 0x0d, 0xb0, 0xb2, 0x81, 0x07, 0xe1, 0xce, 0x8a, 0x46, 0x18, 0x99, 0xeb, 0x9a, 0xd7, 0x0e, 0x0f, 0x58, 0x02, 0x36, 0xed, 0x43, 0x3e, 0x6d, 0xef, 0xcc, 0x24, 0x11, 0x4e, 0x9d, 0xd5, 0x08, 0x99, 0x37, 0x28, 0x8e, 0x2e, 0x67, 0x2b, 0xad, 0x4e, 0x5c, 0x27, 0x0f, 0x7a, 0xc3, 0x99, 0xa0, 0xa0, 0x7f, 0x74, 0xb8, 0x17, 0x59, 0x7c, 0x5e, 0x5e, 0x70, 0xc9, 0x5a, 0x81, 0x93, 0xb0, 0xeb, 0x6d, 0xfb, 0x1a, 0x4b, 0x18, 0x0d, 0x63, 0x0c, 0xff, 0x90, 0xff, 0x9e, 0xd5, 0x26, 0x75, 0x1f, 0x04, 0x1e, 0x65, 0xbe, 0xb8, 0x82, 0xc4, 0x71, 0xc3, 0x97, 0xc5, 0x98, 0x74, 0x98, 0xa9, 0xeb, 0x93, 0x46, 0xfa, 0xdd, 0x95, 0x72, 0x30, 0x71, 0xf9, 0xb6, 0xd1, 0x9f, 0x96, 0x30, 0xc6, 0x6d, 0x42, 0xf9, 0x24, 0x24, 0xf8, 0x58, 0xca, 0xd8, 0x72, 0x1b, 0x26, 0x08, 0xac, 0x77, 0x3c, 0xd2, 0x5d, 0x4b, 0xbd, 0xb7, 0xfd, 0xa7, 0x71, 0x2f, 0xed, 0x3d, 0x59, 0x87, 0x18, 0xb3, 0x36, 0x88, 0xf6, 0xe9, 0x4d, 0xb6, 0x62, 0xa7, 0x87, 0xc1, 0x6b, 0x83, 0x6c, 0x7c, 0x82, 0xa3, 0x7a, 0x5c, 0x1e, 0x81, 0xb5, 0xd6, 0x36, 0x91, 0x11, 0x5e, 0xbd, 0xf4, 0x3e, 0xdd, 0xe8, 0xfc, 0x89, 0x25, 0x12, 0x00, 0x26, 0x46, 0x58, 0xf7, 0xb3, 0x03, 0x4c, 0x5b, 0x37, 0x8b, 0x9c, 0xd1, 0x02, 0x80, 0x1a, 0xb3, 0x48, 0xf9, 0xb2, 0x10, 0x98, 0x67, 0x3f, 0x99, 0x59, 0xf3, 0xd9, 0x00, 0xb1, 0x83, 0xe1, 0xb2, 0x1c, 0xd9, 0x4d, 0x2f, 0xf5, 0x56, 0x1b, 0xc6, 0x80, 0x36, 0xa0, 0x5d, 0x41, 0x67, 0xf8, 0xbf, 0xfe, 0x00, 0x18, 0xdb, 0x52, 0xf2, 0xac, 0x7c, 0xd6, 0x42, 0x70, 0xe2, 0x14, 0xc2, 0x33, 0xac, 0x14, 0x1f, 0xfa, 0xd0, 0x28, 0x30, 0x22, 0xba, 0xbe, 0xac, 0x53, 0xf7, 0xc5, 0x42, 0xb0, 0x64, 0xc7, 0xe5, 0xf7, 0xc4, 0x2a, 0x4d, 0xc5, 0x83, 0xa0, 0x6b, 0x4f, 0x49, 0x8d, 0xd7, 0x9a, 0x23, 0xdf, 0xbd, 0x07, 0x75, 0x34, 0xc0, 0xde, 0x66, 0x34, 0x7e, 0x94, 0xb7, 0x17, 0x02, 0xd1, 0x39, 0x5a, 0x42, 0xe9, 0x52, 0x54, 0xbf, 0x9d, 0xb6, 0xfe, 0xe2, 0x8e, 0x7d, 0x19, 0xa9, 0x85, 0xdb, 0x67, 0xee, 0xdd, 0x74, 0xa8, 0xba, 0x16, 0x81, 0x01, 0x37, 0x40, 0x30, 0x32, 0x88, 0x66, 0xa4, 0x85, 0x60, 0x0f, 0x5b, 0x4a, 0x0d, 0xd5, 0x81, 0x02, 0xb5, 0xf4, 0xd3, 0xda, 0x6e, 0x03, 0x63, 0xa5, 0x0e, 0xdc, 0x81, 0xfe, 0x9b, 0xf7, 0x59, 0xc1, 0x38, 0xeb, 0x2c, 0xed, 0x12, 0xf9, 0x15, 0x45, 0x7d, 0x90, 0x0f, 0xea, 0x7d, 0x41, 0xd7, 0x7e, 0xf3, 0x68, 0x78, 0xe5, 0x4c, 0x77, 0xa7, 0x83, 0x4b, 0xe4, 0xed, 0xd6, 0x6f, 0xb9, 0x98, 0x04, 0x76, 0x82, 0x1e, 0xb2, 0xc9, 0x8f, 0xc6, 0x5b, 0xdc, 0x1e, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x9b, 0x7b, 0xdc, 0x1c, 0xac, 0x09, 0x71, 0x73, 0x18, 0x64, 0x92, 0xcc, 0x53, 0x4f, 0x46, 0xe1, 0x19, 0xe2, 0x23, 0x65, 0x1b, 0x3b, 0xb1, 0xd7, 0xc0, 0xb3, 0x61, 0x3b, 0x42, 0x1f, 0xb1, 0xec, 0x08, 0x2b, 0x15, 0x32, 0xa1, 0xe7, 0xf1, 0x02, 0x9e, 0x60, 0x44, 0x1b, 0x7d, 0x6b, 0x87, 0xe9, 0xcf, 0xdc, 0x0c, 0x54, 0x1e, 0x96, 0xf7, 0xb6, 0x7b, 0x6a, 0x47, 0x37, 0xb1, 0xa6, 0xf7, 0x60, 0x73, 0xe2, 0x4b, 0x9e, 0xc6, 0x8d, 0xfe, 0x12, 0xfc, 0xee, 0x1d, 0x40, 0xb4, 0x91, 0x5d, 0x37, 0x0b, 0xfd, 0x13, 0x17, 0xdb, 0x75, 0x52, 0x68, 0x3b, 0x02, 0x56, 0x42, 0x6b, 0x75, 0x6c, 0x1f, 0xcc, 0x5d, 0xfc, 0x3e, 0x6d, 0xc2, 0xb5, 0x8f, 0x08, 0x66, 0x58, 0x93, 0x74, 0x3a, 0x28, 0xc1, 0x9d, 0x57, 0x13, 0x0c, 0xad, 0x1a, 0xb5, 0x2f, 0xc8, 0x2b, 0x0d, 0x4a, 0x20, 0x5a, 0x49, 0xb1, 0x8c, 0x1e, 0x34, 0x93, 0x7c, 0xe8, 0x15, 0x04, 0xa2, 0xf6, 0x15, 0x00, 0x9c, 0xd4, 0x5a, 0x63, 0xa2, 0x1a, 0xef, 0x92, 0x6e, 0x39, 0xf3, 0xe1, 0x6e, 0x55, 0x7b, 0xfe, 0xbc, 0x45, 0x1f, 0x4e, 0x42, 0xa2, 0xdf, 0x08, 0xd6, 0x67, 0x0b, 0x47, 0x27, 0x4b, 0x40, 0x31, 0xef, 0x0f, 0xc7, 0xbd, 0x20, 0xe9, 0x4e, 0x95, 0xa7, 0x5f, 0xe3, 0x04, 0x70, 0xb7, 0x02, 0x76, 0x6b, 0xe7, 0x13, 0xc4, 0x18, 0x9e, 0xf7, 0xad, 0x38, 0xdf, 0x9b, 0x65, 0xcd, 0x69, 0xf4, 0xc0, 0xb4, 0x88, 0x59, 0x28, 0x14, 0xfe, 0x68, 0x84, 0x30, 0x80, 0xae, 0x2d, 0x11, 0xb0, 0xd6, 0x02, 0xdd, 0x48, 0xbf, 0x25, 0x48, 0xa5, 0x05, 0xa3, 0xbc, 0x02, 0xef, 0xad, 0xa0, 0xb1, 0xc3, 0xbb, 0xe1, 0xc8, 0xc3, 0x42, 0x4c, 0x37, 0x29, 0x10, 0x91, 0x7a, 0x11, 0x1b, 0x19, 0x24, 0x5b, 0xb5, 0x81, 0xa2, 0xdc, 0x51, 0xa0, 0x85, 0x15, 0x5a, 0x7c, 0xb3, 0xfa, 0x56, 0x0a, 0xc3, 0x16, 0xfa, 0x7d, 0x51, 0xdc, 0x4a, 0x87, 0xad, 0x97, 0x2e, 0xb6, 0x1c, 0xca, 0x6d, 0x12, 0x3b, 0xc9, 0x27, 0x41, 0x02, 0xe4, 0x8c, 0x40, 0x28, 0xf0, 0xff, 0x83, 0x6c, 0x85, 0x27, 0xad, 0xf4, 0xaf, 0x53, 0x28, 0x8b, 0x3e, 0xbd, 0x45, 0x1c, 0x2c, 0xe5, 0x5c, 0xbd, 0x51, 0xa7, 0xa0, 0x1b, 0xe7, 0x72, 0x77, 0xea, 0x08, 0xb2, 0xad, 0x0d, 0x38, 0x3f, 0x4f, 0x4e, 0xfa, 0x68, 0x0d, 0x74, 0xaa, 0x70, 0x2c, 0x1b, 0x96, 0x04, 0x73, 0x63, 0x20, 0x4a, 0x84, 0xad, 0xfd, 0x5b, 0xd2, 0xee, 0x43, 0x2a, 0xad, 0xbb, 0x77, 0x46, 0x59, 0x7c, 0x82, 0x51, 0xf3, 0x5b, 0xaf, 0x39, 0xe5, 0xdf, 0xed, 0x7c, 0xff, 0x9e, 0xf7, 0x9a, 0xd3, 0x2d, 0x5c, 0x58, 0x44, 0x99, 0x2d, 0xed, 0x89, 0xac, 0x99, 0x72, 0x73, 0x06, 0x0e, 0x33, 0xd3, 0x43, 0xe6, 0x68, 0x47, 0x51, 0xcc, 0x52, 0xb6, 0x76, 0x06, 0xa2, 0xa2, 0x79, 0x57, 0x92, 0x01, 0xc8, 0xfd, 0x0d, 0x8e, 0xb1, 0x84, 0x0f, 0x66, 0x6c, 0x3f, 0xb5, 0x1c, 0xef, 0x15, 0x8e, 0x70, 0xfa, 0x55, 0x86, 0x4a, 0x61, 0x56, 0x9b, 0xad, 0x2a, 0xa2, 0xfa, 0x83, 0x6c, 0xc3, 0x42, 0xee, 0x1b, 0x84, 0x13, 0xa3, 0xed, 0x47, 0xde, 0x99, 0x50, 0x06, 0xfa, 0xf4, 0x39, 0x6c, 0xc0, 0x99, 0xe9, 0xf9, 0x3d, 0xb4, 0x31, 0x40, 0xdf, 0xde, 0x57, 0xf4, 0x49, 0x3f, 0xfd, 0xd7, 0x46, 0xad, 0x57, 0xb3, 0x25, 0x2c, 0xef, 0x5a, 0x7c, 0xe8, 0x7e, 0x03, 0xaf, 0x8e, 0x2c, 0xa6, 0xce, 0xe9, 0x35, 0xb4, 0x9e, 0x0d, 0xa8, 0x7e, 0x47, 0xcb, 0x3c, 0xe0, 0xd6, 0x5e, 0xeb, 0xb8, 0xcf, 0x74, 0xc2, 0xea, 0x09, 0xba, 0x4b, 0x51, 0x48, 0x0f, 0xef, 0x6a, 0xb7, 0xc1, 0x30, 0xf6, 0x65, 0xdc, 0x0f, 0x9c, 0xe6, 0x15, 0xff, 0xcc, 0x0a, 0x3f, 0x8f, 0xde, 0x86, 0x14, 0x66, 0xdd, 0xbe, 0xbf, 0x1e, 0xb4, 0x68, 0x92, 0xda, 0x12, 0xab, 0x88, 0xb9, 0x2f, 0x94, 0x8b, 0xf1, 0x9a, 0x5c, 0xee, 0x38, 0x5a, 0x30, 0xb3, 0x94, 0x52, 0x50, 0x0b, 0x2a, 0x76, 0xc3, 0x90, 0x81, 0xf5, 0xe9, 0xc7, 0x2b, 0xfa, 0x2d, 0x91, 0xf8, 0xfc, 0x6b, 0x13, 0x75, 0x71, 0x4c, 0xb4, 0x54, 0xa5, 0xd7, 0xe6, 0xc9, 0x7b, 0xd0, 0xb8, 0xf4, 0x2f, 0x61, 0xcf, 0x49, 0xb6, 0x57, 0x1a, 0xd4, 0xdb, 0x5e, 0x4d, 0x4f, 0x18, 0x53, 0xe0, 0xf4, 0x27, 0x03, 0xd8, 0x08, 0xcb, 0x9e, 0xee, 0xdc, 0x72, 0x5a, 0x6c, 0x3b, 0x13, 0x78, 0x28, 0xf5, 0xf8, 0x6e, 0x1a, 0x7a, 0xda, 0xc5, 0xf0, 0x4f, 0xbd, 0x0e, 0xcd, 0xc7, 0x22, 0x44, 0x0c, 0x85, 0x4b, 0xe0, 0x96, 0x80, 0xbb, 0x96, 0x26, 0xd2, 0x5d, 0x5f, 0x69, 0x8b, 0x3a, 0x29, 0xaa, 0x04, 0xdd, 0x95, 0xd2, 0x71, 0xf2, 0x62, 0x32, 0x11, 0x3b, 0xe1, 0x00, 0x94, 0x8d, 0x94, 0xf7, 0x9d, 0x5f, 0x57, 0xc3, 0xca, 0x82, 0xc4, 0x70, 0x9f, 0x47, 0x4c, 0x2a, 0xdc, 0x3a, 0x2b, 0xc6, 0x86, 0xc1, 0x9e, 0xf6, 0x04, 0x39, 0x8c, 0x1f, 0x67, 0xd4, 0xc2, 0x5c, 0x8d, 0xf4, 0x80, 0xc7, 0x6b, 0x71, 0xcb, 0x2a, 0x8d, 0x5a, 0x17, 0xae, 0x48, 0x2e, 0x9e, 0x90, 0xd2, 0xdb, 0x6e, 0x8b, 0xd3, 0x8c, 0xe1, 0x06, 0xd4, 0xef, 0x43, 0xf0, 0x3f, 0x53, 0x4c, 0xfb, 0x38, 0x0d, 0xc9, 0xa5, 0x0c, 0xc5, 0x37, 0x92, 0x50, 0x5b, 0x10, 0x39, 0xa5, 0x9e, 0x01, 0x18, 0x62, 0x6c, 0xd6, 0x48, 0xdc, 0xec, 0x68, 0x3a, 0x60, 0xb2, 0x0d, 0x7a, 0x0b, 0x07, 0x93, 0x4b, 0xa3, 0x2d, 0xfb, 0x8b, 0x8b, 0x14, 0x14, 0x4f, 0x3a, 0x47, 0xff, 0xdd, 0x5a, 0x8f, 0x07, 0x7b, 0x01, 0x16, 0x06, 0xe3, 0xe9, 0x02, 0xdc, 0xa8, 0x28, 0x34, 0x0b, 0xcb, 0x7a, 0x6d, 0xe6, 0xce, 0x41, 0xac, 0x13, 0xfa, 0x22, 0x54, 0x03, 0x46, 0x7a, 0x66, 0x75, 0x25, 0x7d, 0xfc, 0x74, 0x67, 0xa4, 0x4d, 0x3e, 0x0c, 0x4a, 0x19, 0xa3, 0xd9, 0x1d, 0x08, 0xc2, 0xe0, 0x4e, 0x90, 0xfd, 0x74, 0x4b, 0x8a, 0x07, 0xcd, 0x49, 0x23, 0x58, 0xe9, 0xa7, 0x1e, 0xbc, 0x64, 0x6d, 0xcb, 0xe0, 0xd3, 0x06, 0x7e, 0x39, 0x57, 0x03, 0x50, 0x76, 0x81, 0x25, 0xe4, 0x7e, 0xc6, 0xf9, 0x8c, 0xce, 0x05, 0x53, 0xaa, 0x7f, 0x0d, 0xe5, 0xef, 0x5f, 0xdb, 0xec, 0x91, 0xd9, 0x34, 0x34, 0xef, 0x27, 0xc1, 0x82, 0x56, 0x16, 0x02, 0x20, 0x23, 0xfc, 0x36, 0xa7, 0x62, 0x57, 0x9e, 0xe6, 0x62, 0x9f, 0xc6, 0x52, 0x2c, 0x2f, 0x33, 0x22, 0xd4, 0x94, 0x87, 0x17, 0xd8, 0x0d, 0x3d, 0x72, 0x2e, 0x8f, 0x04, 0x3b, 0x1e, 0xf4, 0xac, 0x90, 0x5d, 0x27, 0x63, 0x7b, 0xdb, 0xa5, 0x0a, 0x10, 0x9e, 0x79, 0xbd, 0x21, 0x2a, 0xa3, 0x7e, 0xf6, 0x72, 0x34, 0xa6, 0x64, 0x09, 0x0f, 0x82, 0x6e, 0xe7, 0x71, 0xca, 0x21, 0x2f, 0x29, 0x0c, 0xe2, 0x9d, 0x28, 0x6b, 0x5f, 0x9a, 0xd9, 0x68, 0x6f, 0xbe, 0xd8, 0x3b, 0xd3, 0x75, 0x52, 0x58, 0x7c, 0x51, 0x35, 0xfc, 0x6e, 0xe7, 0x7d, 0xab, 0xa9, 0x8b, 0x0d, 0x47, 0x42, 0x00, 0x73, 0x4c, 0xae, 0x02, 0xef, 0xd4, 0xa0, 0x6f, 0x6f, 0xa6, 0x56, 0xf9, 0x0d, 0xb2, 0x8a, 0xa3, 0x09, 0xe2, 0x7f, 0xc3, 0x22, 0x0f, 0x9a, 0xf5, 0x0f, 0x6e, 0x66, 0xe6, 0x85, 0x99, 0x67, 0x13, 0x94, 0xe8, 0x15, 0x55, 0x0f, 0x37, 0x8f, 0x43, 0x8e, 0x32, 0x88, 0x35, 0x8d, 0xb8, 0x19, 0xbd, 0xe4, 0x3f, 0x1d, 0x44, 0x65, 0xd3, 0xbe, 0xbb, 0x7f, 0xdf, 0x21, 0x4e, 0xe6, 0x87, 0x81, 0x86, 0xc0, 0x66, 0xad, 0x52, 0x98, 0x56, 0x02, 0xe0, 0x09, 0xe9, 0xa1, 0x96, 0x0a, 0xfb, 0x75, 0xbd, 0x9c, 0xeb, 0x23, 0x99, 0x9e, 0x93, 0x5c, 0x65, 0xde, 0xc4, 0x68, 0xa4, 0xac, 0x1d, 0xbb, 0xa7, 0x7f, 0x7c, 0x7f, 0xe8, 0xc7, 0x41, 0xd6, 0xd5, 0x1f, 0x1f, 0x66, 0x59, 0xb2, 0xe0, 0xab, 0xa0, 0x52, 0x9a, 0x07, 0x8c, 0xb6, 0x6d, 0x9f, 0x61, 0xfe, 0x06, 0x55, 0x19, 0x22, 0x38, 0x25, 0xc6, 0x20, 0x99, 0xd5, 0xac, 0x8e, 0xfb, 0x43, 0x3d, 0xa6, 0x23, 0xb4, 0xa0, 0x6d, 0x83, 0x4e, 0xd5, 0xd6, 0x14, 0xfd, 0xb6, 0xe2, 0xf2, 0xe2, 0xae, 0x15, 0x39, 0x66, 0x12, 0x5c, 0x0c, 0xa5, 0xc2, 0xa3, 0x5c, 0x4e, 0x55, 0x9a, 0x71, 0xcf, 0xfc, 0x26, 0x54, 0x44, 0x72, 0x2f, 0xed, 0x2a, 0x93, 0x94, 0xce, 0x04, 0x66, 0x66, 0x51, 0x37, 0x02, 0x11, 0xee, 0xbc, 0xe9, 0x6c, 0x4e, 0xba, 0x2c, 0x54, 0x15, 0x25, 0x40, 0x19, 0x2c, 0x6e, 0x2b, 0x1b, 0x7e, 0x8d, 0x29, 0x45, 0x1e, 0x12, 0xbb, 0xe3, 0x44, 0xc8, 0x8b, 0xe6, 0xd3, 0x6b, 0xc8, 0x27, 0x22, 0x40, 0x33, 0xa5, 0x2e, 0x87, 0x59, 0xa9, 0xac, 0x78, 0x23, 0x98, 0x84, 0x75, 0xfc, 0xa4, 0x4e, 0x6f, 0x1b, 0x76, 0x45, 0xd9, 0x91, 0x58, 0xf7, 0x1a, 0x95, 0xad, 0xdd, 0x33, 0x20, 0xfb, 0x25, 0x5d, 0x3d, 0xfb, 0xdf, 0xc2, 0x35, 0x27, 0x38, 0xf0, 0x2f, 0x0f, 0xb6, 0x82, 0x3e, 0x61, 0x64, 0x4b, 0xa4, 0xc2, 0x9d, 0x9e, 0x86, 0xa7, 0xd9, 0xfe, 0xea, 0x0d, 0x87, 0x7a, 0xad, 0x9e, 0x8d, 0x13, 0xd1, 0x0b, 0x53, 0x0c, 0x17, 0x29, 0x40, 0x17, 0xe7, 0x07, 0x75, 0x75, 0x66, 0xfb, 0x94, 0x9d, 0xa7, 0x2c, 0xc2, 0x65, 0x6b, 0xc9, 0xd9, 0xc0, 0xe6, 0x87, 0x31, 0x54, 0x29, 0x64, 0x28, 0x45, 0x63, 0x6c, 0x22, 0xed, 0xaa, 0x3b, 0xcf, 0x97, 0xd5, 0x7a, 0x16, 0xec, 0x06, 0x1d, 0xbf, 0x8a, 0x92, 0x68, 0xa9, 0xdd, 0x6d, 0xe2, 0x2a, 0x4b, 0xca, 0x49, 0xa9, 0x3d, 0x37, 0x2b, 0xdc, 0x00, 0xd9, 0xe4, 0x5e, 0x3c, 0x2c, 0xfd, 0x5f, 0x01, 0xcf, 0xd4, 0x08, 0x38, 0x1b, 0x2a, 0xa5, 0x56, 0xea, 0xfe, 0x53, 0xc9, 0xbd, 0x39, 0xcb, 0x93, 0x5f, 0x06, 0xf0, 0x14, 0x82, 0xfb, 0xe6, 0xe1, 0x24, 0x93, 0xeb, 0xdc, 0x71, 0xc1, 0xac, 0xd9, 0x0a, 0xda, 0x94, 0x1e, 0xcf, 0xf4, 0x27, 0x36, 0x91, 0x8a, 0x47, 0x8c, 0xda, 0xe2, 0x7c, 0x31, 0xbf, 0x70, 0x04, 0x98, 0xfb, 0x3b, 0xf3, 0x70, 0x78, 0xa3, 0x0b, 0x67, 0x69, 0x2b, 0x82, 0x5d, 0xb1, 0xcc, 0x1a, 0x0d, 0x82, 0xf2, 0xe3, 0x6f, 0x0e, 0x54, 0x5b, 0x2a, 0xb9, 0x6a, 0x1d, 0x11, 0x10, 0x20, 0x35, 0x76, 0x7b, 0xa1, 0x64, 0x2b, 0x96, 0x12, 0x5c, 0x62, 0xab, 0x42, 0xc8, 0x30, 0xb7, 0xba, 0x51, 0xb3, 0xe7, 0xe1, 0xa5, 0x21, 0xdc, 0xe5, 0xad, 0x7c, 0xf8, 0x83, 0x7a, 0xa3, 0xec, 0xd4, 0xd1, 0x0d, 0x8b, 0x2e, 0xbf, 0xc4, 0x1f, 0x47, 0x07, 0x5a, 0xa6, 0x4d, 0x5b, 0xc9, 0x21, 0xa2, 0x31, 0x7b, 0xcd, 0x61, 0xcd, 0x1b, 0x51, 0xfc, 0xea, 0xff, 0xb0, 0x86, 0xce, 0x10, 0x51, 0xcb, 0x77, 0xcd, 0x74, 0x4b, 0x3e, 0x6b, 0x0b, 0x9d, 0x42, 0x9f, 0x0f, 0xfa, 0x7c, 0x1e, 0x30, 0x11, 0xc1, 0x02, 0x96, 0x85, 0xd3, 0x8b, 0xdd, 0xc2, 0xc7, 0xf8, 0x09, 0x77, 0x8b, 0x8d, 0xef, 0x3a, 0xfc, 0x21, 0xd6, 0x0b, 0x62, 0x8a, 0x16, 0xd8, 0x5a, 0x75, 0x32, 0x23, 0xd3, 0x5f, 0xa8, 0x9b, 0xba, 0xac, 0x78, 0x64, 0xbf, 0xc4, 0x41, 0x01, 0x5e, 0x95, 0x17, 0x52, 0xf1, 0x53, 0x77, 0xdc, 0x68, 0x62, 0x64, 0xd0, 0x62, 0x9b, 0x73, 0xd0, 0xec, 0xd6, 0x1e, 0x9a, 0xef, 0xea, 0xc6, 0xb7, 0x17, 0x83, 0x74, 0x70, 0xb4, 0x0b, 0x77, 0x7b, 0xab, 0xb5, 0x00, 0x9f, 0xe9, 0x20, 0xc6, 0xf3, 0x3e, 0xc3, 0x1b, 0x5f, 0x53, 0x08, 0x46, 0x5c, 0x4e, 0x03, 0x8f, 0x4f, 0xdc, 0xdc, 0x9d, 0x02, 0xba, 0x9c, 0xd9, 0xca, 0x0d, 0x6d, 0xe7, 0x33, 0xb0, 0xf5, 0x37, 0x8d, 0x04, 0xb0, 0x95, 0x1e, 0x39, 0x8b, 0x15, 0xcc, 0xc6, 0x15, 0x86, 0x41, 0x41, 0x71, 0xb4, 0x48, 0x29, 0x67, 0x97, 0x3f, 0x96, 0x52, 0x1f, 0x75, 0x8a, 0xd7, 0x68, 0xae, 0xa1, 0x66, 0xc5, 0x18, 0xaa, 0x59, 0xbd, 0x8e, 0xa5, 0xa2, 0x89, 0x73, 0x36, 0xa5, 0x01, 0xdd, 0x4a, 0x29, 0xea, 0x1f, 0x03, 0x9a, 0xbc, 0x30, 0x80, 0xa5, 0xa8, 0x44, 0xc1, 0xa3, 0xc5, 0x32, 0xd7, 0x6b, 0xdf, 0x6e, 0xba, 0xd2, 0x02, 0x61, 0x7a, 0x48, 0xb4, 0x8a, 0xa3, 0x7b, 0x26, 0x4d, 0x1b, 0x76, 0x52, 0xd7, 0x4b, 0x18, 0xe7, 0xa0, 0x5a, 0xf3, 0x5e, 0x05, 0x4a, 0x16, 0x65, 0xe3, 0xa2, 0x52, 0x06, 0xa2, 0x68, 0x52, 0x14, 0x00, 0xd3, 0x76, 0xb4, 0xdc, 0x9c, 0xe1, 0x7d, 0xaf, 0xb3, 0x78, 0xe1, 0x1a, 0xf0, 0xa6, 0xbb, 0x72, 0x8b, 0x4c, 0xc7, 0x44, 0xc7, 0xa0, 0xcf, 0x96, 0xf1, 0xfc, 0x1b, 0x6d, 0x92, 0x96, 0x37, 0x21, 0x2b, 0xfa, 0x00, 0xa5, 0x92, 0xd2, 0x38, 0xe9, 0x22, 0xf9, 0x7c, 0xf6, 0x6e, 0x7d, 0xad, 0xd0, 0xd6, 0x46, 0xa7, 0x4a, 0x38, 0x85, 0xe8, 0xce, 0x6a, 0xc8 }; +constexpr AccessUnit AC3_SIZE_MISMATCH_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x3d, 0x29, 0x18, 0x6e, 0x61, 0xd9, 0x34, 0x8e, 0x10, 0xc9, 0x57, 0xdd, 0x59, 0x03, 0xca, 0x97, 0x43, 0xdf, 0x1f, 0xd3 } }; + + +const std::vector M2V_SEQUENCE_END_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0xf2, 0x26, 0xae, 0xd3, 0xf0, 0x56, 0xd2, 0xd9, 0x26, 0xf4, 0x15, 0xd1, 0x9e, 0xbd, 0x68, 0x9d, 0x99, 0x4a, 0x77, 0xcf, 0x6c, 0xea, 0x0a, 0xbe, 0x4b, 0x6c, 0x0f, 0x35, 0x82, 0xf6, 0xef, 0x3d, 0xce, 0x01, 0x6c, 0x79, 0x05, 0x4e, 0xff, 0xb3, 0xca, 0x99, 0xd2, 0x78, 0xdd, 0xf0, 0x68, 0xea, 0x2c, 0x8f, 0x8f, 0xcd, 0x9e, 0x33, 0x8e, 0x0d, 0xe4, 0xf7, 0x67, 0x03, 0x2c, 0x75, 0x5c, 0x05, 0xbf, 0x6a, 0x5d, 0x78, 0x35, 0x68, 0x9d, 0x40, 0xaa, 0xde, 0x5e, 0xde, 0x1c, 0xcb, 0x4a, 0x61, 0x54, 0x61, 0x3a, 0x88, 0xee, 0x47, 0x71, 0xe1, 0xaa, 0xca, 0x47, 0x21, 0xeb, 0x9d, 0x5b, 0xf5, 0x51, 0xc1, 0x08, 0xdb, 0xd1, 0x75, 0x1b, 0x7f, 0x41, 0x7c, 0x99, 0xd1, 0xaa, 0x55, 0x84, 0xf7, 0xac, 0x85, 0xdc, 0x38, 0xf2, 0x26, 0x70, 0xe1, 0x73, 0x49, 0x19, 0x19, 0x1d, 0xbd, 0x77, 0x7a, 0xc5, 0xc5, 0xeb, 0xb9, 0x12, 0x07, 0x4b, 0x06, 0x6b, 0x83, 0x27, 0x8b, 0x66, 0x5a, 0xf5, 0x81, 0x38, 0x77, 0x75, 0x59, 0xda, 0xac, 0x22, 0x41, 0xe6, 0xcf, 0x49, 0xaf, 0xd1, 0x9e, 0x1d, 0xf3, 0x3d, 0x98, 0x05, 0x11, 0x64, 0x8c, 0x86, 0x36, 0x75, 0xc5, 0xd4, 0x7a, 0xda, 0x76, 0x11, 0x6f, 0x5f, 0x60, 0x6f, 0x36, 0xd5, 0x8f, 0x0a, 0xa4, 0x1c, 0x51, 0x9e, 0x10, 0x9c, 0x66, 0xe9, 0xac, 0xdf, 0xde, 0x6f, 0xcc, 0xb8, 0xd6, 0x24, 0xee, 0xe2, 0xaf, 0x5e, 0x75, 0xe0, 0x34, 0x0f, 0x6f, 0xa3, 0x85, 0xbe, 0x61, 0x7b, 0xcf, 0xca, 0x06, 0xf6, 0xf5, 0x02, 0x3b, 0xdb, 0x4f, 0x17, 0x0f, 0x72, 0xdf, 0x97, 0x88, 0xe5, 0xb1, 0x89, 0x9e, 0xec, 0xca, 0x65, 0xb2, 0x40, 0x1f, 0xb4, 0x94, 0x15, 0x34, 0xfe, 0xa6, 0xb4, 0x0f, 0xa7, 0x7f, 0x0b, 0xf7, 0x59, 0x1d, 0x39, 0xef, 0x70, 0xcc, 0x5d, 0x70, 0x01, 0x0e, 0xee, 0xb5, 0x85, 0x56, 0xe8, 0x04, 0xe3, 0x10, 0xae, 0x6e, 0x70, 0xad, 0xf5, 0x56, 0xbe, 0xc8, 0x01, 0xbc, 0x42, 0xd0, 0x50, 0x05, 0xb7, 0xfd, 0x0f, 0x5a, 0x73, 0xec, 0x0c, 0xef, 0x18, 0xd0, 0xb5, 0xbb, 0x9f, 0x62, 0xac, 0x8e, 0xfc, 0x53, 0xac, 0xec, 0x4f, 0x81, 0x98, 0xef, 0x24, 0x46, 0xb5, 0x71, 0x8d, 0xd2, 0xf4, 0xec, 0x60, 0x34, 0x2c, 0x5f, 0xd3, 0x33, 0xfb, 0xcb, 0x20, 0xe1, 0xb2, 0x66, 0x66, 0x4d, 0x39, 0xb0, 0xa2, 0xfc, 0x0f, 0x5f, 0x52, 0xfc, 0x69, 0xe7, 0xf7, 0xc0, 0xd7, 0xc6, 0x36, 0xe0, 0x23, 0x1d, 0x62, 0xe3, 0x3f, 0xb2, 0x66, 0x6b, 0x1f, 0x88, 0x39, 0x21, 0xf0, 0x81, 0xf7, 0x73, 0x41, 0x07, 0xb7, 0x04, 0xb6, 0x22, 0xd3, 0xbb, 0x19, 0xd9, 0xfb, 0xd0, 0xb9, 0xa7, 0xfc, 0x58, 0x88, 0x4d, 0xa9, 0xaa, 0x19, 0xaf, 0xfb, 0x1d, 0x1a, 0xec, 0x50, 0x3f, 0xb2, 0x02, 0x63, 0x30, 0xba, 0x50, 0x42, 0xa0, 0x5e, 0x55, 0xc9, 0xb4, 0x92, 0xb6, 0x31, 0x0d, 0x21, 0xa3, 0x8f, 0xd1, 0x76, 0x48, 0x26, 0xa5, 0xf5, 0xa8, 0x86, 0x26, 0xc3, 0x52, 0x66, 0x92, 0x38, 0x0d, 0x0e, 0xf5, 0xd7, 0xee, 0x53, 0x3c, 0x34, 0xa4, 0xf0, 0xdf, 0xda, 0x98, 0x33, 0x28, 0x3e, 0x66, 0xea, 0x5e, 0xec, 0xd1, 0xf1, 0xca, 0x0b, 0x1e, 0x6d, 0x93, 0x59, 0xf8, 0xb6, 0xec, 0x75, 0x1f, 0xe0, 0xa9, 0xd9, 0x47, 0x34, 0xfc, 0x40, 0x10, 0x72, 0xc7, 0xd3, 0x9c, 0x35, 0x58, 0x02, 0x1d, 0x2b, 0x5f, 0x2c, 0xa1, 0xcc, 0xbf, 0x3a, 0x4d, 0xde, 0x03, 0xc8, 0x51, 0x1e, 0x6a, 0xd3, 0xe8, 0x71, 0x50, 0x63, 0x9f, 0x1b, 0x42, 0xd0, 0x0a, 0xca, 0xc5, 0x19, 0xc8, 0x7f, 0xf0, 0xd1, 0x65, 0x6e, 0x49, 0xb1, 0x55, 0xbf, 0x14, 0x12, 0x07, 0xfe, 0xb1, 0xda, 0x1b, 0xc0, 0xd0, 0xf8, 0x5f, 0x03, 0xf0, 0x92, 0x8e, 0x45, 0xd8, 0xe7, 0xaa, 0x46, 0x4b, 0x10, 0xfa, 0xc2, 0xdd, 0x67, 0xdd, 0x9b, 0x67, 0x3d, 0xbd, 0xa9, 0xd7, 0x63, 0x08, 0x74, 0xd9, 0xc3, 0x64, 0x2c, 0x5f, 0xc8, 0x1c, 0x70, 0x8e, 0x01, 0x4f, 0x72, 0x83, 0xe3, 0x80, 0x21, 0x9e, 0xb6, 0x3f, 0x31, 0xe4, 0x07, 0xb0, 0xfa, 0xf6, 0xd3, 0x4b, 0xc7, 0xb8, 0xf0, 0xf9, 0xcd, 0xe3, 0x81, 0x30, 0xfd, 0x29, 0xdd, 0xc5, 0xc7, 0x01, 0xc3, 0xef, 0xd2, 0xff, 0x45, 0x1c, 0xff, 0x16, 0x72, 0x5a, 0x65, 0x4a, 0x61, 0x97, 0xf1, 0xc1, 0xa6, 0xee, 0x69, 0xa5, 0xc8, 0x74, 0x79, 0x9e, 0xf0, 0x27, 0xc4, 0x2d, 0x45, 0xb3, 0x91, 0x41, 0x41, 0xd9, 0x7b, 0x6f, 0x12, 0x55, 0xe9, 0x01, 0x6c, 0xeb, 0x3c, 0x90, 0x2f, 0xee, 0x9d, 0xa0, 0x5c, 0x7a, 0x5b, 0xa7, 0x01, 0xca, 0x31, 0xd3, 0xfc, 0xb4, 0xd7, 0x25, 0xbe, 0xc3, 0xa0, 0xde, 0xa9, 0x74, 0x7c, 0x6d, 0x0b, 0xd2, 0x47, 0x76, 0x4a, 0x3f, 0x8e, 0xbd, 0xe3, 0x38, 0xfb, 0xf6, 0x4d, 0xaf, 0x9b, 0xb8, 0xba, 0x50, 0xaa, 0x60, 0x81, 0xd4, 0x0e, 0x8d, 0x6b, 0xd2, 0x9b, 0xdd, 0x22, 0xf0, 0x38, 0x4b, 0xef, 0xd0, 0x34, 0x76, 0x65, 0x53, 0xd5, 0xcf, 0x41, 0xe3, 0xaa, 0x1d, 0xa1, 0xd7, 0xa7, 0xdb, 0x75, 0xc6, 0x69, 0xf0, 0x71, 0xbe, 0x98, 0x06, 0xe6, 0x8e, 0x04, 0x6e, 0x7d, 0x89, 0x24, 0xc6, 0xa4, 0x53, 0xa6, 0x68, 0x6a, 0xdf, 0xb3, 0xa3, 0xbe, 0x9f, 0x76, 0x17, 0xa1, 0x5f, 0x18, 0x60, 0xf0, 0x85, 0x23, 0x67, 0x04, 0x0e, 0x48, 0x93, 0x49, 0x84, 0xc3, 0x11, 0x30, 0x0a, 0x8c, 0x86, 0x00, 0x42, 0x0b, 0x71, 0xc0, 0x6c, 0xb9, 0xd2, 0x7f, 0x75, 0x30, 0x17, 0x37, 0x2c, 0x48, 0x96, 0xe0, 0xc0, 0x1d, 0xdf, 0x45, 0xcd, 0xc5, 0x69, 0xcb, 0xcf, 0x2d, 0x55, 0x7b, 0x0a, 0x14, 0x44, 0x68, 0xd2, 0x55, 0x6a, 0xa4, 0xe7, 0x62, 0x87, 0x43, 0x9d, 0x04, 0x26, 0x7e, 0x2e, 0x6a, 0x25, 0x8c, 0x45, 0x20, 0x26, 0xfc, 0x6a, 0x10, 0xfc, 0x41, 0x04, 0x1e, 0x1c, 0x0e, 0xf4, 0x0c, 0xdb, 0x82, 0x60, 0xc5, 0x1c, 0x11, 0xdc, 0x17, 0x07, 0x01, 0xa5, 0x83, 0x24, 0xa8, 0x7b, 0x4c, 0x7f, 0xf2, 0x92, 0x3e, 0x5f, 0xce, 0x2a, 0xf5, 0xa9, 0x73, 0x17, 0xe2, 0x0a, 0x11, 0x8b, 0x10, 0x18, 0x1e, 0x0a, 0x97, 0xcd, 0xdb, 0x51, 0x6a, 0x5a, 0x69, 0x69, 0x61, 0x06, 0x9c, 0xd3, 0x80, 0xfa, 0xe3, 0xac, 0x8b, 0x9e, 0xbf, 0xbe, 0x1d, 0x35, 0x95, 0xda, 0xd8, 0x42, 0xcf, 0x01, 0xca, 0x88, 0x02, 0x2a, 0x93, 0x1e, 0xa8, 0xd7, 0xe6, 0x60, 0x4c, 0xac, 0x14, 0x16, 0x4b, 0x50, 0xda, 0x7a, 0x72, 0x3b, 0x1a, 0xeb, 0x52, 0x2e, 0xc9, 0xa1, 0x96, 0x2a, 0xc9, 0x73, 0x4d, 0xe2, 0x06, 0xff, 0xe4, 0xa7, 0xf1, 0xf4, 0x32, 0x4e, 0x5f, 0xd8, 0x37, 0x9a, 0x51, 0x48, 0x6c, 0xf3, 0x31, 0xb5, 0x3c, 0x10, 0xb6, 0xc1, 0x74, 0xa8, 0xad, 0x53, 0x64, 0x7d, 0xc5, 0xa2, 0x21, 0xf8, 0x00, 0xd6, 0x48, 0x05, 0xd7, 0x59, 0x65, 0xa2, 0xaa, 0x61, 0xd1, 0x69, 0xd6, 0xf7, 0xe2, 0xf3, 0x03, 0xd3, 0x1a, 0xeb, 0xaa, 0x99, 0x5f, 0xc6, 0x9f, 0x97, 0x3b, 0x80, 0x7c, 0x98, 0xdd, 0xf0, 0x87, 0xde, 0x03, 0xec, 0x82, 0xe4, 0xce, 0x55, 0xb3, 0xda, 0x42, 0x8b, 0xbf, 0xc6, 0x51, 0xfd, 0x20, 0x21, 0xff, 0xb6, 0x0b, 0xe6, 0x80, 0x74, 0x6d, 0x45, 0x9a, 0xe5, 0x63, 0x6d, 0x30, 0xe9, 0x1a, 0x0c, 0x42, 0x48, 0x08, 0xa5, 0xd5, 0xa3, 0x91, 0x38, 0x7d, 0xc7, 0x73, 0x4c, 0xef, 0x26, 0xad, 0x46, 0x61, 0xed, 0x38, 0x73, 0xa5, 0x1e, 0x0d, 0x7b, 0x1e, 0xe6, 0x62, 0xa4, 0x96, 0x7b, 0x6d, 0x52, 0x7b, 0x3d, 0x56, 0xb5, 0x41, 0xab, 0xe4, 0xa8, 0xd0, 0x94, 0x1a, 0x15, 0x7e, 0x34, 0x23, 0xab, 0x77, 0xcb, 0xee, 0x85, 0x0e, 0x2f, 0x1b, 0xf7, 0x74, 0x49, 0x31, 0xd8, 0xfa, 0xf2, 0xd5, 0xbf, 0xa6, 0xe3, 0x65, 0x46, 0x77, 0x9c, 0x69, 0x67, 0x13, 0x20, 0xd9, 0xfc, 0xed, 0xc7, 0x12, 0x2b, 0xf1, 0x98, 0x40, 0xbb, 0x8e, 0x87, 0xe2, 0x1a, 0xa2, 0x4a, 0xe7, 0x7f, 0x3a, 0xda, 0xbe, 0x21, 0xcd, 0x9e, 0xb2, 0x75, 0x52, 0xb2, 0x97, 0x48, 0x08, 0xe2, 0x9a, 0x84, 0x2b, 0x47, 0x00, 0x94, 0xe0, 0x81, 0x4e, 0xef, 0x6c, 0xca, 0x21, 0x7c, 0x65, 0xe9, 0x0a, 0x41, 0x16, 0xc3, 0x8e, 0x59, 0xd2, 0xf1, 0x18, 0x31, 0xde, 0xef, 0xfb, 0x2b, 0xcc, 0x42, 0x8d, 0x51, 0xcd, 0x07, 0x98, 0x76, 0x90, 0x3c, 0x75, 0xb7, 0x68, 0x77, 0xec, 0x41, 0xd5, 0xca, 0x38, 0x8e, 0x10, 0xf8, 0xe3, 0xa5, 0x05, 0x14, 0xac, 0xc7, 0x78, 0x61, 0xde, 0xc6, 0xe0, 0x14, 0x2e, 0x04, 0x4f, 0xe6, 0x3b, 0x76, 0x9c, 0xa5, 0x43, 0xbf, 0xdb, 0x7e, 0x24, 0xae, 0x62, 0x28, 0x7d, 0xbb, 0x98, 0x98, 0x30, 0x29, 0x56, 0x9f, 0x9d, 0xb5, 0x8a, 0xa5, 0x3d, 0x75, 0xb8, 0x35, 0xea, 0x34, 0xa9, 0x4c, 0xdb, 0xf3, 0x4d, 0x62, 0x19, 0x52, 0x4b, 0xfa, 0x3d, 0xee, 0x93, 0xb6, 0xff, 0x4f, 0x56, 0x0e, 0x84, 0x36, 0x4a, 0xb3, 0x58, 0x36, 0x30, 0x23, 0x72, 0xc8, 0x7c, 0xd2, 0x01, 0x5d, 0xbc, 0xb0, 0xc5, 0x4b, 0x78, 0xf9, 0x7c, 0x66, 0x17, 0x5e, 0x10, 0x80, 0xef, 0x7c, 0xa5, 0x2a, 0xe8, 0x67, 0x01, 0xfa, 0xe3, 0xf0, 0x6d, 0x50, 0x80, 0x6b, 0x88, 0x74, 0x6e, 0x46, 0xd3, 0xad, 0x04, 0xc1, 0x43, 0xb3, 0xe5, 0x17, 0x87, 0x24, 0xfe, 0x6d, 0x46, 0x58, 0x4b, 0xec, 0xf3, 0x62, 0x66, 0x39, 0x2d, 0xbb, 0xfe, 0x8b, 0x5c, 0xf0, 0x81, 0x4f, 0xe4, 0x82, 0xdd, 0x9d, 0xac, 0x6d, 0x7e, 0xb1, 0x77, 0x16, 0x49, 0xbe, 0xd3, 0x28, 0x10, 0xc7, 0xb3, 0xbf, 0xc6, 0x0b, 0x5e, 0x8a, 0xd9, 0x5c, 0xf6, 0xd7, 0x5d, 0xde, 0x27, 0xba, 0x04, 0xd9, 0xdc, 0xbb, 0x01, 0xd4, 0x10, 0x46, 0xdd, 0x60, 0x75, 0xea, 0xf1, 0x8e, 0xbc, 0xf1, 0xf8, 0x67, 0xee, 0x1c, 0x51, 0x3e, 0xe9, 0xd5, 0xfa, 0x25, 0xa1, 0x0f, 0x0f, 0x8c, 0x8e, 0x89, 0x77, 0xe5, 0xe6, 0x1a, 0x28, 0x34, 0x16, 0x85, 0x94, 0x5b, 0x83, 0xe3, 0xde, 0xfe, 0x91, 0x29, 0xdc, 0xe1, 0xe6, 0x75, 0xa8, 0x0a, 0xf6, 0x08, 0xe7, 0x4d, 0xad, 0xb5, 0x0e, 0x63, 0xf3, 0x7d, 0xbf, 0xf0, 0xeb, 0xd1, 0x71, 0xe7, 0x76, 0xf5, 0x87, 0xb6, 0x95, 0x44, 0xae, 0x2f, 0x6b, 0x72, 0xbd, 0xd6, 0x69, 0xa3, 0x42, 0xf4, 0x2f, 0x3b, 0xaf, 0x03, 0x6b, 0x56, 0x86, 0x50, 0xa1, 0xfd, 0xcc, 0x93, 0xb3, 0xff, 0xc3, 0x72, 0xfe, 0x7c, 0x56, 0x94, 0x74, 0x70, 0xeb, 0xea, 0x83, 0x9c, 0xcc, 0xed, 0xcf, 0xf9, 0xae, 0xce, 0xfe, 0xa7, 0x3f, 0xf8, 0xb0, 0xba, 0xdf, 0x7a, 0x85, 0x13, 0xb4, 0xe5, 0xf7, 0x6b, 0x24, 0xc6, 0x2c, 0x01, 0x8e, 0x32, 0xb9, 0x29, 0xa6, 0xf1, 0xb7, 0x2e, 0xc6, 0x94, 0xbd, 0xd4, 0x3e, 0x07, 0x57, 0x3a, 0x32, 0xaf, 0x27, 0xbe, 0x66, 0x90, 0x20, 0x8a, 0x45, 0xc9, 0xc5, 0x4f, 0x21, 0x42, 0x95, 0x4a, 0xbc, 0x3c, 0x0d, 0x8d, 0x4e, 0x22, 0xaa, 0x1c, 0xba, 0x2a, 0xb3, 0x69, 0xd9, 0xf4, 0x33, 0x89, 0xde, 0x8f, 0xc5, 0xf0, 0x65, 0x90, 0xb3, 0x62, 0x74, 0x4c, 0x7f, 0xb3, 0xa5, 0x1e, 0x67, 0x62, 0x1e, 0x29, 0x88, 0x6d, 0x2e, 0x65, 0x5c, 0x57, 0xbe, 0x3b, 0xed, 0x77, 0xd0, 0x55, 0xe9, 0xcc, 0x6b, 0xe6, 0x0a, 0xcb, 0xa6, 0x7a, 0x6e, 0x9d, 0xbe, 0x6f, 0xba, 0x87, 0xc8, 0x0d, 0x5d, 0x03, 0xaf, 0xeb, 0xa9, 0x24, 0xb8, 0x51, 0x17, 0x17, 0x1b, 0x73, 0xd8, 0x26, 0xbf, 0x89, 0xeb, 0x27, 0x68, 0xff, 0x18, 0x9e, 0xc6, 0x70, 0xb5, 0x15, 0x17, 0xc0, 0x5b, 0x7b, 0x93, 0xd2, 0x0f, 0x26, 0x8f, 0x36, 0x2a, 0x1b, 0x6c, 0x97, 0x77, 0x69, 0xaf, 0x17, 0xeb, 0xf2, 0x3e, 0x96, 0xc4, 0xf9, 0xba, 0xce, 0xb8, 0x57, 0xb7, 0x46, 0x79, 0xe8, 0x5c, 0xfd, 0x75, 0xdd, 0x03, 0xbe, 0x37, 0x5a, 0x51, 0x63, 0xc1, 0xa7, 0xb9, 0x92, 0x68, 0x23, 0xb1, 0x74, 0x84, 0x49, 0xe2, 0x8e, 0xc1, 0x94, 0x6f, 0x3d, 0x89, 0xdf, 0x11, 0xc0, 0xfc, 0x00, 0x0c, 0x17, 0xdc, 0x6e, 0x92, 0x37, 0xde, 0x91, 0xf5, 0x18, 0x41, 0x90, 0x58, 0xc4, 0x8b, 0xe8, 0x58, 0xd7, 0x87, 0xe6, 0x27, 0xc9, 0xce, 0x7b, 0xc0, 0x2e, 0xf8, 0xd6, 0x1c, 0x7c, 0xe3, 0x79, 0x95, 0x92, 0x1f, 0x71, 0xd8, 0x9f, 0x7f, 0x0f, 0x25, 0x99, 0x03, 0x0f, 0x81, 0xc7, 0x25, 0x5d, 0x49, 0x51, 0xad, 0xc8, 0x9b, 0x62, 0x87, 0x32, 0x62, 0x18, 0xef, 0xb0, 0x72, 0x56, 0xb4, 0x99, 0xa9, 0xff, 0xb0, 0xa0, 0x6a, 0xb6, 0xf7, 0xad, 0x53, 0xd4, 0xd8, 0xc4, 0xc5, 0xa6, 0x9a, 0x94, 0x37, 0x8d, 0x0d, 0xc6, 0x56, 0x90, 0x00, 0x4a, 0x35, 0x70, 0x60, 0x5a, 0x47, 0x58, 0x1d, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x11, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0xb7, 0xde, 0xad, 0xbe, 0xef, 0x92, 0x8a, 0xad, 0x4b, 0x8e, 0x21, 0x89, 0xdc, 0xf8, 0x7d, 0x5b, 0x89, 0xa1, 0x2a, 0x4b, 0xb2, 0xff, 0xa4, 0x5e, 0x1c, 0x1f, 0x0f, 0x4c, 0x68, 0x16, 0x18, 0x5e, 0x99, 0xbd, 0x17, 0x33, 0x71, 0x7c, 0x20, 0x20, 0xf1, 0xab, 0x29, 0x8f, 0x99, 0xd3, 0x63, 0xd7, 0x9d, 0x6e, 0xac, 0x4e, 0x23, 0x68, 0xb2, 0x51, 0x45, 0x5e, 0xe4, 0x57, 0x53, 0x49, 0x2c, 0x78, 0x20, 0xba, 0xd2, 0xb6, 0xf8, 0xef, 0x3e, 0xb8, 0xea, 0x7f, 0x79, 0xc8, 0x57, 0xbc, 0x72, 0xdf, 0x31, 0x38, 0x38, 0x33, 0xd8, 0xe4, 0x9c, 0x00, 0x0f, 0x94, 0xb3, 0x63, 0xbd, 0x27, 0xde, 0x73, 0x58, 0x24, 0xaf, 0x73, 0xd1, 0x63, 0xc8, 0xb3, 0x28, 0x0d, 0x12, 0x88, 0x20, 0xbe, 0x3c, 0x67, 0x72, 0x1c, 0x71, 0x92, 0x8a, 0xc8, 0x64, 0x53, 0xaf, 0x30, 0xd3, 0xd3, 0xe8, 0xa1, 0x36, 0x39, 0xba, 0xe6, 0x63, 0xe7, 0x72, 0x8d, 0x78, 0xc0, 0xf3, 0xf4, 0xaf, 0x5a, 0xc8, 0xc1, 0x08, 0x20, 0xe4, 0xf9, 0x49, 0xdb, 0xcf, 0x85, 0x4e, 0x5d, 0x63, 0x7f, 0xcf, 0x8e, 0xdf, 0xaf, 0xa3, 0x3a, 0xfd, 0x6e, 0x05, 0xc7, 0xe7, 0x34, 0xd6, 0x78, 0x05, 0x0c, 0x8a, 0xe3, 0xd6, 0x4c, 0x55, 0x2a, 0xfa, 0xa4, 0xd0, 0x27, 0x0a, 0xde, 0x36, 0xa1, 0x92, 0xd2, 0xb2, 0xf0, 0x09, 0xd5, 0xf6, 0xf2, 0x8b, 0x2c, 0x13, 0x7c, 0xe9, 0xfc, 0xe5, 0x3f, 0xd3, 0x74, 0x5d, 0xd4, 0x99, 0x3c, 0xd4, 0xc9, 0x64, 0x7a, 0x65, 0xf8, 0x13, 0x34, 0x50, 0x0b, 0xab, 0x08, 0x77, 0x1a, 0x94, 0x0d, 0xcd, 0xb2, 0xef, 0x20, 0x15, 0xf9, 0x5b, 0x33, 0x21, 0x95, 0xf5, 0x70, 0x19, 0x3d, 0x1c, 0x26, 0xe9, 0x54, 0x8c, 0x46, 0x32, 0x13, 0x36, 0x64, 0x4f, 0x19, 0x7f, 0xd9, 0xa4, 0xc8, 0xd7, 0x1a, 0x8d, 0x20, 0xb0, 0x30, 0xba, 0xcf, 0x2b, 0xd5, 0x7e, 0x30, 0x67, 0x83, 0x88, 0xf0, 0x3b, 0x5d, 0x9d, 0x6b, 0x59, 0x51, 0xd4, 0xdc, 0x5d, 0xa4, 0x65, 0xa2, 0x81, 0x4b, 0x19, 0xcd, 0xab, 0x37, 0x76, 0x67, 0x44, 0xaf, 0x3f, 0xdd, 0x74, 0xd6, 0x01, 0x61, 0xf2, 0x8f, 0xf7, 0x9e, 0x55, 0x3f, 0xe7, 0xb0, 0x2f, 0x65, 0x1f, 0x64, 0xf2, 0x47, 0x61, 0x48, 0xa3, 0x12, 0xad, 0x4e, 0x0d, 0x11, 0x31, 0x08, 0xba, 0x4a, 0x76, 0x32, 0x3f, 0x90, 0x69, 0x80, 0x3e, 0x42, 0x8e, 0xea, 0x18, 0xac, 0x25, 0x6f, 0x7e, 0x95, 0xff, 0x41, 0xd7, 0x84, 0xf3, 0x5e, 0xea, 0x7f, 0x40, 0x2d, 0xbf, 0x63, 0xf7, 0xe3, 0xe7, 0xbf, 0x6b, 0xdb, 0xdb, 0x44, 0x40, 0x78, 0x9c, 0x6c, 0xa1, 0x17, 0x1a, 0xf4, 0x8f, 0x55, 0xe7, 0x41, 0xf2, 0x1b, 0x52, 0xe9, 0x6e, 0x3b, 0x66, 0x63, 0x3a, 0x89, 0x81, 0x40, 0x02, 0xea, 0x6b, 0x2e, 0x81, 0xd5, 0xbe, 0x4b, 0x73, 0x8a, 0x7f, 0xd7, 0x9e, 0x8b, 0xf7, 0xc8, 0x05, 0xb7, 0x48, 0xbb, 0xb0, 0x5d, 0xe8, 0x92, 0xbf, 0x5f, 0xdd, 0xcc, 0x32, 0x42, 0xb7, 0x6b, 0xff, 0x1d, 0x8a, 0x45, 0xe3, 0x9e, 0xaa, 0x57, 0x3a, 0x2d, 0x54, 0xbf, 0x98, 0x04, 0x5b, 0x29, 0xb3, 0x10, 0xcc, 0x4c, 0x4b, 0xec, 0x5f, 0x94, 0xfe, 0xba, 0x04, 0x77, 0x4d, 0x1c, 0x84, 0x2e, 0x44, 0xe5, 0x4a, 0xcb, 0x11, 0x89, 0x30, 0x46, 0xda, 0x8a, 0xb9, 0x1a, 0xda, 0x6f, 0xc5, 0x24, 0xc9, 0xff, 0xa1, 0xf8, 0x00, 0x6c, 0x44, 0xaa, 0x48, 0x5d, 0x9e, 0xa8, 0xe5, 0x74, 0xda, 0xe3, 0x11, 0x0a, 0x67, 0xca, 0xb9, 0x5c, 0x68, 0xed, 0x21, 0x5b, 0x09, 0x65, 0x3c, 0x4a, 0xe9, 0x72, 0xbb, 0xad, 0x27, 0xb7, 0xe5, 0x5f, 0x0c, 0xfd, 0x04, 0xba, 0xcf, 0x71, 0x6b, 0x71, 0x62, 0x9e, 0xec, 0x40, 0x2c, 0x29, 0x87, 0x5a, 0xef, 0x1d, 0x18, 0xee, 0xd1, 0x67, 0x9b, 0xea, 0x35, 0x9c, 0xc5, 0xb3, 0x7a, 0xcd, 0x80, 0xbc, 0xd4, 0xf7, 0x38, 0x56, 0x9b, 0x02, 0xca, 0x61, 0xa1, 0x8d, 0x15, 0x96, 0x8d, 0xe8, 0xb6, 0xb1, 0xb9, 0x74, 0xc8, 0x9b, 0x73, 0xa9, 0xe6, 0x16, 0x81, 0x9e, 0xb2, 0xf8, 0x5a, 0x56, 0xf2, 0x9e, 0x8c, 0x26, 0xe7, 0xc5, 0x40, 0xbf, 0xd8, 0x94, 0x91, 0x04, 0x21, 0x0c, 0x00, 0x04, 0x7e, 0x78, 0x12, 0x5a, 0x6e, 0x69, 0x57, 0xb6, 0x27, 0xa6, 0x39, 0xe5, 0xe5, 0x00, 0x0e, 0xe0, 0xe2, 0xe1, 0x4b, 0x83, 0x9d, 0x51, 0x00, 0xfc, 0xa9, 0xb7, 0x46, 0xf5, 0x99, 0x1a, 0x1f, 0xfe, 0x54, 0x81, 0x2e, 0xe3, 0x63, 0xcb, 0x73, 0xc4, 0x5b, 0x8f, 0x2d, 0x0d, 0x76, 0x83, 0x3c, 0xe1, 0x80, 0x5b, 0xdc, 0x71, 0x8d, 0x6a, 0x3b, 0xdc, 0xae, 0x31, 0x4a, 0xc6, 0xfb, 0x6e, 0x1c, 0xc3, 0xdb, 0xb5, 0xa0, 0x83, 0x7a, 0x34, 0xfb, 0x89, 0x57, 0xa4, 0xd5, 0x7c, 0x46, 0x5e, 0xa7, 0x79, 0xf7, 0x75, 0x01, 0x72, 0x43, 0x4e, 0x7a, 0x1f, 0xed, 0x39, 0x09, 0xd2, 0x80, 0xf9, 0x6a, 0x7a, 0x41, 0x6f, 0x0b, 0x5f, 0x97, 0x35, 0xe1, 0xa0, 0x35, 0xaf, 0xba, 0x36, 0x45, 0xad, 0xf4, 0x49, 0xbe, 0x74, 0x42, 0x02, 0xea, 0x3b, 0xf1, 0xd5, 0x7d, 0x67, 0x7e, 0x66, 0x98, 0xb8, 0x76, 0x00, 0xbd, 0x9a, 0xd7, 0x17, 0x2d, 0xd7, 0x8e, 0xe6, 0xed, 0xe6, 0xf0, 0x3e, 0x67, 0x94, 0xde, 0xf3, 0x39, 0x78, 0xb6, 0x0e, 0x60, 0xe2, 0xd6, 0xeb, 0xfe, 0x98, 0x84, 0xcc, 0xb1, 0xa2, 0xa2, 0x8f, 0x28, 0x10, 0x60, 0xd8, 0xbd, 0x6d, 0x00, 0x8d, 0xb8, 0x9d, 0x11, 0x2f, 0x73, 0xf9, 0x79, 0xbf, 0xf2, 0x18, 0xa2, 0x27, 0x5d, 0x0c, 0xef, 0x29, 0x40, 0x3f, 0x0d, 0x45, 0xb4, 0x96, 0xb9, 0xc6, 0x44, 0xa3, 0x4b, 0x09, 0x9b, 0xa9, 0x93, 0x16, 0xf0, 0x3d, 0xa1, 0x24, 0x13, 0xcd, 0x39, 0x13, 0xe6, 0x4b, 0x48, 0x1b, 0xc7, 0x3a, 0x4a, 0xcf, 0x9e, 0xbd, 0x5c, 0x18, 0x1f, 0x36, 0xbc, 0x83, 0xbe, 0x79, 0xb6, 0x96, 0xe0, 0x55, 0x76, 0x9f, 0x29, 0x7b, 0xac, 0x6e, 0x5a, 0x7b, 0xb2, 0x83, 0x5a, 0xbe, 0xe4, 0x41, 0xe1, 0xfb, 0x1c, 0x3f, 0x32, 0x42, 0x79, 0x57, 0x93, 0xdd, 0x8a, 0xd6, 0x65, 0x8d, 0x60, 0x46, 0xda, 0xc8, 0x84, 0x60, 0xdb, 0x78, 0x69, 0xef, 0xe5, 0xa6, 0x7c, 0xa5, 0x22, 0xef, 0x23, 0x51, 0xd6, 0xe6, 0x04, 0x66, 0xf4, 0x62, 0xd8, 0x0b, 0x59, 0x94, 0x16, 0xd8, 0xf6, 0xce, 0x9f, 0xa1, 0x0e, 0x81, 0x8a, 0x54, 0xab, 0x78, 0x1e, 0xff, 0xb9, 0x59, 0x25, 0x7a, 0x43, 0x52, 0xa3, 0xc2, 0x74, 0xb8, 0xa0, 0x29, 0x27, 0x98, 0xf3, 0x18, 0xe2, 0x6e, 0x7b, 0x8b, 0x48, 0x73, 0xc5, 0x3b, 0x1c, 0xb1, 0x16, 0x40, 0x68, 0x9a, 0xbe, 0x16, 0x48, 0xaa, 0x07, 0xef, 0x40, 0xc1, 0xec, 0xdb, 0x4e, 0x94, 0x8c, 0x54, 0x41, 0xa2, 0x66, 0x33, 0x53, 0xf9, 0x6e, 0x4d, 0xcc, 0x62, 0x24, 0x33, 0x02, 0xeb, 0x91, 0xbe, 0xeb, 0x95, 0x34, 0xa7, 0x0e, 0x88, 0xfb, 0x1f, 0x6b, 0x15, 0xe0, 0x17, 0xc0, 0x6d, 0x6b, 0x4f, 0x78, 0x5a, 0x7c, 0x36, 0xae, 0xe6, 0x7e, 0xff, 0x00, 0x7c, 0x27, 0x94, 0xc6, 0xd4, 0xa1, 0x22, 0x2a, 0x83, 0x64, 0x34, 0x6e, 0x71, 0x0f, 0x4e, 0x98, 0xb7, 0xc9, 0x78, 0xfb, 0x6d, 0xaa, 0x35, 0x56, 0x16, 0x20, 0x1b, 0x9f, 0x66, 0xec, 0x80, 0x3e, 0xc5, 0x5a, 0x61, 0x69, 0x7c, 0x0c, 0x70, 0x03, 0x23, 0xe8, 0xa5, 0x97, 0x22, 0x62, 0xe6, 0x47, 0xb3, 0x61, 0xe3, 0x1e, 0xd7, 0x77, 0xc8, 0xea, 0x12, 0xf6, 0x0c, 0xf5, 0xca, 0xde, 0xc3, 0x33, 0x97, 0x93, 0xcc, 0x7b, 0xca, 0x75, 0xda, 0x71, 0x10, 0x3e, 0xf5, 0xd3, 0xa7, 0x61, 0xd9, 0xa0, 0x3e, 0xe3, 0x2f, 0x78, 0x5f, 0xef, 0xcb, 0x89, 0xa8, 0x8d, 0xb6, 0xb6, 0x9c, 0xe9, 0x55, 0x45, 0x12, 0xf9, 0x46, 0x55, 0x94, 0xd3, 0x96, 0x0f, 0x12, 0xb6, 0xdc, 0x25, 0x86, 0xbe, 0xca, 0x13, 0x04, 0xbe, 0xda, 0x39, 0xab, 0x9a, 0x1e, 0xa3, 0x0d, 0x13, 0xa6, 0x19, 0x7b, 0xe5, 0x17, 0xcd, 0x63, 0x4a, 0x6a, 0xab, 0xd7, 0xde, 0xbc, 0x0f, 0x70, 0xa6, 0xb2, 0x60, 0xae, 0xcd, 0xdb, 0x52, 0x59, 0x17, 0x28, 0x15, 0x5c, 0xa9, 0xec, 0x89, 0x29, 0xb4, 0x39, 0x7d, 0x71, 0x2b, 0x47, 0x75, 0x29, 0x43, 0x66, 0xa8, 0x8f, 0x15, 0xb9, 0xb5, 0xc5, 0x69, 0x03, 0xc1, 0x12, 0xf5, 0x3c, 0xeb, 0x22, 0x76, 0x2a, 0x36, 0xc1, 0x5b, 0x5b, 0x4a, 0x21, 0xa7, 0xdd, 0xb5, 0xed, 0x53, 0x93, 0x9f, 0xd1, 0xac, 0xb2, 0x51, 0x08, 0x68, 0x03, 0x73, 0xd3, 0x36, 0x40, 0xca, 0xe1, 0x7b, 0xb8, 0x0b, 0xca, 0xc0, 0x3d, 0xa6, 0x12, 0xf2, 0x55, 0x30, 0xe5, 0xba, 0x2c, 0x26, 0x43, 0xbf, 0x2b, 0x0a, 0x94, 0xcc, 0xb1, 0xd9, 0x3a, 0x2a, 0xa0, 0xb4, 0xeb, 0xaf, 0x7e, 0xb5, 0xad, 0xb9, 0x0b, 0xda, 0xd3, 0xa1, 0x91, 0x25, 0x11, 0x2e, 0x52, 0xc8, 0xf1, 0xd1, 0xba, 0x1a, 0xef, 0xd5, 0x5d, 0x7b, 0x02, 0x1b, 0x8d, 0x34, 0x0f, 0x48, 0x5b, 0x66, 0x68, 0xd2, 0xab, 0xda, 0x16, 0x76, 0x63, 0x13, 0x17, 0x83, 0x60, 0xe4, 0xb0, 0x8f, 0x19, 0x33, 0x2d, 0x38, 0x6a, 0x28, 0x85, 0x5c, 0xbc, 0xea, 0xb1, 0xfb, 0xf8, 0xf2, 0xc6, 0x59, 0x21, 0xb6, 0xf2, 0xc7, 0x7a, 0x7c, 0x9b, 0xd4, 0x58, 0x82, 0xed, 0xac, 0x6a, 0xc4, 0x71, 0xfc, 0x2e, 0xeb, 0x9c, 0xe4, 0xcc, 0x8b, 0x66, 0x5d, 0xd5, 0x1c, 0x12, 0x16, 0x5d, 0x98, 0xa6, 0x2d, 0x6b, 0x75, 0x4e, 0x00, 0x59, 0x36, 0xfe, 0x6c, 0x87, 0x48, 0x47, 0xa9, 0xec, 0x8f, 0xc8, 0x88, 0x66, 0x00, 0xb3, 0x5a, 0xe7, 0xe1, 0xc5, 0x13, 0x3b, 0x57, 0xe7, 0x81, 0xa1, 0xfb, 0x6a, 0x7e, 0xc4, 0xf4, 0xf4, 0xc7, 0xbe, 0x90, 0x3c, 0x6a, 0xcc, 0xed, 0xe9, 0x35, 0xf2, 0x19, 0xc8, 0x6e, 0xa2, 0xbe, 0xae, 0xa0, 0x46, 0x3d, 0x76, 0xcd, 0xcf, 0xae, 0xd6, 0x8c, 0x0c, 0xdf, 0x05, 0x1a, 0x2b, 0xde, 0xbf, 0xc4, 0x0d, 0xe6, 0x74, 0x88, 0xad, 0xc7, 0x39, 0x8c, 0x33, 0x9b, 0x31, 0xaa, 0xc4, 0xc0, 0xab, 0x8d, 0x4b, 0xad, 0x88, 0x87, 0x4a, 0x1b, 0x59, 0xaa, 0xac, 0xfe, 0x11, 0x19, 0xa4, 0xd5, 0x40, 0xb1, 0x18, 0x7c, 0x05, 0xa8, 0x7e, 0x89, 0xda, 0x57, 0x0e, 0xfd, 0x70, 0x59, 0xa5, 0xa0, 0x8c, 0x85, 0x3f, 0xaf, 0x05, 0x8a, 0xe5, 0xd3, 0x98, 0x0a, 0x30, 0x8b, 0x47, 0x44, 0x32, 0x13, 0x97, 0x61, 0xef, 0x11, 0xca, 0x96, 0x8f, 0x78, 0x9c, 0x64, 0x4f, 0x56, 0xb1, 0x5c, 0xdc, 0x3f, 0x24, 0x6c, 0xf2, 0xb6, 0x5b, 0x8b, 0x59, 0x8b, 0xab, 0xa6, 0xb8, 0xfc, 0x41, 0xf5, 0xc1, 0xa4, 0xcc, 0x98, 0xdf, 0x72, 0xe7, 0x8a, 0x3a, 0x9a, 0xe6, 0xd7, 0xbf, 0xf7, 0xa0, 0xc7, 0xf9, 0xe1, 0x51, 0xc0, 0xce, 0x7f, 0x8f, 0x07, 0x36, 0xfa, 0x9d, 0xe6, 0x9f, 0xe6, 0x44, 0xe1, 0xf8, 0xe7, 0x0b, 0xe9, 0xde, 0xe9, 0x6a, 0x7f, 0x08, 0x9e, 0xe9, 0x08, 0xfa, 0x28, 0x87, 0xc5, 0xc7, 0x6d, 0x08, 0xd2, 0xf2, 0x59, 0x20, 0x81, 0xdf, 0xe6, 0x0c, 0x85, 0xb5, 0x10, 0xcd, 0x39, 0x24, 0x0d, 0x67, 0x5c, 0x49, 0x2d, 0x84, 0xc8, 0x2c, 0x81, 0x11, 0xfa, 0x49, 0x27, 0x25, 0xd4, 0x40, 0x7d, 0xee, 0xb1, 0x83, 0x72, 0xd6, 0x53, 0xf2, 0xb6, 0x3c, 0x08, 0x58, 0xf8, 0xe3, 0x5a, 0x9e, 0xa7, 0x9d, 0x8d, 0x26, 0xf2, 0xfd, 0xe0, 0x4e, 0xb8, 0x4a, 0x49, 0x99, 0x97, 0x38, 0xe8, 0xc8, 0xc6, 0x6f, 0x54, 0xe7, 0xa7, 0x64, 0xdd, 0x34, 0x2b, 0x71, 0x60, 0xc9, 0x80, 0xbb, 0x42, 0xbe, 0xfb, 0x57, 0x4f, 0x6c, 0xc4, 0x4d, 0x9b, 0x53, 0x07, 0x58, 0x5b, 0xec, 0x02, 0x00, 0x83, 0xec, 0x5b, 0x6d, 0x9f, 0x03, 0xe2, 0x75, 0x60, 0x18, 0x10, 0xa2, 0xa1, 0xc0, 0xad, 0xe2, 0xad, 0xd1, 0x27, 0x7f, 0x45, 0xdf, 0xa6, 0x9c, 0xb7, 0x9b, 0x62, 0xc7, 0x9c, 0x78, 0xc0, 0x5a, 0x63, 0x7b, 0xda, 0x57, 0x89, 0x32, 0x4c, 0x10, 0x25, 0x38, 0xa8, 0x0a, 0x45, 0x37, 0x3e, 0x10, 0x73, 0xe5, 0x12, 0x65, 0x12, 0x21, 0x9f, 0x1a, 0x74, 0x03, 0x8c, 0xf7, 0x6e, 0xdd, 0x14, 0x32, 0x58, 0xea, 0x80, 0xe0, 0xa7, 0xa1, 0xb5, 0xa8, 0x16, 0xab, 0x62, 0x6f, 0x7d, 0xf1, 0xf2, 0x8f, 0xb0, 0x9d, 0xd6, 0x32, 0x31, 0x15, 0x2e, 0xfe, 0xec, 0xcd, 0xb8, 0x5c, 0xe6, 0x9e, 0x64, 0x04, 0x29, 0xe8, 0xe2, 0xcb, 0x48, 0x11, 0x02, 0x68, 0x56, 0xce, 0xad, 0xf6, 0x5d, 0xd3, 0x90, 0x65, 0x32, 0x75, 0x4d, 0x85, 0xce, 0x15, 0x47, 0x77, 0x90, 0x00, 0xbc, 0x08, 0x38, 0x30, 0xb3, 0x71, 0x49, 0x61, 0xcd, 0x1f, 0xea, 0x12, 0xbe, 0x87, 0x77, 0x32, 0x4c, 0x31, 0xe6, 0xc8, 0x7e, 0x22, 0x37, 0x9b, 0x44, 0x2f, 0xb9, 0x73, 0x46, 0x7a, 0x40, 0x24, 0x07, 0x54, 0x0c, 0xc2, 0x31, 0x9d, 0xa4, 0x2b, 0xc5, 0x7f, 0x4f, 0x6d, 0x23, 0x8a, 0xf9, 0x3e, 0xc0, 0x71, 0xab, 0x32, 0xa9, 0xb9, 0x99, 0x40, 0xbd, 0x06, 0x7b, 0xa4, 0xf6, 0x92, 0xec, 0xab, 0x51, 0xec, 0x46, 0x79, 0x6e, 0x40, 0xbf, 0x69, 0x33, 0xad, 0xe6, 0x37, 0x2b, 0x2d, 0xf9, 0xf5, 0x8b, 0x03, 0xeb, 0x72, 0x80, 0x15, 0xb2, 0x0e, 0xb7, 0x60, 0x51, 0xad, 0xdf, 0x6b, 0x5f, 0xf2, 0x2f, 0xe9, 0x48, 0x86, 0x17, 0xe9, 0x21, 0x9d, 0x00, 0x9c, 0x72, 0x14, 0xa3, 0x6c, 0x08, 0xdb, 0x78, 0x3d, 0x3c, 0xce, 0x60, 0x55, 0x5c, 0x12, 0x17, 0x09, 0x7e, 0xaf, 0x0e, 0x5c, 0x2e, 0xc0, 0x5d, 0xf7, 0xec, 0xb1, 0xa7, 0x84, 0xa7, 0x7c, 0x78, 0x52, 0x9c, 0x75, 0xf6, 0x8d, 0x3b, 0x65, 0x18, 0xc5, 0x06, 0x15, 0x95, 0xdb, 0x35, 0x36, 0x16, 0xc4, 0xd3, 0x78, 0xe9, 0x6c, 0x2c, 0x9a, 0x01, 0x90, 0x80, 0x8c, 0xd4, 0x76, 0xf7, 0x19, 0x84, 0x08, 0xfa, 0x62, 0x6d, 0x97, 0xce, 0x60, 0xd9, 0xdf, 0x2b, 0xb5, 0x72, 0xb0, 0x85, 0x69, 0x76, 0x50, 0x08, 0x84, 0xd2, 0xf2, 0xf1, 0xe0, 0x5e, 0x42, 0x97, 0xac, 0x03, 0x76, 0x9a, 0x1a, 0x88, 0xaa, 0x3a, 0x51, 0xb8, 0x49, 0xa0, 0x0c, 0xf4, 0xd2, 0xca, 0x43, 0x7c, 0xa2, 0xf5, 0xb2, 0x2d, 0x78, 0x19, 0x31, 0x7c, 0xe7, 0x4f, 0xdd, 0x67, 0x57, 0x7c, 0x8e, 0x4b, 0x00, 0x54, 0x17, 0xa0, 0xe5, 0xfc, 0x39, 0x9c, 0x37, 0x91, 0x4e, 0xae, 0xe3, 0xb3, 0x78, 0xa4, 0xcd, 0xc6, 0x7d, 0xe5, 0xa9, 0x63, 0x5e, 0xfd, 0x77, 0x78, 0x98, 0x81, 0x53, 0x5e, 0x25, 0x53, 0x79, 0x9b, 0x21, 0x74, 0xc7, 0x66, 0x63, 0x2c, 0x7c, 0x1e, 0x75, 0x3e, 0x86, 0x98, 0x6b, 0xf1, 0xaa, 0xe6, 0x6f, 0xea, 0x62, 0x84, 0xa4, 0xc1, 0x6e, 0x42, 0x93, 0x06, 0x18, 0x4c, 0xdf, 0x9a, 0xd8, 0x8e, 0x03, 0x08, 0xdb }; +constexpr AccessUnit M2V_SEQUENCE_END_SPLIT_EXPECTED_AU = { 0x15f90, 0x159b2, true, 0, {}, { 0x6f, 0x00, 0x25, 0xed, 0x88, 0xfb, 0x17, 0x95, 0x83, 0x1c, 0xb6, 0x9b, 0xbc, 0x41, 0xd8, 0x1f, 0xf1, 0xb0, 0xd5, 0xa3 } }; + + +constexpr std::array AVC_MULTIPLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x09, 0x9a, 0xc4, 0xa0, 0x2d, 0x49, 0x55, 0xcd, 0xbe, 0x15, 0xf7, 0x93, 0xa4, 0xa7, 0x61, 0x41, 0x82, 0xa8, 0x30, 0xe6, 0xd2, 0x14, 0xe8, 0xa4, 0xa4, 0xdd, 0xf1, 0x6b, 0x6a, 0x44, 0x31, 0xfe, 0x64, 0x2c, 0x95, 0x3a, 0x7a, 0x71, 0x21, 0xc7, 0x11, 0x98, 0x91, 0x63, 0x6d, 0x79, 0xec, 0x89, 0x63, 0x3d, 0xe8, 0x95, 0x7e, 0x4e, 0xfc, 0xe3, 0x7e, 0x8b, 0xd8, 0xe7, 0xe8, 0xaa, 0x15, 0x68, 0x28, 0x35, 0x8e, 0x0a, 0x1c, 0xc3, 0x99, 0xeb, 0x1a, 0x76, 0xae, 0x86, 0x8a, 0x33, 0xb3, 0x11, 0xd7, 0x96, 0x2b, 0x32, 0xaf, 0x6b, 0x07, 0xb0, 0x9d, 0x53, 0xb0, 0x5a, 0x87, 0x2f, 0xe8, 0xa0, 0x30, 0xc2, 0x06, 0x69, 0xfa, 0x07, 0x49, 0xf5, 0x6f, 0xca, 0x0a, 0x3d, 0xcc, 0x72, 0x79, 0x9f, 0x66, 0x1f, 0x8f, 0x75, 0x24, 0x79, 0x2a, 0x43, 0x38, 0x07, 0xd4, 0x6e, 0xcc, 0x2b, 0xf1, 0x81, 0xff, 0x73, 0x99, 0x1e, 0x1a, 0x74, 0xfe, 0xc7, 0xad, 0x01, 0x10, 0x40, 0xb7, 0x48, 0x48, 0x1f, 0x00, 0xd3, 0x02, 0xec, 0x3c, 0x60, 0x1e, 0xf0, 0x4f, 0xa3, 0x97, 0xfb, 0x45, 0x49, 0xc8, 0x4a, 0x6a, 0x9b, 0x6f, 0xbc, 0x82, 0xda, 0x6b, 0xfb, 0x40, 0x5b, 0x04, 0x02, 0x6e, 0x19, 0x1d, 0xc7, 0x90, 0x68, 0xa9, 0xde, 0xae, 0x17, 0xf8, 0xed, 0x64, 0x2c, 0xef, 0x7e, 0x4c, 0x83, 0x1f, 0x28, 0xe9, 0x60, 0x09, 0x80, 0xa4, 0x22, 0x38, 0xd6, 0x0c, 0x2b, 0xb0, 0xc8, 0x46, 0x51, 0x0c, 0x56, 0xe9, 0xc3, 0x94, 0x66, 0x35, 0xc0, 0x13, 0x26, 0xda, 0x02, 0x45, 0x07, 0x89, 0x11, 0xcf, 0xdc, 0x4d, 0x31, 0x95, 0x29, 0xbf, 0x31, 0xe1, 0xfc, 0x44, 0x90, 0x1d, 0x56, 0xbe, 0x33, 0x75, 0x9a, 0xc8, 0xc9, 0xe4, 0xb6, 0x74, 0x89, 0x25, 0xd8, 0x55, 0xa2, 0xa4, 0x66, 0xd2, 0x09, 0xbd, 0x88, 0xfa, 0x89, 0x8a, 0x38, 0x8c, 0x20, 0x8c, 0xd2, 0x32, 0xf5, 0x99, 0x26, 0xb9, 0x90, 0x12, 0xe2, 0x40, 0xd9, 0xce, 0xda, 0x39, 0x8d, 0xb7, 0x14, 0xe3, 0x0b, 0x7f, 0xf7, 0x3f, 0xf7, 0x5c, 0x9a, 0xd2, 0xd6, 0x79, 0xe2, 0xc7, 0x5a, 0xd9, 0x8b, 0xd7, 0x37, 0x63, 0x27, 0x5e, 0x8f, 0x41, 0xc5, 0xff, 0x24, 0x28, 0xcc, 0x27, 0x88, 0xc2, 0x87, 0xd0, 0xf2, 0xd6, 0x21, 0x0e, 0x91, 0x3a, 0x40, 0xc5, 0x3c, 0x44, 0x63, 0x6c, 0xa1, 0x20, 0x13, 0x86, 0x86, 0x03, 0x72, 0x91, 0x37, 0x08, 0x35, 0xfb, 0xb8, 0xf0, 0xdb, 0x23, 0x69, 0x33, 0xe0, 0xde, 0x3d, 0x5b, 0x20, 0xc2, 0xf6, 0x35, 0x0f, 0x32, 0xc9, 0x98, 0xdc, 0x7e, 0xf8, 0xd8, 0x7a, 0xd1, 0x54, 0x34, 0xa2, 0x10, 0x0c, 0xf6, 0x2d, 0xab, 0x24, 0x95, 0x50, 0xbf, 0xd9, 0xb4, 0x42, 0xc3, 0x55, 0xb0, 0x97, 0xec, 0x74, 0x72, 0x6e, 0x61, 0xf6, 0x03, 0x97, 0x47, 0x51, 0xf1, 0x64, 0xb2, 0x90, 0x05, 0xa4, 0x6f, 0xda, 0xeb, 0xf8, 0xa2, 0x77, 0x02, 0x5b, 0xb9, 0xbc, 0xe7, 0x5b, 0xfd, 0x34, 0xb5, 0xf4, 0x8c, 0xd1, 0xe0, 0xa0, 0xd6, 0x06, 0xa8, 0x44, 0x85, 0x8c, 0xfb, 0x9b, 0x73, 0x87, 0xfa, 0x25, 0xeb, 0x17, 0x0c, 0xf3, 0x41, 0xe4, 0x2c, 0xe8, 0xfb, 0x7d, 0x6b, 0x1a, 0x16, 0xe4, 0x5c, 0x20, 0xf6, 0x80, 0x2d, 0x4f, 0x19, 0x61, 0x98, 0x48, 0x22, 0xc2, 0x32, 0xfc, 0xb8, 0x96, 0x92, 0xa1, 0xcd, 0x1d, 0x71, 0x2e, 0xb5, 0x2d, 0xe9, 0xe4, 0xc3, 0x0b, 0x5b, 0xe9, 0xee, 0x85, 0xb2, 0xaf, 0x8d, 0x25, 0xe0, 0x43, 0xb0, 0x1d, 0x82, 0x78, 0xa4, 0xd0, 0x66, 0x61, 0x96, 0x2f, 0xd6, 0x3d, 0x10, 0xe6, 0xda, 0xab, 0xcf, 0xa5, 0x59, 0x95, 0x07, 0x88, 0x7d, 0xae, 0xd7, 0x1d, 0x64, 0x76, 0xdc, 0x60, 0x8e, 0x38, 0x4f, 0xe6, 0x6d, 0xb5, 0xc2, 0x72, 0xd1, 0xe1, 0xa0, 0x84, 0x1f, 0x98, 0x9b, 0x11, 0x31, 0xd3, 0x93, 0x0f, 0x23, 0xff, 0xa8, 0xb0, 0x2b, 0x90, 0xe0, 0x60, 0x40, 0xeb, 0x0c, 0x98, 0xd5, 0x98, 0xe6, 0x3a, 0x42, 0x95, 0xb3, 0x76, 0x90, 0x4c, 0x4a, 0x8d, 0x46, 0x42, 0x0e, 0x39, 0x4c, 0x54, 0x52, 0xa6, 0x2b, 0x87, 0x72, 0x6f, 0xee, 0x41, 0xaf, 0xe0, 0xc3, 0xfe, 0x0d, 0xd1, 0xa2, 0xd4, 0xc6, 0x9d, 0xa9, 0x89, 0x78, 0xcd, 0x8a, 0x33, 0x50, 0x89, 0xe7, 0x4c, 0x85, 0x7a, 0xc2, 0x91, 0x0b, 0x88, 0xd2, 0xe0, 0x0d, 0xfe, 0x21, 0x82, 0x81, 0xc7, 0x4c, 0xfc, 0x00, 0xcb, 0x86, 0x03, 0x38, 0xa5, 0xa4, 0xcf, 0xb0, 0xbd, 0x77, 0x38, 0x4a, 0xd5, 0x92, 0x45, 0x07, 0x96, 0x23, 0xe7, 0x3e, 0x43, 0x50, 0x48, 0xe6, 0x1d, 0x3f, 0x79, 0x67, 0x61, 0xe1, 0xae, 0x5f, 0x57, 0xe4, 0xbd, 0x79, 0x67, 0x0d, 0x11, 0x81, 0xb9, 0xa5, 0xc5, 0xb8, 0x11, 0x0c, 0x02, 0x78, 0x0f, 0x93, 0x51, 0xd6, 0x6a, 0x07, 0xd8, 0xcd, 0x50, 0x60, 0xf6, 0x59, 0x97, 0x0f, 0x25, 0xb6, 0xc7, 0x1f, 0x94, 0xbb, 0xd4, 0xe0, 0x05, 0x44, 0x88, 0x03, 0x44, 0xa4, 0x93, 0x07, 0x80, 0x23, 0x7c, 0x3f, 0xf7, 0xf9, 0x7a, 0x60, 0x39, 0xf6, 0x37, 0xbc, 0x67, 0x56, 0xa1, 0x58, 0x79, 0xd8, 0xb6, 0x05, 0x53, 0xb4, 0xa1, 0x77, 0x57, 0x94, 0xb0, 0xfd, 0xbc, 0xaf, 0x25, 0x52, 0x2c, 0x73, 0xcb, 0x4a, 0x87, 0xcd, 0xda, 0xb4, 0x51, 0x57, 0xaa, 0x1e, 0xc9, 0x2d, 0x6c, 0x51, 0x9d, 0xc6, 0x67, 0x7a, 0x82, 0x76, 0xf2, 0x8b, 0xef, 0xc4, 0xd9, 0xad, 0x96, 0xc4, 0x1c, 0x78, 0x0a, 0x98, 0xb0, 0x16, 0x43, 0x1d, 0xea, 0x3a, 0xe6, 0x77, 0xe8, 0xc7, 0x86, 0x28, 0x1e, 0x24, 0xe3, 0xd4, 0xa8, 0x4a, 0x6f, 0xe1, 0xde, 0x3b, 0x38, 0xd6, 0xa4, 0x3b, 0x4f, 0xaa, 0x6e, 0xe6, 0x80, 0x00, 0xa9, 0xbd, 0xd1, 0xca, 0x35, 0x41, 0x97, 0xca, 0x94, 0x28, 0xd1, 0x0f, 0x52, 0x62, 0x29, 0x23, 0xa3, 0xfd, 0x35, 0x34, 0x57, 0xd3, 0x22, 0x69, 0xf1, 0x17, 0xf5, 0x29, 0x0d, 0xf1, 0xa7, 0xee, 0xe2, 0x2d, 0xe5, 0x19, 0x8c, 0x6b, 0xe7, 0x93, 0x3e, 0xb4, 0xb7, 0xee, 0x65, 0x70, 0x45, 0x4c, 0xd6, 0xe8, 0xe9, 0x9f, 0x33, 0x9a, 0xf8, 0xf9, 0xbd, 0x21, 0xe6, 0x3c, 0x93, 0x5f, 0xa4, 0x5e, 0x6d, 0xab, 0x26, 0xf3, 0xab, 0x07, 0x01, 0x81, 0xa7, 0xea, 0x11, 0xb1, 0x58, 0x5e, 0x49, 0xc2, 0xab, 0x1b, 0xaf, 0xba, 0xe5, 0xae, 0xb4, 0x2d, 0x98, 0x00, 0x40, 0x89, 0x76, 0x18, 0x03, 0x6f, 0x43, 0xe9, 0x48, 0x39, 0x91, 0xa3, 0x6d, 0x61, 0xe7, 0xea, 0x6a, 0xd9, 0x3d, 0x43, 0xf1, 0xd5, 0xcc, 0xb1, 0x2e, 0xe6, 0xbb, 0x10, 0xd9, 0x6a, 0xd2, 0x34, 0x4e, 0xd1, 0x83, 0xef, 0x8a, 0x26, 0x15, 0x04, 0xbf, 0x74, 0xce, 0xbb, 0x25, 0x80, 0xea, 0xc1, 0xc7, 0x25, 0xee, 0x99, 0x9a, 0x25, 0x73, 0x2c, 0xe7, 0x99, 0x33, 0xad, 0x89, 0x69, 0x9e, 0x58, 0xf5, 0x0f, 0x26, 0xba, 0x3e, 0x33, 0x06, 0x0b, 0xb7, 0x8d, 0xbd, 0xc1, 0x38, 0x04, 0x66, 0xa0, 0x94, 0xf6, 0xe2, 0x87, 0x56, 0xde, 0x3f, 0x60, 0x48, 0x1a, 0xbb, 0xc2, 0x05, 0x20, 0xc5, 0xfb, 0x27, 0xcf, 0xc8, 0x2e, 0xb9, 0x6a, 0x8b, 0x37, 0x6f, 0x1e, 0x0f, 0xa5, 0xd1, 0x34, 0xaf, 0x3b, 0xea, 0xfe, 0xc6, 0xaa, 0x76, 0x13, 0x16, 0x1b, 0xb3, 0x33, 0xd2, 0x4b, 0x1e, 0x4d, 0x9c, 0xe6, 0xa7, 0x76, 0x49, 0xe7, 0x6d, 0xf1, 0xb5, 0x9f, 0x6f, 0xbb, 0xaf, 0x49, 0x38, 0xb9, 0xdd, 0x4e, 0xb3, 0x05, 0x00, 0x7d, 0x5a, 0xb8, 0xe0, 0x5c, 0xb7, 0x61, 0xf0, 0x72, 0x7c, 0x71, 0xf8, 0x7d, 0x46, 0xf0, 0x15, 0x30, 0xd7, 0x0a, 0x19, 0x71, 0x1c, 0x68, 0x5e, 0xa9, 0xcf, 0x16, 0xbe, 0x94, 0xa5, 0x95, 0xc9, 0xd7, 0x78, 0x95, 0x29, 0x43, 0x0d, 0xb7, 0xa2, 0xce, 0x7c, 0xa3, 0x1a, 0xc6, 0x2d, 0x55, 0x6f, 0x4c, 0x2f, 0xee, 0x48, 0x20, 0x32, 0x60, 0x60, 0xa7, 0xe3, 0x1c, 0xdf, 0xad, 0x53, 0xb1, 0x88, 0x0d, 0x55, 0x25, 0xd5, 0xf2, 0xb6, 0x80, 0x37, 0xe5, 0x3a, 0x64, 0xfd, 0x02, 0xae, 0xf3, 0x57, 0xfa, 0x6c, 0xbd, 0x69, 0xa3, 0x6e, 0x32, 0x6e, 0xc2, 0x0f, 0x6e, 0x9b, 0xb9, 0x3a, 0xa6, 0x39, 0x27, 0xb4, 0xa0, 0x0f, 0xe0, 0x51, 0xdf, 0xf5, 0x8d, 0xaf, 0x35, 0xc6, 0x55, 0x86, 0x54, 0xcc, 0x28, 0xa0, 0xf8, 0xd2, 0x32, 0x03, 0x6c, 0x09, 0xd3, 0xfb, 0x3b, 0x74, 0x69, 0x44, 0x71, 0x49, 0xf8, 0x87, 0xb6, 0xd9, 0xdc, 0xfc, 0xc4, 0x7f, 0x45, 0xdc, 0x73, 0x99, 0x79, 0xf0, 0x95, 0x78, 0xce, 0x4e, 0x99, 0xc8, 0x35, 0xca, 0xea, 0xba, 0x92, 0xab, 0xe3, 0xba, 0xed, 0x4d, 0xec, 0x32, 0x99, 0x65, 0x48, 0x12, 0x24, 0x3a, 0xaa, 0xbe, 0x54, 0xf0, 0x63, 0xbb, 0x3c, 0x06, 0x38, 0x35, 0x2c, 0xbc, 0x05, 0xe6, 0x1c, 0xc6, 0xe1, 0x9f, 0x77, 0x2c, 0xfa, 0xd5, 0x8d, 0xec, 0x7e, 0x19, 0x8c, 0x7c, 0x29, 0x26, 0xb9, 0x61, 0xba, 0x7c, 0xfa, 0xc4, 0x10, 0x8f, 0x48, 0xf0, 0xed, 0x11, 0xbd, 0xd0, 0xc8, 0x46, 0x9d, 0x06, 0x67, 0xbe, 0xd5, 0x3e, 0x7c, 0xbe, 0x37, 0x7c, 0xf5, 0x4e, 0x77, 0x63, 0xb4, 0x12, 0xb9, 0x37, 0xe3, 0x8d, 0xdc, 0x2f, 0xa4, 0xb8, 0x92, 0xec, 0x06, 0xd7, 0x56, 0x77, 0x02, 0xa2, 0x55, 0xbc, 0x1b, 0x9a, 0x12, 0x05, 0x89, 0x40, 0x59, 0x27, 0x80, 0x74, 0x01, 0xb9, 0xa2, 0x12, 0xb8, 0xcb, 0xd5, 0xd5, 0xe0, 0xd6, 0x78, 0xc1, 0x23, 0x24, 0x23, 0x77, 0x84, 0x60, 0xb3, 0xe5, 0x9c, 0x35, 0x3f, 0xb1, 0x7b, 0x38, 0xe2, 0x35, 0x68, 0xbc, 0x14, 0x8b, 0x89, 0xc2, 0xae, 0x41, 0x48, 0x2e, 0x3a, 0xad, 0x28, 0x3c, 0xc2, 0x7b, 0x8c, 0x20, 0x63, 0xfe, 0x74, 0x6d, 0xf9, 0xd8, 0x57, 0xe0, 0xdb, 0x6e, 0xba, 0xd0, 0x06, 0x4a, 0x50, 0x2f, 0x05, 0x5f, 0x0f, 0x64, 0x7c, 0x6a, 0xe2, 0x10, 0x1f, 0xd7, 0x18, 0xe0, 0x40, 0xcd, 0x06, 0x2c, 0x7c, 0xe9, 0x1a, 0x7c, 0x2c, 0x93, 0x9a, 0x6a, 0x9d, 0x92, 0x26, 0xb6, 0x7e, 0xb6, 0xb7, 0xdf, 0x51, 0xc4, 0x48, 0x0d, 0x37, 0x15, 0xba, 0x02, 0x58, 0xda, 0x07, 0x64, 0x4b, 0x59, 0xf7, 0x0a, 0x1f, 0x2c, 0xe3, 0xce, 0x74, 0x3f, 0x84, 0xb8, 0xd1, 0x96, 0x4a, 0x9f, 0x93, 0x3a, 0x1d, 0x7b, 0x0b, 0x53, 0x5b, 0xc8, 0x6a, 0xc0, 0x60, 0x37, 0xa6, 0xd5, 0x5f, 0x96, 0x12, 0x08, 0xd1, 0x41, 0x3b, 0xc0, 0xde, 0x51, 0x4a, 0x0a, 0x4d, 0xdc, 0xcf, 0x3f, 0xe5, 0x58, 0x76, 0x99, 0x2d, 0x41, 0x16, 0xbf, 0xc7, 0x08, 0x11, 0x80, 0x88, 0x12, 0xd7, 0xba, 0x85, 0x2b, 0xe7, 0x55, 0x23, 0x74, 0x69, 0x62, 0xfe, 0xb4, 0x1b, 0x47, 0xe3, 0xc3, 0xac, 0x74, 0xa6, 0xcd, 0x96, 0xa9, 0x84, 0x60, 0xb6, 0x4d, 0xdc, 0xcb, 0xa1, 0x18, 0xd2, 0xce, 0xb2, 0xa6, 0x37, 0x49, 0x1e, 0x99, 0xbd, 0xdc, 0xcf, 0x69, 0xd0, 0x3f, 0x90, 0xee, 0x52, 0x33, 0x45, 0xd3, 0x9a, 0x3f, 0x64, 0x0d, 0x00, 0x0b, 0xff, 0x5d, 0xbf, 0x1b, 0x43, 0xd3, 0xf5, 0x53, 0xe8, 0x37, 0x63, 0xba, 0xad, 0x01, 0xd6, 0x01, 0x86, 0x48, 0x2d, 0xee, 0x07, 0x0d, 0x0b, 0x85, 0xb2, 0xf9, 0x7e, 0x6c, 0xb9, 0x79, 0x77, 0x1d, 0xff, 0x68, 0xfa, 0xb6, 0xad, 0x0a, 0x0f, 0x43, 0xf6, 0x65, 0x6f, 0x7d, 0x79, 0x5d, 0x70, 0x55, 0x29, 0xc7, 0x41, 0x67, 0xfb, 0x3e, 0xc5, 0xcd, 0x0f, 0x7d, 0x69, 0x5b, 0x64, 0x47, 0x5a, 0x2e, 0x6a, 0xfb, 0xe9, 0x8e, 0x66, 0x80, 0x38, 0x3d, 0x4c, 0xdd, 0x64, 0xc0, 0xfc, 0x07, 0x86, 0xae, 0x90, 0x30, 0xa9, 0x81, 0x18, 0x35, 0xd3, 0x65, 0xf6, 0x7b, 0xe8, 0x1c, 0x92, 0x4b, 0xcb, 0x7a, 0x9d, 0x96, 0x8a, 0x42, 0x2c, 0x72, 0x6f, 0x24, 0xce, 0x7f, 0x5d, 0x6b, 0xf2, 0x50, 0x6c, 0x6a, 0x8d, 0x63, 0x4b, 0x64, 0x23, 0x31, 0x21, 0x60, 0xe2, 0xdb, 0xb9, 0xe6, 0x4e, 0x8e, 0x95, 0x91, 0x59, 0xc1, 0xb3, 0x49, 0x6c, 0x81, 0x1a, 0x08, 0xc0, 0xf3, 0xf4, 0x99, 0x5a, 0x2f, 0x53, 0xfd, 0x6e, 0xf7, 0x58, 0x0e, 0x50, 0xc7, 0x1d, 0xc9, 0xe0, 0xcb, 0x49, 0x07, 0x3b, 0x70, 0xa0, 0x43, 0xc8, 0xb1, 0x88, 0xd2, 0x7d, 0x98, 0xd7, 0xf7, 0xff, 0xdd, 0xdf, 0x6d, 0x06, 0x79, 0x80, 0xcf, 0xfa, 0xa2, 0x39, 0xd0, 0xe9, 0xe1, 0xee, 0x70, 0xc9, 0xb5, 0x03, 0xd3, 0x4a, 0xec, 0x3f, 0x1c, 0xa6, 0xe5, 0x73, 0x35, 0xe7, 0x01, 0xe3, 0xea, 0xd5, 0xab, 0xc1, 0xa7, 0x3d, 0x4c, 0xbd, 0x2f, 0xce, 0x49, 0x0c, 0x48, 0x34, 0xc5, 0xd3, 0x17, 0x62, 0xeb, 0x5f, 0x3c, 0xf8, 0x33, 0x7a, 0x60, 0x71, 0x87, 0x12, 0xb2, 0x46, 0x50, 0x85, 0xad, 0x0e, 0x0b, 0xa3, 0x29, 0xa4, 0xd3, 0x9b, 0xd1, 0xcb, 0x1a, 0x00, 0x30, 0xbc, 0xaa, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x33, 0x91, 0x85, 0xbf, 0x29, 0x11, 0xf0, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x09, 0xc2, 0x61, 0x4a, 0x53, 0xd7, 0x45, 0xd1, 0xb4, 0x87, 0x33, 0x02, 0x7c, 0xce, 0x58, 0xc3, 0x62, 0x61, 0xb1, 0x48, 0x93, 0x12, 0x99, 0x43, 0x51, 0x04, 0x23, 0xaf, 0x35, 0x48, 0x29, 0xe1, 0x71, 0x0d, 0x4b, 0x12, 0x0e, 0x9a, 0xf5, 0x1a, 0x64, 0xc1, 0xa6, 0xf5, 0x7d, 0x99, 0x0a, 0x1b, 0x9f, 0xa1, 0xf5, 0xa4, 0xc1, 0xa9, 0x7b, 0xe7, 0x7f, 0xd1, 0x0a, 0x25, 0xc8, 0x04, 0x30, 0xf8, 0x89, 0x9e, 0xa9, 0x58, 0xff, 0xb0, 0x9c, 0x72, 0x25, 0x10, 0xe6, 0xb1, 0xdd, 0xf1, 0x62, 0xde, 0x8f, 0x4c, 0x36, 0x9b, 0xdd, 0xa1, 0xd2, 0x4f, 0x82, 0x65, 0xa8, 0xb6, 0xd3, 0x69, 0x30, 0x4f, 0x53, 0x17, 0xc6, 0x34, 0x6e, 0x99, 0x6c, 0xf3, 0x2d, 0x43, 0x24, 0x27, 0xc8, 0x3f, 0xda, 0x62, 0x8e, 0xa0, 0xbe, 0x8d, 0xa6, 0x4f, 0x72, 0x2b, 0x21, 0x62, 0x45, 0x69, 0x3f, 0x00, 0x97, 0xf3, 0xee, 0x7f, 0x5a, 0xb2, 0xf8, 0x99, 0x69, 0x28, 0xa0, 0x94, 0x52, 0x0b, 0x98, 0x9e, 0xb1, 0xfa, 0x6a, 0x0f, 0x22, 0x23, 0x63, 0xb5, 0xbf, 0x64, 0x05, 0xb6, 0xcc, 0x2d, 0x69, 0x99, 0x12, 0x8f, 0xa8, 0xbb, 0xc4, 0x8a, 0x61, 0xb2, 0x6b, 0x94, 0x66, 0x7f, 0x61, 0xab, 0xc5, 0xc5, 0x9b, 0x75, 0x31, 0x73, 0x58, 0xaa, 0x3b, 0x37, 0xd1, 0x28, 0xbc, 0x45, 0x3b, 0xb2, 0x75, 0x95, 0xb5, 0x42, 0xd0, 0xd6, 0xe3, 0x13, 0xbd, 0xfd, 0x69, 0xde, 0xe6, 0xb3, 0x61, 0x44, 0x93, 0xa0, 0xb0, 0x95, 0xa5, 0x90, 0x1e, 0x05, 0xcd, 0x4e, 0xf3, 0x83, 0x64, 0xd3, 0x51, 0xf6, 0x58, 0x6c, 0x12, 0x2d, 0xe5, 0x3c, 0x79, 0x60, 0xf8, 0x5c, 0xab, 0x41, 0x47, 0x3d, 0xb7, 0xb5, 0x65, 0xd0, 0xd8, 0x23, 0xf4, 0xb5, 0xcd, 0x2e, 0xbb, 0x5b, 0x73, 0xf7, 0xdd, 0xa9, 0x1d, 0xe1, 0xea, 0x9c, 0x43, 0xef, 0x86, 0x05, 0x7d, 0x0a, 0x8a, 0x82, 0xc0, 0xc4, 0x27, 0xc2, 0xa9, 0xc8, 0x8e, 0x0a, 0xeb, 0x42, 0xd9, 0x83, 0x7c, 0xd5, 0x95, 0x71, 0x9c, 0x61, 0x5e, 0xb7, 0x22, 0xe6, 0xa7, 0xa9, 0x7c, 0x18, 0x29, 0x7c, 0x10, 0xcd, 0x6d, 0x2e, 0xfc, 0xc6, 0x3e, 0xc1, 0xfe, 0x32, 0x60, 0x1f, 0xa5, 0xfa, 0x01, 0x29, 0xf1, 0x25, 0xa2, 0xad, 0x80, 0xc4, 0xfe, 0x2d, 0xf8, 0x94, 0x43, 0x01, 0xe3, 0xe9, 0x8e, 0x4f, 0x57, 0xfa, 0xca, 0xc5, 0xb2, 0x4d, 0xb5, 0x36, 0xf6, 0xda, 0x5a, 0xaa, 0x5f, 0xd5, 0xff, 0x1e, 0xc0, 0x7f, 0xea, 0x36, 0xfe, 0xc8, 0xdf, 0x83, 0x83, 0xa2, 0xca, 0xb8, 0xcd, 0x36, 0x78, 0x24, 0xbd, 0xb6, 0x58, 0x66, 0x0a, 0x3e, 0x08, 0x5a, 0x18, 0x73, 0x18, 0xaf, 0x11, 0x4d, 0x3e, 0xd8, 0x29, 0xd1, 0x48, 0x11, 0xad, 0x36, 0x98, 0x8a, 0xe5, 0xb4, 0xcd, 0x53, 0x56, 0xd2, 0xfc, 0x89, 0x00, 0x14, 0x8e, 0x2c, 0xde, 0xbc, 0x05, 0x97, 0x72, 0xe2, 0xad, 0x40, 0xae, 0x8f, 0x3d, 0x7f, 0xb6, 0x4a, 0x55, 0x55, 0x03, 0x8a, 0xa3, 0x08, 0x0b, 0xbd, 0xcb, 0x76, 0x0a, 0xf8, 0x6d, 0x3d, 0x32, 0xb2, 0xe5, 0x50, 0xa4, 0x3c, 0x2d, 0xdf, 0x42, 0x70, 0x9f, 0x64, 0xdb, 0x5c, 0x8e, 0xd9, 0xfe, 0x48, 0xd5, 0x43, 0x3e, 0x97, 0x25, 0x52, 0x0a, 0xef, 0x60, 0x38, 0xba, 0x6c, 0x51, 0xed, 0xbc, 0xbc, 0x8b, 0xe9, 0x59, 0x8f, 0xe7, 0xdf, 0xa2, 0x18, 0xcb, 0x11, 0x0e, 0x90, 0x6d, 0x30, 0xcd, 0x24, 0xff, 0x62, 0x62, 0x2c, 0x0d, 0x9c, 0x9a, 0x12, 0x65, 0x37, 0x2c, 0xdf, 0x64, 0x76, 0xf6, 0x60, 0x8d, 0x9a, 0x2d, 0xdd, 0x94, 0xec, 0xee, 0x87, 0x9c, 0x01, 0xcc, 0x34, 0x68, 0x6d, 0xe6, 0xb6, 0x42, 0x33, 0x3c, 0xef, 0x7a, 0x0f, 0xb7, 0xbf, 0x69, 0x7e, 0x72, 0x71, 0x74, 0xd8, 0xc1, 0xd8, 0x1a, 0x7a, 0x9f, 0x4d, 0x47, 0xd7, 0x63, 0x00, 0x0d, 0xdb, 0x1b, 0x20, 0x06, 0x91, 0x0a, 0xf1, 0x20, 0x8c, 0x96, 0x1c, 0x13, 0x7b, 0xd2, 0x3d, 0x0f, 0x01, 0x27, 0x60, 0xbc, 0xd6, 0xa7, 0x8d, 0x7c, 0x05, 0x30, 0x92, 0x35, 0xfc, 0xa8, 0x06, 0x52, 0x2b, 0xda, 0xd4, 0x2c, 0x42, 0x4a, 0xb3, 0x0d, 0x6d, 0x66, 0xec, 0x28, 0xb6, 0x8f, 0xc7, 0x0b, 0xcd, 0x9d, 0xae, 0xcb, 0xad, 0xd8, 0x9d, 0xec, 0x08, 0x4e, 0xab, 0x25, 0x09, 0x3a, 0xd8, 0xc7, 0x01, 0x49, 0x5e, 0xa9, 0x83, 0x65, 0x34, 0x87, 0x67, 0x38, 0x1e, 0x40, 0x91, 0xf2, 0x54, 0x18, 0x92, 0xa7, 0x17, 0xf3, 0x6c, 0xa1, 0x8a, 0x28, 0xe0, 0x56, 0xb3, 0xbf, 0x6c, 0xe2, 0xb7, 0xb8, 0xa3, 0x72, 0x6c, 0x3c, 0x81, 0x16, 0xdc, 0x7b, 0xd3, 0xa7, 0xfa, 0xb3, 0x0b, 0x24, 0xfa, 0x4c, 0xdb, 0xa2, 0x14, 0xd1, 0xb1, 0xab, 0x68, 0x20, 0x2e, 0x7b, 0xc2, 0x9d, 0x85, 0x12, 0xf6, 0xc8, 0x09, 0xf0, 0xec, 0x10, 0x0a, 0x69, 0x97, 0x11, 0x55, 0x19, 0xad, 0x3b, 0x93, 0xb5, 0xf1, 0x75, 0x2e, 0x7c, 0x16, 0xc6, 0xd4, 0xfc, 0xff, 0xc6, 0x8b, 0x7a, 0x38, 0x5a, 0x6c, 0x8b, 0xe7, 0x61, 0x15, 0x6e, 0x70, 0xd1, 0x44, 0xa3, 0x39, 0xae, 0x09, 0xe2, 0x52, 0x1c, 0xbb, 0xa0, 0xcc, 0x55, 0x3b, 0x4c, 0x11, 0x9e, 0x2f, 0x59, 0x9a, 0x57, 0x72, 0xce, 0xf7, 0xcd, 0x50, 0x37, 0x5d, 0xea, 0x83, 0xfd, 0x67, 0x7e, 0x64, 0x8b, 0x7e, 0x88, 0xd2, 0x31, 0xf3, 0xae, 0xcd, 0xfd, 0x65, 0x6a, 0x07, 0x92, 0x63, 0xc2, 0xaf, 0x4e, 0x8a, 0x54, 0x87, 0x77, 0xb9, 0x0e, 0x8c, 0x21, 0x16, 0x5f, 0xa7, 0xf2, 0xd6, 0x50, 0xfa, 0xe0, 0x5d, 0x3e, 0x63, 0x9c, 0x67, 0x0b, 0xde, 0x91, 0xe6, 0xe1, 0x09, 0x87, 0x4f, 0xcb, 0xf2, 0xa8, 0x24, 0xa7, 0x92, 0xc5, 0x1b, 0xec, 0x44, 0x74, 0xf4, 0xe7, 0x53, 0xaf, 0x6d, 0xc2, 0x46, 0x38, 0xd5, 0x6f, 0x9e, 0x93, 0x7f, 0x46, 0xfb, 0x41, 0x3f, 0x83, 0x74, 0x7b, 0xbb, 0x39, 0xe3, 0x2d, 0x5d, 0x85, 0x7c, 0xb3, 0xce, 0xdb, 0xa6, 0x39, 0x5d, 0xea, 0xd2, 0xe2, 0x9d, 0x4e, 0xfa, 0x70, 0xcc, 0x77, 0x37, 0xf0, 0x58, 0xa9, 0xef, 0x56, 0x12, 0x59, 0xd9, 0x4a, 0xbf, 0xba, 0xa5, 0x30, 0x15, 0xa3, 0xa1, 0x85, 0x4a, 0x7b, 0xf4, 0x5f, 0x84, 0x92, 0x54, 0xce, 0x4a, 0x68, 0x9c, 0x9c, 0x6d, 0x0a, 0x95, 0x9a, 0xfc, 0xe6, 0x1c, 0xa4, 0x6f, 0x2c, 0x8e, 0x5a, 0xd8, 0x4b, 0x3c, 0xbc, 0x62, 0x6b, 0x18, 0x5a, 0x1e, 0x3d, 0xb6, 0xac, 0x29, 0x69, 0x22, 0xda, 0xca, 0xd6, 0xdf, 0x48, 0x36, 0xeb, 0x7f, 0x15, 0x98, 0xb1, 0xcd, 0x92, 0xce, 0x14, 0x32, 0x93, 0x5c, 0x44, 0xe9, 0x17, 0x05, 0x22, 0xb0, 0xc6, 0x16, 0xf2, 0x22, 0x9c, 0x80, 0x48, 0xbf, 0x29, 0x98, 0x48, 0x85, 0xa8, 0xdd, 0xc2, 0x40, 0x22, 0x3f, 0x5c, 0xde, 0x52, 0x7e, 0xf1, 0xf2, 0x8b, 0xbe, 0xfe, 0x6f, 0xfa, 0xb0, 0xa2, 0x42, 0x22, 0xc4, 0x0b, 0x87, 0xdd, 0xc8, 0x69, 0x0c, 0x92, 0xaa, 0x37, 0xe6, 0x59, 0xe9, 0x8d, 0xa9, 0xed, 0xeb, 0xb8, 0xb8, 0x80, 0x33, 0xa7, 0xf5, 0xde, 0x33, 0xd2, 0xfc, 0x1c, 0x00, 0x6c, 0x18, 0x82, 0xb5, 0xc8, 0x11, 0x65, 0xfe, 0x7c, 0x9a, 0x0d, 0x43, 0xba, 0x16, 0x5c, 0xb1, 0xa0, 0xf6, 0xec, 0x4f, 0x24, 0x56, 0xfb, 0x70, 0x01, 0x21, 0x42, 0xd0, 0x5f, 0xbb, 0xbc, 0x8d, 0xad, 0x5c, 0x83, 0x70, 0x58, 0x23, 0xb5, 0x91, 0xa7, 0x1a, 0x1d, 0xc6, 0x00, 0x25, 0xd3, 0x7a, 0x7b, 0xc3, 0xbf, 0xbd, 0x57, 0xe6, 0xab, 0xf9, 0x91, 0x4d, 0xb4, 0x91, 0x92, 0x64, 0x2e, 0x02, 0xd8, 0x6e, 0x37, 0x6b, 0x19, 0x8d, 0xbb, 0xf1, 0x8e, 0xfe, 0x58, 0xd7, 0xe7, 0xac, 0x33, 0x46, 0x01, 0xd5, 0x15, 0x51, 0x7a, 0xae, 0x07, 0x9f, 0x6e, 0xca, 0x22, 0x94, 0x87, 0xfd, 0xc9, 0xad, 0x13, 0x85, 0xd5, 0xca, 0x97, 0xcc, 0x0a, 0x07, 0x7b, 0x33, 0xd1, 0x7a, 0x5e, 0x0d, 0xff, 0xa6, 0x44, 0xfe, 0x20, 0xbf, 0xfa, 0x7e, 0xc7, 0x46, 0x0d, 0x15, 0x5c, 0xaa, 0xaa, 0xe2, 0x41, 0x9f, 0x42, 0x03, 0xfe, 0x60, 0x79, 0xdf, 0x5e, 0xdf, 0x60, 0x94, 0xa1, 0x01, 0x8a, 0xf7, 0xc3, 0xf4, 0x02, 0x8a, 0xf0, 0xb4, 0x27, 0xf4, 0x19, 0x45, 0x00, 0x71, 0xe4, 0x44, 0xd0, 0xd3, 0xec, 0x39, 0x0c, 0xa7, 0xe7, 0xf7, 0x5a, 0xeb, 0x43, 0xfb, 0x2c, 0x4f, 0x38, 0xe7, 0x0f, 0xd6, 0x08, 0x44, 0x2e, 0xd2, 0x88, 0xcb, 0xa6, 0x0f, 0x28, 0x84, 0xf0, 0x78, 0xee, 0x5a, 0x60, 0xea, 0x49, 0x3a, 0x09, 0xff, 0xf0, 0x25, 0xbf, 0x50, 0x62, 0xcf, 0x4e, 0x43, 0x5b, 0xd7, 0xbb, 0x44, 0xe5, 0x3d, 0x1e, 0xf5, 0x88, 0x38, 0xe0, 0x3f, 0xe2, 0x07, 0xaa, 0x8a, 0x42, 0x40, 0x1a, 0x9e, 0x32, 0x14, 0x37, 0x40, 0x1a, 0x7b, 0xe1, 0x6b, 0x07, 0x63, 0xb0, 0xbb, 0x92, 0x6c, 0x94, 0xe4, 0x13, 0x88, 0x4d, 0x5e, 0x00, 0xbf, 0xb4, 0xc3, 0xc2, 0x10, 0xdd, 0x2f, 0x1c, 0xdf, 0xc8, 0xdb, 0xab, 0x61, 0xa7, 0x6a, 0x67, 0x19, 0x4f, 0xa2, 0xfc, 0x3e, 0x11, 0xa0, 0xf4, 0x83, 0x58, 0xb8, 0x88, 0x29, 0xe4, 0xc4, 0x7c, 0x85, 0x74, 0x26, 0xb8, 0x76, 0xe4, 0xce, 0xcc, 0x19, 0xf6, 0xaa, 0x64, 0x4e, 0xfa, 0xe0, 0x2f, 0xa1, 0xca, 0x5b, 0x67, 0x92, 0x76, 0x15, 0x2b, 0x03, 0x8e, 0x97, 0x8c, 0x4c, 0xb0, 0x4b, 0xc0, 0x99, 0xc1, 0xf8, 0xa3, 0x0c, 0xa9, 0xfe, 0x96, 0x9f, 0x09, 0xfd, 0xe9, 0xa2, 0x2b, 0x7e, 0xe2, 0xe2, 0xb8, 0x21, 0xb6, 0x35, 0xde, 0x72, 0xdf, 0xbb, 0x2b, 0xdc, 0x90, 0xee, 0x66, 0x64, 0xe6, 0xd4, 0x2b, 0x93, 0xf3, 0xb9, 0xc7, 0xd9, 0x77, 0xdf, 0x47, 0x21, 0xbe, 0x53, 0x9d, 0xe9, 0xc9, 0x69, 0xcd, 0xa0, 0x7b, 0x4b, 0xd6, 0x00, 0x2b, 0x80, 0x50, 0x4c, 0x38, 0x03, 0x77, 0xac, 0xa1, 0x43, 0xcb, 0xb7, 0xdb, 0x12, 0x23, 0x45, 0x14, 0x8c, 0x36, 0x60, 0x84, 0xbd, 0x5e, 0x53, 0xa4, 0x94, 0xbc, 0x40, 0x0f, 0x9c, 0x3e, 0x4a, 0x8b, 0x98, 0xb4, 0xc7, 0xe6, 0xc9, 0xbf, 0x45, 0x42, 0x3c, 0xf8, 0xea, 0x54, 0x8c, 0xdf, 0x3f, 0x75, 0x39, 0x82, 0xd8, 0xc4, 0x72, 0x40, 0x8a, 0xd8, 0x5b, 0x8c, 0x27, 0x2a, 0x37, 0xdc, 0x17, 0xec, 0x1e, 0xff, 0x15, 0x98, 0xeb, 0xf9, 0xd0, 0x46, 0x38, 0x5a, 0x58, 0xb9, 0x0a, 0xba, 0xb1, 0x56, 0x10, 0x3d, 0xcb, 0x25, 0x13, 0x02, 0x8b, 0x50, 0x5e, 0xb4, 0x93, 0x14, 0xd9, 0x2e, 0x4c, 0x35, 0xf0, 0xa2, 0xf0, 0xf9, 0xbc, 0x17, 0xe2, 0x53, 0xb1, 0x56, 0xe4, 0x7c, 0x87, 0x06, 0xbe, 0xe2, 0xdd, 0x08, 0x17, 0xbe, 0x04, 0xdb, 0xb5, 0x30, 0x0c, 0xdf, 0x2d, 0x18, 0x5f, 0x85, 0x3d, 0x99, 0xe2, 0xe4, 0xd0, 0xe5, 0x38, 0x04, 0x56, 0x01, 0xc3, 0x05, 0xdc, 0x68, 0xc1, 0xf3, 0x39, 0x67, 0x60, 0xea, 0x94, 0x8f, 0xd8, 0xd7, 0xa6, 0x23, 0x45, 0x80, 0x5f, 0xc9, 0x97, 0x57, 0xf0, 0x92, 0xb7, 0x4b, 0xa3, 0x05, 0x84, 0x06, 0x15, 0xcd, 0x2a, 0xc9, 0xf8, 0xd6, 0x15, 0x37, 0xcd, 0x74, 0xc0, 0x63, 0x4b, 0xf2, 0xa3, 0x10, 0x64, 0x0f, 0xf9, 0xdb, 0xb6, 0xe6, 0x54, 0x1e, 0xde, 0x01, 0x94, 0x81, 0x26, 0x45, 0xb8, 0x5b, 0x93, 0x7a, 0x3b, 0xea, 0xf4, 0x98, 0x48, 0x09, 0x15, 0xc0, 0x16, 0x4a, 0xba, 0x19, 0x91, 0x6e, 0xe5, 0xcf, 0x02, 0xbb, 0xe5, 0xa2, 0x84, 0x3a, 0xc8, 0x25, 0x0d, 0x11, 0x25, 0x21, 0x76, 0x02, 0x5a, 0xa6, 0x8a, 0xb5, 0x7e, 0xd5, 0xda, 0x00, 0x61, 0xb3, 0x30, 0x4d, 0x48, 0x53, 0x78, 0xf3, 0x0c, 0x6d, 0xd0, 0x81, 0xf9, 0x89, 0x04, 0x1a, 0x9e, 0xac, 0xb7, 0x3e, 0x7f, 0x95, 0x92, 0x67, 0xb4, 0x63, 0x66, 0xe6, 0x9d, 0x34, 0x98, 0xa4, 0x17, 0xdc, 0xc9, 0xbc, 0x47, 0xc9, 0xf4, 0xa6, 0xa5, 0x9e, 0x9f, 0x18, 0x91, 0xe5, 0xc8, 0xf2, 0x76, 0x88, 0xc4, 0xec, 0x10, 0x06, 0x0a, 0x70, 0x58, 0xed, 0x9a, 0xa8, 0x68, 0x57, 0xfb, 0xf6, 0x2d, 0x1c, 0x78, 0xb3, 0xdd, 0x3f, 0x26, 0xc2, 0x5b, 0x88, 0xb1, 0x3b, 0x55, 0x26, 0x2b, 0x74, 0xba, 0xc3, 0x4c, 0xa0, 0xec, 0x25, 0x85, 0x18, 0x18, 0xd5, 0x50, 0xd5, 0xb4, 0x46, 0x77, 0x3e, 0x01, 0x6b, 0x56, 0xe6, 0xb0, 0x83, 0x8e, 0x5b, 0x36, 0x82, 0x4b, 0xe9, 0x6a, 0x5a, 0x40, 0xe1, 0xd2, 0xe5, 0xb9, 0x27, 0xc3, 0xce, 0x67, 0x86, 0x46, 0x25, 0xa7, 0x53, 0x1b, 0x63, 0x92, 0x9c, 0x5a, 0xd9, 0x82, 0x4b, 0x4f, 0x71, 0x90, 0x7b, 0xf4, 0x6b, 0x7d, 0x13, 0x6a, 0xe6, 0xb7, 0x5c, 0x11, 0x9e, 0x2e, 0x1c, 0x17, 0x7f, 0x6f, 0x90, 0x4f, 0x20, 0xc7, 0xe0, 0x75, 0x68, 0x40, 0x59, 0xa0, 0x8e, 0xea, 0x91, 0xb6, 0xc2, 0x8e, 0xfa, 0xb2, 0x16, 0xe8, 0xe2, 0x02, 0xdb, 0xac, 0x7c, 0x0b, 0x9d, 0xa2, 0x4a, 0x89, 0xc2, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x01, 0x09, 0x2d, 0x0f, 0xf6, 0x4d, 0x95, 0x3e, 0x3a, 0x22, 0xe0, 0x6b, 0xf4, 0xc7, 0x1f, 0x61, 0x19, 0x68, 0x7d, 0xa1, 0x25, 0xe0, 0x51, 0xca, 0x80, 0x6f, 0x30, 0x0e, 0xdb, 0x46, 0x51, 0xe6, 0x18, 0x8a, 0x85, 0x40, 0x01, 0xef, 0xca, 0x74, 0xd7, 0xc1, 0xb9, 0x01, 0x17, 0x45, 0xda, 0x3f, 0x12, 0x94, 0xd8, 0x72, 0xb8, 0xdd, 0x39, 0x4c, 0x3f, 0x60, 0x8b, 0x42, 0xae, 0x7d, 0x0f, 0x89, 0xc1, 0xc7, 0xae, 0x86, 0x0e, 0xd5, 0x3d, 0xd1, 0x95, 0x7b, 0xd7, 0x0a, 0xac, 0x14, 0x9e, 0xd5, 0x2b, 0xa0, 0x9b, 0xff, 0x30, 0xc9, 0xcc, 0x8d, 0x07, 0xc2, 0x17, 0xe5, 0xe1, 0xdf, 0x9b, 0x4d, 0xa8, 0xf7, 0x0f, 0x81, 0x72, 0xb5, 0x8d, 0xa5, 0x89, 0xac, 0x43, 0x78, 0x9a, 0x88, 0x9c, 0x76, 0xa0, 0x37, 0x63, 0x43, 0xbd, 0xbb, 0x54, 0x93, 0x27, 0x92, 0x87, 0x1d, 0x35, 0xca, 0x03, 0x36, 0x20, 0x8e, 0xa0, 0x56, 0x49, 0xd6, 0x76, 0x7d, 0x79, 0x69, 0x0d, 0x5f, 0xfc, 0xe6, 0x7d, 0xf6, 0x81, 0x0c, 0xec, 0xd1, 0x33, 0x3f, 0xd2, 0xb3, 0x5d, 0x27, 0x07, 0x70, 0x1a, 0x64, 0xd8, 0x5e, 0x47, 0x93, 0xfa, 0xbc, 0x61, 0x68, 0x15, 0xe4, 0x93, 0x7e, 0xba, 0x34, 0x0b, 0xb2, 0x60, 0x8f, 0xf1, 0x01, 0x86, 0xc1, 0x04, 0xdf, 0x40, 0x0a, 0x01, 0x25, 0x86, 0xb0, 0xf8, 0xe5, 0xf5, 0xb4, 0xee, 0x0a, 0xa6, 0xb1, 0x89, 0x6e, 0x93, 0xca, 0x11, 0x4b, 0xe9, 0x35, 0x2b, 0x4e, 0x3b, 0x9f, 0x69, 0xc4, 0xe5, 0x77, 0x85, 0x72, 0xd2, 0x73, 0x2a, 0x08, 0xbb, 0xd3, 0x4b, 0x9d, 0xb7, 0xc8, 0xe5, 0x25, 0xcb, 0x99, 0x5f, 0xe3, 0xd5, 0x5b, 0x24, 0x8e, 0xcd, 0xdd, 0x3c, 0x8a, 0x91, 0xef, 0x99, 0xf0, 0x0c, 0xe8, 0xb5, 0xe5, 0x43, 0x32, 0x26, 0x0c, 0x0f, 0xe4, 0x38, 0x17, 0xc9, 0x56, 0x39, 0x58, 0x1b, 0x04, 0x71, 0xf3, 0xd2, 0x3d, 0x0d, 0x29, 0x80, 0x74, 0x84, 0x8d, 0x91, 0x2c, 0xaf, 0x8c, 0xa4, 0x90, 0x6a, 0x3c, 0x15, 0xda, 0x4c, 0xda, 0x7f, 0x3f, 0xfe, 0xeb, 0x96, 0x09, 0x3d, 0x44, 0x32, 0x49, 0x06, 0x65, 0x63, 0xab, 0xc2, 0x6a, 0xdd, 0xe5, 0x02, 0x7a, 0x33, 0x9c, 0x54, 0x16, 0x4c, 0x0b, 0x5b, 0xe9, 0xe4, 0x27, 0xe9, 0x7a, 0x92, 0xbd, 0x22, 0xd7, 0x5e, 0x21, 0x6d, 0xb8, 0x97, 0x0d, 0xb5, 0x09, 0xe2, 0x55, 0xc0, 0xbd, 0x95, 0x17, 0xd0, 0x52, 0xcc, 0xee, 0x6d, 0x1e, 0xf8, 0x45, 0xe6, 0x34, 0x6d, 0xb2, 0xf1, 0xa8, 0x37, 0x7d, 0x4b, 0x3e, 0x86, 0x9d, 0x4f, 0xc0, 0x3c, 0xfa, 0xa2, 0x9a, 0xad, 0x06, 0xba, 0x83, 0x10, 0xb2, 0xc0, 0x02, 0xf0, 0x82, 0xce, 0x01, 0x07, 0xc4, 0x01, 0xb2, 0x6c, 0x01, 0x70, 0x68, 0x01, 0x42, 0xd4, 0x9a, 0x90, 0x16, 0xb3, 0x1d, 0xb0, 0x4b, 0xc7, 0x47, 0x6d, 0x4c, 0x04, 0x4a, 0xb3, 0x83, 0x31, 0x46, 0x75, 0xf4, 0x4c, 0x28, 0x10, 0x88, 0x7b, 0x03, 0x48, 0x4d, 0xd3, 0xdb, 0xba, 0xbd, 0xca, 0x74, 0xbc, 0xfd, 0x43, 0x60, 0x76, 0xba, 0xa5, 0x63, 0xbc, 0xe9, 0x46, 0x00, 0xd7, 0x31, 0xff, 0xff, 0x19, 0x29, 0x4d, 0x01, 0x9d, 0x09, 0x30, 0xc1, 0xe7, 0x79, 0x66, 0xe1, 0x74, 0xbd, 0x03, 0x31, 0xe9, 0xbf, 0xca, 0x7e, 0xc1, 0x06, 0x94, 0x7b, 0x64, 0xe5, 0xc3, 0xe9, 0x99, 0x3f, 0x2f, 0x0c, 0x41, 0x57, 0x4c, 0x0d, 0xcd, 0xfd, 0xb2, 0x62, 0x9b, 0xf0, 0xc1, 0x34, 0x39, 0xaa, 0x04, 0x67, 0x3c, 0x23, 0x71, 0x28, 0xa9, 0x87, 0x90, 0x7d, 0x64, 0xc0, 0x0b, 0xa8, 0x51, 0x34, 0x6f, 0xfe, 0xe2, 0xf1, 0xdd, 0xa0, 0x0e, 0x68, 0xa6, 0xf1, 0x35, 0x6a, 0xbd, 0x92, 0x4c, 0x45, 0xd6, 0x3e, 0x9c, 0xea, 0x20, 0xd6, 0x67, 0xcf, 0xdb, 0xc4, 0x0b, 0xf6, 0xdd, 0xaf, 0xb8, 0xd5, 0x97, 0xc4, 0x05, 0xe1, 0x5a, 0x5e, 0xef, 0xb7, 0x0d, 0x82, 0x1f, 0xdc, 0x5e, 0x3a, 0x50, 0x51, 0x8a, 0xce, 0x6e, 0x88, 0x75, 0xea, 0x9f, 0x90, 0x17, 0x12, 0x99, 0xed, 0xe8, 0x2b, 0x44, 0x8d, 0xf2, 0xab, 0x93, 0xc1, 0xf0, 0xad, 0xd1, 0x6d, 0x14, 0x63, 0x21, 0x97, 0x83, 0x32, 0x9c, 0xeb, 0x6c, 0x59, 0xd6, 0x2a, 0x27, 0xac, 0xde, 0xb5, 0x7f, 0x69, 0x37, 0x4c, 0x60, 0xb6, 0xfd, 0x0e, 0x21, 0x27, 0x37, 0xc4, 0x3a, 0xdd, 0x4f, 0xd7, 0x1f, 0xfd, 0x28, 0x4a, 0xf1, 0x5e, 0x9d, 0x8b, 0x87, 0x3c, 0x71, 0xdc, 0xc7, 0x58, 0x88, 0x11, 0x7a, 0xb3, 0x63, 0x31, 0x48, 0x6d, 0xe6, 0x7a, 0x3d, 0xad, 0xf8, 0xd7, 0xd7, 0xe3, 0x7d, 0x19, 0x69, 0x4b, 0xf9, 0xdf, 0xab, 0x44, 0x4d, 0x8b, 0x03, 0x9d, 0x8d, 0xf5, 0x43, 0xa0, 0x12, 0x15, 0x04, 0x85, 0x2c, 0x7b, 0xec, 0x78, 0x94, 0x71, 0x50, 0xcc, 0xb8, 0x88, 0x5e, 0xe8, 0xcd, 0xbe, 0xa6, 0xe7, 0x14, 0xe1, 0x93, 0xe5, 0x68, 0x86, 0xe0, 0x0d, 0xbc, 0x0a, 0x46, 0xc6, 0xe3, 0x63, 0xaf, 0x06, 0x99, 0x22, 0x16, 0x8c, 0x8d, 0x6f, 0x2a, 0xbf, 0x21, 0xb8, 0xf3, 0x7c, 0x75, 0xf1, 0xca, 0x03, 0x26, 0x95, 0x4b, 0xad, 0xa4, 0xf4, 0x29, 0xb5, 0x07, 0x16, 0x8e, 0xb3, 0x79, 0x9b, 0xbe, 0xec, 0xdd, 0x64, 0x1f, 0xf8, 0x93, 0x7c, 0xf5, 0x0c, 0xb6, 0xdc, 0x74, 0xf6, 0xe8, 0xe7, 0x63, 0x26, 0xe8, 0x86, 0x18, 0x59, 0x5d, 0xc3, 0x13, 0xa8, 0x8d, 0xe1, 0xe9, 0x43, 0xc9, 0x58, 0xb2, 0x6c, 0x8c, 0x6d, 0x95, 0xc9, 0xa7, 0xcd, 0xc2, 0xc3, 0xfb, 0x77, 0xda, 0xf7, 0x05, 0x5e, 0x16, 0xf5, 0xc9, 0xa3, 0xa4, 0x33, 0xfe, 0x3f, 0xd4, 0x4e, 0xa1, 0xb2, 0xd7, 0x79, 0xcd, 0x5a, 0xce, 0x2b, 0xfc, 0xda, 0x5e, 0x5a, 0x8b, 0x79, 0x1c, 0xd7, 0x86, 0x62, 0x87, 0x8d, 0xcf, 0x6f, 0x52, 0x28, 0x30, 0x03, 0x97, 0xb1, 0x49, 0x7c, 0x7b, 0x05, 0x04, 0x07, 0xae, 0x2d, 0x94, 0x54, 0x06, 0xd5, 0x3d, 0x1b, 0x18, 0x3c, 0x13, 0xce, 0x3d, 0x2b, 0x4e, 0xac, 0xbe, 0x98, 0x60, 0x89, 0xcf, 0xb8, 0x25, 0xf4, 0x44, 0xe9, 0xda, 0x9d, 0xc8, 0x77, 0x33, 0x4f, 0xc0, 0x4b, 0x58, 0xaf, 0xf2, 0xd4, 0x12, 0xb8, 0xfb, 0x3a, 0x07, 0x3b, 0x7f, 0xaf, 0x3d, 0x7b, 0xf1, 0x8b, 0x09, 0xe3, 0x9c, 0x97, 0xb1, 0xd0, 0x4a, 0x32, 0xb6, 0x04, 0x23, 0x2e, 0xe5, 0xbe, 0xca, 0xad, 0xeb, 0x53, 0xfa, 0xc2, 0x8c, 0xea, 0xa0, 0x91, 0xe2, 0x9f, 0xa8, 0x68, 0xb2, 0x3f, 0x28, 0x80, 0xd6, 0x3f, 0x98, 0x5a, 0xf9, 0x96, 0xae, 0x01, 0x4c, 0xce, 0x2f, 0x1b, 0x6a, 0xd3, 0x1a, 0xd9, 0x69, 0x32, 0xc7, 0xba, 0x0e, 0x06, 0xed, 0x3e, 0x74, 0xec, 0xce, 0x80, 0x39, 0xee, 0x2e, 0x9b, 0x43, 0x44, 0xd2, 0x2d, 0x52, 0x8d, 0xf2, 0x9a, 0x20, 0x77, 0xb5, 0x21, 0xdf, 0x72, 0x8c, 0x85, 0x46, 0x4d, 0x93, 0xd1, 0x6a, 0xb2, 0x21, 0xcc, 0x97, 0x31, 0x3a, 0x89, 0xa6, 0x19, 0x77, 0x76, 0xc1, 0x7c, 0xfd, 0x2b, 0x99, 0x10, 0xbb, 0xfa, 0x16, 0xe5, 0xbf, 0xa3, 0x27, 0x19, 0x7c, 0xaf, 0xdc, 0xf9, 0x11, 0xb0, 0x00, 0xc6, 0x16, 0x9e, 0x5c, 0x4a, 0xcc, 0x19, 0x3f, 0xe0, 0x8b, 0x9a, 0x40, 0xfc, 0x44, 0x51, 0xa0, 0xab, 0xa4, 0x31, 0x13, 0x22, 0x0a, 0x1b, 0x4b, 0x37, 0x33, 0xdb, 0x21, 0x45, 0x7a, 0xfc, 0xfc, 0xc3, 0xd0, 0x3b, 0xe2, 0x27, 0x38, 0x78, 0x17, 0x0d, 0xd6, 0x4b, 0x8f, 0x77, 0x05, 0x52, 0x8f, 0xdd, 0x8d, 0xcd, 0x22, 0x48, 0x6e, 0x8d, 0x47, 0xfe, 0xbd, 0x66, 0x73, 0x2d, 0xa5, 0x95, 0x13, 0xe8, 0x5d, 0xce, 0xc2, 0xa7, 0xa5, 0xc0, 0xf5, 0x98, 0x78, 0xf5, 0x7d, 0x1a, 0x19, 0x8b, 0xd2, 0xbd, 0x7f, 0xe3, 0x07, 0xef, 0x57, 0x20, 0xd4, 0xbd, 0x4e, 0x29, 0xfc, 0xf6, 0x3c, 0x5e, 0xc8, 0x99, 0xa5, 0xf5, 0xf6, 0x26, 0x98, 0x6a, 0x1d, 0x83, 0x47, 0x52, 0x7e, 0x71, 0x53, 0xa5, 0x93, 0x95, 0x57, 0xf5, 0x12, 0x0f, 0x03, 0xc4, 0xdf, 0x30, 0x6d, 0x9d, 0x1f, 0x3a, 0x09, 0x03, 0xcc, 0x54, 0xf1, 0xea, 0xd8, 0x67, 0x30, 0x61, 0x2a, 0xa1, 0x85, 0xce, 0x62, 0x97, 0xb8, 0x90, 0x87, 0x5b, 0x34, 0x55, 0x59, 0xe8, 0x6d, 0x5b, 0x11, 0x3c, 0x0b, 0xa0, 0x3c, 0x4d, 0x15, 0x8a, 0xe8, 0x99, 0xda, 0x37, 0xce, 0xf9, 0xd2, 0x47, 0xf1, 0x84, 0xcf, 0x97, 0x1f, 0x50, 0x57, 0x5c, 0xa0, 0x74, 0x2c, 0x97, 0x83, 0x92, 0x1d, 0x2d, 0x2f, 0x00, 0xcd, 0xa9, 0xb9, 0x77, 0xad, 0x84, 0xe1, 0xaa, 0x4a, 0xdb, 0x9f, 0x83, 0x8a, 0x43, 0xc3, 0xb7, 0xe2, 0x94, 0xb1, 0xe6, 0xc5, 0x7d, 0xa9, 0x50, 0x46, 0x78, 0x1a, 0x4d, 0xcf, 0xad, 0x3f, 0x88, 0x3a, 0x30, 0x7c, 0x63, 0x9a, 0x2f, 0xb8, 0x86, 0x6f, 0xff, 0x55, 0x90, 0xa7, 0x5d, 0xd7, 0x92, 0xee, 0xe9, 0x2e, 0x39, 0xa6, 0x4c, 0x98, 0xeb, 0xa8, 0xd6, 0x06, 0xd5, 0xd3, 0x2c, 0xe1, 0x6d, 0xe0, 0xaa, 0x82, 0x4f, 0xac, 0x81, 0xa2, 0xd3, 0xdf, 0x3e, 0xf6, 0x2d, 0x0f, 0x3b, 0x93, 0x1c, 0xc4, 0xdc, 0x82, 0x13, 0xf1, 0xc4, 0x97, 0x56, 0xcc, 0x64, 0xeb, 0xf9, 0x40, 0xb5, 0x90, 0x5a, 0xc7, 0x05, 0xed, 0xa4, 0xc6, 0x53, 0x62, 0xe0, 0x3d, 0xc2, 0xde, 0xc6, 0xaf, 0xbf, 0x47, 0x8e, 0x51, 0x51, 0x3e, 0x74, 0xe8, 0x4a, 0xc6, 0x88, 0xfc, 0xcd, 0xcb, 0x19, 0xa4, 0x59, 0x4e, 0x72, 0x15, 0x73, 0xa9, 0x32, 0xa3, 0x48, 0x94, 0xd7, 0x4a, 0x4b, 0xbf, 0xec, 0x0a, 0x1f, 0xef, 0x00, 0x63, 0x4e, 0xf6, 0x12, 0x8f, 0x27, 0x97, 0x59, 0x93, 0xdd, 0xb8, 0xaa, 0xca, 0xe9, 0x23, 0x83, 0x68, 0x8f, 0x67, 0x47, 0xbd, 0xa4, 0x0f, 0x69, 0x37, 0xdc, 0xa2, 0xae, 0x4d, 0x2c, 0xcb, 0x9c, 0xb9, 0x4f, 0x56, 0xf9, 0x1e, 0xd5, 0x04, 0x55, 0xfc, 0x11, 0xfe, 0x3e, 0xd8, 0x72, 0x22, 0x03, 0xc7, 0x2d, 0x0d, 0x56, 0x19, 0xf0, 0x4b, 0xa8, 0x10, 0x2d, 0xc6, 0xed, 0xfe, 0xbe, 0xe1, 0x2d, 0x23, 0x2f, 0x5c, 0x56, 0x95, 0xde, 0xdd, 0x1b, 0x25, 0x71, 0x64, 0xfc, 0x69, 0x29, 0xf5, 0x21, 0x84, 0xb4, 0x6f, 0xab, 0x3f, 0x09, 0xdf, 0x7c, 0xd4, 0xc1, 0x11, 0x86, 0xd3, 0x8b, 0xaa, 0xfd, 0x71, 0xcf, 0xb7, 0x74, 0x81, 0xa9, 0x9e, 0xae, 0xa4, 0x8b, 0x95, 0x0d, 0x9b, 0x29, 0x63, 0xd6, 0x76, 0x08, 0xa5, 0xff, 0x6c, 0x20, 0x46, 0x4e, 0xba, 0xac, 0xa9, 0xa6, 0x68, 0xa0, 0x1a, 0xdb, 0x09, 0x38, 0x02, 0x45, 0xf9, 0xf0, 0x5d, 0x0e, 0x4a, 0xaf, 0x34, 0x40, 0x53, 0x60, 0x61, 0x91, 0x65, 0xcd, 0xb5, 0xe2, 0x5b, 0xee, 0xa4, 0x88, 0x16, 0x55, 0xbf, 0xf2, 0x82, 0x77, 0x79, 0x54, 0x2b, 0x0d, 0xec, 0xc3, 0x4b, 0xab, 0xec, 0x16, 0xd7, 0x48, 0xb8, 0x4b, 0x25, 0x79, 0xa9, 0x94, 0x1e, 0xb3, 0x22, 0xaf, 0x56, 0x10, 0x9d, 0x8f, 0x3c, 0x54, 0x65, 0xf0, 0xf4, 0xd7, 0x82, 0x21, 0x39, 0x0f, 0x42, 0x1e, 0xc9, 0xfb, 0x7f, 0x4a, 0xa1, 0x36, 0x92, 0xcd, 0x40, 0x00, 0xa2, 0xda, 0xe3, 0x4b, 0x42, 0xad, 0x00, 0xf0, 0x56, 0x37, 0x7a, 0x88, 0xfc, 0x2f, 0x88, 0xde, 0x56, 0x28, 0xe8, 0x22, 0x75, 0x38, 0x41, 0x32, 0xd5, 0x09, 0xdf, 0x75, 0x70, 0x11, 0x3c, 0x00, 0x41, 0x89, 0x8f, 0xb8, 0xda, 0xbc, 0x5a, 0x21, 0x0a, 0x3d, 0x21, 0xd5, 0x1c, 0x03, 0x73, 0x60, 0x12, 0xfc, 0x5e, 0x2a, 0x1f, 0xb7, 0x27, 0x11, 0xd8, 0x8b, 0x73, 0x1b, 0x46, 0xe1, 0xaa, 0xcc, 0x16, 0xa9, 0x04, 0xa0, 0xde, 0xbe, 0x17, 0xc8, 0x53, 0xd9, 0xcf, 0xf0, 0x93, 0x1d, 0x54, 0x9b, 0x38, 0x40, 0x23, 0xff, 0xc8, 0x86, 0xb2, 0xae, 0xd0, 0xb8, 0x25, 0xc2, 0xf5, 0x05, 0xcd, 0x68, 0xa2, 0x11, 0xcd, 0x8b, 0xe4, 0x00, 0xa9, 0xaa, 0x90, 0x31, 0x70, 0x8d, 0x4f, 0x6b, 0x48, 0x3c, 0x02, 0x76, 0x70, 0x4a, 0x91, 0xca, 0x13, 0x59, 0xbb, 0x7a, 0x87, 0x30, 0xaf, 0xbe, 0x71, 0x26, 0xa3, 0x70, 0xfa, 0xe2, 0x73, 0x41, 0xac, 0xc0, 0x5a, 0xf2, 0x7b, 0xa2, 0xaa, 0xbb, 0xb5, 0x04, 0x51, 0x36, 0x3c, 0x7f, 0x14, 0x69, 0x61, 0x99, 0xbd, 0xde, 0xb1, 0xfa, 0xa1, 0xf0, 0x1a, 0x10, 0x76, 0x2e, 0xce, 0x86, 0x2d, 0x91, 0x51, 0x76, 0x53, 0xeb, 0x89, 0x6e, 0xf2, 0x55, 0x31, 0x40, 0x84, 0x91, 0x15, 0xcc, 0x3d, 0x2b, 0xf8, 0xd1, 0x9a, 0x33, 0xa2, 0x60, 0x17, 0x1c, 0xa0, 0x73, 0x1f, 0xe9, 0x1d, 0x28, 0xa4, 0xc6, 0xd3, 0xbd, 0x0c, 0x82, 0xc0, 0xad, 0xbc, 0xf8, 0x17, 0x8d, 0x07, 0x5c, 0x3d, 0x78, 0x65, 0xb0, 0x67, 0x69, 0x8f, 0xdb, 0xbb, 0x48, 0x93, 0x26, 0x00, 0x81, 0xa7, 0x56, 0xb1, 0xec, 0xf9, 0xfe, 0x6f, 0xd6, 0x47, 0xa6, 0x0f, 0x57, 0xfb, 0x7d, 0x52, 0x2a, 0x73, 0xdc, 0x44, 0x25, 0x4b, 0x52, 0x90, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x44, 0x22, 0x38, 0x56, 0x12, 0x66, 0x2a, 0x86, 0x62, 0x1e, 0x69, 0xb2, 0x00, 0x01, 0x09, 0x0a, 0xf8, 0x53, 0x35, 0x2a, 0xd5, 0xc7, 0x8e, 0x2f, 0xdd, 0xc0, 0x53, 0xbe, 0x03, 0xea, 0x3f, 0x96, 0xbe, 0xe9, 0x75, 0xac, 0xf3, 0xda, 0xd1, 0x24, 0xed, 0xda, 0x19, 0x6d, 0xf3, 0xad, 0xb8, 0xa9, 0xc4, 0xe6, 0xde, 0xd9, 0x9c, 0xc6, 0x58, 0xcf, 0xe0, 0x17, 0xc5, 0x8e, 0xd9, 0x49, 0x65, 0x41, 0x1b, 0xb4, 0x1f, 0x79, 0xef, 0x0a, 0x37, 0x83, 0x1f, 0xf5, 0x08, 0x60, 0x31, 0xe1, 0x87, 0xfd, 0x04, 0x06, 0xe5, 0xe2, 0x8c, 0xc2, 0x02, 0xdc, 0x6b, 0xe0, 0xf4, 0x4a, 0x7b, 0x36, 0x4e, 0xfc, 0xeb, 0xc6, 0x5f, 0xc0, 0xaa, 0x8c, 0x19, 0xd4, 0xad, 0x90, 0xd3, 0xad, 0xbe, 0xc3, 0xef, 0x0c, 0xed, 0xfa, 0x26, 0xac, 0xcd, 0x04, 0x24, 0x3a, 0xa0, 0x23, 0x89, 0xa0, 0x13, 0x59, 0xdf, 0xed, 0x6d, 0x91, 0xa1, 0x9e, 0xd7, 0x8e, 0xaa, 0xf4, 0xc3, 0xd5, 0xb2, 0xa2, 0xe4, 0xab, 0xcf, 0x92, 0xab, 0x69, 0x16, 0xa7, 0x01, 0x26, 0x8f, 0x1c, 0xa5, 0x4d, 0x4f, 0x39, 0x1e, 0x46, 0x16, 0xa9, 0x59, 0x20, 0xf0, 0xb4, 0x14, 0x14, 0xe2, 0x75, 0x59, 0x50, 0x31, 0x30, 0x57, 0x91, 0x66, 0x76, 0xdd, 0xef, 0xe2, 0xb2, 0xb3, 0xbe, 0x0c, 0x5b, 0x06, 0xf5, 0xd7, 0x33, 0x83, 0x3a, 0x5b, 0x33, 0x94, 0x6b, 0x88, 0xbf, 0x87, 0xe7, 0xbb, 0xd1, 0x7d, 0xc3, 0xaf, 0x02, 0xd7, 0x96, 0xfb, 0x5b, 0xe9, 0xb9, 0x98, 0xea, 0x95, 0xda, 0x2e, 0x45, 0x05, 0x0d, 0x2c, 0x76, 0x67, 0xc7, 0x5e, 0x7a, 0x89, 0x00, 0x5a, 0xb7, 0x34, 0x1f, 0xb6, 0x1c, 0xa0, 0xe1, 0x1c, 0x58, 0xc9, 0x70, 0xc2, 0xf5, 0xb0, 0x5b, 0x2e, 0x5d, 0xf2, 0x07, 0x02, 0xed, 0xf1, 0x71, 0x87, 0x83, 0x56, 0x24, 0xf0, 0x9d, 0x74, 0x2e, 0x10, 0x8e, 0x60, 0x3b, 0x14, 0xde, 0xa1, 0xae, 0xbf, 0x96, 0x30, 0x1d, 0x3a, 0x3e, 0xaa, 0x65, 0x37, 0x31, 0x5b, 0x98, 0x82, 0x80, 0xc3, 0x59, 0x82, 0x61, 0xfd, 0xfa, 0x1f, 0x01, 0x85, 0x97, 0x16, 0x19, 0x73, 0xaf, 0x45, 0x16, 0x67, 0x62, 0x2b, 0x46, 0x15, 0x50, 0x9d, 0xc7, 0x86, 0x7a, 0xd5, 0xc2, 0x2a, 0x7d, 0x52, 0x4b, 0x8f, 0x86, 0x73, 0x30, 0x2c, 0x0d, 0xdc, 0x5a, 0x99, 0xb3, 0x8e, 0x82, 0xdf, 0x1a, 0x2e, 0x43, 0xa8, 0x54, 0xea, 0x7f, 0x78, 0x10, 0x9c, 0xe0, 0x81, 0x0c, 0xac, 0x45, 0x7c, 0x15, 0xaa, 0x9f, 0x7a, 0xca, 0x9d, 0x88, 0x08, 0xe6, 0xfa, 0xf2, 0xe1, 0xb5, 0xdd, 0x90, 0x0e, 0x4e, 0xb5, 0xf9, 0xbc, 0x7c, 0x57, 0xeb, 0xd4, 0x69, 0x28, 0xef, 0x0e, 0xcd, 0x5f, 0x73, 0xa8, 0xb6, 0x49, 0xf9, 0xfc, 0x55, 0x20, 0xa3, 0x0b, 0x72, 0xfd, 0x69, 0x4f, 0x6b, 0x99, 0x1d, 0x0f, 0xf9, 0xd7, 0x95, 0x82, 0x7a, 0x1c, 0x34, 0x21, 0x49, 0xbe, 0x26, 0x9b, 0x48, 0x5f, 0x1e, 0x92, 0x76, 0x93, 0xce, 0x4e, 0xbc, 0x82, 0xe7, 0x19, 0x62, 0xf2, 0x3d, 0x76, 0x1e, 0x64, 0xb2, 0xd5, 0xaa, 0xc8, 0x35, 0x76, 0xaf, 0x65, 0xb4, 0xce, 0xe5, 0x76, 0xc9, 0xce, 0xc8, 0x5c, 0xa4, 0x8d, 0xd2, 0x49, 0xac, 0xae, 0x97, 0xdd, 0x86, 0x4d, 0xe8, 0x6c, 0x70, 0x7e, 0x1b, 0x2f, 0xea, 0xe7, 0x3c, 0xdf, 0x17, 0x92, 0x20, 0x88, 0x00, 0xa5, 0x61, 0xc6, 0x4c, 0x12, 0xf9, 0x43, 0xa8, 0xee, 0x6d, 0x15, 0x69, 0xd6, 0x68, 0x9a, 0xbb, 0xcf, 0x07, 0x0b, 0x17, 0x00, 0x11, 0xc0, 0x95, 0x6e, 0xce, 0x69, 0x35, 0x9b, 0xd6, 0x48, 0xc4, 0xf9, 0xd3, 0x35, 0x3d, 0xb9, 0x17, 0xae, 0x31, 0x28, 0xf2, 0xc9, 0xf8, 0xde, 0xbd, 0x40, 0x29, 0x03, 0xc8, 0x0f, 0x7a, 0xe9, 0x06, 0x86, 0x33, 0x9f, 0x09, 0x2d, 0xa3, 0x00, 0x8b, 0x06, 0x4c, 0x3d, 0xde, 0x45, 0x39, 0xd5, 0xc8, 0xa6, 0x4d, 0x23, 0x00, 0x46, 0x82, 0xea, 0x54, 0x69, 0x59, 0xa0, 0xcb, 0x09, 0x85, 0x42, 0x83, 0x7c, 0xab, 0x6e, 0xab, 0xf9, 0x95, 0x6f, 0x1c, 0xb5, 0x59, 0x28, 0x63, 0xed, 0x2c, 0xae, 0x55, 0x80, 0xce, 0x67, 0x2f, 0xf0, 0xff, 0x42, 0x48, 0x43, 0x79, 0x32, 0xbb, 0x4d, 0x66, 0x89, 0x95, 0xcd, 0x83, 0x8f, 0x02, 0xa2, 0x2f, 0xe9, 0xea, 0x06, 0x59, 0x6f, 0x24, 0xa6, 0xe0, 0xd7, 0x23, 0x03, 0x5e, 0xe1, 0x23, 0x10, 0xee, 0x65, 0x94, 0x49, 0x88, 0xf5, 0xf4, 0x0b, 0x6a, 0x12, 0xab, 0xe7, 0xe0, 0x7d, 0x34, 0xa0, 0xcd, 0xfc, 0x39, 0x6a, 0xb3, 0xc7, 0x55, 0xe6, 0xe6, 0x2c, 0xc6, 0x38, 0xec, 0x13, 0xf8, 0x77, 0x27, 0x29, 0xad, 0x64, 0x5c, 0x76, 0x6a, 0x71, 0x62, 0xf8, 0x19, 0x92, 0x78, 0xba, 0x96, 0x1d, 0x0c, 0x39, 0x66, 0xe5, 0x3e, 0x71, 0x01, 0x96, 0x3a, 0x29, 0x6e, 0x9d, 0x82, 0x22, 0x58, 0x35, 0xa6, 0xef, 0xb3, 0x88, 0xbe, 0x34, 0xca, 0x44, 0xdb, 0x8f, 0x4b, 0xcf, 0x6d, 0xff, 0x5d, 0x5f, 0xa0, 0x27, 0x52, 0x8c, 0x5d, 0xd0, 0x50, 0xf4, 0xd2, 0x42, 0x14, 0x98, 0xbd, 0xdb, 0x36, 0xa1, 0x5b, 0x86, 0x60, 0x4a, 0x37, 0x0f, 0x80, 0xf0, 0x47, 0xb6, 0x79, 0xff, 0xe7, 0xd3, 0xec, 0x13, 0x0c, 0x99, 0x97, 0xd2, 0x3d, 0x85, 0x51, 0x28, 0xe4, 0x89, 0xa4, 0x3f, 0x2a, 0x1c, 0xda, 0x06, 0x1b, 0xf9, 0xc1, 0x8c, 0xaa, 0x50, 0x50, 0x43, 0x6e, 0x4f, 0xae, 0x13, 0x20, 0x6f, 0x1f, 0x60, 0xe1, 0xf6, 0x65, 0x94, 0xf2, 0x67, 0xbc, 0x0e, 0x1f, 0x6a, 0xb6, 0xf3, 0xcc, 0x8f, 0x81, 0x7b, 0xab, 0xfb, 0xbb, 0x24, 0xf1, 0x00, 0x29, 0x01, 0xce, 0xfe, 0x79, 0xdc, 0x7b, 0xc8, 0xa5, 0x3a, 0x6f, 0x0d, 0x38, 0x06, 0x15, 0xe4, 0xc3, 0xb7, 0x91, 0xf8, 0xff, 0xc5, 0x2c, 0x20, 0x25, 0x2d, 0x8e, 0x5f, 0x5f, 0x7d, 0xc9, 0x10, 0x3b, 0x84, 0xf8, 0x2b, 0x91, 0x39, 0x96, 0x19, 0x8b, 0x0d, 0x15, 0x12, 0xff, 0xab, 0x25, 0xbf, 0xde, 0x48, 0x78, 0x3e, 0xb4, 0x8c, 0xa6, 0x2d, 0xf0, 0xa1, 0x9d, 0x17, 0xe7, 0x00, 0xfe, 0x86, 0x58, 0x01, 0x1f, 0x14, 0x9a, 0x84, 0xb1, 0x99, 0x79, 0xaa, 0xcb, 0x32, 0x77, 0x92, 0x0d, 0x4c, 0xa3, 0xf3, 0xd9, 0xf5, 0xbd, 0xb8, 0x54, 0x1e, 0x92, 0x76, 0x71, 0x26, 0x0d, 0xc9, 0x50, 0x32, 0xda, 0xeb, 0xbc, 0xd8, 0x22, 0x9d, 0xf5, 0xed, 0xa2, 0xa8, 0xe6, 0xc7, 0x7b, 0xf3, 0x99, 0xfd, 0xbf, 0x6d, 0xed, 0x79, 0xe8, 0xc4, 0xc8, 0xed, 0xbb, 0xb3, 0x92, 0xf7, 0x28, 0xb8, 0x0a, 0x38, 0x32, 0xfd, 0xa4, 0xbc, 0xd5, 0x6b, 0x8f, 0x37, 0x41, 0xd5, 0xab, 0x63, 0x59, 0xb4, 0xd4, 0x4f, 0x95, 0x25, 0xcc, 0x8d, 0x1b, 0x3b, 0xc2, 0x9f, 0xff, 0xa0, 0x52, 0xfd, 0x3b, 0x4e, 0x52, 0x31, 0x91, 0x86, 0xbd, 0xbf, 0xda, 0xc6, 0x1d, 0x87, 0x9c, 0x94, 0x9b, 0xe7, 0x4f, 0x23, 0x2c, 0x9d, 0xe0, 0x04, 0x18, 0x64, 0x30, 0x98, 0xe9, 0xcd, 0x1c, 0x1a, 0x93, 0xe7, 0x5e, 0x9b, 0x13, 0x23, 0x7b, 0xc1, 0x0c, 0xa1, 0xc3, 0x62, 0x49, 0x6b, 0x39, 0x12, 0x48, 0x70, 0xbe, 0xe5, 0xa7, 0xb8, 0xcf, 0x4e, 0xaa, 0x49, 0x91, 0xb8, 0x06, 0x7c, 0xf4, 0x63, 0xb0, 0x19, 0x52, 0x39, 0xbd, 0x4f, 0x5e, 0xf8, 0xf7, 0x60, 0x83, 0x49, 0x5c, 0x31, 0x7e, 0x91, 0x47, 0x3c, 0x98, 0x5c, 0x04, 0x86, 0x7d, 0xf1, 0x0f, 0xac, 0x29, 0xae, 0x5a, 0xaf, 0x25, 0x11, 0x3e, 0xf7, 0xd8, 0xed, 0x64, 0x70, 0xe9, 0x14, 0x8a, 0xfd, 0x28, 0xbe, 0x9a, 0x95, 0x64, 0x98, 0x56, 0x7f, 0x64, 0x49, 0x33, 0x4a, 0xa6, 0x94, 0xfc, 0x5a, 0xf7, 0xff, 0xe9, 0x26, 0x93, 0x85, 0xae, 0xe4, 0x05, 0x99, 0xf4, 0x6d, 0x95, 0x25, 0x0c, 0x79, 0xc4, 0x20, 0xc8, 0x81, 0xe3, 0x03, 0x76, 0x7e, 0xa1, 0xb6, 0xd1, 0x2c, 0xa6, 0x16, 0xbb, 0x95, 0xa9, 0xcd, 0x41, 0x47, 0xba, 0x7b, 0x76, 0xad, 0x4b, 0x06, 0xbb, 0x8e, 0x0a, 0x17, 0xec, 0xcc, 0x67, 0x89, 0x53, 0xd3, 0x22, 0x7f, 0x11, 0xc1, 0x09, 0x91, 0xd3, 0xf6, 0x0e, 0x5a, 0x09, 0x9e, 0x1b, 0x41, 0x2b, 0x80, 0x80, 0x2f, 0xfe, 0x65, 0xcd, 0x34, 0x9b, 0x91, 0x1e, 0x32, 0xce, 0xe2, 0x6d, 0xc5, 0xd5, 0xf8, 0x0c, 0xbd, 0x6a, 0xd7, 0x16, 0x32, 0x79, 0x75, 0xc5, 0x2d, 0xc4, 0xa1, 0x22, 0x9e, 0x52, 0xaa, 0x95, 0x2a, 0x2f, 0xa6, 0x0d, 0x93, 0x25, 0x52, 0x79, 0xf8, 0x32, 0x6a, 0xba, 0x03, 0x08, 0xdb, 0xf6, 0x3c, 0x96, 0x25, 0x85, 0x4b, 0x76, 0x71, 0x92, 0x29, 0x48, 0x29, 0x4f, 0xac, 0x53, 0xe2, 0xdf, 0x41, 0xf3, 0xc0, 0xb7, 0x19, 0x1b, 0x50, 0xa8, 0x3b, 0x45, 0x38, 0x9a, 0x35, 0x4a, 0x20, 0xf1, 0x21, 0x20, 0xb5, 0x96, 0x03, 0xe2, 0x9f, 0x02, 0xd9, 0x9c, 0xc4, 0x37, 0xd9, 0xd4, 0x95, 0x32, 0xfb, 0x6e, 0x74, 0xe8, 0xf7, 0x42, 0xcb, 0x57, 0xbb, 0x2c, 0xe8, 0x54, 0x9f, 0x6a, 0x65, 0xa2, 0x2a, 0x75, 0x2e, 0xb9, 0x47, 0x14, 0xcd, 0xd2, 0xb9, 0xa0, 0xff, 0x5b, 0x45, 0x26, 0x89, 0x7e, 0xf9, 0xac, 0xef, 0x42, 0xc0, 0xd8, 0x73, 0x35, 0x67, 0x32, 0x8e, 0xcc, 0x65, 0x79, 0xf8, 0x42, 0x07, 0xa1, 0x86, 0xd8, 0x22, 0xe6, 0x07, 0xda, 0x10, 0xc9, 0xfa, 0xf5, 0x1f, 0x21, 0xb7, 0xef, 0x4b, 0x7c, 0x17, 0x5c, 0x7b, 0x69, 0x8a, 0x22, 0x56, 0x2c, 0xb8, 0xb2, 0x7c, 0xc7, 0x1b, 0x7d, 0x00, 0x7d, 0x4b, 0xb8, 0xab, 0x17, 0x5f, 0xd9, 0xc2, 0x1b, 0x4d, 0xac, 0x9b, 0xa0, 0xbd, 0xc8, 0xd1, 0xf7, 0x52, 0xeb, 0xf7, 0x90, 0x66, 0x3c, 0x6d, 0x17, 0x7d, 0xee, 0x06, 0xbb, 0xbf, 0xb1, 0xed, 0x8a, 0x6b, 0x76, 0x74, 0x89, 0x7d, 0xc8, 0xc6, 0x8f, 0xfc, 0x5f, 0x68, 0xba, 0x70, 0x4c, 0x44, 0xa4, 0x4c, 0xb4, 0x0d, 0x7a, 0x3e, 0xb0, 0x46, 0x8e, 0xc9, 0x5c, 0xff, 0x26, 0x94, 0x71, 0x4c, 0x3b, 0xaa, 0xa4, 0x22, 0xbe, 0xaa, 0x28, 0x5b, 0xc6, 0x63, 0xac, 0xe0, 0x8c, 0x5f, 0xf8, 0xfe, 0xc7, 0x14, 0xb4, 0x56, 0xa9, 0xcc, 0xc2, 0x67, 0xd4, 0x38, 0x6d, 0x18, 0x99, 0x3f, 0xb4, 0x79, 0x9b, 0x02, 0x37, 0xa1, 0x67, 0x01, 0x07, 0xd3, 0x57, 0xee, 0x42, 0x95, 0xc4, 0xee, 0x02, 0x6c, 0x64, 0x07, 0xc5, 0x10, 0xc5, 0xc1, 0x42, 0xe6, 0x12, 0x84, 0xc1, 0xac, 0xc7, 0x99, 0xaa, 0x82, 0x4f, 0x61, 0xb3, 0x90, 0xa5, 0x49, 0xec, 0x0b, 0x3e, 0xf7, 0x18, 0xad, 0x2f, 0xc6, 0x61, 0x88, 0xc8, 0xc9, 0x8e, 0x7c, 0x6d, 0x8e, 0x07, 0x74, 0x0c, 0x03, 0x95, 0x8b, 0x47, 0x27, 0x37, 0xa7, 0xeb, 0xc6, 0xe2, 0x7d, 0x7e, 0x1c, 0x12, 0x48, 0xef, 0x60, 0x4a, 0xd5, 0x34, 0x21, 0x6e, 0xc0, 0x11, 0x8d, 0xec, 0x1e, 0x50, 0x91, 0x99, 0xce, 0x67, 0xa4, 0xf0, 0xcb, 0x25, 0x0e, 0x00, 0xca, 0xd7, 0xc6, 0x40, 0xaf, 0xd4, 0x35, 0xb4, 0xd8, 0x39, 0x27, 0xde, 0x05, 0x4f, 0xb1, 0xa4, 0x74, 0x92, 0x59, 0x03, 0xc1, 0xd9, 0x71, 0xfd, 0xf3, 0x2d, 0x3a, 0xf9, 0xf0, 0x67, 0xd3, 0xd0, 0x95, 0x2a, 0x3f, 0x76, 0xf9, 0x9f, 0x8e, 0x22, 0xd1, 0xb9, 0x11, 0x02, 0x42, 0x1a, 0x95, 0xb0, 0x4d, 0x58, 0x5e, 0x2f, 0x24, 0xbe, 0xbb, 0xb8, 0x43, 0xa3, 0xcd, 0xc8, 0x87, 0x3d, 0x4b, 0xeb, 0x80, 0x4a, 0x5e, 0x77, 0x0e, 0xec, 0x06, 0xc4, 0x31, 0x7b, 0x82, 0xa4, 0x69, 0x72, 0x94, 0x1d, 0xc5, 0x13, 0x85, 0x2a, 0x84, 0xeb, 0xd4, 0x2f, 0x8f, 0xcb, 0xcb, 0xa2, 0x3f, 0x48, 0xa4, 0xed, 0x59, 0x40, 0x57, 0xca, 0x8b, 0xe2, 0xa2, 0x10, 0x59, 0x92, 0x92, 0x4f, 0x29, 0x50, 0x2d, 0x52, 0xe1, 0xee, 0xdc, 0xbe, 0x05, 0x2a, 0x76, 0x7d, 0x38, 0x6c, 0x3e, 0x7f, 0xb7, 0x48, 0x57, 0x35, 0x75, 0xc4, 0x41, 0x93, 0x21, 0xca, 0x87, 0xd5, 0x14, 0x30, 0x95, 0x2b, 0x4f, 0xc3, 0x6c, 0xc3, 0xce, 0x78, 0xe5, 0x25, 0x8e, 0xfe, 0x6b, 0x09, 0xfa, 0xf3, 0xd3, 0x13, 0x22, 0x14, 0xfb, 0x95, 0x50, 0x15, 0x67, 0x09, 0x4d, 0xc8, 0x91, 0x4b, 0x82, 0xd3, 0x9b, 0xf3, 0x14, 0xd9, 0xfb, 0xb2, 0x1a, 0x03, 0x30, 0xff, 0x58, 0x7e, 0xce, 0x51, 0xda, 0xb2, 0xa2, 0xc9, 0x66, 0x18, 0x84, 0x04, 0xd3, 0xe0, 0x57, 0x60, 0x8b, 0xf8, 0x74, 0x15, 0x12, 0x1c, 0x41, 0x09, 0x16, 0x59, 0xf9, 0xe7, 0x3b, 0x89, 0xe3, 0x27, 0xa9, 0x3d, 0xcd, 0x08, 0xa8, 0xe3, 0x14, 0x49, 0x87, 0x61, 0x28, 0x8f, 0x54, 0x7f, 0xdb, 0x9d, 0x0f, 0x7c, 0xde, 0x1f, 0xa2, 0x3a, 0xc8, 0xad, 0x37, 0x0a, 0x60, 0x86, 0x3f, 0x81, 0xd9, 0x52, 0x21, 0x5b, 0x49, 0xae, 0xb5, 0x18, 0x03, 0x56, 0xba, 0x46, 0x7c, 0xcc, 0xc7, 0xec, 0xf2, 0x6a, 0x29, 0xc8, 0xcc, 0x64, 0xbe, 0x5a, 0x61, 0xda, 0xf0, 0x34, 0xcb, 0x95, 0xed, 0xf2, 0x23, 0xbd, 0x6c, 0x09, 0x79, 0x68, 0x00, 0x00, 0x01, 0x09 }; +constexpr AccessUnit AVC_MULTIPLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, true, 0, {}, { 0xf3, 0x15, 0xed, 0x63, 0x82, 0x7c, 0xb1, 0xdf, 0x38, 0x75, 0x9e, 0x5e, 0xb4, 0x5e, 0xe2, 0xf2, 0x65, 0x6a, 0x58, 0xb1 } }; +constexpr AccessUnit AVC_MULTIPLE_PACK_EXPECTED_AU_2 = { 0x64615f94, 0x3c0159b2, true, 0, {}, { 0xbe, 0x1d, 0x4f, 0x54, 0x72, 0x44, 0x77, 0xa3, 0x09, 0x5e, 0x3b, 0xea, 0xc2, 0x55, 0x07, 0xb5, 0xcd, 0x33, 0x28, 0x6d } }; +constexpr AccessUnit AVC_MULTIPLE_PACK_EXPECTED_AU_3 = { 0x15f90, 0x159b2, true, 0, {}, { 0x37, 0xdb, 0xa1, 0x63, 0x9e, 0x5a, 0xff, 0x92, 0xd0, 0x54, 0xbd, 0xc6, 0x69, 0x4f, 0x38, 0x89, 0xb8, 0x4b, 0x66, 0xfb } }; +constexpr AccessUnit AVC_MULTIPLE_PACK_EXPECTED_AU_4 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x03, 0x31, 0xd3, 0xe2, 0xbb, 0x54, 0x06, 0xdb, 0xda, 0xe8, 0x0b, 0xfd, 0x96, 0x81, 0x66, 0x3f, 0x5c, 0x1b, 0xac, 0x69 } }; + +constexpr std::array M2V_MULTIPLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x01, 0x00, 0xb8, 0x7e, 0x91, 0xe4, 0x7b, 0x15, 0x52, 0x0c, 0x57, 0xe9, 0x3f, 0x05, 0x04, 0x5c, 0x02, 0x72, 0xde, 0x18, 0x8d, 0x08, 0x31, 0x03, 0x75, 0xa4, 0xfe, 0xfe, 0x0b, 0xda, 0xcb, 0x2f, 0x8d, 0xe9, 0xb3, 0xc0, 0x32, 0x65, 0x3e, 0xf8, 0x3d, 0x89, 0xd1, 0xe1, 0xcb, 0xe0, 0x8f, 0xad, 0x2e, 0x97, 0x22, 0x75, 0x3a, 0xcd, 0xcd, 0x6d, 0x5b, 0x4b, 0xff, 0x04, 0x9a, 0x4a, 0xfe, 0x8a, 0xc5, 0xd7, 0x10, 0x0a, 0xb1, 0x71, 0x50, 0x0b, 0x2f, 0x82, 0x31, 0x15, 0x66, 0xab, 0xe4, 0x4b, 0x25, 0x4f, 0x62, 0xf6, 0xe0, 0xab, 0x11, 0x11, 0x55, 0x65, 0x65, 0x79, 0x9b, 0xfb, 0xd8, 0x85, 0x6b, 0x53, 0x19, 0xc6, 0x1c, 0xfc, 0x24, 0x2d, 0x00, 0x9b, 0x57, 0xac, 0xd9, 0xfa, 0x7a, 0xe4, 0x60, 0x1f, 0x8a, 0xb8, 0x0c, 0x92, 0x85, 0x06, 0xe4, 0x34, 0xd7, 0xce, 0x80, 0x4b, 0x21, 0xf4, 0x5a, 0xea, 0x19, 0x4a, 0xb2, 0x0d, 0x25, 0x58, 0x07, 0x96, 0x58, 0xad, 0xde, 0x80, 0x5d, 0xa8, 0xff, 0x74, 0x8d, 0xaf, 0x1d, 0xd7, 0x90, 0x0e, 0x3d, 0xa1, 0x85, 0x1f, 0xf8, 0x1e, 0xf5, 0xc5, 0x35, 0x0d, 0x79, 0x50, 0xd4, 0x28, 0x5a, 0x8e, 0xae, 0xe3, 0x2f, 0xd1, 0x6b, 0xb7, 0xaf, 0x30, 0xa3, 0xf5, 0x00, 0xf6, 0xe5, 0x05, 0x8c, 0x5b, 0x3f, 0xb3, 0xb0, 0xb2, 0x35, 0x88, 0x65, 0x62, 0x3a, 0x7e, 0x20, 0x17, 0x61, 0x1f, 0x98, 0x10, 0x68, 0xf7, 0x8b, 0x29, 0x5a, 0x7e, 0x51, 0xe0, 0x09, 0x72, 0xde, 0xbc, 0xfd, 0x0b, 0xdf, 0x67, 0xa3, 0x8b, 0x4f, 0xe0, 0xa3, 0xfe, 0x33, 0x09, 0x38, 0x77, 0x97, 0x53, 0xa6, 0x11, 0x57, 0xb8, 0x5e, 0xed, 0x75, 0x1a, 0x66, 0xf4, 0x5f, 0x74, 0x13, 0x80, 0xb5, 0xfe, 0xce, 0x8c, 0x04, 0x32, 0x7e, 0xa1, 0x91, 0x39, 0x04, 0xcd, 0x4c, 0x2f, 0x59, 0x5d, 0xa6, 0xdb, 0x3d, 0xc6, 0x58, 0x66, 0x55, 0xca, 0x53, 0xdc, 0xc2, 0x3a, 0x07, 0xc0, 0xc2, 0x74, 0x7b, 0x28, 0xfc, 0xd0, 0xcd, 0x17, 0x03, 0xb3, 0x26, 0x8c, 0x9e, 0x60, 0x9c, 0x5b, 0x57, 0x3e, 0x44, 0x6f, 0xc0, 0x1f, 0xa7, 0xdd, 0xb7, 0xa0, 0x59, 0x3e, 0xd8, 0x25, 0x2d, 0xf1, 0x4e, 0x8a, 0x76, 0x86, 0x84, 0xe3, 0xf0, 0xec, 0x70, 0x87, 0xc2, 0x45, 0xc9, 0x3a, 0xd6, 0x4d, 0x4d, 0xc5, 0x18, 0x4b, 0x11, 0x29, 0x13, 0x05, 0x8e, 0x44, 0x90, 0xbb, 0x8c, 0xa6, 0x77, 0xeb, 0x64, 0x0c, 0xcf, 0x06, 0x14, 0x72, 0xeb, 0xfa, 0xca, 0x63, 0xc5, 0x7e, 0x9b, 0x7f, 0x83, 0x7c, 0x18, 0xd8, 0x21, 0xf0, 0xb7, 0xb6, 0x51, 0xf3, 0x7d, 0x4c, 0xb4, 0x38, 0xb4, 0xca, 0x25, 0xa9, 0x16, 0x5f, 0x48, 0xea, 0xef, 0x83, 0x92, 0x07, 0xc5, 0xec, 0x08, 0xa2, 0x39, 0x26, 0x98, 0xbb, 0x1c, 0x02, 0xba, 0xf8, 0xe4, 0xe4, 0xbb, 0xb3, 0x77, 0x19, 0x17, 0xbf, 0x97, 0xb2, 0x9a, 0x1f, 0x20, 0xea, 0xdc, 0xc5, 0x4e, 0xaa, 0xf5, 0x2e, 0x0e, 0xb8, 0x8a, 0x73, 0x8d, 0xab, 0xc3, 0x2b, 0x05, 0xe4, 0x43, 0xed, 0xbc, 0xc0, 0xd2, 0x18, 0x96, 0x1f, 0x65, 0xd0, 0xc7, 0x2b, 0x59, 0x12, 0xf3, 0x69, 0x48, 0x32, 0x47, 0xc5, 0x58, 0x8c, 0x00, 0x60, 0x8f, 0xb4, 0x29, 0x0b, 0xf0, 0x03, 0x88, 0x88, 0xfc, 0xbe, 0x7b, 0x80, 0x7d, 0x9f, 0x99, 0xae, 0xa4, 0xf2, 0x2d, 0xc0, 0x1a, 0xb3, 0xa5, 0x79, 0x7e, 0x16, 0x72, 0x74, 0xf4, 0x92, 0x77, 0x19, 0xbc, 0xfc, 0x8d, 0xf1, 0x0c, 0xf8, 0x32, 0xfc, 0xf3, 0xcf, 0x93, 0xb8, 0xc0, 0x82, 0x4e, 0x0e, 0x2f, 0x5c, 0xf2, 0x88, 0x38, 0x39, 0x0e, 0x30, 0x00, 0x7e, 0xcd, 0x84, 0xd1, 0xc6, 0x8b, 0xdd, 0x8c, 0x12, 0x0a, 0x81, 0x27, 0x23, 0x3f, 0xd4, 0x78, 0x99, 0xec, 0x53, 0xa1, 0xad, 0x71, 0x8a, 0xf8, 0x73, 0xf7, 0xb6, 0x6c, 0x07, 0xa9, 0xc0, 0xa7, 0x59, 0x70, 0x4f, 0xbd, 0x00, 0x7f, 0x65, 0xf3, 0x7f, 0x6a, 0xec, 0xe9, 0xec, 0x66, 0xce, 0x86, 0x26, 0x90, 0x01, 0x87, 0x0f, 0x4a, 0xfe, 0x13, 0xbc, 0x1b, 0xe5, 0xb2, 0x82, 0x1c, 0x5c, 0xf0, 0xcc, 0x89, 0x69, 0x0e, 0xda, 0x58, 0x2b, 0x4b, 0x42, 0x87, 0xcc, 0xd1, 0x6f, 0xc1, 0x7a, 0x80, 0x63, 0x2a, 0xc3, 0x28, 0x4c, 0xae, 0xf0, 0x77, 0x9a, 0xa9, 0xc2, 0x8b, 0x0d, 0xa3, 0xfc, 0x7e, 0xb9, 0x99, 0xa6, 0x2c, 0x9a, 0x4e, 0x10, 0x77, 0x20, 0xb5, 0x7c, 0x2d, 0xa6, 0x02, 0xee, 0x08, 0x6e, 0x4f, 0x5b, 0x8b, 0x9e, 0x35, 0xc3, 0x64, 0xdf, 0xf7, 0x7f, 0xc0, 0x57, 0xf4, 0x42, 0x0f, 0x16, 0xdd, 0xb2, 0xf5, 0x9c, 0x04, 0x0c, 0x97, 0x64, 0x48, 0x94, 0x0c, 0xc4, 0xfe, 0x9e, 0xce, 0x78, 0x0c, 0xda, 0xcd, 0x9d, 0x3d, 0x38, 0xd6, 0x83, 0x5d, 0x36, 0x52, 0x61, 0x86, 0x19, 0x23, 0x39, 0x51, 0x9f, 0xb5, 0x95, 0x5f, 0x1a, 0x6d, 0x36, 0x68, 0x3a, 0x01, 0xe3, 0x5f, 0x6e, 0x73, 0x0f, 0xf4, 0xb6, 0xc2, 0x3f, 0x14, 0x66, 0xa3, 0x77, 0x07, 0x6b, 0xed, 0x76, 0x85, 0x81, 0x0b, 0x16, 0x48, 0x34, 0x68, 0x8d, 0x50, 0xe7, 0x91, 0x85, 0x61, 0xff, 0x30, 0x37, 0x1f, 0x2f, 0x15, 0x9c, 0xa6, 0xa8, 0xcb, 0xfc, 0x0a, 0x92, 0x1a, 0xd8, 0x4c, 0x09, 0xa5, 0x40, 0x65, 0xb6, 0xbd, 0x2b, 0xca, 0xce, 0x72, 0xac, 0xb8, 0xe8, 0x46, 0xd5, 0x9a, 0x7e, 0xf1, 0x5f, 0x60, 0x2c, 0x05, 0xce, 0xb5, 0x71, 0xdd, 0xb8, 0x2f, 0xa8, 0xaa, 0x0e, 0xea, 0x37, 0x86, 0xf5, 0x06, 0x73, 0xae, 0x24, 0x9c, 0x02, 0x9d, 0x36, 0xb7, 0x0b, 0x3f, 0x5e, 0x0f, 0x80, 0xa0, 0xb1, 0xcb, 0x2a, 0x56, 0xe6, 0xa6, 0xac, 0x57, 0xe0, 0x92, 0x8d, 0xee, 0x28, 0x2b, 0x8f, 0xd3, 0x09, 0x67, 0xac, 0x37, 0xa9, 0x2d, 0x5b, 0x67, 0x38, 0xf0, 0xe0, 0x87, 0x8c, 0x6f, 0x05, 0x12, 0xff, 0xd4, 0x72, 0x02, 0x8c, 0x08, 0x05, 0xc3, 0x50, 0x3b, 0xaf, 0x97, 0x5f, 0xa3, 0xa9, 0x39, 0x63, 0xfa, 0x5a, 0x31, 0x32, 0x08, 0xbb, 0x5b, 0xf6, 0xd0, 0xd4, 0xd4, 0xb3, 0xe3, 0xa1, 0x52, 0x74, 0xd7, 0x46, 0xfe, 0x00, 0x88, 0x09, 0xaa, 0xed, 0xa3, 0x7b, 0x6b, 0x88, 0x72, 0x75, 0xf1, 0xdb, 0xc7, 0x8e, 0x49, 0x45, 0xd1, 0x02, 0x8f, 0xc0, 0x52, 0x33, 0x15, 0x9b, 0xd8, 0x5a, 0xb1, 0xf1, 0x61, 0x2a, 0x4a, 0xb0, 0x59, 0x0c, 0x5d, 0x08, 0xa7, 0xc6, 0x62, 0x4f, 0xfe, 0x5d, 0xa9, 0x54, 0xb5, 0xcd, 0xb8, 0x49, 0x7f, 0x62, 0x06, 0xa4, 0x38, 0x90, 0x0f, 0x39, 0x06, 0x3a, 0x52, 0xf1, 0x69, 0xd2, 0x98, 0x23, 0x0c, 0xbd, 0x72, 0x98, 0xf5, 0xf1, 0x12, 0x5e, 0xdf, 0xfc, 0x22, 0x00, 0x9e, 0x4b, 0xc8, 0x12, 0xf3, 0xe4, 0x84, 0xb0, 0x4e, 0xd3, 0xf2, 0xec, 0xf0, 0x11, 0x44, 0x0f, 0xb3, 0x8f, 0x12, 0xbf, 0x92, 0xa9, 0x51, 0x00, 0x00, 0x1b, 0x07, 0xf4, 0x2d, 0xa0, 0xce, 0xa3, 0x2b, 0xa0, 0x4c, 0xa7, 0x07, 0xa2, 0x05, 0x0e, 0xca, 0xd0, 0x1e, 0x85, 0xb9, 0x10, 0x6b, 0x4f, 0x21, 0x7e, 0x11, 0x46, 0x12, 0x64, 0xde, 0x78, 0x02, 0x97, 0xee, 0xe6, 0xfa, 0x1b, 0xa7, 0xe7, 0x77, 0x91, 0x11, 0x07, 0xfe, 0x06, 0x10, 0x8c, 0x8f, 0x4c, 0x3c, 0x72, 0x9d, 0x14, 0x57, 0xb1, 0x93, 0xbf, 0xad, 0x8b, 0xb1, 0x27, 0xfa, 0x0d, 0xdb, 0xae, 0xac, 0x76, 0xd8, 0xed, 0x76, 0x56, 0xb3, 0x2c, 0x5f, 0x56, 0x69, 0x06, 0x27, 0xaa, 0x24, 0x13, 0x71, 0x8d, 0x41, 0x93, 0x4f, 0x70, 0xa1, 0x3b, 0x16, 0xc6, 0xeb, 0x06, 0x20, 0x06, 0x7a, 0xb2, 0x9e, 0x48, 0x3c, 0x41, 0x94, 0xf7, 0x84, 0x41, 0x7d, 0x35, 0x58, 0xfe, 0x26, 0x8c, 0xb5, 0xd3, 0x69, 0x0f, 0x59, 0xf6, 0xf6, 0x36, 0x35, 0xb6, 0xa8, 0x9e, 0xa5, 0xbf, 0xfe, 0x7f, 0x31, 0x92, 0x28, 0x8c, 0xc3, 0x8b, 0x4a, 0x3b, 0x25, 0x9b, 0x2d, 0xdf, 0xc5, 0xfd, 0xa5, 0x45, 0x35, 0xfa, 0x7a, 0xec, 0x30, 0x4d, 0x9e, 0x10, 0x69, 0xf3, 0xa0, 0x10, 0x73, 0x67, 0x94, 0xc9, 0x63, 0x24, 0xe5, 0x46, 0x71, 0x48, 0x29, 0x48, 0x0e, 0xfa, 0xa6, 0xa8, 0xa6, 0x4b, 0x9f, 0xe6, 0x3c, 0xb5, 0x76, 0xa3, 0x4a, 0xc0, 0xeb, 0x34, 0x8f, 0x13, 0x44, 0x5e, 0x83, 0x44, 0x72, 0xd3, 0x99, 0xa1, 0x34, 0x35, 0x9c, 0x3b, 0xfd, 0xb4, 0x6c, 0x3b, 0x58, 0xf7, 0x86, 0xc0, 0x22, 0xa3, 0x02, 0xfc, 0xef, 0x4c, 0x3a, 0xf3, 0x89, 0x5f, 0x31, 0x7f, 0x9f, 0x5d, 0xab, 0x07, 0x0e, 0x8a, 0x0a, 0xed, 0x5d, 0x94, 0x90, 0xea, 0xf5, 0x28, 0x1c, 0x96, 0x3d, 0xd0, 0x3e, 0x5a, 0x6a, 0xef, 0xb4, 0x81, 0x06, 0x3c, 0x29, 0xfc, 0x1d, 0x5c, 0x79, 0x43, 0x91, 0xe0, 0xec, 0x93, 0xdc, 0xa4, 0xed, 0x66, 0xe0, 0xb9, 0xc0, 0x6a, 0x3e, 0x3b, 0x64, 0x39, 0x37, 0x8d, 0xb4, 0x0a, 0xdf, 0x46, 0x0d, 0x3f, 0xdb, 0x1a, 0x37, 0xd5, 0x96, 0x7b, 0x70, 0x09, 0x6d, 0xf8, 0xa5, 0xe0, 0xe8, 0x6e, 0xf3, 0xa4, 0x68, 0x16, 0xa3, 0xc5, 0x3a, 0x06, 0xc5, 0x31, 0x38, 0xa5, 0x15, 0xf2, 0x4d, 0xc3, 0x9f, 0x50, 0x04, 0xc9, 0x67, 0x90, 0x1a, 0x13, 0x8f, 0x48, 0x05, 0xec, 0x1d, 0x71, 0xf2, 0xae, 0x4a, 0x2b, 0x7f, 0x50, 0xef, 0x57, 0x7d, 0x68, 0x31, 0x7f, 0xf5, 0xfd, 0x9f, 0xf0, 0x74, 0x7c, 0x3b, 0xfb, 0x39, 0x33, 0xe9, 0xbb, 0x49, 0xb9, 0x01, 0xd7, 0x32, 0xb5, 0x64, 0x23, 0xb1, 0x83, 0x91, 0x2a, 0xbd, 0x4e, 0xdf, 0x84, 0x3a, 0x55, 0x62, 0x66, 0x9d, 0x16, 0x51, 0xd8, 0x2d, 0xf8, 0x86, 0x21, 0x15, 0x09, 0x00, 0xf1, 0xd2, 0x9f, 0x3b, 0x17, 0x25, 0x60, 0x5f, 0xbe, 0x6e, 0x40, 0x40, 0x58, 0xa3, 0xe3, 0x0b, 0x64, 0x34, 0x00, 0x00, 0x01, 0xba, 0xea, 0xd0, 0xb3, 0x4e, 0x2a, 0x24, 0x44, 0x53, 0xdd, 0x8b, 0x0d, 0x11, 0xf4, 0xb1, 0x4e, 0xe4, 0x56, 0x1b, 0xc1, 0x19, 0x97, 0xca, 0xf7, 0x5f, 0x52, 0x60, 0x22, 0xac, 0xa3, 0x25, 0xcd, 0xbd, 0x5c, 0xb7, 0x93, 0xaa, 0x44, 0x18, 0x08, 0xc8, 0x87, 0xa6, 0x5a, 0x21, 0x2d, 0x37, 0x8c, 0x92, 0xb4, 0xe8, 0xf2, 0x18, 0x97, 0x04, 0x71, 0x9a, 0xda, 0x51, 0x77, 0x05, 0xd7, 0x24, 0xdb, 0x9d, 0x32, 0x46, 0xbf, 0xcd, 0x6a, 0xbd, 0x05, 0xac, 0x29, 0xca, 0x20, 0x95, 0xc9, 0x6a, 0x1f, 0x02, 0x76, 0x11, 0xf6, 0x62, 0x7b, 0x09, 0x85, 0xca, 0x2e, 0x75, 0x09, 0xf9, 0x62, 0x00, 0x3f, 0x9f, 0x2d, 0xbc, 0x8f, 0x36, 0x45, 0xe0, 0x8d, 0xd1, 0xa7, 0xac, 0x32, 0x90, 0x73, 0xde, 0xd7, 0x1c, 0x98, 0xd4, 0xea, 0x97, 0x3c, 0x8b, 0xa2, 0x2a, 0x17, 0xaa, 0xfe, 0xf6, 0x20, 0x05, 0x1a, 0xdd, 0xf3, 0xef, 0xec, 0xa2, 0x2e, 0xc0, 0x57, 0x15, 0x48, 0xa0, 0x1d, 0x8a, 0x2f, 0x37, 0xc0, 0x31, 0xaa, 0x22, 0xb2, 0x1b, 0x13, 0xf4, 0xd0, 0xeb, 0xb6, 0x12, 0xeb, 0x87, 0xd1, 0xa0, 0x49, 0xe2, 0x71, 0x0b, 0x36, 0x91, 0xa2, 0x0b, 0x42, 0x1e, 0x9c, 0xfd, 0x88, 0x55, 0x41, 0x4a, 0x03, 0x05, 0xb9, 0xba, 0xfd, 0x3a, 0x39, 0x44, 0x5e, 0xf6, 0xf4, 0x29, 0x75, 0x67, 0xec, 0xfb, 0xad, 0x97, 0xf6, 0x14, 0x4f, 0xa9, 0xce, 0x6d, 0xb4, 0x6f, 0xa7, 0xec, 0xcd, 0xb8, 0xe8, 0xda, 0x38, 0x6e, 0x12, 0xa5, 0x29, 0xa9, 0x21, 0x08, 0xde, 0x5d, 0x45, 0x5b, 0x07, 0x35, 0xa5, 0xa6, 0x87, 0x55, 0x5e, 0xe8, 0x35, 0xbf, 0xe4, 0x4b, 0xcb, 0x82, 0xa0, 0x40, 0xe9, 0x2c, 0xfa, 0x5b, 0xc0, 0xee, 0xb4, 0x6b, 0xae, 0x1e, 0xeb, 0xa3, 0x2e, 0x94, 0x56, 0x14, 0x08, 0x54, 0x32, 0xcc, 0xcf, 0xa1, 0x66, 0x09, 0x9e, 0xdc, 0xae, 0xcd, 0xb7, 0x59, 0x82, 0x98, 0x55, 0x49, 0x5c, 0x64, 0xd0, 0x20, 0x90, 0x55, 0x8b, 0x68, 0xcf, 0x52, 0x3a, 0x4f, 0x66, 0xcd, 0x45, 0x6c, 0xe6, 0x55, 0xcf, 0xfe, 0x08, 0x05, 0x20, 0xae, 0xd1, 0x75, 0xed, 0x81, 0xf8, 0x07, 0xa1, 0xb7, 0xeb, 0xf4, 0x4b, 0xa2, 0x05, 0x32, 0x15, 0xbe, 0x72, 0x3c, 0x30, 0x93, 0xa1, 0xe8, 0x6a, 0x0c, 0x17, 0xb9, 0x59, 0x9f, 0xcf, 0x40, 0xdf, 0x3b, 0xe2, 0xc6, 0xb5, 0x17, 0x7f, 0xd3, 0x35, 0xdd, 0xcc, 0x90, 0x65, 0x06, 0x3a, 0x87, 0x77, 0xea, 0x45, 0x03, 0xe9, 0xbc, 0x4b, 0xf7, 0xcd, 0x4a, 0x94, 0x95, 0xc0, 0x48, 0xa9, 0xa5, 0xb0, 0x09, 0x3a, 0x2a, 0x9a, 0xf5, 0xda, 0x0b, 0x53, 0xbc, 0xf4, 0x3d, 0x29, 0xb2, 0x91, 0x9c, 0xe4, 0xc4, 0xa0, 0x31, 0xa3, 0xb6, 0x00, 0x00, 0x01, 0x09, 0x00, 0xb7, 0x03, 0xa3, 0xb5, 0xa3, 0x5f, 0x54, 0x42, 0x54, 0x25, 0x60, 0x23, 0x30, 0x0c, 0xfe, 0xe7, 0x82, 0x82, 0x62, 0x90, 0x80, 0x7e, 0x8a, 0x42, 0x04, 0x28, 0x08, 0x05, 0x25, 0x3c, 0x3e, 0xc8, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0xe8, 0xa0, 0x50, 0x98, 0x8e, 0xe2, 0xf9, 0x39, 0xd1, 0xa9, 0x47, 0x6e, 0x97, 0x00, 0x1b, 0x58, 0x50, 0x91, 0xc4, 0x7e, 0x2b, 0xe4, 0x20, 0x64, 0xba, 0x27, 0x9b, 0x42, 0x41, 0x03, 0x96, 0x5e, 0x5c, 0x00, 0x5b, 0x9d, 0x08, 0xbf, 0x25, 0xba, 0xf7, 0x3b, 0xbb, 0xc0, 0xe9, 0x38, 0x77, 0x14, 0x46, 0x4b, 0xca, 0xa3, 0x1c, 0x3f, 0xa9, 0xed, 0x5c, 0x88, 0x99, 0x54, 0x00, 0xeb, 0xe5, 0xb0, 0x23, 0xe5, 0x84, 0x74, 0x29, 0x15, 0xb1, 0x37, 0x2d, 0xf6, 0x5b, 0xa4, 0xf0, 0x63, 0x9d, 0x9c, 0xd4, 0x78, 0x41, 0xfb, 0xd6, 0xf9, 0xf2, 0xb8, 0xe2, 0x0d, 0xc0, 0x32, 0x28, 0x29, 0xc5, 0xa7, 0x7b, 0xec, 0x87, 0x5f, 0x58, 0xdd, 0x8d, 0xb9, 0x47, 0xe9, 0x89, 0x27, 0x86, 0x3e, 0x9e, 0x69, 0x40, 0x15, 0xd6, 0xfc, 0x1a, 0x1c, 0xdb, 0x22, 0xbb, 0xd2, 0xc7, 0x80, 0x25, 0x6a, 0x1a, 0xe1, 0xef, 0x2d, 0x4a, 0xc8, 0xe2, 0xab, 0x48, 0x16, 0x45, 0x04, 0xad, 0x04, 0xb2, 0x63, 0x99, 0xc9, 0x09, 0x3b, 0xa3, 0xda, 0x4b, 0xcd, 0xd0, 0x5e, 0xe0, 0x64, 0x95, 0x8f, 0x48, 0x9a, 0x39, 0x99, 0x43, 0x6d, 0x4c, 0x5d, 0x03, 0xee, 0x15, 0xa2, 0x7a, 0xfa, 0xb2, 0x5f, 0xa1, 0xfe, 0x52, 0x6b, 0xc3, 0x25, 0xf6, 0xc7, 0x5b, 0x48, 0x9d, 0xea, 0xfc, 0xbd, 0xc9, 0x41, 0x8b, 0xbd, 0x3b, 0x29, 0x65, 0x92, 0xc5, 0x9f, 0x03, 0xec, 0xda, 0xa4, 0x61, 0xe3, 0x67, 0x47, 0xaf, 0xd0, 0x4b, 0xe3, 0xa4, 0x01, 0xd2, 0xef, 0x78, 0x29, 0x39, 0xf1, 0xcf, 0xf3, 0x56, 0x82, 0x0c, 0xb0, 0x37, 0x4a, 0xae, 0x48, 0x78, 0xd1, 0x7d, 0x8a, 0xdf, 0x05, 0x70, 0xe5, 0xed, 0x72, 0xe0, 0x22, 0xed, 0x16, 0x4b, 0xee, 0xec, 0x72, 0xf6, 0xb1, 0x54, 0x53, 0x2c, 0x25, 0xcb, 0x26, 0x02, 0xf3, 0x66, 0xf4, 0xec, 0x33, 0x4f, 0x99, 0x1a, 0xce, 0x2d, 0x4b, 0x9d, 0x50, 0x71, 0xd0, 0x1d, 0xf3, 0x06, 0xdb, 0x70, 0xe4, 0x58, 0xf2, 0xde, 0xb0, 0xef, 0x0d, 0xff, 0xfc, 0xe4, 0xe5, 0x0c, 0x36, 0x3a, 0x68, 0xa9, 0x25, 0x13, 0x1f, 0xed, 0xde, 0x39, 0x5e, 0x56, 0x4e, 0x29, 0x78, 0x12, 0x5c, 0x64, 0xff, 0xb2, 0xf7, 0x9e, 0x52, 0x14, 0x2d, 0xdd, 0x7d, 0x5f, 0x14, 0x87, 0xb4, 0x14, 0xa0, 0x58, 0xae, 0xf4, 0x9b, 0x83, 0x17, 0x30, 0x9c, 0xd1, 0x0c, 0x96, 0x55, 0xfb, 0x1d, 0x28, 0xc5, 0x97, 0xcf, 0x67, 0x4c, 0x68, 0x09, 0x33, 0x38, 0x4e, 0x39, 0xcc, 0x48, 0x88, 0xd6, 0xe8, 0x46, 0x95, 0x11, 0x28, 0xca, 0xf4, 0x18, 0xfc, 0xd3, 0x62, 0xea, 0x7e, 0x85, 0x3b, 0x1e, 0xbc, 0x13, 0x99, 0xc0, 0x3c, 0xd4, 0xad, 0x76, 0x8b, 0x54, 0xd4, 0x9b, 0x7c, 0xa7, 0xa1, 0xc8, 0x35, 0x2f, 0xa7, 0xfa, 0x6e, 0xe4, 0x5f, 0xf8, 0x14, 0xe5, 0x02, 0x0e, 0x7b, 0xee, 0x95, 0x21, 0x02, 0x31, 0x83, 0xd1, 0x8b, 0x40, 0x37, 0x54, 0xb4, 0x2d, 0x57, 0xad, 0x6d, 0xac, 0x1e, 0xf7, 0x13, 0x9b, 0x6b, 0xaf, 0xa3, 0x99, 0xa6, 0x06, 0x5e, 0x2d, 0x6b, 0x7c, 0xb7, 0xb0, 0x5f, 0x19, 0x0e, 0x73, 0x48, 0x77, 0xf5, 0x19, 0xb1, 0xa6, 0xec, 0x28, 0xa8, 0xb7, 0x60, 0xf4, 0x59, 0x18, 0x9f, 0xe1, 0x5a, 0x59, 0x60, 0x17, 0xa7, 0xdf, 0x53, 0x54, 0x74, 0x18, 0x50, 0x1a, 0x85, 0xb0, 0xe1, 0xa2, 0x13, 0x58, 0xd3, 0x94, 0x11, 0xa4, 0x8f, 0x63, 0xaa, 0xf0, 0x43, 0xb2, 0x64, 0x7b, 0x4f, 0x05, 0x86, 0xa0, 0xcf, 0xec, 0x4a, 0x93, 0x07, 0xf9, 0xbf, 0x85, 0x8a, 0x47, 0x24, 0x06, 0xf1, 0x56, 0xc4, 0xf3, 0x77, 0xe3, 0xb9, 0x40, 0x10, 0x73, 0x07, 0x68, 0x01, 0xce, 0x35, 0xfc, 0x5a, 0x53, 0x02, 0xfc, 0x99, 0xde, 0xdd, 0xbc, 0x0d, 0xf8, 0x8a, 0xe6, 0x0f, 0x80, 0xaf, 0xbd, 0xb1, 0xb6, 0x4f, 0x1b, 0x7a, 0x4a, 0xc4, 0x85, 0xec, 0xc1, 0x31, 0x36, 0xd7, 0x50, 0x8f, 0x98, 0x14, 0xd2, 0x1f, 0xb3, 0xac, 0x5c, 0xaa, 0x43, 0x07, 0xb0, 0xca, 0x6a, 0x0a, 0x14, 0x39, 0xfa, 0xa1, 0x0a, 0x59, 0xc8, 0xab, 0x50, 0x6a, 0xb7, 0x45, 0xbe, 0x97, 0xe4, 0xf0, 0xd3, 0xde, 0x26, 0x52, 0x55, 0x2f, 0x80, 0xc0, 0x60, 0x13, 0x08, 0xb3, 0x52, 0xbf, 0xac, 0xc0, 0xdd, 0x01, 0xac, 0xb9, 0xc8, 0xd7, 0x85, 0xf1, 0x3e, 0xf1, 0x95, 0xb5, 0x13, 0xc5, 0xc1, 0x99, 0x75, 0xf2, 0x13, 0xf3, 0x1f, 0x3b, 0x0d, 0x5b, 0xa2, 0xa7, 0x53, 0x78, 0xde, 0x12, 0x94, 0xda, 0x47, 0x67, 0xe6, 0x48, 0x9b, 0xb4, 0x0a, 0x24, 0x57, 0x46, 0x44, 0x57, 0x5e, 0x67, 0x56, 0x9c, 0xde, 0x40, 0x8b, 0x2e, 0x7c, 0xe1, 0x8a, 0x55, 0x9f, 0x7d, 0xe0, 0x91, 0xa8, 0xae, 0xbc, 0x00, 0x47, 0x7f, 0x71, 0x36, 0x7b, 0x5c, 0x6d, 0x0e, 0x64, 0xa7, 0x90, 0xf0, 0x21, 0x9c, 0x3d, 0xff, 0xcf, 0x34, 0x70, 0x7c, 0x52, 0x32, 0x79, 0xa6, 0x4d, 0xb3, 0x44, 0xb8, 0x19, 0x89, 0x10, 0x35, 0x19, 0xb7, 0x4e, 0xb5, 0x6e, 0x55, 0xe9, 0x98, 0x1c, 0x55, 0xfe, 0x83, 0xaf, 0xa4, 0xe9, 0x63, 0xa9, 0xa2, 0xd2, 0x30, 0xdb, 0xaf, 0xcb, 0xc3, 0x06, 0x59, 0xc3, 0x67, 0x98, 0x6a, 0xf4, 0xb4, 0x9c, 0x2b, 0x73, 0x97, 0x43, 0x47, 0x37, 0xec, 0x0c, 0xe9, 0x31, 0x8b, 0xf0, 0x2e, 0x6b, 0x50, 0x5f, 0x2f, 0xb4, 0x90, 0xde, 0x70, 0xc7, 0xcb, 0x68, 0x7a, 0x28, 0xa7, 0x78, 0x5d, 0xf2, 0x30, 0x80, 0xdb, 0x34, 0xde, 0xac, 0x78, 0x5a, 0xcd, 0xd8, 0xb4, 0x14, 0x77, 0x47, 0xa4, 0xdd, 0x88, 0xcf, 0x68, 0x86, 0x1b, 0x20, 0xec, 0xb1, 0xb8, 0x03, 0xc4, 0xca, 0x4e, 0x48, 0x34, 0x27, 0x24, 0x79, 0x55, 0x63, 0x9f, 0x39, 0x6c, 0x36, 0x47, 0x75, 0x91, 0x37, 0xaf, 0xb8, 0x96, 0x4e, 0x2d, 0xd3, 0x2d, 0xda, 0x60, 0x32, 0xd1, 0xc1, 0x4b, 0x6d, 0xd4, 0x68, 0xd1, 0x0f, 0x77, 0x27, 0x78, 0x22, 0x2f, 0xb6, 0x65, 0x98, 0xee, 0xd1, 0x9f, 0xa6, 0xa3, 0xeb, 0xe9, 0x12, 0xd3, 0x7a, 0x96, 0x25, 0x32, 0x29, 0xce, 0x70, 0x8b, 0xe5, 0xfc, 0x14, 0x8f, 0xd6, 0x9f, 0x0c, 0x19, 0x0d, 0x45, 0x55, 0x95, 0x5a, 0xcb, 0x97, 0x44, 0x1a, 0x5b, 0x80, 0xac, 0x62, 0xe9, 0xce, 0x14, 0x87, 0x42, 0x44, 0x04, 0x20, 0xc8, 0x88, 0x19, 0x25, 0x3a, 0xeb, 0x84, 0x67, 0x9a, 0xf2, 0x5a, 0x99, 0x3c, 0x28, 0x43, 0xb3, 0xca, 0xac, 0xfe, 0x01, 0x60, 0x91, 0x6f, 0x0d, 0x48, 0xbf, 0xf1, 0x46, 0xb9, 0x06, 0x2a, 0x95, 0xb9, 0x40, 0x6a, 0x8d, 0x9b, 0x1e, 0x61, 0xf3, 0x72, 0x43, 0xd5, 0x58, 0x2d, 0x73, 0x2f, 0x38, 0xc4, 0xc1, 0xd3, 0x15, 0xcf, 0x85, 0x82, 0x42, 0x52, 0x7d, 0x25, 0x29, 0xd0, 0x08, 0xcf, 0xab, 0x0a, 0x27, 0x60, 0x8c, 0xd3, 0xbb, 0x79, 0x73, 0x53, 0xc6, 0xdf, 0x74, 0x77, 0x3e, 0xfe, 0x6a, 0x83, 0x0a, 0x87, 0x45, 0x35, 0x9c, 0xb0, 0x1a, 0xb8, 0x41, 0x92, 0x95, 0xc7, 0x0e, 0xca, 0x0d, 0x4b, 0xf6, 0xf8, 0xf0, 0x97, 0xfc, 0x7b, 0x67, 0xb0, 0xc2, 0xe9, 0x3b, 0x38, 0xbe, 0x0a, 0x3d, 0x41, 0xed, 0x7f, 0x9c, 0x5d, 0xeb, 0x1a, 0xc6, 0x71, 0x06, 0xb4, 0x74, 0xbf, 0x7c, 0x39, 0x2f, 0xd2, 0x9a, 0x56, 0xec, 0xaf, 0x90, 0x0c, 0x57, 0x6e, 0xd7, 0x28, 0x86, 0xf4, 0xd7, 0x4f, 0x48, 0x02, 0xe7, 0xb4, 0xa9, 0xd0, 0x3e, 0x18, 0xe1, 0xc3, 0xdf, 0xf4, 0x99, 0xa6, 0x3b, 0xd1, 0xfe, 0x7f, 0xd3, 0x99, 0xbc, 0x11, 0xaf, 0x22, 0xaa, 0xcf, 0x55, 0x05, 0x45, 0x61, 0x5b, 0x3b, 0x84, 0x31, 0x53, 0x44, 0xab, 0x71, 0x57, 0xc7, 0x69, 0xd8, 0x40, 0xa4, 0x2f, 0x26, 0x3c, 0x7c, 0xc7, 0xfc, 0x61, 0x8b, 0xb3, 0xba, 0x7e, 0xf3, 0x43, 0xed, 0x71, 0xd7, 0x73, 0xa9, 0x36, 0x5d, 0x2f, 0x12, 0xe1, 0xe9, 0x18, 0x5a, 0xca, 0x6a, 0xce, 0x48, 0x54, 0x9b, 0x4c, 0x96, 0x02, 0xa8, 0xa6, 0x23, 0x92, 0x5e, 0xeb, 0x1d, 0xd2, 0x88, 0x50, 0x01, 0xa1, 0x40, 0x2b, 0x31, 0xba, 0xd4, 0x61, 0x8a, 0x4c, 0x22, 0x74, 0x87, 0x99, 0x74, 0x12, 0xff, 0x21, 0x13, 0x43, 0x7f, 0x25, 0x08, 0x8d, 0xf0, 0xdd, 0x47, 0x3a, 0x83, 0x17, 0xb4, 0x33, 0x4d, 0x25, 0xcc, 0xdd, 0x5c, 0xce, 0xed, 0xf4, 0xf1, 0x89, 0x2c, 0x2b, 0x89, 0x9a, 0x39, 0xf4, 0xc3, 0x0c, 0x7f, 0x37, 0x9d, 0xb6, 0xde, 0xdb, 0xb2, 0x3f, 0x01, 0xde, 0x1c, 0xd0, 0xe1, 0xf8, 0x2d, 0xf4, 0xbf, 0x1a, 0x8a, 0x8a, 0xc3, 0x15, 0x04, 0x4e, 0x83, 0x00, 0x06, 0xfd, 0xcb, 0xf4, 0xd1, 0x1c, 0xa7, 0x43, 0x02, 0x75, 0xa6, 0x66, 0x7d, 0x56, 0x60, 0xcc, 0x22, 0x51, 0xa9, 0xf9, 0x13, 0x51, 0x13, 0x89, 0x41, 0xfc, 0x13, 0x24, 0xcb, 0xf5, 0x2c, 0x65, 0x79, 0x7f, 0x7b, 0x6d, 0xa8, 0xdf, 0xee, 0xa2, 0x42, 0xf2, 0xe7, 0x23, 0xfe, 0xc0, 0x67, 0x5b, 0x27, 0x1c, 0x8f, 0x00, 0x3d, 0xe4, 0x37, 0x94, 0x05, 0x2e, 0xb7, 0x03, 0xb9, 0xa7, 0x69, 0xd4, 0xb8, 0xc4, 0x3c, 0xd0, 0x19, 0xc3, 0xf9, 0x78, 0x70, 0xf0, 0x2b, 0x6f, 0x89, 0xec, 0x73, 0xb7, 0xd6, 0xda, 0x55, 0xa5, 0xed, 0x39, 0xe1, 0x84, 0x7f, 0x87, 0x2a, 0x46, 0x3e, 0xa7, 0xa9, 0xcb, 0x04, 0x3e, 0xd2, 0xbf, 0xb2, 0x09, 0x35, 0x36, 0xa0, 0x14, 0xed, 0x51, 0xf8, 0x1d, 0xba, 0x98, 0xdc, 0x4e, 0x37, 0x93, 0x28, 0xc0, 0xda, 0xc9, 0xaa, 0x30, 0x8c, 0x87, 0x47, 0x60, 0xf2, 0xcc, 0xdf, 0xa2, 0xb6, 0xa6, 0xef, 0x1c, 0xa7, 0x02, 0x21, 0x39, 0xc1, 0x07, 0x85, 0xe1, 0x1a, 0x6f, 0xe3, 0xc8, 0xa4, 0x20, 0xb2, 0x8f, 0x7b, 0xfb, 0xfc, 0xe4, 0xc1, 0x9d, 0xaa, 0x10, 0x3d, 0x34, 0x70, 0xcf, 0xdf, 0x4a, 0x77, 0x40, 0x37, 0x0f, 0x81, 0xea, 0x5e, 0x96, 0x9c, 0xaf, 0x16, 0x79, 0x96, 0xb7, 0x0e, 0x5f, 0x1a, 0xc9, 0x97, 0x15, 0x79, 0x7f, 0x8e, 0x63, 0xdb, 0xcd, 0x99, 0xed, 0xdc, 0xf8, 0xbe, 0x82, 0xa6, 0x91, 0xe8, 0xb2, 0x3f, 0x91, 0x4a, 0x85, 0xf3, 0xe6, 0x1e, 0xa3, 0x55, 0x68, 0xdc, 0xe3, 0xaa, 0xe0, 0xf3, 0x20, 0x9e, 0xed, 0x30, 0x2f, 0xfb, 0xf6, 0x7e, 0x4c, 0xf3, 0x4b, 0xe8, 0xbb, 0x7c, 0x02, 0xc8, 0x78, 0x60, 0x4e, 0xe1, 0xe8, 0xe7, 0x5f, 0x0e, 0x66, 0xf1, 0x67, 0x3b, 0x98, 0x0c, 0xc2, 0xf4, 0x81, 0x95, 0xc4, 0x91, 0x94, 0xdf, 0xf9, 0x2e, 0x6d, 0x92, 0xd2, 0xf5, 0xa0, 0xa8, 0x13, 0x84, 0x5c, 0x3f, 0xc5, 0x9e, 0xf1, 0xab, 0xb7, 0x73, 0x16, 0x7b, 0x83, 0xe5, 0xf8, 0xe9, 0xfd, 0xce, 0xa4, 0x32, 0xa5, 0xeb, 0x33, 0x3c, 0x62, 0x14, 0x71, 0x2e, 0xe5, 0xa7, 0xa6, 0xf2, 0x48, 0x98, 0x2e, 0x43, 0xf0, 0xbb, 0xd0, 0xba, 0x26, 0x02, 0xd5, 0x41, 0xba, 0xcf, 0xd3, 0xf0, 0xcd, 0xd1, 0xf2, 0x49, 0xcf, 0x59, 0x30, 0x6a, 0x4c, 0xbf, 0xea, 0xb3, 0x03, 0x0b, 0x59, 0xb4, 0x13, 0x85, 0x03, 0xbe, 0xe2, 0xa1, 0xe3, 0x4c, 0x86, 0x71, 0xc7, 0x21, 0xdd, 0x80, 0xc1, 0x6a, 0x29, 0xda, 0x81, 0xb1, 0x0c, 0xcc, 0xa9, 0x75, 0xa0, 0x0c, 0x1f, 0xf1, 0x6b, 0xd5, 0x04, 0xf1, 0x9e, 0x46, 0x69, 0x07, 0x7b, 0x05, 0x76, 0xbf, 0xe3, 0x9a, 0xb5, 0x03, 0x2f, 0xb8, 0x4d, 0xbc, 0xca, 0x88, 0xa1, 0x06, 0x5b, 0xce, 0x06, 0x52, 0xa6, 0x1d, 0x80, 0x9d, 0x14, 0xca, 0xc0, 0xd8, 0x08, 0x7c, 0x94, 0x75, 0x17, 0x42, 0xd4, 0x1f, 0x6a, 0xca, 0x98, 0xf9, 0x0f, 0x45, 0x34, 0x8a, 0xac, 0xbe, 0x4d, 0x65, 0x7f, 0x4e, 0x9e, 0xd2, 0x2c, 0xc3, 0x75, 0x9e, 0x6f, 0xe9, 0x83, 0xb0, 0x3e, 0x9c, 0xee, 0x7c, 0x52, 0x04, 0x53, 0x59, 0x77, 0x68, 0x5c, 0x8c, 0x10, 0xfb, 0x3a, 0x34, 0x57, 0x22, 0xa2, 0xf0, 0xb1, 0x32, 0x3c, 0x4d, 0x33, 0xf9, 0xd8, 0x7b, 0xed, 0xbc, 0xbc, 0x00, 0xf2, 0x7d, 0x1a, 0xd9, 0x0e, 0x6e, 0xdc, 0x43, 0xa1, 0x7d, 0xa4, 0x1c, 0x72, 0x59, 0xf2, 0x04, 0xb7, 0x4e, 0x9e, 0xe0, 0x03, 0xe7, 0xcd, 0xe7, 0xfe, 0x2c, 0x81, 0x54, 0xc4, 0x48, 0x30, 0x9b, 0x4e, 0x07, 0x85, 0x34, 0x5b, 0xf5, 0xb5, 0x55, 0xb9, 0xb7, 0x36, 0xc8, 0xa2, 0xa7, 0xbb, 0xfd, 0xfd, 0x9b, 0x26, 0x91, 0xa6, 0x37, 0x0a, 0xbf, 0x7f, 0xd5, 0x4d, 0xf9, 0xf3, 0x50, 0x7c, 0x84, 0x63, 0xbe, 0x66, 0x01, 0x5f, 0x37, 0x78, 0xc5, 0x23, 0x93, 0x30, 0xbe, 0x1d, 0x8f, 0x51, 0xa3, 0x87, 0x38, 0x24, 0xb1, 0x36, 0xc6, 0xd5, 0xf3, 0x85, 0x47, 0xf0, 0xef, 0x1f, 0xdb, 0x95, 0xcf, 0x10, 0xb7, 0x10, 0x0c, 0xb5, 0x5d, 0x0a, 0x0d, 0x2a, 0xde, 0xd1, 0x0e, 0xf0, 0x28, 0x53, 0x24, 0x9b, 0xd6, 0x91, 0x79, 0x6e, 0x8f, 0xae, 0x73, 0x3c, 0x86, 0x2e, 0xb8, 0x9b, 0xf2, 0x29, 0xe8, 0xfc, 0x4b, 0x08, 0xd6, 0x81, 0xbb, 0xc3, 0x50, 0xb0, 0x5b, 0x8a, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x01, 0x00, 0x0e, 0x6b, 0x6b, 0x11, 0xaf, 0x22, 0x52, 0x3f, 0x82, 0x51, 0x0e, 0xd7, 0x03, 0xd4, 0xae, 0x54, 0x10, 0x1e, 0x83, 0x75, 0x11, 0x11, 0xeb, 0xa0, 0xde, 0x5e, 0x24, 0x28, 0x9d, 0x29, 0x11, 0x45, 0xfd, 0x06, 0x89, 0xb8, 0x3a, 0x3d, 0xd5, 0x11, 0xa1, 0xb8, 0xb7, 0x7f, 0x02, 0xf0, 0x1b, 0xcf, 0xbd, 0x27, 0xf3, 0xd9, 0x5a, 0x92, 0xf4, 0x7f, 0x18, 0x4f, 0x61, 0x9a, 0x26, 0x0d, 0xe4, 0x2a, 0x7a, 0xab, 0x21, 0x9a, 0xa5, 0xa0, 0x12, 0x9a, 0x81, 0xab, 0xff, 0x10, 0xdb, 0x43, 0x61, 0x77, 0x7f, 0xe6, 0xc8, 0xb8, 0x96, 0x84, 0xa1, 0x2d, 0x0f, 0x0a, 0xbb, 0x8c, 0x68, 0x83, 0x7b, 0x6b, 0xc0, 0xf8, 0x51, 0xbb, 0x27, 0x2d, 0x70, 0x80, 0x90, 0x71, 0x4e, 0x0e, 0x21, 0x23, 0xe9, 0xb8, 0x6e, 0x49, 0x1f, 0x67, 0xea, 0x01, 0x3d, 0xff, 0xe0, 0xdc, 0xbe, 0xd6, 0x6a, 0x95, 0xcb, 0xda, 0xaf, 0x2b, 0x51, 0xce, 0xba, 0xa4, 0x9f, 0x09, 0x29, 0x8a, 0x20, 0x48, 0xd8, 0xa0, 0x37, 0xed, 0xc8, 0x75, 0xba, 0xc0, 0x01, 0x47, 0x47, 0x15, 0x15, 0xb5, 0xe2, 0x07, 0x7d, 0x89, 0x9d, 0x07, 0x7e, 0xa7, 0xcf, 0xe3, 0xe8, 0xe0, 0xa2, 0xf5, 0x12, 0x2b, 0xc0, 0x79, 0xc6, 0x64, 0xcd, 0xa4, 0x9f, 0xda, 0x2a, 0x39, 0x30, 0x69, 0x07, 0xbe, 0x6d, 0xb5, 0x4a, 0xa4, 0x79, 0x31, 0xef, 0xda, 0x88, 0x65, 0xc6, 0x95, 0x17, 0xfd, 0x0e, 0x13, 0xf2, 0x76, 0x47, 0xb4, 0x64, 0x7e, 0x4f, 0xb4, 0xa5, 0xb5, 0x36, 0xa3, 0x92, 0xa7, 0xc5, 0x3d, 0xfe, 0xb1, 0x64, 0x4a, 0xd6, 0x76, 0x5e, 0x17, 0xf9, 0x01, 0xe1, 0xc5, 0x42, 0x11, 0xf0, 0xcf, 0x96, 0x8f, 0x1c, 0x21, 0x64, 0x8a, 0x14, 0xb4, 0x80, 0xc8, 0x97, 0x31, 0x04, 0xff, 0xce, 0x5e, 0xc0, 0x10, 0xf7, 0xf2, 0x09, 0x80, 0x6f, 0x05, 0xc3, 0x44, 0xdc, 0xa7, 0xfe, 0x2f, 0x47, 0x43, 0xcc, 0xc7, 0xf9, 0xdf, 0x0f, 0xe4, 0x23, 0xdc, 0x44, 0xc5, 0xd8, 0x32, 0x5d, 0x8b, 0xda, 0x51, 0xf7, 0x34, 0xc7, 0xc1, 0xc8, 0xdd, 0x79, 0x18, 0x68, 0xb2, 0x33, 0xa5, 0x85, 0xec, 0xa2, 0x5f, 0xf8, 0x21, 0xf5, 0x4c, 0xb6, 0xb4, 0xd4, 0xdf, 0xaa, 0x7a, 0x93, 0x1b, 0x83, 0x26, 0x11, 0x06, 0xdb, 0x45, 0x65, 0x83, 0xb7, 0xe2, 0xba, 0xc9, 0x02, 0x4a, 0x29, 0x0f, 0xa7, 0x74, 0x3a, 0xd7, 0x8f, 0x23, 0xfa, 0x90, 0x29, 0x27, 0xf9, 0xa9, 0x13, 0x0b, 0x2d, 0x3d, 0x6c, 0xbe, 0xd4, 0xa0, 0xbc, 0x37, 0x28, 0x7f, 0x69, 0x82, 0x2f, 0xa7, 0x4d, 0x22, 0x87, 0x9f, 0xa7, 0x96, 0x6c, 0x93, 0xaa, 0x91, 0xe9, 0x1d, 0x36, 0x9c, 0x87, 0x7e, 0x27, 0x7f, 0x13, 0x59, 0xea, 0x3d, 0xcb, 0xe4, 0xe3, 0x56, 0x31, 0xb0, 0x9a, 0xfb, 0xc1, 0xe8, 0xe6, 0xf3, 0x10, 0x62, 0x80, 0x8b, 0x53, 0x1d, 0xe0, 0x1d, 0xc5, 0x44, 0x59, 0xb1, 0x29, 0xe2, 0x0c, 0x24, 0x37, 0xad, 0x7a, 0xd6, 0x7c, 0xb2, 0x68, 0xf6, 0x00, 0xa4, 0x30, 0x22, 0x0a, 0xd9, 0x06, 0xf5, 0xd2, 0x36, 0x0a, 0x27, 0x90, 0x11, 0x2b, 0x17, 0x6f, 0x22, 0x77, 0x6f, 0x19, 0x91, 0x73, 0x24, 0xfd, 0x42, 0x1f, 0x1d, 0x20, 0x8b, 0x45, 0x76, 0x35, 0x10, 0xcb, 0x21, 0x9f, 0x6d, 0x01, 0xd7, 0xda, 0x1c, 0xbd, 0x98, 0x0d, 0x19, 0x8b, 0x4a, 0x5b, 0x3d, 0x99, 0x73, 0x98, 0x7d, 0x7e, 0xac, 0xeb, 0x5b, 0xad, 0x97, 0xd1, 0xbc, 0x6f, 0x60, 0xed, 0x05, 0xe5, 0xa6, 0xa8, 0xda, 0x87, 0x34, 0x22, 0xad, 0x6d, 0xd9, 0x71, 0x3c, 0xc0, 0xce, 0x25, 0xef, 0xcd, 0x30, 0x54, 0x6d, 0xc5, 0xd4, 0xf7, 0x37, 0x89, 0x78, 0x89, 0x41, 0x0b, 0x65, 0xaa, 0x7b, 0x1b, 0xe0, 0xe7, 0x14, 0x0d, 0xe7, 0x24, 0xe4, 0x73, 0xa6, 0xd4, 0x06, 0xd2, 0x7a, 0x36, 0x44, 0xfe, 0xfd, 0xb8, 0x8f, 0xd9, 0x45, 0xc6, 0xb2, 0x35, 0x82, 0xdc, 0x1c, 0xf5, 0x9b, 0x2a, 0x4f, 0x30, 0xa0, 0xb6, 0x27, 0xc6, 0x93, 0x95, 0x35, 0x00, 0x2f, 0xfe, 0xab, 0x6f, 0xc6, 0x9d, 0xa3, 0x1e, 0x31, 0xe6, 0xd9, 0x7f, 0x53, 0x5d, 0x14, 0x56, 0xb2, 0x79, 0xf9, 0x06, 0xd9, 0x9e, 0x6a, 0x1d, 0x39, 0xba, 0x40, 0x26, 0xa1, 0xae, 0xf8, 0x57, 0xaf, 0x45, 0xad, 0x54, 0x31, 0x0c, 0x4a, 0xb0, 0xdd, 0x8c, 0xc2, 0xa3, 0x9b, 0x10, 0xe9, 0x67, 0x0f, 0x25, 0x5b, 0x53, 0x12, 0x0a, 0xda, 0x90, 0x7f, 0x62, 0x01, 0xba, 0x03, 0xd0, 0x6a, 0x61, 0x19, 0x88, 0x18, 0x0f, 0xe5, 0x7f, 0xec, 0x0e, 0x49, 0x25, 0x16, 0x0e, 0x9a, 0xd1, 0x3d, 0xf7, 0x5f, 0xfb, 0x92, 0x27, 0x85, 0x68, 0x9a, 0xbb, 0xf2, 0xc6, 0x98, 0xa2, 0xf2, 0x3b, 0xb5, 0x9f, 0xfe, 0x5f, 0x9d, 0x6e, 0xb6, 0xc4, 0x1e, 0xcc, 0xbd, 0x4c, 0x10, 0x24, 0xe1, 0x03, 0xf9, 0x7f, 0x7f, 0x3f, 0xb2, 0xe1, 0x63, 0x28, 0xfd, 0x8c, 0x2b, 0xff, 0xa7, 0xf9, 0x05, 0xc9, 0xd3, 0x92, 0xfd, 0xf8, 0x2f, 0x48, 0x0d, 0xa2, 0x9f, 0xb3, 0x23, 0xfe, 0xae, 0x95, 0x1d, 0x6e, 0xa6, 0xd8, 0xe1, 0x1a, 0x9f, 0xd7, 0x98, 0x34, 0x5e, 0x97, 0x26, 0xd1, 0xfe, 0x2e, 0xbb, 0xe2, 0x39, 0xa8, 0x09, 0xec, 0xcb, 0xb2, 0x07, 0xf1, 0x83, 0xf4, 0x5e, 0x1d, 0xa9, 0x0c, 0xa4, 0x8f, 0xa4, 0x7e, 0xba, 0x09, 0x30, 0xb0, 0x20, 0x1e, 0x23, 0xb6, 0x45, 0x1b, 0x6f, 0x44, 0x39, 0x3b, 0x28, 0xf0, 0xca, 0xe1, 0xf1, 0xc3, 0x4e, 0x6c, 0xb0, 0x57, 0xcf, 0x4f, 0xb5, 0x7a, 0x1b, 0xce, 0x45, 0x67, 0xd3, 0x36, 0xc7, 0x41, 0x84, 0x01, 0xb5, 0x57, 0xab, 0x0f, 0x34, 0xe0, 0xb8, 0x2c, 0xfe, 0xb2, 0x2f, 0x70, 0x9a, 0x5c, 0xbe, 0x7b, 0xc3, 0xdc, 0x6c, 0x9e, 0x76, 0xf2, 0xa2, 0xf6, 0x76, 0xbe, 0xb0, 0x70, 0x44, 0x77, 0x17, 0x69, 0x55, 0x7e, 0x85, 0xc5, 0xd7, 0x09, 0x55, 0x5a, 0x7f, 0x9b, 0xf3, 0x6a, 0xfa, 0x1e, 0x37, 0xad, 0xac, 0xe8, 0x75, 0x22, 0x32, 0xe8, 0x5c, 0xfc, 0x11, 0xf7, 0xb2, 0x5b, 0xce, 0xb7, 0x3b, 0x90, 0xaf, 0xec, 0xe2, 0x14, 0x1c, 0xdd, 0x56, 0x2e, 0xaf, 0x00, 0x24, 0x8c, 0x46, 0x64, 0x60, 0x51, 0x55, 0x1f, 0x62, 0xf5, 0x1c, 0x20, 0x11, 0x0a, 0x3a, 0x2c, 0x5c, 0xf1, 0x21, 0x04, 0x2e, 0x6a, 0x61, 0xc2, 0x11, 0x27, 0x1e, 0xf3, 0xfc, 0x26, 0x5a, 0x9f, 0x52, 0x02, 0xd4, 0x3a, 0xd8, 0x6d, 0xca, 0x4e, 0x34, 0x2a, 0x36, 0x41, 0xd3, 0x29, 0x71, 0xf7, 0x8c, 0xdb, 0x6d, 0x76, 0x3b, 0x1f, 0xfa, 0x3b, 0x83, 0xeb, 0x56, 0xcc, 0x46, 0x57, 0x43, 0x5e, 0x24, 0x2d, 0x6a, 0xb1, 0x42, 0xb8, 0x14, 0xe4, 0xdd, 0xc6, 0xed, 0xb0, 0x93, 0xc7, 0xbf, 0x1c, 0xcc, 0xc3, 0x0c, 0x5c, 0x32, 0x42, 0x73, 0xca, 0x71, 0x39, 0x5b, 0xfa, 0x8e, 0x8f, 0x28, 0xba, 0xa8, 0x69, 0xdc, 0xe7, 0x08, 0xa1, 0x8f, 0xdf, 0x6f, 0x3f, 0xb3, 0x8f, 0xc0, 0x86, 0xfb, 0xf7, 0xb2, 0x55, 0xd5, 0x77, 0x48, 0x27, 0x60, 0xdb, 0x12, 0x6f, 0x32, 0xc2, 0x4d, 0xd3, 0xbc, 0x34, 0xf4, 0xb4, 0x28, 0xf4, 0x90, 0xab, 0x78, 0x4d, 0xc8, 0x9f, 0x34, 0x4a, 0x66, 0x2c, 0x57, 0x73, 0xac, 0xde, 0x00, 0xc2, 0x23, 0x29, 0xd7, 0x47, 0x52, 0xc6, 0x36, 0x4d, 0xba, 0xbc, 0xce, 0x6c, 0xe6, 0xf2, 0xa2, 0x05, 0x59, 0x32, 0x99, 0x18, 0x38, 0xd4, 0x1b, 0x02, 0x03, 0x99, 0x06, 0xbe, 0x77, 0x42, 0xa0, 0x22, 0x2d, 0x01, 0x41, 0x58, 0x4b, 0x58, 0x7a, 0x0e, 0xf8, 0x94, 0x53, 0xe5, 0x24, 0xe5, 0xec, 0x23, 0x6b, 0x88, 0x65, 0xd3, 0x4e, 0xb9, 0xe9, 0x26, 0xab, 0x0b, 0x4f, 0xfb, 0xb3, 0x2d, 0x30, 0x7e, 0x27, 0x6d, 0x22, 0xd7, 0x06, 0x34, 0x35, 0xf4, 0x8b, 0x7f, 0xe0, 0x38, 0xc2, 0xbb, 0x30, 0xc9, 0x0d, 0xbe, 0x57, 0xcd, 0x5c, 0xa2, 0x48, 0x91, 0x9b, 0x11, 0x03, 0x65, 0xb1, 0x18, 0x81, 0x84, 0x56, 0x20, 0x54, 0xfc, 0x86, 0xc0, 0x6e, 0x7c, 0xdf, 0x59, 0x01, 0x67, 0x0e, 0x1d, 0x44, 0x21, 0xf7, 0xb4, 0xf4, 0xcc, 0x44, 0xb7, 0xf7, 0x27, 0xd7, 0xd4, 0xde, 0x82, 0xba, 0xac, 0xd2, 0x6c, 0x7d, 0x70, 0x79, 0x76, 0xf7, 0x56, 0x12, 0xf6, 0x69, 0x7c, 0x1c, 0x08, 0x98, 0x84, 0x90, 0x3e, 0x8d, 0x7f, 0x81, 0x2a, 0x65, 0xe4, 0x08, 0xc2, 0xb7, 0x84, 0x15, 0x92, 0x14, 0x70, 0xc9, 0xb3, 0xaf, 0x2c, 0x21, 0x32, 0x9d, 0x99, 0x60, 0xed, 0xf7, 0x81, 0x48, 0x41, 0x57, 0x51, 0xfb, 0x34, 0x26, 0x98, 0x8e, 0x21, 0x28, 0x29, 0xb9, 0x5c, 0xf3, 0x3b, 0x3b, 0x92, 0x49, 0x01, 0xd4, 0x71, 0x92, 0x39, 0x2a, 0x1a, 0xda, 0x2c, 0xa0, 0x2b, 0xed, 0xba, 0xe2, 0xb4, 0x27, 0x1f, 0x6a, 0x7c, 0x9b, 0xe9, 0xf7, 0x8a, 0x50, 0xc5, 0xc8, 0x89, 0xb4, 0xfe, 0x50, 0x46, 0x5b, 0xae, 0x52, 0x03, 0x52, 0x87, 0xcf, 0x2e, 0x31, 0x39, 0xa8, 0x16, 0xa6, 0xee, 0x39, 0x12, 0x55, 0x3c, 0xc7, 0xec, 0xba, 0x63, 0x14, 0xc8, 0x15, 0xa5, 0xae, 0x1f, 0x7e, 0x31, 0xb8, 0x05, 0xf7, 0xb8, 0xf3, 0x72, 0xb0, 0xe6, 0x6b, 0x63, 0x0e, 0x18, 0x5c, 0x87, 0xde, 0x18, 0x83, 0xc6, 0xb4, 0x44, 0x7c, 0xcc, 0x19, 0xdc, 0x63, 0x1d, 0x87, 0x9b, 0x39, 0xd5, 0x07, 0x90, 0xf0, 0x7b, 0x22, 0x7e, 0x72, 0x17, 0xe0, 0x6a, 0x87, 0x6f, 0xf3, 0x42, 0x62, 0x17, 0x84, 0x23, 0x63, 0xc0, 0xf4, 0x9a, 0x05, 0x63, 0x37, 0xae, 0x97, 0xf0, 0x33, 0xe0, 0x40, 0xc5, 0x2c, 0x27, 0x4e, 0x5a, 0xf3, 0x88, 0xab, 0xe8, 0x35, 0x84, 0x59, 0x50, 0xeb, 0x03, 0xab, 0x3a, 0x9e, 0xe9, 0x50, 0xf7, 0x54, 0x04, 0xb5, 0x9b, 0xf2, 0x75, 0xbd, 0xad, 0x03, 0xca, 0xce, 0x94, 0x79, 0x7c, 0x78, 0x4b, 0x0b, 0xd0, 0x3d, 0xfb, 0x99, 0xd3, 0x71, 0x35, 0x10, 0x4c, 0x29, 0xbd, 0xee, 0xcb, 0x16, 0xd8, 0xdc, 0x41, 0xb4, 0x81, 0xe3, 0xd9, 0x3a, 0xf8, 0x2f, 0x5c, 0xb4, 0x58, 0xb5, 0xf8, 0x55, 0x73, 0x56, 0xa2, 0x68, 0x8f, 0xb4, 0xe1, 0xe5, 0x5c, 0xbc, 0xe8, 0xad, 0x78, 0x72, 0x6e, 0x7d, 0x1e, 0xed, 0x4d, 0x1f, 0xa4, 0x95, 0x5d, 0x3b, 0x96, 0x3e, 0x8c, 0x2c, 0x2e, 0x7a, 0x34, 0x0d, 0xb2, 0xd7, 0x94, 0x44, 0x75, 0x92, 0x2d, 0xa3, 0x80, 0x49, 0x5f, 0x58, 0x2d, 0x08, 0x63, 0x50, 0x98, 0x59, 0x14, 0xe7, 0xf0, 0x0c, 0xb3, 0xb9, 0x38, 0x43, 0xaf, 0x93, 0x22, 0x2f, 0x73, 0x0a, 0xed, 0xd2, 0xdc, 0xe8, 0xdf, 0x02, 0x4b, 0xfe, 0x55, 0xda, 0x37, 0xfe, 0x4c, 0xb4, 0xce, 0x8f, 0x23, 0xb8, 0x2d, 0x1d, 0xde, 0x3b, 0x07, 0x48, 0x39, 0xee, 0x80, 0x36, 0x9f, 0x54, 0xfb, 0x99, 0xfe, 0xad, 0xac, 0x30, 0x08, 0x8e, 0x96, 0xdd, 0xca, 0x51, 0xd0, 0x69, 0xbd, 0x5d, 0xec, 0x34, 0x33, 0x41, 0xa9, 0x62, 0xbd, 0xac, 0x86, 0x83, 0x3e, 0xb9, 0x11, 0x2d, 0x35, 0xa8, 0xac, 0xba, 0x8c, 0xd2, 0xfe, 0x6c, 0xdf, 0xc5, 0xf6, 0x6b, 0xd8, 0x90, 0xc6, 0x9c, 0x6f, 0xf3, 0x49, 0x5d, 0x44, 0x89, 0xc7, 0x74, 0xdb, 0xe4, 0xf5, 0x7c, 0xe1, 0x82, 0x23, 0x74, 0x53, 0xf7, 0xa1, 0x22, 0xbf, 0xc0, 0xb7, 0xaf, 0xb6, 0xdf, 0x47, 0x15, 0x81, 0x64, 0x1c, 0xca, 0x21, 0xb9, 0x78, 0xa8, 0x70, 0x1d, 0x43, 0xdd, 0x54, 0xda, 0xd8, 0x51, 0xb9, 0xc8, 0x02, 0x7f, 0xe0, 0xaa, 0xd1, 0x35, 0x6c, 0x66, 0x2b, 0xff, 0x64, 0x5f, 0x82, 0xca, 0xd2, 0x09, 0xb8, 0x95, 0x23, 0xd5, 0x32, 0x31, 0xef, 0x30, 0xa3, 0x3b, 0x4d, 0xe5, 0xe2, 0x04, 0x07, 0xb6, 0x09, 0x1e, 0x4f, 0x87, 0xb8, 0x7e, 0xae, 0x34, 0x62, 0xe3, 0x73, 0x5c, 0xa8, 0x67, 0x76, 0x9f, 0xd2, 0xf5, 0x08, 0x36, 0x5a, 0x15, 0x42, 0x77, 0x54, 0x7f, 0x38, 0x54, 0x33, 0x11, 0xda, 0xf4, 0x96, 0x3e, 0x41, 0xcf, 0xe8, 0x59, 0x47, 0xb5, 0xd2, 0x77, 0x69, 0xf2, 0x7e, 0xd9, 0x12, 0x1c, 0xfa, 0x3f, 0x67, 0xc3, 0x12, 0x1e, 0x8d, 0x94, 0xa3, 0x5e, 0x8c, 0x5c, 0x89, 0x0d, 0xe6, 0xf4, 0x18, 0xeb, 0x8b, 0x03, 0x97, 0xd7, 0x3f, 0xb1, 0xda, 0x8d, 0x76, 0x2c, 0x04, 0x86, 0xd1, 0x20, 0xbf, 0x93, 0xa5, 0x79, 0xb3, 0xe2, 0x33, 0x22, 0xef, 0x14, 0x59, 0x03, 0x03, 0x7a, 0x05, 0xed, 0x30, 0x2c, 0x76, 0xf1, 0x12, 0x00, 0x5f, 0x0c, 0x13, 0xc0, 0xef, 0x79, 0xd6, 0xb6, 0x19, 0xa0, 0xb3, 0xc8, 0xf7, 0xbf, 0x29, 0xc7, 0x78, 0xcf, 0x6a, 0x39, 0x04, 0x1e, 0x78, 0x78, 0xbf, 0x52, 0xc1, 0x56, 0xfd, 0xd1, 0x2c, 0xcf, 0xe2, 0xb8, 0x6c, 0x2a, 0xbc, 0xdb, 0x57, 0xec, 0xba, 0x83, 0xaa, 0x07, 0xb4, 0xd4, 0x11, 0xe2, 0xbf, 0xa7, 0x24, 0x79, 0x3b, 0x84, 0x8c, 0x05, 0x4d, 0x94, 0xaf, 0x7a, 0x0d, 0x96, 0xc5, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x08, 0x5c, 0x89, 0xee, 0xed, 0x68, 0xbf, 0x74, 0xa2, 0x2c, 0x63, 0x0a, 0x80, 0x00, 0x01, 0x00, 0x25, 0x9f, 0xe4, 0x7b, 0xd4, 0xac, 0x7c, 0x3f, 0x34, 0xd5, 0xc5, 0xca, 0x11, 0xd2, 0xef, 0xbf, 0x83, 0xf5, 0x1e, 0x60, 0x48, 0x26, 0x6e, 0x5a, 0xe3, 0x03, 0xe5, 0x7e, 0xa4, 0xee, 0x66, 0xbb, 0x68, 0xcb, 0x37, 0x3a, 0x38, 0x3b, 0x0f, 0x99, 0x78, 0xa7, 0x2c, 0x99, 0x9c, 0xc3, 0xa6, 0xc5, 0x97, 0x72, 0x0e, 0x27, 0x48, 0xce, 0xe6, 0x5e, 0x98, 0xd0, 0xb2, 0xce, 0x4f, 0xf3, 0xff, 0xe7, 0x80, 0x16, 0xb9, 0x0a, 0x4f, 0xcc, 0x5c, 0xc6, 0x05, 0x48, 0xd2, 0xfa, 0x56, 0x3b, 0x7e, 0xe8, 0x8c, 0x67, 0x6a, 0xb0, 0x86, 0x95, 0x56, 0x86, 0x94, 0x7b, 0xac, 0x41, 0xef, 0xdf, 0x25, 0xcf, 0xc3, 0x91, 0xc7, 0x8e, 0xfb, 0xde, 0xca, 0x7b, 0xe5, 0x0c, 0x6d, 0x72, 0x27, 0xad, 0x5e, 0xd0, 0x57, 0x20, 0x99, 0x62, 0x02, 0x13, 0x26, 0x28, 0x1f, 0xc8, 0x38, 0x49, 0xcd, 0x80, 0xe6, 0x50, 0xea, 0xcd, 0x4c, 0xe9, 0x71, 0xfa, 0xca, 0xfd, 0xbd, 0xb1, 0xc5, 0x42, 0x31, 0x04, 0xa4, 0x79, 0x92, 0x55, 0xdf, 0x08, 0x8d, 0x42, 0x9d, 0xd6, 0x3c, 0x38, 0x0c, 0x5f, 0x3d, 0xf9, 0x0d, 0x41, 0xc4, 0xc5, 0xf7, 0x41, 0x9f, 0x37, 0x05, 0xc3, 0x94, 0xa6, 0x45, 0xbe, 0x9e, 0x32, 0x07, 0x64, 0x71, 0x2d, 0x04, 0x4c, 0x36, 0x89, 0xd3, 0xbc, 0x36, 0xfb, 0x40, 0x9c, 0x4f, 0x74, 0x34, 0xd1, 0x44, 0x75, 0x34, 0x3c, 0xf2, 0x2c, 0x89, 0x02, 0xe2, 0xc3, 0xb7, 0xcd, 0x37, 0x39, 0xa6, 0xf1, 0x5a, 0x84, 0xff, 0xfe, 0xbb, 0xd2, 0x50, 0xa8, 0x71, 0x16, 0xc7, 0xf1, 0x37, 0x4f, 0xc5, 0x2b, 0x14, 0x56, 0x7d, 0xd2, 0x94, 0xa3, 0x57, 0x36, 0xb0, 0xe6, 0x40, 0x6b, 0xa6, 0xbb, 0x43, 0xe9, 0x08, 0x41, 0x07, 0x65, 0x96, 0x7c, 0x60, 0xaa, 0x6d, 0x9b, 0xc6, 0x22, 0x56, 0x93, 0x55, 0x08, 0x60, 0x21, 0xa9, 0xd4, 0xda, 0x4d, 0x53, 0x05, 0x4f, 0xf1, 0x30, 0x06, 0xc4, 0x19, 0xa4, 0xc8, 0x2e, 0xd5, 0x82, 0xca, 0x79, 0xff, 0xea, 0x4f, 0x4f, 0xd4, 0xf7, 0x40, 0x84, 0x2e, 0x00, 0x23, 0xc6, 0x0a, 0xd8, 0xfc, 0xb8, 0x58, 0xd8, 0x71, 0xf6, 0xb0, 0xbc, 0x77, 0x7a, 0x12, 0xf2, 0xbe, 0xb1, 0xdb, 0x7f, 0xe4, 0xde, 0x2e, 0x49, 0x19, 0xb4, 0xc6, 0xee, 0xa0, 0x07, 0x51, 0x96, 0x81, 0xa1, 0xc2, 0x05, 0xac, 0xb5, 0x1d, 0x58, 0xc0, 0xba, 0x11, 0xb7, 0x93, 0xbf, 0x32, 0xd3, 0x0c, 0xb3, 0x0a, 0xbe, 0x96, 0xc7, 0x89, 0xfc, 0x89, 0x80, 0x4f, 0x59, 0x2a, 0xf8, 0xf4, 0x7d, 0x2c, 0x27, 0xf9, 0x3b, 0x6e, 0xc7, 0xc0, 0x86, 0x68, 0x08, 0xe8, 0x7f, 0x69, 0x22, 0xab, 0xe3, 0x1d, 0x1e, 0x5d, 0x2d, 0x0a, 0xd9, 0x40, 0x0b, 0x3d, 0x62, 0x18, 0xac, 0xf0, 0x77, 0x89, 0xd1, 0x96, 0x12, 0xdb, 0x07, 0xc5, 0x7e, 0xa3, 0xf5, 0x59, 0xcb, 0xd7, 0xae, 0x1d, 0x91, 0xf9, 0xb8, 0x62, 0xf4, 0x5f, 0x95, 0x79, 0x2f, 0x3c, 0x2e, 0x53, 0xb5, 0x85, 0xe0, 0x60, 0x68, 0x5b, 0x30, 0xf3, 0xa7, 0xd9, 0xc0, 0x69, 0x4b, 0xf7, 0x80, 0x5b, 0x52, 0x3d, 0xf8, 0x82, 0x9e, 0x08, 0xfb, 0xfe, 0x1d, 0x19, 0xc9, 0xd0, 0xb6, 0xaf, 0x56, 0x55, 0xd4, 0x92, 0x3b, 0x74, 0x5b, 0x71, 0x4b, 0x59, 0x36, 0xed, 0x8b, 0x40, 0xb8, 0xd6, 0xd2, 0x84, 0x49, 0x86, 0x29, 0x3d, 0x7e, 0xb7, 0x54, 0xdc, 0x87, 0xf8, 0xc9, 0x05, 0x8a, 0xef, 0x58, 0x80, 0x6b, 0xa3, 0x93, 0x04, 0x85, 0x7c, 0x88, 0xbf, 0x7b, 0xba, 0x22, 0xa5, 0x7f, 0x6f, 0xd3, 0x3e, 0xa2, 0x10, 0x8c, 0x7d, 0x7c, 0x93, 0x72, 0xb4, 0xb0, 0xed, 0xd7, 0x5e, 0xd4, 0x7c, 0x6b, 0x2b, 0x56, 0xca, 0x72, 0x14, 0xbd, 0xef, 0xe9, 0xb5, 0xa8, 0x49, 0x96, 0x62, 0x08, 0x09, 0x2c, 0xdd, 0xe7, 0xc7, 0x93, 0x7c, 0x58, 0x0b, 0x39, 0x94, 0x4b, 0xac, 0x82, 0x88, 0x3a, 0x99, 0x17, 0x21, 0xad, 0x27, 0x9a, 0xb4, 0x30, 0x72, 0x88, 0x4c, 0x17, 0x42, 0xe8, 0x34, 0xb9, 0xcb, 0x0d, 0xc8, 0x16, 0x18, 0xde, 0x70, 0xdd, 0xdf, 0x95, 0x36, 0xd1, 0x95, 0x98, 0x69, 0x42, 0x84, 0x11, 0xfa, 0xd1, 0xee, 0x17, 0xe5, 0x3d, 0xdc, 0x85, 0x6d, 0x05, 0xfe, 0x8c, 0x80, 0x48, 0x8e, 0x8a, 0xdc, 0xe7, 0x67, 0x16, 0x81, 0xeb, 0xfc, 0xae, 0x00, 0x3f, 0x23, 0xdc, 0xd1, 0x75, 0x12, 0x7c, 0x70, 0x71, 0xb6, 0x4b, 0xdd, 0xc8, 0x1e, 0x2f, 0x28, 0x62, 0x53, 0x72, 0xfe, 0x9e, 0x07, 0xe4, 0x5e, 0x23, 0x1a, 0xb5, 0xf0, 0xd9, 0xd7, 0xcb, 0x21, 0x22, 0xa8, 0x2b, 0x48, 0x46, 0xed, 0x96, 0xfc, 0x01, 0x65, 0x91, 0xe4, 0x5b, 0xd9, 0x9d, 0xdd, 0x74, 0x0c, 0x49, 0x11, 0x16, 0x60, 0x08, 0x14, 0x95, 0x88, 0x4f, 0x2a, 0xb6, 0x1a, 0x7a, 0x1c, 0x15, 0x79, 0xd2, 0x7e, 0xbc, 0xa3, 0x4f, 0x58, 0xd8, 0xa9, 0x85, 0xf4, 0xf5, 0x78, 0x72, 0x78, 0xd5, 0xcd, 0x61, 0x24, 0xef, 0x3b, 0xcf, 0x88, 0xa9, 0x86, 0xd5, 0xea, 0x8e, 0x66, 0xbb, 0x9d, 0x68, 0xd4, 0xca, 0x8a, 0x9b, 0x71, 0x31, 0x7c, 0x30, 0x9d, 0xb3, 0x33, 0xc4, 0xfd, 0xfb, 0x5d, 0xae, 0xe5, 0x8f, 0x63, 0xcd, 0xa0, 0x09, 0x5d, 0x8d, 0x63, 0xf3, 0xba, 0xa1, 0x80, 0xa5, 0xe3, 0x53, 0x84, 0x2c, 0x37, 0x4f, 0xf1, 0x82, 0xb6, 0x3a, 0x74, 0x12, 0xc3, 0xc2, 0x76, 0x3d, 0x2e, 0x87, 0x8b, 0xd6, 0x47, 0x38, 0x8b, 0x04, 0x19, 0x74, 0x86, 0xc5, 0x0e, 0xd0, 0x8c, 0xd4, 0x2c, 0xeb, 0x75, 0xfc, 0xa6, 0xaf, 0x3e, 0xdf, 0xac, 0x41, 0x17, 0x69, 0x91, 0x16, 0x73, 0xe0, 0x0e, 0xdc, 0x4b, 0x41, 0xa3, 0x7a, 0x72, 0x2c, 0xaa, 0xa7, 0xb6, 0x10, 0x3f, 0x51, 0x8c, 0xfe, 0xdb, 0x64, 0x2b, 0x3f, 0xee, 0xca, 0x94, 0x74, 0x13, 0x53, 0xa3, 0xa8, 0x8f, 0x5f, 0x6b, 0x4e, 0xbd, 0x8c, 0xc9, 0xd2, 0x9f, 0x4f, 0x01, 0xf0, 0xec, 0xdd, 0x4b, 0x77, 0x01, 0xd8, 0x7f, 0x16, 0x37, 0xec, 0xbf, 0xee, 0x54, 0xcc, 0xf0, 0x8d, 0xb0, 0x34, 0xc6, 0x31, 0x2d, 0xea, 0x07, 0x31, 0xe8, 0xdd, 0x45, 0x9b, 0x35, 0x47, 0x56, 0xe4, 0x61, 0x2f, 0xfe, 0x45, 0xdf, 0xde, 0xe8, 0x59, 0x25, 0x75, 0x75, 0xef, 0x69, 0x66, 0x33, 0x89, 0x9e, 0x2b, 0x8a, 0x44, 0x04, 0x6a, 0x81, 0x50, 0xad, 0x78, 0x39, 0xad, 0x16, 0x3e, 0x21, 0xd6, 0xbd, 0x98, 0x7e, 0x58, 0x25, 0xf5, 0x31, 0x3f, 0xcc, 0xce, 0xd0, 0x7d, 0x62, 0xe2, 0x2b, 0x3e, 0xe5, 0xec, 0xe3, 0x3b, 0xb5, 0x3d, 0x34, 0xc7, 0xf8, 0x64, 0x4b, 0x8c, 0xa2, 0xd8, 0x28, 0x32, 0xaa, 0xa7, 0x16, 0x55, 0xd8, 0xe8, 0x44, 0x20, 0x90, 0xc8, 0xb1, 0x7c, 0xbb, 0x99, 0xd1, 0xb1, 0x2d, 0x7a, 0x25, 0xaa, 0x85, 0x0d, 0xb1, 0xaf, 0x71, 0x66, 0x9a, 0x12, 0xc9, 0xe6, 0xc2, 0x27, 0xea, 0x69, 0x7d, 0xd3, 0x42, 0x6a, 0x3e, 0x22, 0x47, 0x62, 0xa6, 0x46, 0x21, 0xd3, 0xbe, 0x9d, 0x83, 0x0c, 0xcf, 0xa6, 0x11, 0xe7, 0x7a, 0xfd, 0x15, 0xd1, 0x9b, 0xd4, 0x2b, 0x0b, 0x16, 0x93, 0x68, 0x49, 0xdc, 0xd2, 0x00, 0x92, 0x1d, 0x08, 0xb2, 0x2f, 0x84, 0xfd, 0xda, 0xc0, 0xb1, 0x90, 0xf2, 0x63, 0x9c, 0xe0, 0x9e, 0x16, 0x91, 0x18, 0xc1, 0x6e, 0xc0, 0xde, 0xbf, 0x1d, 0xa3, 0xa7, 0xaa, 0x24, 0xde, 0x41, 0x1a, 0x8a, 0x77, 0xba, 0x18, 0xcc, 0x0e, 0xc7, 0x77, 0x34, 0x07, 0xaa, 0xfb, 0xfd, 0x6e, 0x6e, 0x8b, 0x34, 0x52, 0x20, 0x9d, 0x1c, 0xdf, 0x0e, 0x57, 0xef, 0x8c, 0xba, 0xcc, 0x26, 0x00, 0x7c, 0xf5, 0xf6, 0x23, 0x3e, 0x9b, 0x48, 0x54, 0xe3, 0x9c, 0x6e, 0xdc, 0x98, 0x79, 0xa7, 0xc4, 0x74, 0x7e, 0x15, 0xcf, 0x0e, 0x9c, 0xae, 0xca, 0xaa, 0x98, 0xbf, 0xaf, 0xd7, 0x0a, 0x05, 0x6d, 0xf7, 0xf3, 0xcb, 0x7c, 0x07, 0x03, 0x2a, 0x11, 0xc0, 0x66, 0x8e, 0x27, 0x16, 0xfc, 0x67, 0x58, 0x6f, 0x01, 0x21, 0x92, 0xe4, 0x68, 0x0c, 0x80, 0x97, 0x37, 0xb8, 0x1e, 0xd2, 0x07, 0x57, 0x8f, 0xe0, 0x3f, 0xc3, 0xda, 0xf1, 0x22, 0x43, 0xc2, 0x95, 0xa8, 0x0d, 0xd5, 0x7c, 0xc9, 0x8a, 0x87, 0x14, 0xd7, 0xb2, 0xb9, 0x4e, 0xdf, 0x5b, 0xd1, 0x59, 0xe5, 0xe4, 0x99, 0x8f, 0xa4, 0x8d, 0xdc, 0x2a, 0x6f, 0x87, 0x00, 0x22, 0x23, 0xe0, 0x58, 0xff, 0xf6, 0x37, 0xea, 0x7a, 0xbf, 0x38, 0x98, 0x56, 0x64, 0xb6, 0x01, 0xc3, 0x7a, 0x43, 0x1b, 0x15, 0x96, 0x80, 0x69, 0xc2, 0xa8, 0x9c, 0xac, 0x79, 0x8b, 0x2a, 0xd6, 0x58, 0xa3, 0x0b, 0x9a, 0x41, 0xc3, 0x57, 0xc0, 0x91, 0x91, 0x2a, 0x68, 0x23, 0xd2, 0x0f, 0xeb, 0x80, 0x16, 0xf0, 0x0c, 0xff, 0x96, 0xb4, 0x4f, 0x31, 0x65, 0xd7, 0x3d, 0xc5, 0xaf, 0xf6, 0x68, 0x15, 0xa5, 0x34, 0x3a, 0xb7, 0x34, 0x16, 0x0d, 0x42, 0xda, 0xde, 0x1e, 0x4a, 0x3c, 0xde, 0x3a, 0xd0, 0x5e, 0x25, 0xb6, 0x95, 0x8c, 0x07, 0x8d, 0xd6, 0x22, 0xac, 0x83, 0x75, 0x64, 0xa4, 0x8d, 0x8a, 0xa4, 0x60, 0x21, 0xb7, 0x1d, 0xf5, 0xc9, 0xb0, 0x0c, 0xca, 0xfe, 0x63, 0xd8, 0x16, 0xb2, 0xad, 0x63, 0xc4, 0xdb, 0x61, 0x36, 0xb0, 0x11, 0x29, 0xe6, 0xa2, 0xfe, 0xdf, 0x66, 0x89, 0x3f, 0xa9, 0xe0, 0xfc, 0x4e, 0x6b, 0x83, 0xdd, 0x75, 0x09, 0x66, 0x36, 0x20, 0x95, 0xb3, 0xdb, 0x3c, 0x9b, 0xba, 0x3e, 0xb4, 0xe8, 0xad, 0xc2, 0x24, 0xee, 0xb3, 0x8d, 0xc3, 0xa8, 0x0b, 0xa2, 0x95, 0x0d, 0xd0, 0x68, 0xba, 0x64, 0x4b, 0xdb, 0x20, 0x10, 0xb7, 0xcc, 0x1d, 0xb9, 0x3a, 0x4c, 0xf5, 0x7c, 0xf5, 0xd6, 0x24, 0x82, 0xec, 0x17, 0x3e, 0x1f, 0x7b, 0xdd, 0x63, 0xfe, 0xc3, 0xed, 0x93, 0x34, 0x78, 0x90, 0xe4, 0xe1, 0xec, 0xa8, 0x3d, 0xb9, 0x52, 0xee, 0x7b, 0x1b, 0xf6, 0x33, 0x53, 0x5b, 0xb9, 0x08, 0x96, 0x04, 0x9e, 0xdd, 0xe1, 0x6f, 0xbe, 0x59, 0xe0, 0xdf, 0x8a, 0x9a, 0x2c, 0x64, 0x17, 0xf1, 0x2d, 0x86, 0x1e, 0xe1, 0x66, 0xa9, 0xe6, 0xaa, 0x81, 0x2c, 0xca, 0x6f, 0xc9, 0xe1, 0xe1, 0x48, 0x0b, 0xdf, 0xe6, 0x39, 0xda, 0xd0, 0x14, 0x45, 0x44, 0x6b, 0x96, 0xe1, 0xb2, 0xbb, 0x78, 0xaa, 0x40, 0xe5, 0x89, 0xba, 0x56, 0x83, 0x8b, 0x70, 0x80, 0x18, 0xa4, 0x9f, 0x4c, 0xb2, 0x94, 0x72, 0xdf, 0x42, 0xa6, 0x3b, 0xd4, 0xe4, 0x88, 0x97, 0x29, 0x4f, 0x82, 0xa1, 0xde, 0xfd, 0x6c, 0x4c, 0xdc, 0x01, 0x6b, 0x1f, 0x89, 0x31, 0x6b, 0x71, 0x87, 0x7f, 0xe8, 0x9f, 0xf3, 0xd4, 0x0b, 0xc8, 0x0e, 0x1c, 0xc8, 0x4f, 0x4c, 0x66, 0xe3, 0x86, 0x7c, 0xb4, 0x8b, 0x24, 0xb6, 0x3d, 0x65, 0x13, 0x97, 0xea, 0x3f, 0x3c, 0xfd, 0x02, 0x1f, 0xe6, 0x10, 0x0f, 0x6d, 0xc4, 0xe3, 0x5a, 0x82, 0xd5, 0x61, 0xc1, 0xd3, 0x72, 0x66, 0x7f, 0xf4, 0x0c, 0xe5, 0x9f, 0x98, 0x04, 0xd2, 0x59, 0x5b, 0x89, 0xe1, 0xc4, 0x13, 0x66, 0x8b, 0xed, 0x49, 0x44, 0x06, 0x00, 0x0a, 0xab, 0x6b, 0x45, 0x4a, 0x44, 0x51, 0xcc, 0x02, 0x0b, 0x86, 0x9f, 0xdb, 0xb2, 0xa7, 0x49, 0x58, 0x09, 0xdc, 0x81, 0x79, 0x5b, 0x7c, 0x36, 0x8c, 0x8f, 0x88, 0x37, 0x8e, 0x22, 0x3e, 0x39, 0xb6, 0xa7, 0x46, 0x8f, 0x4f, 0x2c, 0x3c, 0x7a, 0xe8, 0xf2, 0xaf, 0x1b, 0x34, 0xa7, 0xf7, 0x1f, 0x3f, 0x94, 0x6e, 0xba, 0xb5, 0xae, 0xdb, 0xe5, 0xfa, 0x7d, 0x41, 0x3f, 0xfe, 0xdd, 0x67, 0x62, 0x31, 0xa7, 0xdf, 0x7f, 0x0a, 0x81, 0xcb, 0x56, 0x0f, 0xde, 0x40, 0x0c, 0x75, 0x22, 0xe4, 0x06, 0x0a, 0x97, 0x9a, 0x81, 0x33, 0xa3, 0xd5, 0xa9, 0x5d, 0xb6, 0x4b, 0xf9, 0x11, 0x9b, 0xb7, 0xac, 0x7a, 0xc9, 0x70, 0x33, 0x9a, 0xa8, 0x63, 0x13, 0x84, 0x94, 0x69, 0x41, 0xf1, 0x82, 0xf3, 0x03, 0x6c, 0x27, 0x64, 0xb9, 0xfc, 0x8c, 0xc9, 0x66, 0x6d, 0x89, 0x87, 0x64, 0x04, 0xa8, 0xf6, 0x93, 0x5e, 0x0a, 0x73, 0x9e, 0xcb, 0xee, 0x60, 0x15, 0x04, 0xeb, 0x9b, 0x7e, 0x8d, 0x51, 0x45, 0xc5, 0x54, 0x3e, 0x51, 0xdb, 0x7e, 0x07, 0x51, 0x0d, 0x1d, 0x2f, 0xf8, 0x9f, 0xe7, 0xef, 0x0b, 0x13, 0x4d, 0xa2, 0x37, 0xdd, 0x38, 0x7d, 0x8c, 0x97, 0x2f, 0xcb, 0xbd, 0x1b, 0x56, 0x61, 0xd1, 0xe3, 0x6c, 0x02, 0x4f, 0x6b, 0x41, 0xff, 0xc9, 0xa5, 0x49, 0x0f, 0x92, 0x03, 0x1b, 0x32, 0xc4, 0xdf, 0x84, 0x02, 0x4f, 0x59, 0x47, 0xe4, 0x1d, 0xd2, 0x95, 0x5f, 0x6c, 0x9f, 0x3e, 0x2c, 0x6a, 0xd4, 0xae, 0x69, 0x5a, 0xed, 0xc6, 0xcb, 0x92, 0xee, 0xb8, 0x58, 0x0e, 0x51, 0xed, 0x72, 0xab, 0x58, 0xa4, 0x11, 0x5c, 0x02, 0x9f, 0xb0, 0xce, 0x88, 0x7d, 0x35, 0xca, 0xa3, 0xd9, 0xc7, 0x62, 0x75, 0x36, 0xc4, 0xe4, 0xec, 0x00, 0x00, 0x01, 0xb7 }; +constexpr AccessUnit M2V_MULTIPLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, true, 0, {}, { 0xb2, 0x5b, 0x25, 0x1f, 0x28, 0xf8, 0x1e, 0x80, 0xc8, 0x72, 0x45, 0xed, 0xef, 0xe9, 0xb6, 0x08, 0x83, 0x20, 0xcd, 0x25 } }; +constexpr AccessUnit M2V_MULTIPLE_PACK_EXPECTED_AU_2 = { 0x28144c47, 0x7e4e68d4, true, 0, {}, { 0xee, 0x18, 0x40, 0x38, 0x32, 0xb8, 0x2d, 0xa4, 0xe1, 0x8b, 0x09, 0x40, 0xfa, 0x8e, 0xfa, 0x64, 0x8f, 0xcd, 0x7c, 0x40 } }; +constexpr AccessUnit M2V_MULTIPLE_PACK_EXPECTED_AU_3 = { 0x15f90, 0x159b2, true, 0, {}, { 0xf5, 0x44, 0x36, 0x81, 0xe4, 0xff, 0x09, 0x3d, 0xd8, 0x28, 0xd3, 0x2b, 0xf2, 0x04, 0x7e, 0xdb, 0x90, 0x88, 0x6d, 0xdb } }; +constexpr AccessUnit M2V_MULTIPLE_PACK_EXPECTED_AU_4 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xd4, 0x82, 0xc6, 0x8d, 0x56, 0x01, 0x42, 0x07, 0x40, 0x81, 0xeb, 0x25, 0xc5, 0xc9, 0x24, 0x24, 0x0e, 0x24, 0x39, 0x4c } }; + +constexpr std::array ATRACX_MULTIPLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xb7, 0x4a, 0xf6, 0xa9, 0xd4, 0x7b, 0x0f, 0xd0, 0x00, 0xd7, 0xe7, 0x12, 0x43, 0x4c, 0x62, 0x89, 0xa6, 0xc2, 0x04, 0x70, 0x0e, 0x0b, 0xab, 0x92, 0x01, 0x5f, 0x90, 0x5c, 0x0a, 0x9a, 0xc6, 0x0c, 0x34, 0x34, 0xae, 0x42, 0x9c, 0x20, 0x2e, 0x01, 0x84, 0xbf, 0xf9, 0x16, 0x5f, 0xab, 0xb7, 0x91, 0xaa, 0xb2, 0x45, 0xc8, 0x5d, 0x83, 0x75, 0xbc, 0x67, 0xfe, 0xe8, 0x4f, 0xa0, 0xf6, 0x59, 0x01, 0xbb, 0xeb, 0x58, 0x61, 0x1f, 0x2b, 0xe1, 0x29, 0x19, 0x59, 0x6f, 0xfc, 0x3b, 0x04, 0xb2, 0xb2, 0x44, 0x0a, 0xa3, 0xd7, 0x5c, 0x13, 0x8c, 0x75, 0x89, 0x3a, 0x08, 0xce, 0xe8, 0x88, 0xc7, 0x31, 0xf1, 0x29, 0x74, 0x45, 0xc8, 0x34, 0x89, 0xac, 0xc3, 0x83, 0x21, 0xed, 0x1c, 0x70, 0xea, 0x47, 0x92, 0x74, 0x8f, 0xa7, 0x81, 0xf6, 0xae, 0x70, 0x64, 0xae, 0xb0, 0x73, 0xad, 0x6e, 0x54, 0xcb, 0x98, 0x46, 0x39, 0x41, 0x45, 0x11, 0xad, 0xde, 0xb6, 0xdd, 0xa9, 0xe3, 0x8c, 0xf8, 0xe2, 0x3d, 0x73, 0x98, 0x81, 0xf3, 0x70, 0x8e, 0x7e, 0xe1, 0x5a, 0x1f, 0x25, 0x47, 0x01, 0x74, 0x39, 0xf0, 0xe7, 0x85, 0x9d, 0x37, 0x6e, 0x12, 0xed, 0x4d, 0x12, 0x52, 0x21, 0xc1, 0xc2, 0xf8, 0x68, 0xc1, 0xf9, 0x18, 0x0d, 0xda, 0x8c, 0x6f, 0x30, 0xa2, 0x39, 0x5d, 0x4d, 0x7f, 0x7f, 0x93, 0x72, 0xf6, 0x17, 0x9a, 0xd5, 0xa0, 0x03, 0x64, 0xfe, 0x33, 0xfd, 0xc9, 0x9d, 0xab, 0x30, 0xb1, 0x04, 0x4c, 0x85, 0x95, 0xb5, 0x00, 0xb4, 0x53, 0x8c, 0xbb, 0x93, 0x99, 0x86, 0x47, 0x51, 0x94, 0x39, 0x96, 0xcc, 0x87, 0x1a, 0x05, 0xdf, 0xff, 0xbe, 0x29, 0xa3, 0x76, 0xe4, 0x4a, 0xcd, 0xaf, 0x68, 0xc8, 0xb2, 0x30, 0x03, 0x29, 0x51, 0x15, 0xd5, 0xb1, 0x75, 0xcb, 0x5d, 0xba, 0xfe, 0x04, 0x98, 0x48, 0x86, 0xe1, 0xcc, 0x16, 0x3d, 0x9e, 0x3c, 0xab, 0x8f, 0xf2, 0xec, 0x05, 0x24, 0xeb, 0xa8, 0x17, 0xd5, 0xe1, 0x86, 0xac, 0x86, 0x49, 0xb8, 0xe3, 0xc5, 0x88, 0x2e, 0xc7, 0xaf, 0xa4, 0xa9, 0x56, 0x98, 0x82, 0xc3, 0x1f, 0x4c, 0x4c, 0x39, 0x3a, 0x40, 0x58, 0x16, 0x1f, 0x75, 0x35, 0x47, 0x13, 0x82, 0x58, 0xb6, 0xd7, 0xb6, 0x31, 0xed, 0x6e, 0x4b, 0x69, 0x7e, 0x9d, 0x51, 0xc6, 0x43, 0x95, 0x42, 0xd7, 0xe7, 0x25, 0x94, 0x3c, 0xf0, 0xd1, 0xc8, 0x2d, 0xac, 0x01, 0x31, 0x1a, 0x13, 0xe5, 0xf7, 0x0f, 0x51, 0xef, 0x59, 0xb8, 0x36, 0x02, 0xe1, 0xe5, 0x47, 0x98, 0x36, 0x90, 0x2a, 0xc0, 0x20, 0x50, 0xc4, 0xe2, 0x32, 0x02, 0xa0, 0xe2, 0x91, 0x7d, 0x6f, 0x54, 0xf0, 0x84, 0xf9, 0xcb, 0xcf, 0x8b, 0x45, 0xe9, 0x88, 0x5c, 0xa9, 0x56, 0xe5, 0x3a, 0x0d, 0x98, 0x9d, 0xf8, 0x23, 0x3d, 0x90, 0xd6, 0x59, 0x5e, 0x1c, 0xdc, 0x4e, 0x4a, 0x70, 0x80, 0x20, 0xdb, 0x52, 0x8a, 0x08, 0x69, 0xea, 0x78, 0x2f, 0xf9, 0x72, 0xd5, 0x66, 0x1d, 0x9f, 0x9f, 0xc0, 0x00, 0xd0, 0x55, 0x55, 0xd1, 0x5d, 0xbd, 0x3a, 0x41, 0x13, 0x39, 0x71, 0x1c, 0xbc, 0x9a, 0xd1, 0x00, 0x17, 0x6a, 0xfd, 0x81, 0xea, 0xb6, 0x83, 0xb9, 0xb0, 0x86, 0xd2, 0x65, 0xcc, 0xc8, 0x2b, 0x15, 0x07, 0xb1, 0x13, 0xde, 0xf5, 0x30, 0xac, 0x48, 0x75, 0xd9, 0x50, 0xee, 0x0a, 0x12, 0x91, 0x4d, 0x5f, 0xe8, 0x0d, 0x6c, 0xc3, 0x50, 0xc8, 0xdb, 0x33, 0x2c, 0x9f, 0x01, 0xe9, 0x97, 0xe9, 0xb8, 0x4d, 0x18, 0xe2, 0xcd, 0x65, 0x6d, 0xcb, 0x18, 0x46, 0x00, 0x1f, 0x76, 0x96, 0x22, 0x5d, 0x1d, 0xa7, 0x6c, 0xf6, 0x5c, 0x4f, 0x60, 0xf0, 0xe3, 0x47, 0xd5, 0xef, 0x8f, 0xba, 0x37, 0xcc, 0xc0, 0x33, 0xe9, 0x60, 0x0f, 0xaa, 0x8d, 0x13, 0xca, 0xda, 0x04, 0xd7, 0xab, 0x51, 0x1d, 0x9d, 0x11, 0x5e, 0x9b, 0x7b, 0x59, 0x65, 0x4e, 0x43, 0x47, 0x84, 0xb2, 0x2a, 0x9c, 0xb3, 0x9f, 0x1d, 0x6e, 0x72, 0x3b, 0x18, 0x30, 0x19, 0xee, 0xba, 0xd7, 0x50, 0xce, 0x76, 0x3e, 0x6d, 0xe2, 0x68, 0xd3, 0xe3, 0xa8, 0x26, 0x63, 0x1b, 0x3b, 0xbb, 0x03, 0x15, 0x6d, 0xb7, 0x6b, 0x84, 0x38, 0xe7, 0x6e, 0xc0, 0x0f, 0x24, 0x60, 0x81, 0xfc, 0x3d, 0x4c, 0x07, 0xd9, 0xb4, 0xd0, 0x87, 0xc5, 0x1c, 0xb4, 0x2c, 0x8a, 0xe4, 0xb3, 0xbc, 0x0e, 0x39, 0xd5, 0x8b, 0xd3, 0xd1, 0xaf, 0x5c, 0x48, 0x54, 0x2e, 0xa9, 0xeb, 0x49, 0xa4, 0x36, 0x6f, 0x60, 0xc4, 0x88, 0x48, 0x75, 0xc2, 0x9b, 0xf7, 0x61, 0x15, 0x1e, 0xd4, 0x8d, 0x70, 0xbe, 0x73, 0x6d, 0xb7, 0x5c, 0x8b, 0xd1, 0x30, 0x61, 0x0e, 0xec, 0x5d, 0x9a, 0x03, 0x19, 0xc9, 0xe4, 0xce, 0x65, 0x38, 0xee, 0x2c, 0xf5, 0x58, 0x84, 0x83, 0x9a, 0x8f, 0xe1, 0x73, 0xe6, 0x38, 0x04, 0xc1, 0x54, 0x6b, 0xde, 0x22, 0x73, 0xd6, 0x3c, 0x91, 0x91, 0x38, 0x64, 0xda, 0x6e, 0x39, 0x76, 0xac, 0x85, 0x46, 0x48, 0x3b, 0x50, 0x17, 0x7f, 0x55, 0xd0, 0x50, 0x96, 0xbc, 0xb0, 0x46, 0xc4, 0x9e, 0xfb, 0xfe, 0xaf, 0xc4, 0x50, 0xb5, 0xc8, 0xfd, 0x38, 0xda, 0x50, 0xde, 0x46, 0x8f, 0xa7, 0x9f, 0xb2, 0x75, 0x04, 0x8f, 0xad, 0x7e, 0x95, 0x51, 0x53, 0xb2, 0xb0, 0xe4, 0xde, 0x31, 0x90, 0x5c, 0x2d, 0x34, 0x5c, 0xc7, 0x8e, 0x77, 0x39, 0xc8, 0xe8, 0x18, 0x66, 0x30, 0x38, 0x87, 0xc9, 0x6d, 0x27, 0x80, 0xf9, 0x89, 0xf3, 0xcf, 0x6b, 0x40, 0x20, 0x39, 0x29, 0x3e, 0xb2, 0xf7, 0x05, 0x08, 0x0e, 0xdc, 0x34, 0xf5, 0x9e, 0x55, 0xce, 0xa5, 0xa7, 0x1a, 0xaf, 0xcf, 0x1c, 0x1a, 0x4d, 0x89, 0x94, 0x4f, 0x02, 0x7b, 0x0c, 0x5a, 0xb9, 0x8e, 0x62, 0x76, 0x1d, 0x3e, 0x5b, 0x74, 0x2f, 0x8d, 0x7c, 0x54, 0xf4, 0x54, 0x3c, 0x9a, 0x0c, 0xde, 0x7a, 0xfc, 0x65, 0x39, 0x95, 0x39, 0xf8, 0x93, 0xde, 0x57, 0x32, 0x41, 0xfd, 0xb4, 0x15, 0xc4, 0xce, 0xdb, 0xab, 0x6d, 0xf5, 0x37, 0x0c, 0x1a, 0x92, 0x4b, 0xe9, 0xb5, 0xfc, 0x82, 0xa7, 0x3e, 0xee, 0xa2, 0x98, 0x85, 0xfb, 0x52, 0xdb, 0xd8, 0x19, 0xf2, 0xdf, 0xe1, 0xcb, 0x62, 0x57, 0x49, 0x80, 0x74, 0x63, 0xfc, 0x1e, 0xbb, 0x8b, 0x8f, 0xf7, 0x7a, 0x7b, 0xd8, 0x43, 0x14, 0x25, 0xb9, 0x13, 0x33, 0xed, 0x32, 0x7c, 0x92, 0x18, 0x05, 0xd0, 0xe6, 0xc9, 0xd2, 0x6d, 0x7b, 0xb8, 0x4c, 0x87, 0x51, 0x53, 0xde, 0x07, 0x41, 0xc7, 0xa7, 0x18, 0xb5, 0x78, 0xa6, 0x62, 0xa3, 0x75, 0xaf, 0x58, 0x52, 0x11, 0x0b, 0xd6, 0x8d, 0x6e, 0x37, 0x07, 0x88, 0xa7, 0x12, 0xaa, 0xce, 0x58, 0xa2, 0x9e, 0x50, 0x3b, 0x58, 0xfe, 0xff, 0x96, 0x37, 0x85, 0xec, 0xa9, 0x0b, 0x64, 0x5a, 0x2d, 0xbc, 0xa4, 0x57, 0x25, 0x4e, 0x97, 0x4d, 0x0c, 0x81, 0xeb, 0xb7, 0xa1, 0xcc, 0x1e, 0x27, 0x8c, 0xd5, 0x80, 0x41, 0x52, 0xab, 0x0b, 0x89, 0xa3, 0x97, 0x27, 0xeb, 0x17, 0x32, 0x92, 0x9c, 0x83, 0x81, 0xaf, 0x7e, 0xb4, 0x5e, 0x80, 0xa3, 0x6e, 0x68, 0x13, 0x49, 0x82, 0x8b, 0x80, 0x23, 0xb2, 0x5e, 0x4c, 0x6f, 0xb1, 0x51, 0xb9, 0xf8, 0xb6, 0xea, 0xbf, 0x07, 0x7a, 0x3c, 0x47, 0x69, 0x68, 0xc1, 0x14, 0xc7, 0xfe, 0x46, 0x74, 0x47, 0x5c, 0xca, 0xb7, 0x80, 0xa8, 0xeb, 0x0b, 0x78, 0x4e, 0xd0, 0x95, 0x56, 0x8d, 0x65, 0x21, 0x03, 0xf1, 0x2a, 0x3f, 0xcf, 0x7a, 0xd2, 0x7c, 0xef, 0x5c, 0xcf, 0x22, 0x6f, 0x88, 0xf2, 0x40, 0xec, 0x02, 0x0c, 0x5e, 0xd4, 0x2a, 0x9e, 0x07, 0xfc, 0x51, 0xd4, 0xf2, 0x10, 0xcc, 0x27, 0xee, 0x69, 0xbf, 0xbd, 0x72, 0x9c, 0x72, 0xf2, 0x99, 0x11, 0xf9, 0xd0, 0xcf, 0x56, 0x4a, 0x56, 0x2c, 0x10, 0x94, 0x08, 0x41, 0x84, 0xc5, 0x06, 0x07, 0x30, 0x13, 0x29, 0x9a, 0xc3, 0x06, 0x97, 0xe4, 0x1d, 0x61, 0x4d, 0x78, 0x93, 0xe3, 0xd5, 0xf7, 0xc8, 0xd1, 0x21, 0x76, 0x14, 0x25, 0xaf, 0xb6, 0x3d, 0x74, 0x48, 0xa8, 0xcb, 0x4d, 0x99, 0x03, 0xed, 0xc1, 0x37, 0x2e, 0x80, 0x05, 0xab, 0x79, 0xdc, 0x74, 0x60, 0x79, 0x35, 0xf0, 0xb2, 0xac, 0x20, 0xe5, 0xb2, 0x7a, 0x31, 0xe0, 0x74, 0x9b, 0x3d, 0x95, 0x22, 0x97, 0xa0, 0x28, 0x6f, 0x30, 0x2c, 0x0b, 0xe5, 0x5e, 0x9b, 0x01, 0xef, 0x46, 0xf4, 0x4b, 0xd9, 0x83, 0xe7, 0xcc, 0x56, 0x92, 0x5a, 0x96, 0xa1, 0x57, 0xcb, 0xec, 0xa4, 0x32, 0x0e, 0x5d, 0xc7, 0x3e, 0x5b, 0x8b, 0x67, 0xca, 0xd9, 0xf9, 0xb0, 0xfb, 0x11, 0xe5, 0x12, 0x0e, 0xe4, 0xf0, 0x98, 0x91, 0xbf, 0x1d, 0xea, 0x2d, 0x7a, 0x4a, 0x29, 0x85, 0x14, 0x75, 0xb1, 0xa9, 0x5c, 0xd2, 0xb1, 0x79, 0x01, 0x70, 0xcf, 0x83, 0x01, 0xff, 0xc0, 0x1d, 0xa5, 0x28, 0xd3, 0x38, 0xe6, 0xc5, 0x38, 0xee, 0x0b, 0xf7, 0x13, 0x10, 0x34, 0xf1, 0x78, 0xfc, 0x93, 0x14, 0xa4, 0x7a, 0x03, 0x0a, 0x77, 0x30, 0xae, 0xe2, 0x48, 0x78, 0x4e, 0x2c, 0xff, 0xac, 0x83, 0xee, 0x31, 0x6d, 0x49, 0x55, 0x41, 0x4a, 0x4a, 0x44, 0xf4, 0x65, 0x66, 0x79, 0xb0, 0x05, 0xb7, 0xf9, 0x9b, 0xb4, 0x12, 0xb8, 0xa0, 0xdc, 0xe2, 0xec, 0x90, 0x5b, 0xca, 0x70, 0xdf, 0xb0, 0x2c, 0x63, 0x75, 0x6b, 0x2a, 0x4c, 0x14, 0x3d, 0x0e, 0x01, 0x6b, 0x1a, 0x25, 0xac, 0x9b, 0x4b, 0x2b, 0x62, 0x1d, 0x71, 0xb8, 0x86, 0x65, 0x16, 0xc4, 0x37, 0xa2, 0x7f, 0x63, 0x43, 0xb9, 0xf9, 0x44, 0x2b, 0x0a, 0x32, 0xa8, 0xdd, 0x7d, 0x33, 0x1d, 0xb7, 0xae, 0x6a, 0x97, 0xa2, 0xb4, 0xd5, 0xe8, 0x3e, 0x7d, 0x87, 0x5e, 0x88, 0x8d, 0xa8, 0x3c, 0xb0, 0x76, 0xab, 0x0b, 0x12, 0x73, 0x2f, 0x3c, 0xfe, 0xcb, 0x17, 0xbf, 0xa5, 0x8a, 0xf1, 0xef, 0x99, 0x25, 0xd6, 0x63, 0x15, 0xb7, 0xb8, 0xbc, 0xf3, 0x21, 0x05, 0x0f, 0x03, 0x75, 0xa8, 0xb4, 0xca, 0xeb, 0x37, 0xa7, 0x29, 0x5a, 0x9c, 0xf3, 0xcc, 0x08, 0x2b, 0xaa, 0x39, 0x74, 0xcd, 0xeb, 0xc7, 0xd5, 0xd3, 0x4a, 0xf3, 0x34, 0x05, 0xba, 0xd0, 0xbe, 0x00, 0x90, 0xb0, 0x2f, 0x33, 0xfd, 0x34, 0x51, 0xc6, 0xd5, 0xf5, 0x68, 0xd3, 0xa6, 0xb9, 0xa9, 0xf4, 0xcb, 0xdb, 0x28, 0x1a, 0x8e, 0x06, 0x04, 0xd7, 0x75, 0x82, 0x11, 0x6f, 0x88, 0xaf, 0x9b, 0x71, 0x53, 0x90, 0xe7, 0xb9, 0x7b, 0xc9, 0x4c, 0xe3, 0x13, 0x20, 0xdd, 0x1e, 0xa3, 0x7c, 0x27, 0x0b, 0xdd, 0x66, 0xc9, 0xad, 0x02, 0xf9, 0x50, 0xd6, 0xe6, 0x01, 0x83, 0x85, 0x8c, 0x60, 0x9c, 0x45, 0xee, 0xed, 0x91, 0x2d, 0xa4, 0xc5, 0x80, 0x37, 0x08, 0x00, 0x2b, 0x52, 0xe6, 0x1b, 0xb5, 0x14, 0x3b, 0x67, 0x3e, 0x6b, 0x02, 0xc5, 0x4f, 0x39, 0xf2, 0xc7, 0x48, 0xf2, 0x25, 0x4c, 0x9b, 0x07, 0x41, 0x05, 0x43, 0xa5, 0x2e, 0xb7, 0xbb, 0x9f, 0x07, 0xdb, 0x5e, 0xc8, 0x91, 0x75, 0x3a, 0x06, 0x46, 0x01, 0x5f, 0xd1, 0x8b, 0x6c, 0xab, 0xcd, 0xe2, 0xe7, 0xde, 0x29, 0x6b, 0x2e, 0x41, 0xbc, 0x97, 0x21, 0x51, 0x1d, 0x9e, 0x45, 0x2e, 0x4d, 0x88, 0xe0, 0xea, 0x61, 0x87, 0xf6, 0xed, 0x3f, 0xa0, 0x28, 0x70, 0x59, 0x89, 0xe4, 0x9c, 0xba, 0xd0, 0x14, 0x8f, 0x10, 0x85, 0x34, 0xd6, 0x9a, 0x2e, 0xc0, 0x23, 0xc7, 0xfe, 0x64, 0xd2, 0xdd, 0x11, 0x31, 0x1e, 0xbc, 0xb5, 0x2e, 0x06, 0xbb, 0xd0, 0x44, 0xbe, 0xeb, 0x4b, 0x90, 0x2a, 0xb9, 0x1a, 0x61, 0x05, 0x52, 0x13, 0x4f, 0x4b, 0xed, 0xb0, 0x22, 0x2d, 0xe4, 0xef, 0x2d, 0x40, 0x02, 0x58, 0x6f, 0xb5, 0x7b, 0x90, 0x1e, 0x41, 0xb7, 0xab, 0x40, 0x53, 0x72, 0x35, 0x10, 0x0c, 0x6e, 0xf0, 0xd1, 0x88, 0x21, 0x75, 0x29, 0xd0, 0xc3, 0xe4, 0x39, 0xa1, 0xec, 0x53, 0xc1, 0xf2, 0xcb, 0x62, 0x4c, 0x8d, 0xee, 0x78, 0x80, 0x34, 0x60, 0x5f, 0x64, 0x3f, 0x3f, 0xe1, 0x1e, 0xca, 0x56, 0x7f, 0xb5, 0xde, 0x0f, 0x85, 0x33, 0x93, 0x8f, 0x85, 0x6c, 0xf9, 0xd3, 0xf4, 0x86, 0xe8, 0xc2, 0xb7, 0x48, 0xe3, 0x3a, 0xa4, 0xf2, 0x43, 0xf6, 0x21, 0xff, 0xec, 0x11, 0x7c, 0x11, 0x53, 0xbb, 0xf1, 0x15, 0x9b, 0xdb, 0x30, 0x95, 0xa0, 0xa3, 0x42, 0x6e, 0x7d, 0x70, 0xc5, 0x6e, 0x8c, 0x58, 0x35, 0xf5, 0xde, 0xd1, 0xce, 0x2e, 0xb0, 0x15, 0x97, 0xbc, 0x33, 0x88, 0x62, 0xdd, 0xfe, 0xe2, 0x69, 0xe7, 0x46, 0x98, 0x41, 0xc8, 0xe6, 0x55, 0x60, 0x3e, 0xf6, 0x1c, 0x3d, 0x8e, 0x46, 0x0c, 0xf3, 0xff, 0xd0, 0xbd, 0xc5, 0x96, 0x62, 0x1a, 0x50, 0x02, 0x45, 0xc0, 0xe6, 0xa5, 0x98, 0x62, 0xea, 0x41, 0xa9, 0x56, 0x28, 0x45, 0xc8, 0xc3, 0x64, 0xf7, 0x37, 0x95, 0x29, 0x97, 0xbd, 0xe2, 0x39, 0x46, 0x1b, 0xa6, 0xbb, 0x4b, 0x10, 0x0f, 0xd0, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x10, 0xf0, 0xab, 0xbf, 0xd5, 0xd3, 0xcb, 0xde, 0x20, 0x0d, 0x88, 0x1e, 0x69, 0xb2, 0x13, 0xa2, 0x45, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x35, 0xf3, 0xe5, 0x17, 0x48, 0x8f, 0x5c, 0x96, 0xa3, 0xe9, 0x58, 0xd7, 0xb6, 0xfc, 0xc5, 0xc5, 0x11, 0xa2, 0x74, 0x77, 0x19, 0xfa, 0x7b, 0x58, 0x17, 0x28, 0x89, 0x78, 0xf3, 0xd7, 0x98, 0x7b, 0x1a, 0xf9, 0x9f, 0x05, 0x83, 0x87, 0xd3, 0x42, 0x55, 0xa2, 0x02, 0x37, 0x64, 0xa7, 0xac, 0x38, 0x13, 0x5d, 0x06, 0xe7, 0xbb, 0xcb, 0xc2, 0x92, 0x4d, 0x2a, 0xc4, 0xcd, 0x2a, 0x4b, 0x85, 0x5a, 0xfc, 0x70, 0xbc, 0x79, 0xbe, 0x48, 0x90, 0x35, 0xfb, 0x25, 0x0e, 0x93, 0xfd, 0x7d, 0x6c, 0x25, 0x8a, 0x59, 0x7e, 0x9c, 0x0b, 0xa0, 0x58, 0x3b, 0x4e, 0x64, 0x16, 0xef, 0x30, 0x6b, 0xcc, 0xf9, 0x62, 0xe0, 0x68, 0x57, 0x65, 0x93, 0xcc, 0xeb, 0x07, 0xfd, 0xd6, 0x31, 0x38, 0xb5, 0x75, 0xd8, 0xfe, 0x27, 0x86, 0x3b, 0x0a, 0xdc, 0x7c, 0x6f, 0x65, 0x9c, 0x82, 0x08, 0x43, 0x2a, 0x91, 0x45, 0x23, 0x3e, 0x8a, 0x49, 0x34, 0x7e, 0x0a, 0x99, 0x84, 0x11, 0xd2, 0x4a, 0x93, 0xae, 0x8e, 0xcd, 0x1b, 0x6f, 0xa7, 0xf1, 0x50, 0xed, 0x95, 0x97, 0x5c, 0x3d, 0xf9, 0xd1, 0xb7, 0xdb, 0xcf, 0xa3, 0x60, 0xb1, 0x28, 0xe6, 0xa5, 0x22, 0x2c, 0xd1, 0xac, 0x1f, 0x9c, 0x15, 0xd0, 0xe8, 0x8c, 0xab, 0xcb, 0xe0, 0xe9, 0xe9, 0x77, 0xa0, 0x7f, 0x02, 0x02, 0xa1, 0xfb, 0x07, 0x42, 0x72, 0xb8, 0x1a, 0x0f, 0x8d, 0x97, 0x53, 0xa9, 0x75, 0xa1, 0x8b, 0xff, 0x09, 0x21, 0xc3, 0x1e, 0xf9, 0xa3, 0xb9, 0xd7, 0x72, 0x33, 0x62, 0x6e, 0x9a, 0x54, 0xb0, 0x0c, 0x98, 0x0a, 0xbd, 0x30, 0xc7, 0x38, 0x7e, 0x4d, 0xf9, 0xb6, 0x38, 0x3c, 0xb3, 0x7b, 0x4f, 0x86, 0xa2, 0xf3, 0xac, 0x9e, 0x81, 0x15, 0xe4, 0xb5, 0x30, 0x3c, 0xe5, 0x11, 0xf9, 0x05, 0x5c, 0x28, 0x50, 0x0a, 0xa2, 0x9d, 0xe1, 0xfa, 0xe9, 0x80, 0xcd, 0x9d, 0x9e, 0x9a, 0x90, 0x42, 0x2e, 0xe6, 0xd2, 0x4b, 0x1a, 0xd6, 0x84, 0x6e, 0x95, 0x0c, 0x17, 0xc1, 0xb8, 0x1d, 0x84, 0x3a, 0x76, 0xae, 0xfc, 0xd1, 0x32, 0x4d, 0x52, 0xac, 0x6e, 0xe6, 0x4f, 0xcd, 0x76, 0x4d, 0xd3, 0x00, 0x81, 0x82, 0x2e, 0x60, 0xbd, 0x8f, 0x42, 0xe8, 0x83, 0xcb, 0xdd, 0x9b, 0xeb, 0x6f, 0x5a, 0xe8, 0xf9, 0x0c, 0x7a, 0x90, 0x92, 0x2b, 0xe6, 0x04, 0x17, 0x58, 0xd4, 0xa4, 0x43, 0x13, 0xb3, 0xec, 0xb1, 0x39, 0xfe, 0x0e, 0x1d, 0x55, 0xe8, 0x96, 0xa1, 0x13, 0xd6, 0x59, 0xef, 0x36, 0x69, 0xa5, 0x20, 0x83, 0x21, 0xfc, 0xed, 0x6f, 0xa5, 0x85, 0x64, 0x27, 0xeb, 0xdb, 0x53, 0x7f, 0x89, 0x4d, 0xe6, 0x00, 0x61, 0xc4, 0x1e, 0x69, 0x36, 0x74, 0xbe, 0xa3, 0xc0, 0x28, 0x7e, 0x60, 0x97, 0x46, 0xae, 0x9b, 0x9c, 0x70, 0xee, 0xa2, 0x5f, 0x67, 0x18, 0x98, 0x21, 0xef, 0x79, 0xad, 0x4d, 0xff, 0x42, 0xc8, 0x32, 0x28, 0x6e, 0x45, 0xa4, 0x3c, 0x0a, 0x75, 0x19, 0x8a, 0x6b, 0x68, 0x71, 0x11, 0x97, 0x07, 0x8d, 0xf7, 0xcf, 0xdc, 0x61, 0x99, 0xb4, 0xfb, 0xab, 0x7e, 0x0a, 0xf0, 0xf5, 0x08, 0x8b, 0x7e, 0x03, 0x75, 0x4d, 0x75, 0xd8, 0xef, 0x07, 0x3f, 0x80, 0xf4, 0xa1, 0x8e, 0xbc, 0x5b, 0xa5, 0x25, 0x4f, 0xfe, 0x9c, 0xb7, 0x0e, 0x76, 0x39, 0xad, 0xc8, 0x07, 0x2b, 0x87, 0x16, 0xdc, 0x2b, 0xb2, 0xcf, 0x40, 0x4d, 0x23, 0xc0, 0xb9, 0x26, 0xf9, 0xe2, 0x52, 0x55, 0x4a, 0x34, 0x95, 0x5f, 0xbb, 0x14, 0x52, 0x8f, 0xfa, 0x59, 0xd1, 0x2e, 0x53, 0x35, 0x9e, 0x43, 0xcf, 0xa3, 0x1b, 0x24, 0x0b, 0x03, 0xb3, 0x2e, 0x42, 0xb9, 0x85, 0x23, 0x47, 0x4f, 0xfb, 0x69, 0xb6, 0x15, 0x1e, 0x2b, 0xa6, 0xa5, 0x2b, 0xf9, 0x60, 0xae, 0x36, 0x5d, 0x13, 0x10, 0x33, 0xf8, 0x40, 0x61, 0x3a, 0x07, 0x6f, 0xa2, 0x57, 0xdf, 0x38, 0xc1, 0xaf, 0x5b, 0xe6, 0x15, 0x3a, 0x24, 0xaf, 0xb8, 0x2a, 0x43, 0x9f, 0x18, 0xe6, 0xec, 0x89, 0x4d, 0x98, 0x4a, 0xc9, 0x8b, 0x77, 0xf2, 0x4e, 0x50, 0xbd, 0x1e, 0x80, 0x45, 0xcf, 0x94, 0xff, 0xfd, 0xca, 0x9e, 0x57, 0x01, 0x28, 0xf1, 0x4d, 0x1c, 0xd5, 0xd7, 0xe6, 0x1b, 0xcb, 0x4c, 0xac, 0xc7, 0x7c, 0x84, 0x3e, 0xbe, 0x16, 0xab, 0xf2, 0xe8, 0x72, 0xee, 0x69, 0xe4, 0xe2, 0x73, 0x9f, 0x34, 0xec, 0xdb, 0x56, 0x8a, 0xa1, 0x01, 0x53, 0x65, 0x85, 0x23, 0x45, 0xb7, 0xed, 0x85, 0x7a, 0xc5, 0x4e, 0xb4, 0x1e, 0x06, 0x13, 0x54, 0x43, 0xa5, 0x4b, 0xf9, 0x90, 0x8e, 0x4e, 0x55, 0xb5, 0xeb, 0xa7, 0xb6, 0xc0, 0x1f, 0x8d, 0x7d, 0x35, 0xd4, 0xc8, 0xa2, 0xc6, 0x2d, 0x2f, 0xb1, 0xcd, 0xf0, 0xa3, 0x71, 0x5a, 0x67, 0x76, 0xd7, 0x51, 0x3c, 0x9b, 0x14, 0xc8, 0xb6, 0x30, 0x16, 0xbc, 0x4c, 0x95, 0xf0, 0xd2, 0x4f, 0xb0, 0xc3, 0x68, 0x0c, 0xb0, 0x57, 0x3f, 0xa1, 0xa4, 0xda, 0x9d, 0x8f, 0xeb, 0x27, 0xf7, 0x72, 0x22, 0x84, 0xc8, 0xae, 0x81, 0x7e, 0xb9, 0x0f, 0x98, 0xb3, 0x60, 0xa7, 0x27, 0x7b, 0x45, 0x12, 0xf3, 0xa8, 0x2d, 0xff, 0x1b, 0xac, 0x95, 0x80, 0xa3, 0x67, 0x83, 0x5e, 0x6c, 0x54, 0xe9, 0xdb, 0x6e, 0x9a, 0xdf, 0x96, 0x42, 0xbb, 0x44, 0xb9, 0xd2, 0x60, 0xd2, 0x68, 0x37, 0x2a, 0x8d, 0x09, 0xdf, 0xa5, 0x0e, 0x23, 0xc8, 0xb4, 0x65, 0x65, 0x05, 0xc5, 0x75, 0x3e, 0x6b, 0xe5, 0xa4, 0x3e, 0xbe, 0xed, 0xa8, 0x8e, 0xd1, 0x32, 0xe8, 0x5f, 0x5c, 0x0c, 0x73, 0x4a, 0xc9, 0xc7, 0x07, 0xc8, 0x2c, 0xa0, 0x95, 0x79, 0x42, 0xe9, 0x46, 0xae, 0x99, 0x41, 0xc8, 0xfa, 0xa8, 0xdf, 0x36, 0xa2, 0x1d, 0x6e, 0x3d, 0x90, 0x76, 0x59, 0xd4, 0x53, 0x96, 0xa7, 0x66, 0x3c, 0x42, 0x30, 0xfa, 0x41, 0xe5, 0x38, 0x76, 0x51, 0x1a, 0x8d, 0x94, 0x57, 0xee, 0x5d, 0x0b, 0x30, 0xbe, 0x91, 0x72, 0x18, 0xf4, 0x87, 0xd0, 0xc7, 0x7e, 0xbc, 0xce, 0xe8, 0x98, 0x17, 0xc1, 0x0d, 0xbf, 0xa7, 0xe9, 0x1c, 0x57, 0x47, 0x03, 0x88, 0x04, 0xb4, 0x8f, 0xbb, 0x15, 0xda, 0x12, 0x0a, 0x7d, 0xc6, 0x66, 0xb8, 0x74, 0xf0, 0xaa, 0x3c, 0xf0, 0x96, 0x6a, 0x59, 0x3d, 0x5a, 0x28, 0x08, 0xdd, 0x56, 0xb6, 0x8b, 0xa2, 0xbf, 0x45, 0xcc, 0xe5, 0x2f, 0xa1, 0x56, 0xa9, 0xe5, 0x4e, 0x73, 0x3f, 0x41, 0xf9, 0x0b, 0x05, 0x25, 0xcd, 0x65, 0x15, 0x83, 0xf8, 0xfc, 0x12, 0x97, 0x3b, 0xfb, 0xe6, 0xac, 0xab, 0x29, 0x3f, 0x57, 0xb3, 0x8f, 0x40, 0xd7, 0x70, 0x81, 0x55, 0xa2, 0x1d, 0xc7, 0x2a, 0x4a, 0x5c, 0xc4, 0x08, 0x2b, 0x11, 0x5a, 0xac, 0x22, 0x34, 0xcd, 0xa0, 0x42, 0x4b, 0xf6, 0xd2, 0x1f, 0x14, 0xeb, 0xce, 0x99, 0x70, 0xcf, 0xe8, 0x45, 0xbe, 0xd2, 0xe3, 0x12, 0x27, 0xc5, 0x16, 0xc8, 0xa8, 0xa3, 0xff, 0xd3, 0x3b, 0xff, 0x7e, 0x88, 0xef, 0xff, 0xbf, 0xa1, 0x8b, 0x9d, 0xfe, 0xbc, 0xb1, 0xbe, 0x6b, 0xd3, 0x92, 0x9b, 0x7a, 0xaf, 0xfd, 0x2b, 0x5d, 0xc4, 0xe1, 0x3f, 0xfc, 0x1e, 0xc5, 0xe8, 0xf3, 0xd2, 0x84, 0x86, 0x07, 0x06, 0x96, 0xd3, 0x61, 0x72, 0x75, 0x6b, 0xa3, 0x02, 0x2c, 0x9e, 0x75, 0x27, 0xa4, 0xfd, 0x8d, 0x57, 0xde, 0x00, 0xa8, 0x9c, 0x80, 0xa6, 0xe2, 0x53, 0xa2, 0x66, 0x5c, 0x5b, 0x0d, 0xb1, 0x97, 0xc2, 0x40, 0xda, 0x55, 0x51, 0x9a, 0x36, 0x4c, 0xc6, 0xbc, 0x29, 0xd9, 0x1e, 0x5a, 0x58, 0x36, 0x2d, 0x3d, 0x8e, 0x7d, 0xa1, 0x50, 0x58, 0x6a, 0x0f, 0xf2, 0x4f, 0xb0, 0x6f, 0xc9, 0x20, 0x09, 0x55, 0xc4, 0x86, 0x2a, 0x0f, 0x75, 0x85, 0x6d, 0x51, 0xbd, 0x75, 0x5f, 0xc3, 0xfe, 0x0c, 0xee, 0x03, 0xd0, 0xad, 0x89, 0x20, 0x4c, 0x92, 0xda, 0xbf, 0xa5, 0x3c, 0x87, 0xc0, 0x34, 0x08, 0x44, 0x58, 0x6c, 0x66, 0xee, 0x93, 0x6f, 0x46, 0x1b, 0x2e, 0x97, 0x86, 0x6c, 0x9a, 0x2c, 0xb7, 0x55, 0x48, 0xb4, 0x16, 0x9d, 0xcd, 0xfc, 0x89, 0xb5, 0x72, 0x9b, 0x89, 0xc1, 0x6c, 0x16, 0x8d, 0x9d, 0x15, 0x14, 0x5c, 0xe6, 0x5d, 0x08, 0x4d, 0x75, 0xf1, 0x7f, 0x40, 0xee, 0x9e, 0x51, 0xaf, 0xf6, 0xca, 0x29, 0x1b, 0xca, 0x8e, 0x5a, 0x43, 0x3b, 0x3f, 0x39, 0x4e, 0xff, 0x02, 0xdb, 0x76, 0x56, 0x33, 0xfe, 0xf4, 0xfb, 0xc3, 0xbe, 0x5f, 0xf9, 0x42, 0xe9, 0x53, 0x1c, 0x83, 0x52, 0x44, 0x07, 0x91, 0x0e, 0x11, 0x20, 0x60, 0xdd, 0xaf, 0x16, 0xc8, 0xca, 0xf1, 0x89, 0x31, 0x7c, 0xd3, 0xde, 0xe2, 0xd3, 0x59, 0x17, 0x27, 0xc5, 0xc0, 0x2b, 0x80, 0x7a, 0xdc, 0x25, 0x31, 0x83, 0xc4, 0x00, 0xb5, 0x4e, 0x88, 0x8a, 0x71, 0xdc, 0xcc, 0xbe, 0xfc, 0xbd, 0x47, 0x81, 0xac, 0xa1, 0xa6, 0xa8, 0x29, 0x2d, 0x91, 0x41, 0xff, 0x2e, 0x2c, 0xc7, 0x3c, 0x76, 0x3a, 0xa1, 0x0f, 0x1e, 0xbe, 0xf1, 0x09, 0xd5, 0x32, 0xfe, 0x63, 0x7e, 0x50, 0x06, 0x0f, 0x42, 0x0d, 0xf6, 0xa6, 0xb1, 0xd2, 0x76, 0x78, 0x13, 0xe1, 0xd3, 0x44, 0x33, 0xda, 0x48, 0xe5, 0x96, 0x4f, 0xa2, 0x1a, 0x9d, 0x21, 0xf1, 0x29, 0x28, 0x38, 0x47, 0xff, 0xc6, 0xb1, 0xbd, 0x93, 0xc5, 0x4a, 0x55, 0x33, 0xcb, 0xd7, 0x0d, 0x06, 0x7d, 0x06, 0xd9, 0x9b, 0x35, 0x62, 0x32, 0x6e, 0x35, 0xe5, 0x95, 0x9f, 0x68, 0x11, 0xba, 0x80, 0x22, 0xd7, 0xdb, 0x9d, 0x9f, 0x3b, 0xd6, 0x3d, 0x61, 0x75, 0x47, 0x07, 0x64, 0x2e, 0x3e, 0x72, 0xdc, 0x1b, 0xfe, 0x0e, 0xc3, 0x33, 0xa9, 0x13, 0x82, 0xa7, 0x54, 0x67, 0x0c, 0xe2, 0x88, 0x30, 0x69, 0x73, 0xdb, 0xcb, 0x61, 0xab, 0x46, 0xb6, 0x5b, 0x2d, 0x7b, 0x92, 0xfb, 0xe9, 0xb0, 0xcc, 0x0d, 0xf2, 0x2c, 0xfb, 0x42, 0x15, 0x33, 0x73, 0x03, 0xc2, 0xf7, 0x96, 0x66, 0x22, 0xb5, 0x2f, 0x17, 0x29, 0xca, 0xd7, 0xfd, 0xec, 0x7d, 0x2c, 0x72, 0xcc, 0x88, 0x65, 0x07, 0x6d, 0x9b, 0x4f, 0xea, 0xf4, 0x20, 0x56, 0x8c, 0x7f, 0x5a, 0x17, 0x92, 0xa1, 0x30, 0x09, 0x05, 0x85, 0xab, 0x32, 0x42, 0x4c, 0x9f, 0x67, 0xcd, 0xcc, 0xa3, 0x4d, 0x1a, 0xe7, 0x22, 0x03, 0x8b, 0x0d, 0x6a, 0x36, 0xef, 0xf0, 0xcd, 0x50, 0x20, 0x53, 0xdf, 0xa2, 0xdf, 0xe8, 0xb9, 0x94, 0xc3, 0xec, 0x2e, 0x49, 0xe7, 0x24, 0xe0, 0x9d, 0x12, 0xe7, 0x2e, 0x31, 0xfe, 0xd6, 0xa3, 0x2b, 0xd2, 0x38, 0x62, 0x6e, 0x9a, 0xbd, 0xe1, 0xea, 0xe6, 0x82, 0xa5, 0xff, 0x7e, 0x63, 0x87, 0x22, 0xf5, 0x42, 0x56, 0xc9, 0xa8, 0xc4, 0xa2, 0xa4, 0xa1, 0xf3, 0x6a, 0x76, 0x8b, 0x47, 0xb9, 0xe7, 0xb4, 0xe1, 0xe2, 0x18, 0xa7, 0x70, 0x94, 0xc8, 0x2f, 0xa0, 0xd9, 0xac, 0x55, 0x7d, 0x41, 0x34, 0x50, 0xfa, 0x24, 0x1c, 0x8e, 0xcb, 0x7e, 0xaf, 0xe3, 0x81, 0x5f, 0xaa, 0x44, 0x16, 0xad, 0xd0, 0x26, 0x1c, 0x19, 0xf3, 0xcd, 0x08, 0xc7, 0x51, 0x0b, 0x8d, 0xc0, 0xe9, 0xa4, 0xa2, 0xea, 0xeb, 0x4f, 0x1c, 0xc6, 0x73, 0x5c, 0x0c, 0xae, 0x8d, 0x59, 0xe0, 0x85, 0xdf, 0x82, 0x04, 0xa7, 0x9a, 0xa2, 0x08, 0xf7, 0x97, 0xfe, 0xc8, 0xe6, 0x66, 0xd5, 0x66, 0x3e, 0xc3, 0x73, 0xbf, 0x45, 0x42, 0xbd, 0x68, 0xf0, 0x47, 0xd1, 0xcd, 0xcc, 0xeb, 0xfd, 0x45, 0xe7, 0xa6, 0x71, 0x1f, 0xef, 0x78, 0x74, 0x37, 0xdb, 0x3d, 0xea, 0xbb, 0xcb, 0xe3, 0xe7, 0xbc, 0x2c, 0x88, 0xa8, 0xe6, 0x69, 0x31, 0xa5, 0x39, 0x7b, 0x47, 0x89, 0x5f, 0x4b, 0xfa, 0x12, 0xca, 0xb3, 0xd7, 0xcf, 0xcc, 0xb7, 0xe8, 0x29, 0x13, 0xbe, 0x08, 0xc7, 0xc4, 0x8d, 0x00, 0x5a, 0x8e, 0x22, 0x54, 0x1e, 0x9b, 0x6c, 0x30, 0x57, 0x41, 0x87, 0x04, 0x5d, 0x4e, 0x57, 0xa5, 0x34, 0x08, 0xb1, 0xa6, 0x70, 0xf2, 0x9a, 0x3e, 0x52, 0xce, 0x4b, 0xb1, 0x67, 0x35, 0x92, 0xb8, 0x12, 0x01, 0x61, 0x9b, 0x51, 0x2d, 0x00, 0xfc, 0xf7, 0x1a, 0xe8, 0x83, 0x1c, 0xd1, 0x4a, 0x9b, 0xed, 0x5e, 0x79, 0xa1, 0x30, 0x59, 0x6d, 0x29, 0x5f, 0xe2, 0x9e, 0x56, 0x68, 0x04, 0xa2, 0x65, 0x82, 0x72, 0xa0, 0x09, 0x78, 0x54, 0x82, 0x86, 0xb8, 0x82, 0x33, 0x19, 0x1d, 0xa3, 0xf7, 0x5f, 0x31, 0x72, 0xf9, 0x53, 0x8f, 0x6d, 0x60, 0xd4, 0x5e, 0x56, 0x89, 0x11, 0x70, 0x46, 0x61, 0x4a, 0x2d, 0xc7, 0x89, 0xdb, 0x31, 0x9e, 0x6e, 0x9d, 0xbc, 0x2a, 0x1f, 0x3d, 0xda, 0x19, 0x9c, 0x90, 0x5a, 0x28, 0x9f, 0xc9, 0x5f, 0x7a, 0x4a, 0xf9, 0xc7, 0xe2, 0xbe, 0x51, 0x01, 0x37, 0x0e, 0x81, 0x41, 0xb6, 0x2a, 0x66, 0xed, 0xc2, 0xf0, 0x7b, 0xfc, 0xb2, 0x50, 0xf6, 0xbb, 0x59, 0xe3, 0x48, 0x24, 0xea, 0x29, 0x86, 0x87, 0x75, 0x37, 0xaf, 0xee, 0x43, 0x7d, 0xe7, 0x49, 0xb8, 0x16, 0x36, 0x0f, 0xd0, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x10, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0xda, 0xf8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xb3, 0x11, 0x81, 0x8c, 0xab, 0xb1, 0x64, 0x58, 0x83, 0x44, 0xea, 0xca, 0x89, 0xf8, 0x82, 0x03, 0x91, 0x6b, 0xef, 0xe8, 0x74, 0x4a, 0x34, 0xeb, 0xfc, 0x82, 0xd4, 0xab, 0xbb, 0x0d, 0x01, 0x7d, 0x87, 0xbf, 0x9c, 0x88, 0x78, 0xa2, 0xdb, 0x7e, 0x84, 0x22, 0xd7, 0xc7, 0x1f, 0x0c, 0x11, 0xe4, 0xea, 0xfe, 0x86, 0x42, 0xff, 0xe2, 0x10, 0x43, 0x61, 0x8a, 0xa2, 0xc3, 0x22, 0x18, 0x71, 0xbe, 0x17, 0x50, 0x3e, 0xd0, 0x4f, 0x33, 0x63, 0x31, 0x25, 0x6e, 0x5c, 0xd9, 0xac, 0x33, 0xc9, 0x28, 0xda, 0xbc, 0x89, 0xc6, 0xac, 0xd6, 0x64, 0x77, 0xf2, 0x35, 0x51, 0xee, 0xdc, 0x9a, 0x68, 0x67, 0xbc, 0xd4, 0x4f, 0x55, 0xc9, 0x30, 0x2a, 0x4a, 0x75, 0x23, 0xb5, 0x84, 0x2f, 0x03, 0xd9, 0x1a, 0xe2, 0xc8, 0xbb, 0xae, 0x95, 0xc9, 0xb1, 0xf4, 0xe7, 0xa2, 0x19, 0x13, 0xad, 0xd8, 0xcc, 0x0c, 0x9f, 0x75, 0xc9, 0xd4, 0x31, 0x6c, 0xfa, 0xb5, 0x5e, 0x57, 0xad, 0xe3, 0xad, 0xbc, 0x21, 0xc6, 0x42, 0xf5, 0x11, 0x4a, 0x48, 0x3d, 0x22, 0xf8, 0x91, 0x73, 0xbe, 0x51, 0x81, 0x1f, 0xd3, 0x44, 0xf9, 0x2a, 0xce, 0x34, 0x62, 0x8e, 0x1e, 0x3d, 0x57, 0x77, 0x8e, 0x7c, 0x12, 0x5b, 0x82, 0x97, 0x83, 0x9b, 0x91, 0x21, 0x8c, 0xde, 0xfa, 0x2b, 0xcc, 0xd0, 0x04, 0x2e, 0xe4, 0xaf, 0x05, 0x97, 0x22, 0x2d, 0x08, 0xf0, 0x2c, 0x5d, 0x41, 0xb8, 0xc6, 0x5e, 0xf1, 0x32, 0x4e, 0xa7, 0xc6, 0x71, 0xe4, 0x37, 0xb8, 0x3d, 0x70, 0xee, 0x96, 0xf6, 0x0b, 0x67, 0xd3, 0xb7, 0x60, 0x49, 0x17, 0x20, 0xec, 0x9a, 0xab, 0x38, 0x54, 0xd8, 0xdd, 0x6e, 0xd5, 0x43, 0xfd, 0x30, 0xfb, 0x9c, 0xdd, 0x2c, 0x38, 0xe3, 0x04, 0xed, 0x2d, 0x2f, 0x7a, 0x00, 0x87, 0xcf, 0x8e, 0xd4, 0x29, 0x2e, 0x55, 0xbc, 0x31, 0x03, 0xe9, 0x84, 0x97, 0x77, 0xca, 0x59, 0x4a, 0x4f, 0x4b, 0x51, 0x71, 0xc8, 0x3d, 0x28, 0x15, 0xd8, 0x83, 0xad, 0x19, 0x04, 0x70, 0x8e, 0xf8, 0xfc, 0xe3, 0x19, 0xa2, 0x54, 0x76, 0x32, 0xd1, 0xac, 0xdb, 0x20, 0x43, 0xfb, 0xbd, 0xfb, 0x34, 0x44, 0x67, 0xfc, 0x30, 0x69, 0xb4, 0x7a, 0x30, 0x0b, 0xf8, 0x89, 0xa9, 0x2f, 0x72, 0xc5, 0x48, 0x2e, 0x38, 0x76, 0xaa, 0x2b, 0xb3, 0xf8, 0xe4, 0xf5, 0xcb, 0x5f, 0xd7, 0xb9, 0x89, 0xfc, 0xf1, 0x2c, 0x6e, 0x68, 0xd8, 0x42, 0x7b, 0xb7, 0x36, 0xee, 0xe0, 0xff, 0x5f, 0x88, 0x58, 0x53, 0x37, 0x2e, 0xd5, 0x73, 0x21, 0x04, 0x59, 0x57, 0x68, 0xcd, 0xcb, 0xfa, 0x42, 0x3e, 0x77, 0x30, 0x0d, 0x7f, 0x5e, 0x38, 0x4c, 0xf2, 0x90, 0xac, 0x42, 0x6c, 0xc7, 0x5f, 0x3c, 0xc7, 0x82, 0x75, 0x61, 0xa8, 0xd3, 0xea, 0x09, 0x8a, 0xaa, 0xaf, 0x18, 0x22, 0x1b, 0x35, 0x4a, 0x30, 0x0d, 0x69, 0x0f, 0x4e, 0x6b, 0x48, 0xa3, 0x44, 0x50, 0xc4, 0xa8, 0x18, 0xc0, 0x1a, 0x53, 0xce, 0x84, 0x88, 0xab, 0x38, 0x1b, 0xc5, 0xe1, 0x6b, 0x23, 0x4e, 0x87, 0x6a, 0x71, 0xbd, 0x04, 0x7d, 0x0f, 0x6e, 0x3a, 0x62, 0x8d, 0xf7, 0x9d, 0xcc, 0x3d, 0xf4, 0x8e, 0xe3, 0xdc, 0x53, 0x75, 0x17, 0x56, 0xd0, 0x13, 0xe1, 0x35, 0x8a, 0x4f, 0xe0, 0xc9, 0xce, 0x2c, 0x50, 0x90, 0xbb, 0xbe, 0xd6, 0xf0, 0x75, 0xf3, 0x2e, 0xbc, 0xbd, 0x91, 0x34, 0xf5, 0x71, 0x12, 0x48, 0x91, 0x4d, 0xe2, 0x9b, 0xcb, 0x53, 0xdf, 0xa4, 0x87, 0xaf, 0x90, 0xc7, 0x8a, 0xad, 0x1a, 0xc6, 0x28, 0xd6, 0x12, 0x59, 0x8f, 0x31, 0x39, 0xf3, 0xb0, 0xb2, 0x7a, 0x43, 0xef, 0x69, 0x4e, 0xa9, 0x6e, 0xaf, 0x94, 0xbc, 0x10, 0x78, 0x60, 0x44, 0x54, 0x35, 0x7a, 0xfe, 0x36, 0x4a, 0xdd, 0xca, 0x55, 0x01, 0x55, 0xd7, 0x78, 0xcc, 0x7d, 0x4c, 0xeb, 0xd6, 0x0b, 0x81, 0x23, 0x33, 0x27, 0x2f, 0xaf, 0xfd, 0x8b, 0xf2, 0x59, 0x42, 0x77, 0x1e, 0xb7, 0x51, 0x58, 0xaf, 0xcf, 0x21, 0xd5, 0x8b, 0x04, 0x41, 0xb3, 0xc6, 0xb3, 0x8a, 0xf0, 0x07, 0xcb, 0x57, 0x80, 0xac, 0xb3, 0x4a, 0xfc, 0xb4, 0x55, 0x10, 0x5f, 0xc6, 0x21, 0xba, 0xfb, 0x52, 0x5a, 0xbb, 0x4f, 0x76, 0x35, 0x10, 0xa3, 0x7a, 0xff, 0x65, 0xe6, 0x43, 0x7a, 0xb6, 0x85, 0x35, 0x23, 0xa0, 0x9b, 0x22, 0x49, 0x04, 0x7c, 0x4a, 0xb2, 0xb0, 0x9e, 0x2b, 0xda, 0x4f, 0xf5, 0xac, 0xeb, 0x25, 0x71, 0x90, 0x9a, 0x47, 0xd7, 0xc1, 0x5c, 0x54, 0x2b, 0x10, 0xeb, 0x9f, 0xdd, 0x06, 0x80, 0xe0, 0x09, 0xd9, 0x34, 0x39, 0x5d, 0x94, 0x0d, 0x27, 0x99, 0xd4, 0x37, 0xba, 0xdf, 0xd4, 0x29, 0x1e, 0x15, 0x34, 0xe5, 0xe1, 0x72, 0x6b, 0x67, 0x3e, 0x7a, 0x1b, 0xd0, 0x42, 0x90, 0x91, 0x4a, 0xbe, 0x7d, 0x5c, 0xdb, 0x52, 0x4c, 0x59, 0xab, 0x9d, 0xa4, 0x2b, 0x8b, 0x9a, 0xb3, 0xf5, 0x3b, 0xa6, 0x30, 0xa9, 0x0a, 0x15, 0xb0, 0xa9, 0xd8, 0x86, 0x8e, 0x37, 0xf5, 0xbe, 0x0d, 0xb2, 0x59, 0x86, 0x3b, 0xf0, 0xec, 0xd0, 0xcb, 0x3c, 0x25, 0x10, 0xa6, 0x13, 0x0a, 0x82, 0xc8, 0xc4, 0x6a, 0xc3, 0x91, 0xdb, 0x46, 0x9a, 0x70, 0xc5, 0x58, 0xca, 0x4d, 0x84, 0x48, 0x48, 0x69, 0xc8, 0x9c, 0x17, 0xe3, 0x10, 0x1a, 0xba, 0x0e, 0x80, 0x75, 0x1f, 0xc3, 0xf9, 0x88, 0x93, 0xf6, 0x6d, 0x18, 0x9c, 0x93, 0xe8, 0xa0, 0x44, 0xef, 0x32, 0x03, 0xdd, 0xc0, 0x6b, 0xf7, 0x1c, 0x2c, 0x3f, 0x2f, 0xaa, 0x95, 0x5c, 0x2f, 0xd9, 0x3c, 0xeb, 0xc3, 0xd4, 0x22, 0x41, 0x20, 0x95, 0xf7, 0x50, 0xdc, 0x29, 0x54, 0x64, 0xbf, 0x1c, 0x3e, 0x21, 0x88, 0x74, 0xb9, 0x1c, 0x63, 0x2d, 0x7c, 0xe3, 0x91, 0xe5, 0x0e, 0xee, 0xae, 0xbf, 0x16, 0xeb, 0x4c, 0xa0, 0x3a, 0xa2, 0xab, 0xec, 0x3b, 0x7c, 0x9f, 0xe4, 0x82, 0xf8, 0xae, 0x3e, 0x0a, 0xab, 0x3b, 0xba, 0x7a, 0xc6, 0x5b, 0x98, 0x6c, 0x65, 0x7a, 0xcb, 0x8c, 0x98, 0x93, 0x76, 0x00, 0xc6, 0x2b, 0xcf, 0x52, 0x71, 0xec, 0x85, 0x29, 0xa0, 0xbc, 0xe3, 0xfc, 0xa3, 0x4a, 0xd0, 0x71, 0xe0, 0x13, 0x54, 0xbb, 0x1d, 0xb1, 0xe4, 0xfe, 0xd8, 0x97, 0xb0, 0x76, 0xa2, 0x7b, 0x8f, 0x47, 0xec, 0xa2, 0xdf, 0xa2, 0xb4, 0xf4, 0xee, 0x6c, 0x8d, 0x0d, 0x81, 0x6b, 0x36, 0x9b, 0x09, 0xd0, 0xb6, 0x80, 0x05, 0x93, 0x5d, 0x64, 0x99, 0xf5, 0xeb, 0xa1, 0xce, 0x57, 0xc4, 0x4a, 0x2c, 0x41, 0x7d, 0xd1, 0x58, 0x48, 0x40, 0x46, 0x70, 0xf2, 0x89, 0x56, 0xcc, 0x3d, 0xdf, 0xb1, 0x92, 0xb1, 0x6f, 0x9b, 0x2a, 0x39, 0xb8, 0xa9, 0xc8, 0x6b, 0x03, 0xf8, 0x21, 0x85, 0xf4, 0x59, 0x54, 0xb4, 0x92, 0xa4, 0xb5, 0x8d, 0x13, 0xf7, 0x4e, 0xfb, 0xc4, 0x56, 0x50, 0xc6, 0xe0, 0xcf, 0x17, 0x7e, 0x13, 0x3b, 0xfd, 0x94, 0x37, 0xbb, 0xc1, 0x8a, 0x59, 0x13, 0x6f, 0x02, 0xfe, 0x3e, 0xea, 0xff, 0x9b, 0x40, 0xed, 0xe3, 0x35, 0x77, 0x6a, 0x2b, 0x18, 0xab, 0xce, 0xea, 0x36, 0xfb, 0x68, 0x00, 0xba, 0xf1, 0xaa, 0xc6, 0x19, 0x9d, 0x9f, 0x8a, 0x90, 0xa5, 0xc1, 0xd5, 0xb5, 0x62, 0xdd, 0x39, 0xa4, 0x4c, 0x71, 0x0c, 0x4e, 0x7d, 0x23, 0xaf, 0x55, 0x87, 0x7f, 0x07, 0xf7, 0x31, 0x87, 0x75, 0xb6, 0x9f, 0x9f, 0x28, 0xa2, 0x54, 0xa8, 0x21, 0x06, 0x47, 0x3f, 0xbf, 0x29, 0x26, 0x3f, 0x9a, 0x4c, 0x2b, 0x15, 0x28, 0xb1, 0x3a, 0xc2, 0x2d, 0xda, 0x28, 0x52, 0xbb, 0x58, 0x6e, 0x96, 0xa3, 0x50, 0xe3, 0xd0, 0x5c, 0xe1, 0xd6, 0x98, 0xa5, 0x2e, 0xbb, 0x33, 0x9f, 0xd8, 0x55, 0x37, 0x85, 0x99, 0xd9, 0x49, 0x31, 0xe0, 0xfe, 0xbb, 0x9a, 0x8d, 0x01, 0x09, 0x52, 0x38, 0xac, 0xe6, 0x56, 0x6d, 0x8b, 0x16, 0x32, 0x96, 0xce, 0xac, 0x8e, 0x94, 0xfc, 0xf7, 0xd8, 0x4e, 0x56, 0x16, 0xea, 0xf3, 0x94, 0xf1, 0xe6, 0xa7, 0xf8, 0x30, 0xbc, 0x26, 0x58, 0x6b, 0x72, 0x92, 0xe1, 0x06, 0x8c, 0x41, 0x1f, 0x78, 0x8d, 0xca, 0x4f, 0x76, 0xff, 0x46, 0xe2, 0x18, 0xe0, 0xac, 0x7c, 0x0e, 0x46, 0x91, 0x59, 0x2c, 0x20, 0x42, 0x24, 0x70, 0xa8, 0x3d, 0x35, 0xfe, 0xae, 0x06, 0x9f, 0xc0, 0x62, 0x20, 0x6e, 0xcb, 0x5c, 0xe3, 0xcd, 0x7c, 0x8b, 0xbd, 0x1d, 0xe6, 0x67, 0x0e, 0x6e, 0xf1, 0xb3, 0x9b, 0xf2, 0xd0, 0x68, 0x1c, 0x7c, 0x34, 0x6f, 0xa1, 0x0c, 0x03, 0x75, 0x9d, 0x9d, 0x0d, 0x11, 0xc7, 0x32, 0x60, 0x3c, 0x44, 0x0e, 0x8d, 0x4e, 0xa8, 0x90, 0xc7, 0x6b, 0x2a, 0x37, 0x7f, 0x9c, 0x8b, 0x27, 0xe9, 0xde, 0xb4, 0xe4, 0x1a, 0xe9, 0x4f, 0x6b, 0x03, 0x0e, 0x4a, 0xb4, 0x03, 0x35, 0x58, 0x6b, 0xf4, 0x44, 0x19, 0x45, 0xc7, 0xb6, 0xca, 0x4a, 0xe6, 0xc3, 0x77, 0x81, 0x74, 0x19, 0x66, 0x7b, 0xdf, 0x38, 0x5e, 0x9a, 0x44, 0xef, 0xf7, 0x30, 0x84, 0x11, 0xb6, 0x1e, 0xd8, 0xd1, 0x0e, 0x9c, 0x7c, 0x56, 0x86, 0xc4, 0xa9, 0x0f, 0x68, 0x1c, 0xfc, 0x7d, 0x08, 0xf7, 0x0b, 0x96, 0x32, 0xee, 0x77, 0xdd, 0xdd, 0xed, 0x79, 0x0c, 0x77, 0x0f, 0x7c, 0x87, 0xae, 0xbe, 0x3a, 0x8c, 0xcd, 0x68, 0x55, 0xa3, 0xc2, 0xca, 0x88, 0x19, 0x01, 0xa2, 0x25, 0x11, 0x1b, 0x5b, 0x3b, 0xad, 0xe6, 0x46, 0xe0, 0xac, 0xc6, 0xca, 0x58, 0x7f, 0xd1, 0x04, 0xa1, 0x45, 0x65, 0xff, 0x45, 0x2e, 0x68, 0xef, 0xcf, 0x2f, 0x20, 0x65, 0xaa, 0x86, 0x23, 0x2a, 0xa9, 0x42, 0xcd, 0x98, 0xd7, 0x09, 0x79, 0xff, 0xbb, 0xb3, 0x7e, 0x93, 0x51, 0x8a, 0x01, 0xcd, 0x19, 0xad, 0xd3, 0xb3, 0xf8, 0x07, 0xea, 0x58, 0xed, 0xe7, 0x96, 0x0a, 0xf7, 0x0c, 0x10, 0xf4, 0x51, 0xb9, 0xa9, 0x4e, 0x2e, 0x6a, 0xd4, 0x05, 0x11, 0x6d, 0xab, 0xf4, 0xc5, 0x0f, 0xc9, 0xa9, 0x86, 0xe5, 0x4e, 0x05, 0xcb, 0xab, 0xea, 0x01, 0x68, 0x1a, 0xd4, 0x21, 0x0f, 0x61, 0x08, 0x65, 0x98, 0xac, 0x22, 0xc6, 0xd5, 0x01, 0x04, 0xfc, 0x2f, 0x5f, 0xf7, 0x55, 0x21, 0x23, 0x90, 0xb7, 0xf9, 0x3e, 0x3a, 0x47, 0x8b, 0x60, 0x60, 0x13, 0x09, 0x92, 0xd1, 0xe3, 0x5c, 0x03, 0x42, 0xad, 0xc4, 0x24, 0x35, 0x02, 0xc5, 0x86, 0xbc, 0x62, 0x13, 0x43, 0x31, 0xa0, 0x93, 0x83, 0x3c, 0xe1, 0x11, 0x36, 0x15, 0xa7, 0x30, 0x7d, 0x9b, 0x28, 0x36, 0x79, 0x16, 0xf8, 0xfd, 0xd0, 0x9e, 0x61, 0x40, 0x10, 0x52, 0xa0, 0x3b, 0x2f, 0xe8, 0x92, 0x7d, 0x5d, 0x73, 0x96, 0xb9, 0xfc, 0xcb, 0x93, 0x49, 0xcb, 0xc1, 0xa5, 0x25, 0xb6, 0x7b, 0x2e, 0x76, 0x14, 0xb3, 0x42, 0x80, 0xf7, 0xdb, 0xfe, 0xf0, 0x44, 0x42, 0x35, 0xd7, 0x78, 0x14, 0x2c, 0x06, 0x73, 0xa2, 0x9a, 0x50, 0xaf, 0x5c, 0x11, 0x56, 0x6c, 0x99, 0x27, 0x85, 0xad, 0x29, 0x06, 0x28, 0x5f, 0x32, 0xd1, 0x3b, 0x08, 0x24, 0xdf, 0x78, 0x7d, 0xeb, 0x4f, 0x18, 0x66, 0x14, 0xab, 0x5e, 0x25, 0x03, 0x79, 0xd4, 0x96, 0x9f, 0x47, 0xe0, 0x94, 0x57, 0x27, 0x3a, 0xd1, 0x17, 0x1e, 0xa4, 0x58, 0x9f, 0x81, 0x06, 0x77, 0x45, 0xbc, 0x3a, 0x0a, 0x21, 0x11, 0x91, 0xa1, 0xf9, 0x0d, 0xd3, 0xfb, 0xb0, 0x94, 0x43, 0xee, 0x0c, 0xed, 0x73, 0x13, 0xb1, 0x1b, 0x1a, 0xd7, 0xd8, 0xbe, 0xc3, 0xe2, 0xde, 0x2b, 0x48, 0x77, 0xaa, 0x8e, 0x41, 0x69, 0x55, 0x37, 0xec, 0x65, 0xf2, 0x28, 0xf1, 0xcd, 0x31, 0xf8, 0xe5, 0x12, 0x01, 0xf6, 0x96, 0xd2, 0x68, 0x94, 0x22, 0xd0, 0x5b, 0x02, 0xf7, 0x58, 0x5d, 0x29, 0x35, 0xc8, 0xba, 0xeb, 0xf1, 0x79, 0x85, 0x35, 0x90, 0x78, 0x85, 0xd9, 0xe7, 0xd4, 0xa3, 0x80, 0x81, 0x76, 0x32, 0xb1, 0x0a, 0xfc, 0x75, 0xd9, 0x89, 0x87, 0x53, 0x4d, 0xf2, 0x98, 0x69, 0x81, 0xc3, 0xf9, 0x19, 0x61, 0xd2, 0x88, 0xf8, 0x62, 0xf7, 0x24, 0xf7, 0x27, 0x77, 0x51, 0x96, 0x83, 0x85, 0x86, 0xe9, 0xdc, 0x8e, 0xb6, 0x8f, 0xef, 0x35, 0xff, 0xa9, 0xe3, 0x34, 0x29, 0x6e, 0x3b, 0x94, 0x5a, 0xf6, 0x7b, 0x17, 0x76, 0x7a, 0x5b, 0xde, 0x2b, 0x09, 0xf1, 0x33, 0x5d, 0x74, 0xe4, 0x62, 0x99, 0xdb, 0x7a, 0x4b, 0xc3, 0xdc, 0x7c, 0x26, 0x72, 0xbe, 0x66, 0x11, 0xde, 0xcf, 0xdc, 0xed, 0x3c, 0x06, 0x51, 0xae, 0x51, 0x39, 0x68, 0x72, 0x00, 0x87, 0x1a, 0x97, 0x19, 0x61, 0x56, 0xe6, 0x1d, 0x8b, 0x47, 0xb2, 0x82, 0x19, 0x7d, 0xe3, 0x0f, 0xbc, 0xab, 0x72, 0xdc, 0x5d, 0x32, 0x71, 0x5e, 0xcc, 0x96, 0x3d, 0x2b, 0x02, 0x57, 0x34, 0x84, 0xfc, 0x3f, 0x81, 0xb6, 0x94, 0xca, 0x93, 0xef, 0x5b, 0x94, 0x0e, 0xc0, 0xaf, 0xb7, 0x57, 0x62, 0x31, 0x0e, 0x01, 0x8d, 0xef, 0x50, 0x12, 0x96, 0xca, 0xc7, 0x4b, 0x0f, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x14, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x33, 0xc2, 0x90, 0xa3, 0x43, 0x52, 0x20, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0xd7, 0x18, 0xa6, 0xad, 0x12, 0x6a, 0x1a, 0xaa, 0xe9, 0xfb, 0x77, 0x1a, 0x30, 0x10, 0x87, 0x2d, 0xaa, 0x12, 0x77, 0x0a, 0x87, 0x16, 0x82, 0x84, 0xc6, 0x2b, 0xc0, 0x05, 0x5f, 0xfd, 0x4c, 0x34, 0xd3, 0x24, 0xde, 0x70, 0xd4, 0xaa, 0x4f, 0x07, 0x56, 0x02, 0xca, 0xe5, 0xb1, 0x3d, 0xfa, 0x58, 0xbf, 0x2b, 0x08, 0x68, 0x8d, 0x6d, 0x9f, 0x2e, 0x81, 0x52, 0x95, 0xba, 0xcf, 0x71, 0xb3, 0xe2, 0xe9, 0x11, 0xce, 0x92, 0x3a, 0xab, 0x95, 0x92, 0x40, 0xb8, 0x35, 0xc0, 0x18, 0x0c, 0xff, 0x41, 0x16, 0x53, 0x0a, 0xe2, 0x36, 0xd8, 0x4c, 0x4e, 0xb3, 0x93, 0x88, 0xac, 0x8a, 0xcd, 0x23, 0xa5, 0xb7, 0x1b, 0x1c, 0x28, 0x91, 0x74, 0x1a, 0x86, 0x9a, 0xcb, 0x1b, 0x8d, 0xc4, 0x00, 0xf1, 0x30, 0x95, 0xa3, 0x36, 0x25, 0xd6, 0x07, 0x6b, 0x41, 0x23, 0xdc, 0x6b, 0x0b, 0xd3, 0x02, 0x7c, 0xd2, 0xfc, 0x03, 0xf6, 0xaa, 0xf6, 0x49, 0xc9, 0x8a, 0x45, 0x19, 0xc7, 0xf9, 0x96, 0x06, 0xc2, 0xe6, 0x6e, 0x2e, 0x1e, 0xbc, 0x49, 0x68, 0xa8, 0x37, 0x57, 0x7a, 0xeb, 0x09, 0x52, 0xd4, 0x1c, 0x8a, 0xe1, 0x09, 0x53, 0xe9, 0x93, 0x82, 0x96, 0xe7, 0x0a, 0x8b, 0x03, 0x63, 0x9a, 0x24, 0x96, 0xd0, 0xfc, 0x33, 0xe0, 0xdc, 0x77, 0x41, 0x1d, 0xd5, 0x1f, 0x1b, 0x05, 0x16, 0x1e, 0x31, 0x4f, 0xdf, 0x3c, 0xa6, 0x26, 0xc3, 0x4f, 0xef, 0x13, 0x3a, 0x39, 0x72, 0x18, 0x9b, 0x8e, 0x54, 0x77, 0x69, 0xf9, 0x71, 0x4a, 0x3e, 0x01, 0x19, 0x59, 0x8d, 0xe5, 0x3b, 0x45, 0xe4, 0xb1, 0x2a, 0xa7, 0xc8, 0x17, 0xb3, 0xd5, 0x9b, 0x75, 0xd5, 0xab, 0x03, 0x36, 0x11, 0xf7, 0xab, 0x75, 0xf3, 0x60, 0x4a, 0xc3, 0x5a, 0xed, 0xd4, 0x27, 0xfb, 0x1b, 0xc5, 0xce, 0x33, 0x5b, 0x76, 0x54, 0x8d, 0xe8, 0x00, 0xc9, 0xa7, 0x20, 0x4b, 0xc8, 0x1d, 0x67, 0xe8, 0xdd, 0x07, 0x47, 0x8d, 0x5c, 0xd9, 0xb3, 0x7d, 0xf7, 0x02, 0x64, 0x50, 0x89, 0xae, 0x89, 0x41, 0x65, 0x09, 0xa3, 0x86, 0x28, 0x38, 0xf0, 0x56, 0x19, 0x11, 0x0a, 0x6c, 0x8d, 0x0c, 0x1f, 0x3c, 0x3b, 0x83, 0x22, 0xd3, 0x1d, 0x8d, 0xab, 0x22, 0x13, 0xad, 0x7a, 0x82, 0x27, 0x66, 0x97, 0x02, 0x80, 0xc1, 0xa0, 0x29, 0xcc, 0x71, 0x1f, 0x34, 0xe6, 0x9f, 0x9e, 0x35, 0xb2, 0x5e, 0x78, 0x52, 0xa9, 0x23, 0xac, 0x23, 0xd5, 0x6b, 0x69, 0x2e, 0xa8, 0xdd, 0x3e, 0x33, 0x62, 0x99, 0x6d, 0x1f, 0xa1, 0xfb, 0xd4, 0x8f, 0xb7, 0xba, 0x05, 0x9b, 0x74, 0x36, 0x44, 0xa8, 0xe3, 0x4e, 0xfe, 0xba, 0x9f, 0x63, 0x10, 0x2f, 0x96, 0xfa, 0x9b, 0xec, 0x87, 0x41, 0x05, 0xc4, 0x41, 0xf4, 0x81, 0x02, 0xc8, 0x6e, 0x30, 0x81, 0x8b, 0xfa, 0x67, 0x55, 0x8a, 0xed, 0xa6, 0x6c, 0xd7, 0x66, 0xad, 0x15, 0x2b, 0x00, 0xbc, 0x69, 0x04, 0x4b, 0x7d, 0x81, 0x3e, 0x80, 0xed, 0x0a, 0xb2, 0x68, 0x88, 0xc5, 0x56, 0x32, 0x7c, 0x4c, 0xb2, 0x0f, 0xef, 0xfe, 0x3c, 0x1b, 0x6e, 0xfe, 0x28, 0x08, 0x2c, 0x71, 0x48, 0xaf, 0x4a, 0xe0, 0xb6, 0x42, 0x9e, 0x0b, 0x9e, 0xce, 0x8e, 0xed, 0x58, 0x8b, 0x50, 0x63, 0xd0, 0x2e, 0x66, 0x04, 0x7f, 0xc8, 0xea, 0xb4, 0x38, 0xc5, 0x76, 0xe6, 0xba, 0xb4, 0x17, 0xaa, 0x80, 0xd5, 0x64, 0x98, 0x50, 0x78, 0xa3, 0xce, 0x1d, 0x6d, 0x6f, 0xb4, 0x65, 0x7e, 0xd8, 0xd4, 0x17, 0xdf, 0x68, 0x0c, 0xf7, 0x56, 0xcf, 0xfa, 0x8a, 0xca, 0x5d, 0x1c, 0xa6, 0x72, 0x00, 0x39, 0xea, 0x79, 0xca, 0x4e, 0x63, 0x93, 0x51, 0x20, 0xbc, 0xea, 0xa4, 0x69, 0x05, 0xbd, 0xd4, 0xc1, 0xa4, 0xd4, 0xd0, 0xbd, 0x1a, 0x66, 0xc4, 0x4e, 0xbc, 0xca, 0xf7, 0x25, 0xd8, 0x9a, 0x42, 0x63, 0x7d, 0x15, 0x2f, 0xd1, 0x46, 0x63, 0xf3, 0xf9, 0x6a, 0x2e, 0x8f, 0x4e, 0xe5, 0xc2, 0x46, 0xee, 0x22, 0x93, 0x3b, 0x2c, 0x07, 0x5d, 0xfe, 0x7d, 0x8f, 0x75, 0x84, 0xbc, 0x22, 0x06, 0x58, 0x38, 0x76, 0x9e, 0x8f, 0x71, 0xbe, 0x07, 0x16, 0x61, 0xff, 0x25, 0x64, 0x7f, 0x32, 0x84, 0x88, 0xe1, 0xd2, 0xb1, 0x1e, 0xd6, 0xba, 0x24, 0x0c, 0x72, 0xbf, 0xf3, 0x7a, 0xa1, 0xfe, 0x76, 0x65, 0xab, 0xaa, 0x27, 0xfb, 0x68, 0x1e, 0x67, 0x59, 0x75, 0xec, 0x6d, 0x8d, 0x68, 0xe3, 0xb3, 0x42, 0x20, 0x3a, 0x76, 0x65, 0xa5, 0x7e, 0xd2, 0xca, 0x62, 0xb2, 0x7e, 0xe0, 0x24, 0xae, 0x2d, 0x3b, 0x2a, 0x89, 0xc2, 0xf0, 0xc2, 0xc8, 0x66, 0xb8, 0xbe, 0xfb, 0x53, 0x89, 0x2f, 0x1f, 0x2c, 0xda, 0x5c, 0x02, 0x50, 0x7a, 0x11, 0x6f, 0x64, 0x52, 0xd5, 0x53, 0x8f, 0x9a, 0xa9, 0x0f, 0x30, 0xfa, 0xee, 0x5c, 0x68, 0xd6, 0x6f, 0x5f, 0xb7, 0x95, 0xd9, 0xa9, 0x1b, 0x62, 0x51, 0xd2, 0xf8, 0x99, 0x7a, 0x6c, 0xb5, 0xe1, 0x27, 0x4b, 0x06, 0xed, 0xbc, 0x18, 0x25, 0x21, 0xe5, 0x62, 0x5e, 0x15, 0xb8, 0x14, 0x24, 0xb1, 0xd1, 0x40, 0x1f, 0x36, 0xf7, 0x8d, 0xa6, 0xb2, 0xfd, 0xb2, 0x07, 0x2c, 0xbe, 0x05, 0x4d, 0x75, 0x72, 0xbc, 0xf1, 0xbc, 0xc9, 0x0c, 0xc2, 0x8c, 0xa0, 0x70, 0x63, 0x14, 0xe2, 0xec, 0x7e, 0x6c, 0xf6, 0xbb, 0xb5, 0x40, 0x53, 0xda, 0x97, 0x27, 0x21, 0xb0, 0x46, 0x48, 0x59, 0x35, 0xd2, 0x98, 0xb0, 0x84, 0x03, 0x3d, 0xe6, 0x0f, 0xb5, 0xf0, 0x5d, 0xa6, 0xc0, 0xcd, 0xf3, 0x75, 0x02, 0xda, 0xce, 0x20, 0x06, 0x12, 0x15, 0xac, 0xe0, 0xae, 0xe8, 0x06, 0x1c, 0x8d, 0x4c, 0x96, 0xca, 0x03, 0x45, 0x74, 0xc1, 0x02, 0x96, 0xe1, 0xeb, 0x8f, 0xc4, 0xb2, 0xe7, 0xae, 0xd8, 0xbe, 0x52, 0x9b, 0x0f, 0xa5, 0xf9, 0x4e, 0x27, 0xab, 0x96, 0xc9, 0x27, 0xed, 0x89, 0xd0, 0x3c, 0x45, 0xa5, 0x18, 0xe3, 0x4c, 0xc6, 0x99, 0x9d, 0xe9, 0x9b, 0x83, 0x56, 0x16, 0x5d, 0x3a, 0x21, 0x82, 0x19, 0x48, 0x6c, 0x73, 0x3f, 0x0d, 0xf0, 0x3e, 0xce, 0x86, 0x70, 0x0c, 0x22, 0xdb, 0x7d, 0x0e, 0x5b, 0x35, 0x98, 0x73, 0x7a, 0x33, 0x94, 0xf9, 0x78, 0xd8, 0xee, 0x5e, 0x99, 0xb0, 0x8b, 0xd3, 0x42, 0x46, 0x6e, 0x93, 0x1b, 0x25, 0xa8, 0x14, 0xa8, 0x7d, 0xc4, 0x7b, 0x01, 0xc1, 0x01, 0xdd, 0x05, 0x57, 0x4b, 0x2a, 0x74, 0xda, 0x2e, 0x04, 0x58, 0x10, 0x34, 0xd1, 0x0e, 0xaa, 0xca, 0x24, 0x66, 0x91, 0x17, 0xec, 0xca, 0xab, 0xb7, 0x6d, 0xa2, 0x35, 0xad, 0x0d, 0x60, 0xd3, 0x36, 0xbd, 0x63, 0x40, 0x8b, 0xd7, 0xad, 0x42, 0x17, 0xe8, 0xda, 0xc6, 0x27, 0x72, 0xcc, 0x78, 0x18, 0x8e, 0x66, 0x20, 0xc8, 0x84, 0x86, 0x5d, 0x59, 0x20, 0x3e, 0x7c, 0x08, 0x7e, 0x66, 0xaf, 0x9b, 0x38, 0x3e, 0x34, 0x4b, 0x33, 0xa7, 0xf1, 0xce, 0x27, 0x04, 0x6d, 0xc1, 0x2f, 0xa7, 0x85, 0xa7, 0x96, 0x84, 0x42, 0xb0, 0x73, 0x70, 0xd1, 0xe5, 0xa1, 0xbf, 0xec, 0x65, 0xce, 0xe8, 0x50, 0x2e, 0x2d, 0x61, 0xca, 0xb6, 0x7d, 0xb5, 0x4e, 0x48, 0x20, 0xc8, 0x80, 0x52, 0x5e, 0xca, 0xfb, 0xc4, 0x1b, 0xdb, 0x4e, 0x46, 0xcc, 0x49, 0xe6, 0xef, 0xb5, 0xde, 0x99, 0xdb, 0x65, 0x74, 0x05, 0xe3, 0x47, 0xa1, 0xd6, 0x7a, 0xed, 0x91, 0xd6, 0xe3, 0x81, 0x27, 0x50, 0x0d, 0x41, 0xc1, 0xf5, 0x93, 0x25, 0x2b, 0x6c, 0xa9, 0x36, 0xd2, 0xe7, 0x1e, 0xe0, 0xa9, 0x95, 0x68, 0xfd, 0xa7, 0xb9, 0xe1, 0x81, 0x95, 0xd0, 0x8c, 0xce, 0x12, 0x6c, 0xe0, 0x29, 0x6f, 0xee, 0x33, 0xde, 0x46, 0x64, 0xa9, 0x72, 0x82, 0x03, 0x1d, 0x1e, 0xdd, 0x9f, 0x1c, 0x5c, 0x39, 0xc8, 0xc3, 0x16, 0x9c, 0xf6, 0xb3, 0x7b, 0xec, 0x86, 0xb9, 0xe9, 0xe1, 0x4e, 0xb1, 0x14, 0xfd, 0x9c, 0x26, 0xb3, 0x81, 0x25, 0xab, 0x4c, 0x25, 0xd3, 0xa2, 0x63, 0x77, 0x0f, 0xf5, 0x26, 0xc5, 0x14, 0x0c, 0x53, 0x35, 0xa7, 0x7d, 0xa0, 0xce, 0x4e, 0x04, 0x97, 0x77, 0x4c, 0x74, 0x6a, 0xf3, 0xeb, 0xdd, 0xae, 0x27, 0xfc, 0xf7, 0xd0, 0x21, 0xea, 0x46, 0x36, 0x22, 0x84, 0x9d, 0x8c, 0x0c, 0xef, 0x87, 0x0c, 0xac, 0x3a, 0xcc, 0x76, 0xf3, 0xe0, 0xac, 0x7d, 0x01, 0x93, 0x1a, 0x2d, 0x42, 0x99, 0xf3, 0x46, 0xc6, 0xa5, 0x87, 0x9a, 0x44, 0xa4, 0x29, 0xa2, 0xb3, 0x5c, 0x80, 0x10, 0xd4, 0xb7, 0x35, 0x58, 0xc0, 0xd2, 0x65, 0x14, 0x28, 0x4c, 0x95, 0x6e, 0x9b, 0x33, 0x6c, 0x9a, 0xf5, 0x8b, 0x33, 0x92, 0xae, 0x89, 0x53, 0xc5, 0x08, 0x62, 0xbd, 0x57, 0x72, 0xad, 0xb9, 0x35, 0x2c, 0xe5, 0xf6, 0xa4, 0x70, 0xeb, 0xd1, 0xb9, 0x6c, 0x58, 0x1a, 0x12, 0xf5, 0x55, 0xb9, 0x95, 0x69, 0x22, 0xcf, 0x58, 0x88, 0xd2, 0x3f, 0x1f, 0x1d, 0xca, 0x90, 0x5e, 0x73, 0xce, 0x9d, 0xd6, 0x8b, 0x74, 0xa6, 0xb2, 0xe2, 0x62, 0x64, 0xa0, 0xa6, 0xc4, 0xfe, 0xf7, 0x4b, 0x07, 0x37, 0xd2, 0xe3, 0xd3, 0xe1, 0xc3, 0x92, 0xd0, 0x7c, 0x1c, 0x93, 0x08, 0xd9, 0xc5, 0x76, 0xeb, 0x45, 0x58, 0x3f, 0xf4, 0x2c, 0xab, 0xca, 0x93, 0x5c, 0x6c, 0x75, 0xed, 0x1e, 0xa1, 0x15, 0xc5, 0xfa, 0x22, 0xbd, 0x40, 0x6b, 0x96, 0xae, 0xa3, 0x4c, 0x49, 0xee, 0xb9, 0xd7, 0x85, 0x53, 0x24, 0x11, 0x86, 0x43, 0x18, 0x9b, 0x3c, 0x00, 0x89, 0x48, 0x73, 0x5c, 0x91, 0x1b, 0x80, 0x9a, 0x19, 0x0e, 0x19, 0x35, 0x95, 0x51, 0x88, 0xfe, 0xe9, 0x2c, 0x59, 0xdd, 0x95, 0x19, 0xe6, 0x71, 0xa8, 0x84, 0x66, 0x2c, 0xee, 0xc0, 0xa7, 0x4b, 0x9d, 0xef, 0xbf, 0xa5, 0x11, 0x0f, 0xb7, 0xa8, 0x38, 0xb6, 0x4c, 0x1c, 0x93, 0x3d, 0x00, 0x32, 0xb2, 0x4b, 0xb4, 0x7d, 0xf7, 0xb0, 0xab, 0xdb, 0xc0, 0xb0, 0xb1, 0x71, 0x2c, 0xd7, 0x83, 0x2e, 0xe8, 0x88, 0x3b, 0x01, 0xb2, 0xe1, 0x36, 0xcf, 0xca, 0xea, 0x6f, 0xd8, 0x09, 0xa7, 0x6d, 0x61, 0x99, 0x29, 0x35, 0x46, 0xc7, 0xf2, 0x0d, 0xf6, 0xd0, 0x4b, 0x4e, 0x8f, 0x66, 0x58, 0x31, 0x0b, 0x0b, 0x74, 0xbc, 0x31, 0x3d, 0x35, 0x7d, 0x54, 0x3f, 0x13, 0x47, 0x24, 0xb9, 0xea, 0x94, 0x48, 0x4c, 0x3c, 0xdc, 0xb1, 0x97, 0x0f, 0xbe, 0x74, 0x07, 0xe1, 0x80, 0x98, 0x6c, 0xd4, 0xc5, 0xd1, 0xe9, 0x7e, 0x00, 0xf1, 0x79, 0x26, 0x2e, 0xdc, 0x90, 0x91, 0xb1, 0x44, 0x7e, 0xa4, 0x8f, 0x48, 0xe8, 0xea, 0xbf, 0x39, 0xfe, 0xb3, 0xb3, 0x60, 0xed, 0xfa, 0xc8, 0x89, 0x27, 0x16, 0x76, 0x58, 0x51, 0xcc, 0xa7, 0xf5, 0x24, 0x8a, 0xaa, 0x0d, 0x19, 0x36, 0x92, 0x66, 0x1b, 0xe9, 0x9f, 0xb7, 0x26, 0x12, 0xf2, 0xf5, 0x36, 0x33, 0x88, 0x5a, 0xa1, 0x54, 0x41, 0x69, 0x3b, 0x05, 0x46, 0x2d, 0x8c, 0x00, 0xc5, 0xf9, 0x67, 0x63, 0xba, 0x6f, 0x01, 0x4f, 0x4a, 0x82, 0x2f, 0x28, 0x35, 0xc8, 0x01, 0xce, 0x6f, 0xc8, 0x5a, 0xea, 0x24, 0x14, 0xeb, 0xf0, 0x69, 0x93, 0x50, 0xd9, 0x2b, 0x96, 0x8c, 0x5e, 0x75, 0x50, 0x92, 0xea, 0xcb, 0xcd, 0x38, 0x87, 0xdf, 0x0f, 0x21, 0x2c, 0x8c, 0x28, 0xdc, 0xc7, 0x94, 0x6a, 0x32, 0xe6, 0x67, 0xa0, 0x6b, 0x54, 0xf8, 0x10, 0x92, 0xa6, 0xc7, 0x55, 0xba, 0xc5, 0x82, 0xf8, 0x98, 0x96, 0x1f, 0x0a, 0x54, 0x86, 0xd9, 0x6c, 0xa7, 0xa8, 0x1f, 0x0d, 0x15, 0x54, 0x89, 0x10, 0xe5, 0xe5, 0xb5, 0xe2, 0x2c, 0x21, 0x0a, 0x70, 0x49, 0x43, 0x5f, 0xa5, 0xa2, 0xa9, 0x38, 0x4a, 0x93, 0x43, 0x5f, 0xfe, 0xd2, 0x8b, 0xfb, 0x56, 0x3d, 0x05, 0x2a, 0xd8, 0x74, 0x49, 0x15, 0x2b, 0xcb, 0xcb, 0xf0, 0x01, 0x54, 0x50, 0x9d, 0xed, 0x71, 0xcf, 0x19, 0x6d, 0x49, 0x68, 0xdc, 0x66, 0x33, 0xa9, 0x42, 0x6f, 0xe6, 0x0e, 0xd8, 0xd1, 0x4b, 0x22, 0x3a, 0x8c, 0xc0, 0x81, 0x5a, 0xc8, 0x64, 0x97, 0x18, 0x3d, 0xf8, 0xad, 0x3b, 0xec, 0x6f, 0x9a, 0x17, 0x90, 0x47, 0x38, 0x6a, 0xfe, 0x56, 0x80, 0x88, 0x6d, 0xfa, 0x00, 0xba, 0xda, 0x66, 0x45, 0x41, 0x06, 0x3e, 0xe0, 0x4b, 0xdc, 0x83, 0x59, 0x71, 0x16, 0x99, 0x6e, 0xc9, 0x41, 0xa3, 0x81, 0x3c, 0xf7, 0x18, 0x96, 0x6a, 0x24, 0x40, 0x6f, 0x3f, 0xbd, 0x6a, 0xe7, 0xba, 0x63, 0xff, 0xe8, 0x4b, 0x75, 0xc3, 0x54, 0xe6, 0xc8, 0xc8, 0x89, 0x29, 0x2e, 0x4a, 0xec, 0xf3, 0x2f, 0x6d, 0x84, 0x31, 0xc3, 0x22, 0x52, 0x62, 0xf6, 0xf3, 0x16, 0xe9, 0xcb, 0xe0, 0x68, 0xef, 0x75, 0x7a, 0x6d, 0x95, 0xdf, 0x84, 0x3a, 0xa0, 0x10, 0xf8, 0x7d, 0x1d, 0xda, 0x8d, 0x8a, 0x30, 0x18, 0xd5, 0x80, 0xd4, 0x4e, 0x05, 0xbc, 0x6d, 0x1f, 0x79, 0x3d, 0x83, 0x0a, 0x5a, 0x4f, 0x41, 0xb4, 0x46, 0xba, 0xcb, 0x0f, 0xd0, 0xc9, 0x87 }; +constexpr AccessUnit ATRACX_MULTIPLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 0, {}, { 0x78, 0x2c, 0xd2, 0xa4, 0x87, 0x7f, 0xa1, 0xcb, 0x57, 0xad, 0x86, 0x2b, 0xe4, 0xb7, 0xe1, 0xfc, 0xa1, 0xab, 0xb8, 0xc5 } }; +constexpr AccessUnit ATRACX_MULTIPLE_PACK_EXPECTED_AU_2 = { 0x2aefeae9, 0x778806c4, false, 0, {}, { 0x0e, 0x9b, 0x87, 0x06, 0x59, 0x9a, 0xe2, 0xb6, 0xf7, 0x53, 0xfc, 0x2d, 0x47, 0x60, 0xca, 0x7d, 0x52, 0xd1, 0xd4, 0x61 } }; +constexpr AccessUnit ATRACX_MULTIPLE_PACK_EXPECTED_AU_3 = { 0x15f90, 0x159b2, false, 0, {}, { 0x59, 0x1b, 0x5e, 0x0b, 0x45, 0xe7, 0x7d, 0xfb, 0x30, 0x15, 0xce, 0x9b, 0xc1, 0xea, 0xc7, 0x1c, 0xad, 0x4d, 0x3c, 0xe1 } }; +constexpr AccessUnit ATRACX_MULTIPLE_PACK_EXPECTED_AU_4 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x8c, 0xf7, 0x8f, 0x01, 0x95, 0x33, 0x90, 0xf4, 0xb6, 0x81, 0xcf, 0x8f, 0x9f, 0xd2, 0xf0, 0x9c, 0xd9, 0xae, 0xc1, 0xe4 } }; + +constexpr std::array AC3_MULTIPLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0xf3, 0xa6, 0x50, 0x0c, 0xe5, 0x05, 0x0e, 0x03, 0xb9, 0x70, 0x70, 0xf1, 0xfa, 0xac, 0xf5, 0xd7, 0x56, 0x65, 0xa2, 0x06, 0x5a, 0x45, 0xc1, 0x76, 0x51, 0xd2, 0xde, 0x1a, 0xcd, 0x4c, 0xa4, 0x7c, 0xb5, 0xaf, 0xc9, 0xc6, 0xd5, 0xd5, 0x4b, 0x35, 0x5b, 0x70, 0x38, 0xbb, 0xf4, 0x89, 0x9d, 0x5d, 0xa7, 0x5d, 0x05, 0x21, 0x84, 0x11, 0xf6, 0xdc, 0x83, 0x0a, 0x1b, 0xa7, 0x79, 0x16, 0xe5, 0xdc, 0x2a, 0x8e, 0x45, 0x86, 0xe5, 0x45, 0xdc, 0x0b, 0x77, 0x56, 0xd1, 0x5d, 0x71, 0x45, 0xf7, 0xb6, 0xbe, 0x24, 0xd4, 0x03, 0xce, 0xea, 0x38, 0xed, 0xc8, 0x79, 0xb8, 0x05, 0xbb, 0x49, 0x5c, 0x08, 0xbe, 0x2c, 0x9c, 0x06, 0xf2, 0x58, 0x04, 0x30, 0x62, 0x75, 0x45, 0x3e, 0xf8, 0xda, 0x1b, 0x63, 0x06, 0x96, 0x35, 0xc2, 0x03, 0xdc, 0x2a, 0x0c, 0xb9, 0x61, 0x06, 0x1f, 0x66, 0x46, 0xa1, 0xe5, 0x40, 0xba, 0xec, 0xf2, 0x4b, 0xdc, 0xab, 0xd3, 0xaa, 0xe0, 0xf4, 0x3a, 0xdd, 0x40, 0x0d, 0xfb, 0x6e, 0x2e, 0x79, 0x1c, 0xd4, 0xd0, 0x41, 0xd1, 0x3b, 0x26, 0x9e, 0x84, 0xc7, 0x3b, 0x94, 0x6a, 0x46, 0x67, 0xef, 0x5c, 0x96, 0x31, 0xa4, 0xea, 0xb8, 0xfa, 0x4d, 0x1b, 0xac, 0x8b, 0x4c, 0xe5, 0x90, 0xc7, 0xda, 0x98, 0x01, 0xcb, 0x2e, 0x86, 0x8f, 0xbe, 0xb5, 0x8a, 0x3e, 0x01, 0xad, 0xb9, 0x24, 0x7f, 0x7a, 0xb8, 0xe9, 0xb3, 0x64, 0xe0, 0xe1, 0x32, 0x40, 0xed, 0x30, 0x1c, 0x3a, 0x1b, 0x22, 0x86, 0xee, 0xf1, 0x7d, 0xbc, 0x2a, 0xd6, 0x2e, 0x01, 0x1b, 0x0d, 0xb0, 0x54, 0xdd, 0xe7, 0xbf, 0x64, 0x98, 0x4a, 0x48, 0x9e, 0x7c, 0x6e, 0x35, 0x04, 0x38, 0x5b, 0x7b, 0x18, 0xbd, 0x06, 0x51, 0x66, 0xe3, 0x1b, 0x61, 0xf4, 0x35, 0xbc, 0x4b, 0xbd, 0x67, 0x2d, 0x95, 0x55, 0x06, 0xb8, 0x20, 0xb3, 0xac, 0xdc, 0x1c, 0x2c, 0x5d, 0x3f, 0xf1, 0xb6, 0x6c, 0xdb, 0x81, 0x6c, 0xc3, 0xca, 0x03, 0x7e, 0x6a, 0x39, 0x53, 0x8e, 0xd0, 0xbe, 0xe3, 0x24, 0x45, 0x3a, 0x40, 0xd1, 0xba, 0x90, 0x61, 0x4d, 0xfe, 0x59, 0xfd, 0x90, 0x0d, 0x66, 0xe9, 0x79, 0x78, 0x5f, 0x52, 0xce, 0xf8, 0xc6, 0x6c, 0xeb, 0x83, 0x42, 0xba, 0xe2, 0x20, 0x93, 0x39, 0xa7, 0x3b, 0xfc, 0x7c, 0x6a, 0x44, 0xaa, 0x21, 0x76, 0xbb, 0xc2, 0x05, 0x7e, 0xfd, 0xc7, 0x0c, 0x9e, 0x1b, 0xf0, 0xa3, 0x09, 0x0d, 0xb8, 0xbe, 0x4a, 0x14, 0xa6, 0x1c, 0x8a, 0xf0, 0xf8, 0x8a, 0x63, 0x9a, 0xb6, 0x87, 0xd4, 0x40, 0xd9, 0x65, 0xa3, 0x14, 0xf2, 0x43, 0x75, 0x47, 0x0a, 0xb1, 0xf6, 0x8a, 0xa1, 0x5c, 0xe9, 0x44, 0xe6, 0x89, 0x6d, 0x94, 0xc3, 0x2b, 0xe4, 0x6e, 0xba, 0xb8, 0x3b, 0x40, 0xff, 0xa0, 0x9a, 0x32, 0x17, 0x35, 0x3c, 0xea, 0x5e, 0x7b, 0x43, 0x4e, 0x0e, 0x7c, 0xfd, 0x2a, 0x19, 0x3d, 0xf7, 0x88, 0xab, 0x64, 0xa8, 0x3b, 0xcd, 0x6b, 0x41, 0x09, 0x21, 0xa9, 0xe3, 0x0c, 0x20, 0x5a, 0xa5, 0xda, 0x0e, 0xb7, 0xb4, 0x4a, 0xe2, 0xef, 0x14, 0x38, 0xe3, 0xc0, 0xac, 0x0e, 0x24, 0xb3, 0xc4, 0xbe, 0x01, 0x9c, 0x61, 0xbf, 0x04, 0x85, 0xc2, 0x9b, 0x18, 0xea, 0x65, 0xf0, 0x3f, 0x1b, 0xba, 0xff, 0x40, 0x70, 0x46, 0x86, 0x74, 0x7b, 0x45, 0x5a, 0x36, 0x8f, 0x7c, 0xc6, 0x4a, 0xfd, 0x97, 0xa8, 0x13, 0x3e, 0xf1, 0xec, 0xe5, 0x88, 0x13, 0xfc, 0xc6, 0x0c, 0x4a, 0x14, 0xb3, 0xa4, 0x04, 0x97, 0x66, 0x8c, 0x9d, 0xb3, 0x65, 0x4e, 0x05, 0xf9, 0x33, 0x0d, 0x3f, 0xe8, 0x5f, 0x69, 0xf2, 0x2b, 0x6b, 0x1b, 0x8f, 0x81, 0xf7, 0xca, 0x06, 0xf4, 0xe4, 0x81, 0x1f, 0xa8, 0x20, 0x25, 0xc5, 0x48, 0x3c, 0xaa, 0xfb, 0x78, 0x01, 0x3c, 0xc4, 0x04, 0x46, 0x80, 0x57, 0x77, 0x2d, 0x64, 0x60, 0x8e, 0x60, 0x52, 0x5e, 0x9e, 0xc1, 0x3e, 0x22, 0x4d, 0xc8, 0x39, 0x76, 0x24, 0x11, 0x9a, 0x1f, 0xfc, 0xe7, 0x4f, 0x04, 0xfa, 0xed, 0x65, 0xca, 0x83, 0xc4, 0xfe, 0x30, 0xd8, 0xe5, 0x2c, 0x99, 0x5d, 0x2c, 0x86, 0xb8, 0xf2, 0x88, 0x3d, 0x2c, 0x84, 0xe2, 0x62, 0x94, 0xa6, 0x1a, 0x3f, 0xed, 0x56, 0x29, 0x18, 0x7b, 0x0b, 0x02, 0xa7, 0x3b, 0xe5, 0x48, 0xfe, 0xbf, 0xa6, 0xad, 0x55, 0x52, 0x1b, 0x50, 0x5a, 0xec, 0x4f, 0x1b, 0xa2, 0x09, 0x52, 0xc3, 0xbc, 0x8a, 0x6b, 0xb1, 0x8e, 0xd1, 0x44, 0xc4, 0x96, 0x21, 0xc0, 0x03, 0x04, 0xfd, 0x7f, 0x49, 0x0a, 0x66, 0x24, 0x58, 0x00, 0xb1, 0x1a, 0xbe, 0x91, 0x0c, 0x92, 0x9a, 0xe8, 0x53, 0x67, 0x08, 0xfc, 0xbf, 0xb0, 0x7c, 0xaa, 0x38, 0xf8, 0x03, 0x88, 0x44, 0xd0, 0xeb, 0x48, 0x08, 0xa4, 0x35, 0x17, 0x98, 0x7a, 0x12, 0xb2, 0x30, 0x8c, 0xa4, 0xbd, 0xa1, 0xf2, 0x19, 0x60, 0xd2, 0xa2, 0xb9, 0x7f, 0x2a, 0xbc, 0xc6, 0x8e, 0xbd, 0xa8, 0xc0, 0xcb, 0xb3, 0x57, 0xea, 0x67, 0x0e, 0xd2, 0xf8, 0x22, 0x93, 0x1e, 0x71, 0x0e, 0xb5, 0x08, 0x00, 0x74, 0xd3, 0x8a, 0x9c, 0xc6, 0xf5, 0x61, 0x31, 0x65, 0xb8, 0x1c, 0x31, 0xa0, 0xb6, 0x20, 0x1d, 0xf8, 0x5d, 0x50, 0xdd, 0xde, 0x0f, 0x41, 0xd9, 0x67, 0xac, 0xc2, 0x42, 0x65, 0x34, 0xb9, 0x8d, 0x02, 0x2c, 0x10, 0x33, 0x77, 0x25, 0x9d, 0xfc, 0x0c, 0x1b, 0xed, 0xe8, 0x21, 0x06, 0x33, 0xf5, 0xe8, 0xb9, 0x63, 0x9a, 0x89, 0x34, 0x1b, 0x4e, 0xb5, 0x0c, 0xbe, 0x10, 0xd1, 0x30, 0x30, 0x92, 0xef, 0x34, 0xf8, 0xcf, 0x61, 0x90, 0x29, 0x9b, 0x65, 0x64, 0x95, 0xac, 0xbe, 0xce, 0x24, 0x38, 0x1c, 0xa3, 0xd6, 0xf4, 0x7d, 0x7a, 0x47, 0x2e, 0xa4, 0x0d, 0x86, 0x6b, 0xd2, 0xa1, 0x7c, 0xce, 0x30, 0x37, 0xfa, 0x9b, 0x9e, 0xe2, 0xbe, 0x0f, 0xad, 0x0e, 0x43, 0xed, 0x5f, 0xa0, 0x9f, 0xae, 0xaf, 0x93, 0x5f, 0xcd, 0x44, 0xc5, 0xc7, 0x87, 0xaf, 0xc2, 0xda, 0x30, 0x50, 0x8d, 0x71, 0xda, 0x0c, 0x81, 0x16, 0x7a, 0xb3, 0xb9, 0xda, 0x49, 0x49, 0x3f, 0x46, 0xcd, 0x5f, 0xe6, 0xda, 0xa0, 0xf5, 0x76, 0x5d, 0x78, 0xeb, 0x9e, 0xdf, 0xf3, 0x59, 0x7c, 0x1a, 0x12, 0x54, 0x9b, 0xe9, 0x39, 0x4c, 0xe2, 0x89, 0xe6, 0x33, 0x96, 0xf9, 0xd7, 0xe8, 0x21, 0x9f, 0x20, 0x5c, 0xd8, 0xdb, 0x3d, 0xeb, 0x20, 0xc9, 0xa1, 0x42, 0xad, 0x54, 0xb7, 0xbd, 0x88, 0x13, 0x58, 0x11, 0x3c, 0xcc, 0x77, 0xae, 0xfe, 0xef, 0xea, 0xd5, 0x7b, 0x5f, 0xde, 0xf5, 0xbb, 0xd9, 0xbf, 0xea, 0x2c, 0x33, 0xca, 0xaa, 0xf2, 0x1e, 0x76, 0xbb, 0x52, 0x12, 0x00, 0xf7, 0xcb, 0xe1, 0x4a, 0x9b, 0x77, 0x25, 0xdf, 0xff, 0x4f, 0x5f, 0x26, 0x53, 0x76, 0x62, 0x0e, 0x9d, 0xe8, 0x04, 0x58, 0x4a, 0x41, 0x19, 0xe4, 0x21, 0x70, 0xe6, 0xd1, 0xef, 0x43, 0x45, 0x36, 0x6d, 0xf9, 0x66, 0xa3, 0x3e, 0xc3, 0xac, 0x2a, 0x92, 0x84, 0xf3, 0xea, 0xbd, 0x0c, 0xac, 0xd8, 0x6e, 0x83, 0x32, 0x5f, 0x3f, 0x0b, 0xbb, 0x52, 0xa8, 0xdc, 0xec, 0xcf, 0x2c, 0xe0, 0xbc, 0x39, 0x2c, 0xb2, 0xf2, 0x10, 0x96, 0x35, 0xf1, 0xe7, 0xff, 0x21, 0xe4, 0x3f, 0x24, 0xeb, 0x6c, 0x10, 0x9e, 0x35, 0xcb, 0x4f, 0x29, 0xcf, 0xcf, 0x00, 0xe6, 0xc2, 0xd0, 0xda, 0x11, 0x30, 0xb2, 0x38, 0x24, 0x5c, 0x18, 0xec, 0x96, 0x1f, 0x69, 0x30, 0xc9, 0x74, 0xc0, 0x20, 0xd7, 0x04, 0xe1, 0xb1, 0x4c, 0xc9, 0x04, 0x70, 0x39, 0xbf, 0xae, 0x53, 0x0e, 0xa4, 0x21, 0xfe, 0xd5, 0xdb, 0x88, 0x6a, 0x75, 0xf0, 0xb8, 0x51, 0xf6, 0xd2, 0xce, 0x45, 0x9a, 0x03, 0x0c, 0x64, 0xea, 0x3f, 0x16, 0x41, 0x7e, 0x79, 0xe1, 0x99, 0x41, 0x40, 0xa6, 0x71, 0x06, 0x15, 0x31, 0x8f, 0x88, 0x24, 0x41, 0xf7, 0xed, 0x1a, 0xb9, 0xac, 0x22, 0x74, 0x74, 0xf6, 0x90, 0x41, 0x57, 0x9f, 0xae, 0x85, 0xb7, 0xe2, 0xa4, 0x20, 0xa1, 0x56, 0xec, 0x76, 0x3c, 0x5c, 0x60, 0x24, 0xc9, 0xd5, 0xca, 0xfb, 0xa1, 0x8c, 0x34, 0x6e, 0xca, 0x3a, 0xea, 0x25, 0xaf, 0xd8, 0x49, 0x87, 0xf7, 0x39, 0x25, 0x52, 0x7c, 0xc0, 0xec, 0xb3, 0x36, 0x62, 0xac, 0xc3, 0x5f, 0x84, 0x5a, 0x26, 0xb6, 0xd2, 0x95, 0x2a, 0xf2, 0x7e, 0xc7, 0x70, 0x4e, 0xbf, 0x45, 0x57, 0x04, 0x4b, 0xb5, 0xb7, 0xfc, 0xd6, 0x6c, 0xae, 0xef, 0xe2, 0x25, 0xff, 0xa1, 0xaa, 0x2c, 0x31, 0xd9, 0xe5, 0xa0, 0xca, 0x8d, 0x87, 0xbc, 0x45, 0x42, 0x7a, 0x87, 0x1d, 0x29, 0x18, 0x9f, 0xa1, 0x75, 0x41, 0x0d, 0x96, 0xa7, 0x61, 0xf1, 0xd9, 0x24, 0x35, 0xc6, 0xdf, 0xf8, 0x6e, 0x66, 0x36, 0xea, 0x59, 0xcd, 0xb8, 0xd8, 0xb0, 0x10, 0xa2, 0x03, 0xf2, 0x3f, 0x83, 0x12, 0xb7, 0xc3, 0x85, 0x47, 0x03, 0x95, 0xea, 0x3a, 0x6d, 0xe4, 0xb9, 0xa6, 0x3b, 0x9b, 0x4d, 0xb4, 0x29, 0x63, 0xf4, 0xac, 0x14, 0xc6, 0xb7, 0xca, 0xec, 0xe7, 0xab, 0x9a, 0xf9, 0x68, 0xb6, 0xf1, 0x8c, 0x7b, 0xca, 0x9a, 0xb2, 0xc5, 0x90, 0x47, 0xbc, 0x39, 0xd0, 0x36, 0x1f, 0xe1, 0x2e, 0xaa, 0x1d, 0x08, 0x1c, 0xfa, 0x7e, 0x30, 0x31, 0x82, 0x5f, 0xf8, 0x98, 0xc7, 0x9d, 0xaa, 0x5c, 0x99, 0xbc, 0x0c, 0x0c, 0xa0, 0x31, 0xf5, 0x75, 0xb8, 0x03, 0x5d, 0xa1, 0x13, 0x6c, 0xd9, 0x0b, 0x50, 0xca, 0x7b, 0xad, 0x9b, 0xbc, 0x7a, 0xde, 0x31, 0x67, 0xad, 0xf9, 0x35, 0x61, 0xf5, 0x26, 0xcc, 0x27, 0xb7, 0xa1, 0x70, 0xa5, 0x60, 0x5e, 0xf2, 0x94, 0xe6, 0xf9, 0x88, 0x59, 0xdf, 0xf1, 0xc1, 0x50, 0x2e, 0xed, 0xe7, 0x92, 0xf5, 0x2a, 0x40, 0x75, 0x5f, 0x40, 0xa3, 0xce, 0x8e, 0xb0, 0x4b, 0xcb, 0x0e, 0x6f, 0x11, 0xb3, 0xa1, 0x46, 0x7f, 0x3f, 0x2a, 0xcb, 0x7f, 0xa8, 0xb0, 0x9f, 0x31, 0xcd, 0x85, 0xcb, 0x35, 0xde, 0x34, 0x12, 0x16, 0x61, 0x5d, 0x18, 0xda, 0x04, 0x85, 0xa1, 0xf0, 0x08, 0xe7, 0xad, 0x57, 0xab, 0x37, 0xbd, 0x63, 0x38, 0x0f, 0xc5, 0x5f, 0x89, 0x0a, 0x40, 0xa7, 0x38, 0x3c, 0x95, 0x5a, 0x33, 0xa3, 0x12, 0x19, 0x73, 0x72, 0x1b, 0x58, 0x0b, 0x65, 0xd7, 0x11, 0x9c, 0x6e, 0x44, 0xff, 0x6f, 0x31, 0x64, 0x50, 0x57, 0xe1, 0x88, 0xad, 0x11, 0xa8, 0xd8, 0x71, 0x67, 0x52, 0xa1, 0xcb, 0x49, 0x88, 0x05, 0x3f, 0x6e, 0xb1, 0x50, 0x33, 0xd0, 0x28, 0x08, 0x2f, 0x5a, 0xd4, 0x6b, 0xcb, 0xc0, 0x08, 0xfd, 0xbc, 0xc2, 0x49, 0xe7, 0x29, 0x15, 0x4f, 0x01, 0x82, 0x0c, 0x75, 0xd8, 0xc1, 0xc5, 0xa4, 0x98, 0x78, 0x61, 0x3f, 0xf5, 0x72, 0x78, 0x7c, 0x15, 0xb6, 0xe9, 0x58, 0x90, 0x1c, 0x0c, 0xa8, 0x63, 0xe3, 0x37, 0x15, 0xc3, 0xfe, 0xa9, 0xe0, 0x22, 0x0f, 0x35, 0x28, 0xd9, 0x6c, 0x33, 0x92, 0x3a, 0x3c, 0xd2, 0x26, 0x52, 0x7f, 0xa8, 0x0b, 0xde, 0x77, 0x93, 0x03, 0xc2, 0x1c, 0x19, 0xa7, 0x99, 0x6f, 0x98, 0xa2, 0x12, 0x5b, 0xa2, 0xce, 0xcc, 0x7b, 0x87, 0x30, 0x13, 0x04, 0x9e, 0x6b, 0xc1, 0xf5, 0x4d, 0x4d, 0xb1, 0xcb, 0xf2, 0x7e, 0xce, 0x90, 0x14, 0x7f, 0xd4, 0xca, 0x52, 0xb0, 0xf9, 0xd6, 0xeb, 0x16, 0x3f, 0x4a, 0x55, 0x43, 0xdf, 0x09, 0xa8, 0xfa, 0x8e, 0x7c, 0xed, 0x61, 0x62, 0xc3, 0x89, 0x96, 0xc3, 0x67, 0xef, 0x8d, 0xf4, 0x34, 0xde, 0x87, 0x20, 0x8e, 0x70, 0x93, 0x0e, 0xf8, 0x34, 0xc0, 0x99, 0xb5, 0x8c, 0xa9, 0xe8, 0x40, 0x99, 0x03, 0xb9, 0xe1, 0x00, 0x10, 0x3e, 0xd0, 0x1c, 0x7e, 0xd5, 0xa0, 0x71, 0x10, 0xef, 0xf3, 0xc2, 0x54, 0x14, 0x57, 0x22, 0xf5, 0x5b, 0xc8, 0x6c, 0x60, 0xbd, 0xe9, 0x20, 0x7b, 0x67, 0xbe, 0x3b, 0xfe, 0xa4, 0xcf, 0x32, 0x1c, 0x45, 0xa7, 0xd8, 0x20, 0x22, 0xf7, 0xac, 0x16, 0x00, 0xb1, 0x5a, 0xcc, 0x41, 0x6d, 0x76, 0x6b, 0x85, 0xc7, 0x22, 0x29, 0x21, 0x78, 0x21, 0xf0, 0x5c, 0xa0, 0xfb, 0x52, 0x50, 0x40, 0xbb, 0x7a, 0x9e, 0x65, 0x08, 0xd8, 0x84, 0xa5, 0xed, 0x22, 0x87, 0x65, 0x88, 0x07, 0x6b, 0x19, 0x3d, 0x43, 0xc9, 0x81, 0xa6, 0x9a, 0xd9, 0x45, 0xb7, 0x1d, 0xf5, 0x18, 0x35, 0x5c, 0x0e, 0xbc, 0x69, 0x0d, 0x5a, 0x63, 0x6a, 0x88, 0x24, 0xb2, 0x83, 0x1f, 0x7c, 0xb4, 0x4d, 0xc9, 0xd9, 0x52, 0x98, 0xbf, 0x64, 0x2d, 0x6c, 0xe9, 0x03, 0x39, 0xb9, 0x26, 0x2f, 0x61, 0x62, 0xed, 0x21, 0xf5, 0x8d, 0xce, 0x86, 0xa5, 0x68, 0xe3, 0x79, 0x4c, 0x8e, 0x2e, 0xb7, 0xee, 0x47, 0xe6, 0xb5, 0x3f, 0xff, 0x51, 0x0f, 0x93, 0x10, 0xd9, 0x0d, 0xd8, 0x16, 0x01, 0xb1, 0x65, 0x6a, 0x3f, 0x63, 0x7a, 0x43, 0x4b, 0x8e, 0x1b, 0x3a, 0xee, 0x99, 0x1f, 0x76, 0xe1, 0xf6, 0x05, 0xff, 0x29, 0xf0, 0x94, 0x0b, 0x77, 0xc6, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x58, 0x2a, 0xb0, 0xc3, 0x77, 0x15, 0xd0, 0x4c, 0xad, 0x77, 0xba, 0x27, 0x93, 0x3f, 0x6d, 0x5e, 0x55, 0x75, 0x54, 0x80, 0x0d, 0x1b, 0xba, 0x36, 0x05, 0xea, 0xe2, 0xca, 0xcb, 0xc8, 0xfd, 0xae, 0x63, 0x21, 0xc6, 0xc9, 0x82, 0x33, 0x86, 0xd2, 0x0e, 0x59, 0xa4, 0xf9, 0xc6, 0x89, 0xfa, 0xd2, 0x68, 0x50, 0x72, 0xee, 0x6e, 0xc5, 0xdb, 0x28, 0xf9, 0x98, 0x8d, 0xdd, 0x19, 0x58, 0x92, 0xa2, 0x82, 0x6a, 0xcd, 0x22, 0x7f, 0xc8, 0x39, 0x19, 0x43, 0x3c, 0x65, 0x09, 0xe8, 0x61, 0x95, 0xc8, 0x66, 0x33, 0x0b, 0xf7, 0x1e, 0x92, 0x43, 0xee, 0x1a, 0x30, 0x00, 0x00, 0x00, 0xf0, 0x5d, 0xfc, 0x8d, 0xcc, 0x31, 0x59, 0x61, 0x35, 0xf5, 0xd4, 0xcb, 0x69, 0xca, 0x76, 0x4f, 0x43, 0x12, 0xb0, 0xf5, 0x3c, 0xd7, 0x74, 0x3f, 0xef, 0x25, 0xd5, 0x66, 0xa2, 0xd5, 0x87, 0x45, 0x2f, 0x90, 0x3b, 0x55, 0x86, 0x64, 0xc3, 0x57, 0xba, 0x23, 0xaf, 0x96, 0x69, 0xa8, 0x66, 0xf2, 0x35, 0x58, 0xbd, 0xe5, 0x3a, 0xef, 0x07, 0x20, 0x06, 0xf1, 0x83, 0xc9, 0xdc, 0x34, 0xb0, 0xd6, 0x6c, 0x23, 0x1f, 0xb2, 0x5b, 0x49, 0xa7, 0xdf, 0x85, 0x3b, 0x04, 0x27, 0x61, 0x8d, 0x83, 0xa6, 0xce, 0x31, 0xd4, 0x08, 0x40, 0xaf, 0x7c, 0x0b, 0xcf, 0x9b, 0xfc, 0xe7, 0x54, 0x6d, 0x7a, 0x17, 0x04, 0xe8, 0xcb, 0xd7, 0x14, 0x45, 0x31, 0xcd, 0x79, 0xd5, 0x68, 0x33, 0xdf, 0x6a, 0x15, 0x1d, 0x8d, 0x0f, 0xb6, 0x9e, 0xf2, 0xde, 0x8a, 0x16, 0x4c, 0x79, 0xd1, 0x03, 0x74, 0xb6, 0x09, 0xf0, 0x1e, 0x22, 0xd6, 0x62, 0x79, 0x58, 0x35, 0x60, 0xfc, 0x2f, 0xec, 0xb8, 0xf4, 0xf2, 0x30, 0x87, 0x6f, 0xc6, 0x53, 0x21, 0xf1, 0x8f, 0x27, 0x57, 0x93, 0xe2, 0xb0, 0x89, 0x95, 0x26, 0xd3, 0x03, 0xfe, 0xfa, 0x81, 0x0e, 0x78, 0xeb, 0x96, 0xca, 0x6e, 0x02, 0x31, 0x07, 0xcb, 0x1c, 0x7e, 0x82, 0xe2, 0xbb, 0x89, 0xce, 0xaa, 0xf3, 0xfd, 0x7d, 0x19, 0x7c, 0x6c, 0x21, 0xb6, 0x6c, 0xba, 0xa0, 0xf7, 0x7e, 0xb0, 0xb3, 0x87, 0xfd, 0xe9, 0x69, 0x59, 0x8a, 0xdf, 0x50, 0x0e, 0x38, 0x28, 0x46, 0x21, 0x7f, 0x98, 0x3e, 0x94, 0x63, 0x24, 0xcb, 0xbb, 0xad, 0x62, 0xaa, 0x24, 0x4b, 0x62, 0x7d, 0xa7, 0x3a, 0x1b, 0xfe, 0xa4, 0xa4, 0xbb, 0x0a, 0x88, 0x7d, 0x7d, 0x49, 0xe0, 0x3f, 0xce, 0x91, 0xf0, 0x73, 0xc0, 0x56, 0x31, 0xee, 0x6c, 0xec, 0x66, 0x2e, 0x27, 0xa3, 0x32, 0xc8, 0xbb, 0xd9, 0x19, 0x66, 0x48, 0x32, 0x66, 0xd3, 0x33, 0xc1, 0x59, 0xf1, 0xeb, 0xab, 0x73, 0x42, 0x81, 0xb5, 0x57, 0x48, 0x93, 0xda, 0x74, 0x58, 0x4a, 0x39, 0xbd, 0x98, 0x4a, 0x88, 0xf8, 0xdc, 0x87, 0x9d, 0xa2, 0xb0, 0xde, 0xc7, 0x36, 0xbb, 0xb0, 0x8d, 0x37, 0xe0, 0x84, 0x34, 0x28, 0xca, 0x35, 0xc9, 0xeb, 0x00, 0x3f, 0xd1, 0x1f, 0x84, 0x7e, 0xf3, 0x58, 0x5f, 0x7c, 0x6d, 0x66, 0x7d, 0xdc, 0x8e, 0x9c, 0xa8, 0xed, 0x1f, 0x81, 0x62, 0x0f, 0x92, 0xae, 0x75, 0x60, 0x6b, 0x75, 0x5c, 0x48, 0x19, 0x90, 0xea, 0x45, 0x63, 0x5a, 0x2f, 0x79, 0x78, 0x06, 0x20, 0x8f, 0xc4, 0xc2, 0x29, 0xa6, 0x03, 0xc9, 0xd9, 0x05, 0x06, 0xbe, 0xf4, 0x98, 0x28, 0x48, 0x8f, 0xa6, 0xb9, 0xee, 0xd1, 0x6d, 0x41, 0x3e, 0x35, 0x63, 0x87, 0x49, 0x5b, 0x35, 0x51, 0x27, 0x3e, 0x1d, 0x8c, 0x5b, 0x25, 0xeb, 0x98, 0x47, 0x0f, 0x5b, 0xed, 0x76, 0x36, 0x5f, 0x03, 0xc8, 0xdd, 0x6f, 0x2f, 0x8c, 0x4f, 0xf4, 0xe7, 0xda, 0xaa, 0xbc, 0x47, 0xdc, 0x76, 0xca, 0xe0, 0x67, 0xcc, 0x3d, 0xb8, 0xcf, 0xe3, 0x0b, 0x81, 0x64, 0xbf, 0x89, 0x60, 0x54, 0x32, 0xcd, 0x90, 0x5c, 0xc9, 0x5d, 0xc0, 0xdb, 0xdf, 0x4d, 0x3f, 0xce, 0x96, 0x87, 0xe5, 0x29, 0x7d, 0xbd, 0xde, 0x9e, 0xda, 0xd3, 0xfa, 0x8c, 0xd1, 0xa0, 0x2b, 0x6b, 0x84, 0x66, 0xb8, 0x65, 0x31, 0xcf, 0x56, 0xaf, 0x79, 0x43, 0x48, 0x70, 0x5f, 0xaa, 0xb1, 0xd9, 0xe9, 0x40, 0xc0, 0xfd, 0xc6, 0xa2, 0xf5, 0xf5, 0x6f, 0x9d, 0xa6, 0x0a, 0x22, 0x84, 0xa8, 0x28, 0x59, 0xdf, 0x1d, 0xff, 0xbf, 0x05, 0xe9, 0x5f, 0x3f, 0x65, 0x31, 0x2c, 0x2a, 0x02, 0x14, 0x92, 0xcf, 0xab, 0x70, 0xc0, 0x5d, 0x60, 0xe3, 0x29, 0x34, 0x7a, 0x8a, 0x73, 0xdd, 0xa1, 0x85, 0x31, 0x49, 0x35, 0x90, 0xba, 0xf3, 0x2e, 0x0f, 0xf9, 0x1f, 0xbb, 0xa9, 0x75, 0x0c, 0xc8, 0xf4, 0xe9, 0x1f, 0x2e, 0x79, 0x7f, 0xc3, 0x84, 0x0e, 0x71, 0xb0, 0x82, 0x1b, 0x59, 0x75, 0xae, 0xe8, 0xe1, 0xf9, 0x86, 0x31, 0xa8, 0x6e, 0x05, 0xa8, 0x35, 0x76, 0x68, 0x22, 0x45, 0xd7, 0x55, 0x5b, 0x70, 0x36, 0xb2, 0x46, 0x36, 0x7d, 0xcc, 0x3b, 0xe7, 0x9e, 0x43, 0x2c, 0xd2, 0xb0, 0x2b, 0x3e, 0x17, 0xe6, 0xf7, 0xd9, 0xaf, 0x16, 0xba, 0x5c, 0x86, 0x20, 0x22, 0x1d, 0xee, 0xa1, 0x32, 0x7c, 0xc1, 0xa2, 0x9a, 0xc2, 0xde, 0xe1, 0xd9, 0x8d, 0x3d, 0x9a, 0xbe, 0xf4, 0x46, 0x83, 0x07, 0x91, 0x01, 0xa4, 0x89, 0xa3, 0x1e, 0x1f, 0x6e, 0xbe, 0x9c, 0x54, 0x41, 0x0a, 0x5a, 0x74, 0x1b, 0xfb, 0x0c, 0xd7, 0xb6, 0x43, 0x6d, 0x8b, 0x61, 0x5e, 0x86, 0x34, 0x87, 0xb1, 0x9e, 0xce, 0xa4, 0xa2, 0x06, 0x3f, 0x69, 0xfe, 0xfd, 0xb1, 0x20, 0xfe, 0x4b, 0x23, 0x8d, 0x99, 0x26, 0x14, 0xb8, 0x4c, 0x24, 0xcf, 0xd7, 0xf8, 0x10, 0x94, 0xb5, 0x29, 0xe6, 0x7b, 0xb6, 0xdf, 0xc1, 0xb6, 0x71, 0xd2, 0x55, 0x1e, 0x1c, 0x26, 0x3a, 0x63, 0x02, 0x20, 0x89, 0xf3, 0xd4, 0xe1, 0x89, 0xc5, 0x1c, 0xdc, 0x2f, 0xf2, 0x54, 0x10, 0xc7, 0xa2, 0x25, 0x49, 0x7d, 0x1f, 0x67, 0x21, 0x53, 0xc8, 0x30, 0xdc, 0xf2, 0x2d, 0x55, 0x5d, 0xf0, 0x8e, 0x56, 0x18, 0xc0, 0xf4, 0xd1, 0x17, 0xd2, 0x9e, 0x94, 0x71, 0x6b, 0x5e, 0xa4, 0xa4, 0xf7, 0xb6, 0xe1, 0x04, 0xf3, 0xfe, 0xcf, 0x39, 0xa1, 0x71, 0xe6, 0xb6, 0xa9, 0x54, 0x73, 0xb2, 0xf0, 0xfb, 0x4f, 0x08, 0x85, 0x99, 0xb7, 0x74, 0xe5, 0x5e, 0x0c, 0x41, 0xc3, 0x87, 0x3d, 0x33, 0x51, 0x51, 0x81, 0xe9, 0xce, 0x26, 0x4f, 0x9c, 0x0c, 0xc3, 0xc3, 0xef, 0xea, 0xd2, 0x45, 0x3c, 0xbf, 0xd1, 0x79, 0xb0, 0x7a, 0x95, 0x80, 0xae, 0x79, 0x56, 0xca, 0xe0, 0x1d, 0x02, 0xf9, 0xb3, 0xab, 0x37, 0x84, 0x52, 0x09, 0x1e, 0x7d, 0x3b, 0xf7, 0x89, 0x97, 0x4e, 0xc0, 0x7b, 0xb0, 0x75, 0xae, 0xef, 0x47, 0x9a, 0xbd, 0x21, 0x13, 0xfc, 0x12, 0x5f, 0x66, 0xd6, 0xad, 0xab, 0xe8, 0x38, 0xdf, 0x8b, 0xf3, 0xbe, 0xee, 0x53, 0xb0, 0x07, 0x89, 0xa6, 0xed, 0x18, 0x6d, 0x5d, 0xa8, 0x15, 0xfd, 0x8e, 0x8f, 0x28, 0x29, 0x89, 0xec, 0x99, 0xf6, 0x17, 0x39, 0xbe, 0xdb, 0x67, 0xb3, 0x4b, 0x87, 0x1a, 0x70, 0x5d, 0xf1, 0xdc, 0xae, 0x3f, 0x38, 0xaa, 0x44, 0xae, 0xcb, 0x6d, 0xdc, 0x13, 0x16, 0xbc, 0x84, 0x30, 0xb0, 0xeb, 0xe1, 0xa6, 0x74, 0x7d, 0x60, 0x55, 0x26, 0x29, 0x60, 0xce, 0xda, 0x4a, 0xb2, 0x82, 0xb0, 0x46, 0xd9, 0xae, 0xea, 0x7b, 0x30, 0x79, 0x29, 0xe3, 0x79, 0x08, 0x06, 0xbd, 0x2a, 0x20, 0x34, 0xba, 0xf4, 0xe7, 0x3e, 0x4c, 0x40, 0xb2, 0x6e, 0x49, 0xeb, 0x6e, 0x75, 0x03, 0xec, 0xe8, 0xb6, 0x1f, 0xd1, 0xd4, 0x4f, 0x07, 0x72, 0x05, 0x16, 0x8d, 0x3e, 0xc7, 0xa6, 0xe3, 0x88, 0x3b, 0xb4, 0xdf, 0xcb, 0x0d, 0x4e, 0xd2, 0xf4, 0xad, 0x31, 0x2d, 0xca, 0x33, 0x03, 0x8a, 0x2b, 0xc9, 0x2b, 0xdf, 0x3d, 0xe2, 0xf3, 0xfd, 0xfc, 0xe9, 0x09, 0x07, 0xbd, 0xee, 0x03, 0xf6, 0xbf, 0xbd, 0x93, 0x2b, 0x6a, 0x38, 0xa8, 0xc3, 0x20, 0x8e, 0x8f, 0x6b, 0xef, 0x29, 0x9b, 0x92, 0xee, 0x88, 0x99, 0x8c, 0xf2, 0x28, 0xba, 0xe4, 0x53, 0x4b, 0x2a, 0x5b, 0x3e, 0x0b, 0x96, 0x6c, 0xa7, 0x16, 0x86, 0x95, 0xf7, 0x0e, 0xed, 0xff, 0xc5, 0xe6, 0xbb, 0x6f, 0xa0, 0x95, 0xf7, 0xf4, 0xd1, 0xc6, 0xb6, 0xed, 0x0e, 0xc1, 0xbb, 0xf5, 0x2d, 0xcf, 0x04, 0x30, 0x19, 0xf9, 0x53, 0x38, 0x68, 0x5e, 0x07, 0xe1, 0xd3, 0x9b, 0xd0, 0x28, 0x41, 0xdb, 0x99, 0x74, 0x59, 0xc2, 0xc0, 0x92, 0xcb, 0xf1, 0xcc, 0xc3, 0xdd, 0x9c, 0x87, 0x20, 0x41, 0x8c, 0xcf, 0x2e, 0xfe, 0x95, 0x4b, 0xb1, 0x84, 0xbb, 0xed, 0x37, 0xa4, 0x51, 0xb3, 0xd9, 0xa5, 0x1f, 0xe8, 0xdc, 0x97, 0x7a, 0x8d, 0xa7, 0x86, 0xa4, 0x25, 0x05, 0xa4, 0x5e, 0x2a, 0xe7, 0x6a, 0xf2, 0x93, 0x97, 0xca, 0xb4, 0x72, 0xaf, 0xd4, 0x52, 0x66, 0x12, 0x90, 0x34, 0xa4, 0x20, 0x6f, 0x20, 0x56, 0x4c, 0xb2, 0x20, 0x39, 0x1c, 0x05, 0x30, 0x98, 0x76, 0x7a, 0x8d, 0x8f, 0x42, 0x48, 0x00, 0x81, 0xa7, 0xb7, 0x8c, 0xfd, 0xb1, 0xc1, 0xab, 0x47, 0x16, 0x37, 0x66, 0xbe, 0xf6, 0x02, 0x91, 0x4c, 0x75, 0x6a, 0x60, 0x2e, 0x5e, 0xfd, 0x5d, 0x00, 0x5a, 0x90, 0x37, 0x0f, 0xe2, 0x30, 0xf1, 0x61, 0xa2, 0xee, 0x35, 0x7a, 0x04, 0xcc, 0xae, 0x08, 0x11, 0xa5, 0xda, 0xee, 0x47, 0xff, 0x73, 0x6f, 0x7d, 0x4e, 0x2d, 0x6f, 0x57, 0x60, 0xd1, 0xf6, 0x53, 0xeb, 0xa7, 0x8b, 0x22, 0x41, 0x90, 0xc4, 0x9f, 0xd6, 0x0e, 0xa9, 0x24, 0x01, 0xdb, 0xe0, 0xbd, 0x9f, 0xe1, 0xf8, 0x5a, 0xf3, 0x84, 0xc0, 0xdf, 0xd9, 0xc8, 0x17, 0x43, 0x04, 0x3e, 0x2e, 0xf4, 0xba, 0x06, 0x76, 0xbe, 0x66, 0x48, 0x3f, 0xfe, 0x10, 0xf5, 0x0f, 0xbe, 0xad, 0x01, 0x4a, 0xb7, 0x43, 0xef, 0xf6, 0xb4, 0x1d, 0xed, 0x0a, 0x99, 0xd5, 0x4b, 0x97, 0xca, 0x69, 0xf3, 0xee, 0xaa, 0xff, 0x8e, 0x82, 0xb7, 0x89, 0x83, 0xfb, 0x2b, 0x39, 0xbb, 0x56, 0x15, 0xfc, 0x82, 0x32, 0x90, 0xcb, 0x88, 0x4c, 0x23, 0x4c, 0x3a, 0x87, 0x36, 0xe8, 0xf0, 0x79, 0x12, 0xf3, 0xb4, 0x35, 0x93, 0xaa, 0xac, 0xd1, 0x83, 0x19, 0x55, 0x0b, 0x9d, 0xaf, 0x50, 0x71, 0xb0, 0x48, 0x53, 0xa4, 0xb6, 0x4c, 0x58, 0x4a, 0x6a, 0xad, 0x0a, 0xa8, 0x8a, 0x33, 0x09, 0x09, 0x8e, 0xf0, 0x6f, 0x95, 0x83, 0xc2, 0xb1, 0x87, 0xd6, 0xa0, 0xf7, 0x9a, 0x0c, 0x68, 0x0a, 0x70, 0x36, 0xf2, 0x77, 0x8e, 0x06, 0x09, 0x1d, 0x44, 0x36, 0xaf, 0xb2, 0xb9, 0x05, 0x65, 0xf0, 0x7b, 0xb4, 0x30, 0x12, 0x14, 0xe9, 0x92, 0x69, 0x85, 0x11, 0xac, 0xd5, 0x50, 0xc4, 0x8e, 0x39, 0xf1, 0x38, 0x84, 0x55, 0x17, 0x88, 0xda, 0x52, 0x91, 0x80, 0xd5, 0xb8, 0x64, 0x23, 0x0e, 0x12, 0x4e, 0x59, 0xbb, 0x12, 0x90, 0xbd, 0xca, 0xd7, 0x93, 0xd1, 0x03, 0x73, 0xe5, 0x3f, 0x84, 0xb3, 0xc7, 0x51, 0x1b, 0x96, 0xcb, 0x87, 0x23, 0x01, 0x54, 0x20, 0x0b, 0xd5, 0x1e, 0xfc, 0x96, 0x36, 0xc4, 0x4e, 0x85, 0xbd, 0xb4, 0x8f, 0x07, 0x6c, 0x7e, 0x75, 0xb9, 0x54, 0x86, 0x0b, 0x07, 0x80, 0xe2, 0x5f, 0xe9, 0xfe, 0x5d, 0x71, 0xcd, 0xc2, 0x7b, 0xdd, 0x05, 0x73, 0xbf, 0x5b, 0x86, 0x2f, 0xe1, 0x0e, 0x12, 0x7d, 0x29, 0x4b, 0x2f, 0x30, 0xdd, 0xb0, 0xf9, 0xed, 0xfb, 0x97, 0x96, 0x9e, 0x7a, 0x1e, 0x73, 0x11, 0x9a, 0xa7, 0xe3, 0x33, 0xc4, 0x2e, 0xc7, 0x5f, 0x8a, 0x69, 0xe3, 0xfc, 0x85, 0xf0, 0x97, 0x45, 0xfd, 0x7f, 0x25, 0x1f, 0xa6, 0xd3, 0xf6, 0x12, 0x0d, 0x2e, 0xd1, 0x73, 0xdb, 0xc9, 0x48, 0x07, 0xa8, 0xbe, 0xfa, 0x5e, 0x95, 0x9c, 0xcf, 0x08, 0x28, 0xad, 0x16, 0x4c, 0x92, 0x58, 0xd0, 0x71, 0xa9, 0xb4, 0x84, 0x83, 0xa3, 0x3b, 0xa6, 0x2b, 0x2f, 0x08, 0x18, 0xe8, 0x5d, 0x7f, 0x21, 0xfd, 0x5d, 0x53, 0xe7, 0x2e, 0x6b, 0xed, 0x83, 0x2f, 0xab, 0x56, 0x88, 0xd5, 0x5c, 0x5d, 0xe3, 0x9f, 0xdd, 0xe2, 0x21, 0xd4, 0xda, 0x96, 0x7e, 0x56, 0x3d, 0xa3, 0xaf, 0x93, 0xb2, 0xbb, 0x9b, 0xb4, 0x2e, 0xe8, 0xe6, 0x73, 0x0b, 0x9b, 0xa8, 0xbe, 0x3b, 0x34, 0x7d, 0x2e, 0x20, 0x8b, 0x07, 0xfc, 0xfa, 0x5f, 0x78, 0x49, 0x66, 0xdc, 0xb6, 0x14, 0x25, 0xb2, 0x8e, 0x92, 0xb0, 0x9a, 0x40, 0xff, 0x1b, 0x66, 0xd2, 0xde, 0x32, 0x68, 0x79, 0xdf, 0x2f, 0x01, 0x57, 0x6e, 0x48, 0x6b, 0xc0, 0x3e, 0x49, 0x5f, 0x2e, 0xe3, 0x7f, 0xdc, 0xcf, 0x24, 0xcd, 0x7a, 0x01, 0x3d, 0x84, 0xf8, 0x5c, 0x70, 0x54, 0xfc, 0xe3, 0xdf, 0x4d, 0x56, 0x6a, 0xe3, 0xee, 0x20, 0xfa, 0x9b, 0xe2, 0x41, 0x62, 0x9c, 0x7d, 0x94, 0x03, 0xc7, 0x48, 0xf7, 0x02, 0x00, 0xa2, 0x78, 0xaa, 0x43, 0xa3, 0xdb, 0xf5, 0xf9, 0x13, 0x3b, 0x2b, 0x31, 0xbb, 0x65, 0xaf, 0xaf, 0x59, 0x09, 0x4e, 0x66, 0x43, 0x5d, 0xd6, 0xc5, 0xe4, 0x97, 0x89, 0x00, 0x10, 0xe4, 0x9d, 0x73, 0x0c, 0x9d, 0x23, 0x32, 0xf3, 0x0b, 0x77, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x58, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x8f, 0x30, 0xcd, 0xaf, 0x26, 0x40, 0x2c, 0xf9, 0x92, 0xb8, 0x31, 0x61, 0x6a, 0x06, 0x23, 0x24, 0xde, 0xf7, 0xf9, 0x2a, 0x7c, 0xa5, 0xc3, 0x99, 0x4d, 0x6f, 0x15, 0xcc, 0xdc, 0x17, 0xb3, 0x74, 0x5b, 0xd4, 0xa2, 0x68, 0xab, 0x5d, 0x2c, 0x2b, 0xc5, 0xc1, 0x3e, 0xc5, 0x6a, 0x17, 0xbd, 0xb0, 0x57, 0x61, 0x5a, 0x48, 0xe3, 0x48, 0x99, 0x93, 0xde, 0xb0, 0x5e, 0x70, 0x9f, 0xcd, 0xd0, 0xf2, 0x07, 0xd5, 0xed, 0xe9, 0x4c, 0x3a, 0x08, 0xe6, 0x8e, 0xec, 0x78, 0x30, 0x00, 0x00, 0x00, 0x81, 0x9f, 0x5d, 0x92, 0x15, 0xe7, 0x37, 0x10, 0x4c, 0x42, 0xec, 0x9a, 0x12, 0x0a, 0x79, 0x55, 0x54, 0x02, 0x01, 0xb1, 0xc1, 0x08, 0x02, 0x31, 0x10, 0xd0, 0x03, 0x32, 0xae, 0x6a, 0x84, 0x3f, 0xcf, 0x82, 0x53, 0x9d, 0xf0, 0x9a, 0xce, 0x68, 0x6f, 0x07, 0xeb, 0x47, 0x19, 0xa4, 0x62, 0x79, 0x4c, 0x83, 0xcd, 0xfa, 0x1c, 0x78, 0x4e, 0xad, 0x5a, 0x6e, 0xc9, 0x63, 0x1f, 0x6d, 0x56, 0x33, 0x11, 0xd3, 0xfb, 0x35, 0x29, 0xc1, 0x8e, 0x39, 0xf7, 0xaa, 0x54, 0x44, 0x05, 0x4e, 0x81, 0x96, 0x77, 0xc4, 0x22, 0xbd, 0x85, 0xaf, 0x4e, 0xf5, 0x1e, 0xfb, 0x09, 0x83, 0x8c, 0x8f, 0x1c, 0x51, 0x89, 0xc5, 0x9a, 0xaa, 0xa0, 0xc0, 0x81, 0xac, 0x35, 0xe0, 0x12, 0x88, 0xb0, 0xdd, 0x79, 0xa4, 0x13, 0x54, 0x83, 0xde, 0x57, 0x98, 0x0d, 0xcc, 0x4c, 0xf2, 0x14, 0x17, 0xcc, 0x5e, 0x31, 0x53, 0x7d, 0x01, 0xa1, 0x09, 0xe7, 0x0a, 0x73, 0xbc, 0x1f, 0xd8, 0x50, 0xfa, 0x4e, 0x9b, 0x3d, 0x46, 0x7a, 0x11, 0xf2, 0xfb, 0x16, 0xac, 0x4b, 0x61, 0x7a, 0xae, 0xbf, 0xd6, 0x32, 0x10, 0x66, 0xe6, 0xcb, 0xf5, 0x3b, 0x56, 0xa5, 0xed, 0xfa, 0x48, 0x48, 0xbf, 0x39, 0xf9, 0xba, 0xc3, 0x9b, 0xcb, 0xbf, 0x1d, 0x49, 0xd9, 0xb4, 0x5a, 0x70, 0xa0, 0x2c, 0x7b, 0x21, 0x8c, 0x84, 0xda, 0x44, 0x8a, 0xa8, 0x85, 0xdb, 0x06, 0x89, 0x43, 0xc1, 0x81, 0x2c, 0xd9, 0xad, 0xa6, 0xc3, 0xa1, 0x24, 0x90, 0x31, 0x15, 0xab, 0xc6, 0x58, 0xd9, 0x60, 0xac, 0xcf, 0x2e, 0x5a, 0xa1, 0x61, 0x14, 0x71, 0x72, 0xc0, 0x14, 0x0a, 0xb8, 0x9e, 0xc3, 0x93, 0xe2, 0xb2, 0x74, 0x54, 0x55, 0x72, 0x47, 0x21, 0xfb, 0xb5, 0x76, 0xde, 0x08, 0xfc, 0x57, 0xda, 0x3f, 0x56, 0x44, 0xbe, 0x69, 0x1d, 0x49, 0xad, 0xb9, 0xe0, 0x30, 0x68, 0xfd, 0xd4, 0xeb, 0xde, 0x96, 0x66, 0x13, 0xfa, 0x20, 0x7c, 0x82, 0xcb, 0xf6, 0x62, 0x70, 0xac, 0x62, 0x1a, 0xae, 0x1e, 0x50, 0xee, 0x78, 0x61, 0x79, 0x7f, 0xe7, 0xe2, 0xdd, 0x98, 0x56, 0x43, 0xfb, 0x1c, 0x37, 0x50, 0x31, 0xab, 0x0a, 0xd0, 0x99, 0x22, 0x5e, 0x85, 0xae, 0x64, 0xde, 0xdc, 0xb5, 0xae, 0x35, 0x20, 0x00, 0xfb, 0x0b, 0xb4, 0x81, 0xc4, 0xb7, 0x17, 0x04, 0xc0, 0x6e, 0xa0, 0x04, 0x74, 0x4f, 0xef, 0x9c, 0xa0, 0xb6, 0x77, 0xa7, 0x7d, 0x80, 0x0b, 0x46, 0x2b, 0xa9, 0x1f, 0x7c, 0xb1, 0xd6, 0x92, 0xc1, 0x53, 0x64, 0x7c, 0x7e, 0x44, 0xbb, 0x66, 0xee, 0xf0, 0x19, 0x1c, 0xc4, 0xff, 0xae, 0xde, 0x4f, 0xc7, 0x80, 0xe2, 0xb1, 0x54, 0x58, 0xf2, 0x7d, 0xe3, 0x0c, 0xd2, 0x8c, 0x38, 0x70, 0x2f, 0x88, 0xf5, 0x3e, 0x10, 0x91, 0xa5, 0x5b, 0x10, 0x6b, 0xad, 0xf1, 0x1b, 0x23, 0x36, 0xb9, 0x47, 0x57, 0xf7, 0x4c, 0x41, 0x14, 0xd4, 0x48, 0xb1, 0x2c, 0x6a, 0x6a, 0xcd, 0xc4, 0x90, 0x8c, 0x2e, 0xc5, 0xae, 0xaf, 0x5f, 0x96, 0xdd, 0x82, 0x07, 0x04, 0x47, 0x17, 0x98, 0x5c, 0xb1, 0x20, 0xcb, 0xae, 0xec, 0x57, 0x70, 0x9a, 0xbc, 0xd2, 0xd5, 0x42, 0x3a, 0x17, 0x05, 0xe8, 0xae, 0x98, 0x94, 0xe1, 0xc3, 0x70, 0xa0, 0x68, 0x1d, 0xf6, 0x3b, 0x08, 0xc7, 0xb3, 0xfc, 0xcb, 0x7e, 0xd2, 0xf6, 0xbc, 0x44, 0xe0, 0x05, 0x54, 0xfb, 0xd8, 0xfd, 0x25, 0x6d, 0xe6, 0x99, 0xca, 0x89, 0x58, 0x55, 0x53, 0xcb, 0x66, 0xc3, 0x70, 0x11, 0x09, 0xb6, 0xd7, 0x00, 0xb5, 0x74, 0xa7, 0x05, 0x74, 0xf0, 0xdc, 0x53, 0x17, 0x9b, 0x13, 0xe1, 0x25, 0xda, 0xc5, 0x16, 0x00, 0x9b, 0xc5, 0x06, 0x8b, 0xa2, 0x77, 0x22, 0x3d, 0xa4, 0x53, 0xff, 0x01, 0xfe, 0x6d, 0x61, 0x9b, 0x89, 0x5e, 0x26, 0xe0, 0xa7, 0xee, 0xb9, 0xbb, 0x4a, 0x29, 0x5b, 0x0e, 0xb9, 0x16, 0x94, 0xa8, 0x66, 0x80, 0xfd, 0xa1, 0x76, 0x02, 0x0b, 0x9c, 0x2f, 0x7e, 0x6a, 0x8b, 0xcb, 0xf3, 0x3b, 0xf8, 0x85, 0xc8, 0xef, 0x8b, 0xc2, 0xfd, 0xbd, 0xf0, 0x00, 0xd8, 0xe8, 0xed, 0xc7, 0xf5, 0x67, 0xa3, 0x64, 0xb5, 0x13, 0x87, 0xec, 0x11, 0x03, 0x47, 0xfb, 0x08, 0x99, 0x0b, 0x1f, 0x3e, 0x00, 0xb9, 0x9e, 0x41, 0x58, 0xd8, 0x0a, 0xa9, 0x20, 0x9a, 0xe8, 0xf2, 0x15, 0x39, 0xd1, 0xf9, 0xee, 0xe4, 0x8d, 0x18, 0xda, 0x27, 0x83, 0xe0, 0xea, 0xd0, 0xe2, 0x02, 0xda, 0xe3, 0xe2, 0xeb, 0x88, 0x87, 0xce, 0xc2, 0x85, 0x0f, 0xb5, 0x7b, 0x81, 0xba, 0x64, 0x26, 0x3a, 0xea, 0x57, 0x3e, 0xd5, 0xcc, 0xac, 0x5c, 0xf2, 0x36, 0x6c, 0x37, 0xcb, 0xe0, 0x5c, 0xec, 0xb1, 0x06, 0xe6, 0xfa, 0x0a, 0xe4, 0x43, 0x6c, 0xdf, 0xec, 0xe2, 0xfa, 0x6e, 0xd5, 0x13, 0xea, 0x6f, 0x14, 0x23, 0x2a, 0x0b, 0x56, 0x7c, 0x1e, 0xb8, 0x73, 0x18, 0xba, 0x47, 0x0c, 0x7f, 0xcd, 0xf1, 0x3d, 0xff, 0xb7, 0x96, 0x30, 0x12, 0x7a, 0xf0, 0x73, 0xa2, 0x52, 0xfc, 0x3b, 0xd1, 0x3b, 0xd2, 0xbf, 0x65, 0xfc, 0xc0, 0xdc, 0x51, 0x75, 0x69, 0xf9, 0xcf, 0x8b, 0x2f, 0xf3, 0x56, 0x1f, 0x18, 0x96, 0xdd, 0xa9, 0x36, 0x5e, 0x73, 0x3e, 0x52, 0xef, 0x58, 0x49, 0x65, 0x71, 0x88, 0xaf, 0xe9, 0x78, 0xc9, 0x45, 0xab, 0xb6, 0x50, 0xf2, 0xe9, 0xa5, 0x3e, 0xf1, 0xe6, 0x59, 0x0b, 0x4e, 0x7d, 0x76, 0x01, 0xfd, 0x0b, 0x20, 0x8f, 0xdc, 0x0d, 0xd5, 0xb6, 0xa8, 0xd1, 0xf7, 0x4d, 0xf8, 0x32, 0x5e, 0xcd, 0x9e, 0x52, 0x21, 0xc9, 0xa9, 0x70, 0x6f, 0x4e, 0x6d, 0x6b, 0x22, 0x36, 0x20, 0x8a, 0x5d, 0x46, 0x4b, 0x77, 0x36, 0x41, 0xe4, 0xc8, 0xed, 0x80, 0x93, 0x1f, 0x0f, 0xc1, 0x2e, 0x62, 0x80, 0x8e, 0x02, 0xf9, 0xa9, 0xaf, 0xf5, 0x0c, 0x78, 0xc5, 0x17, 0x87, 0xb0, 0x52, 0x0a, 0x9e, 0x58, 0x68, 0x22, 0x1f, 0x87, 0x78, 0xe1, 0x7b, 0x6c, 0x3e, 0x5c, 0x37, 0x28, 0x13, 0x5a, 0x74, 0x7e, 0x73, 0xf1, 0xf7, 0xc8, 0xf1, 0xb9, 0xa1, 0x75, 0x3b, 0x75, 0x81, 0xd2, 0xe3, 0x97, 0x0b, 0x86, 0x0f, 0x27, 0x9f, 0x62, 0x14, 0x6d, 0x84, 0x21, 0xf3, 0x2e, 0x52, 0x4d, 0x44, 0x6f, 0x98, 0x59, 0x14, 0xdc, 0x20, 0xb6, 0xe0, 0x70, 0xb2, 0xd5, 0x9a, 0xde, 0x24, 0xde, 0x90, 0x33, 0xba, 0x20, 0xc0, 0x85, 0x1e, 0x5d, 0x0e, 0xac, 0x14, 0x9e, 0xb9, 0x4d, 0x79, 0xb0, 0x08, 0x45, 0xdf, 0x33, 0x36, 0x38, 0x68, 0xb6, 0x99, 0xf5, 0x70, 0x9c, 0x14, 0xf0, 0x8e, 0xeb, 0x8f, 0xc9, 0xc7, 0x5c, 0x99, 0xd2, 0x9e, 0x16, 0x35, 0x00, 0x94, 0xf1, 0xb3, 0x62, 0x54, 0x1d, 0xbd, 0x2c, 0x21, 0x87, 0x4f, 0xe0, 0xa7, 0x22, 0x25, 0xf2, 0x43, 0x18, 0x0a, 0x5d, 0xf1, 0x4e, 0xf0, 0x48, 0x2d, 0x49, 0x2b, 0x02, 0x7c, 0xb4, 0x69, 0xb8, 0x2d, 0x6f, 0xa4, 0x67, 0x8a, 0x28, 0xc1, 0xaa, 0xe3, 0x8e, 0x41, 0x31, 0xd1, 0xbe, 0x81, 0xb5, 0x6f, 0xa2, 0xfd, 0x0c, 0xee, 0xea, 0x7a, 0x82, 0xd3, 0xb1, 0x4f, 0xc7, 0x35, 0x43, 0x22, 0x3d, 0xfa, 0xb8, 0x21, 0x2e, 0x43, 0xf9, 0x44, 0xcc, 0x7c, 0x3c, 0x01, 0xda, 0x0a, 0xd1, 0xcf, 0x9c, 0xba, 0x8b, 0x14, 0xac, 0x84, 0x98, 0xa6, 0x13, 0x0b, 0x54, 0xd3, 0xcd, 0x9e, 0x4b, 0x20, 0x19, 0x55, 0xae, 0xdc, 0x3b, 0xcd, 0x01, 0xda, 0xdd, 0xb7, 0x20, 0x39, 0x00, 0x16, 0x98, 0x4d, 0xee, 0x06, 0x0d, 0x1b, 0xf1, 0x4f, 0x1f, 0x97, 0x4d, 0x7f, 0x33, 0x05, 0xf6, 0x2b, 0x38, 0x50, 0xe9, 0xbc, 0xe6, 0xa1, 0xb7, 0x40, 0xcf, 0xed, 0x6e, 0x64, 0xce, 0xc7, 0xec, 0x12, 0x0d, 0x01, 0x3e, 0x56, 0x95, 0xd6, 0x32, 0x87, 0xd8, 0x82, 0x5b, 0x83, 0x58, 0xa8, 0xe1, 0xbd, 0x32, 0xea, 0x39, 0x69, 0x57, 0x34, 0x7a, 0x5a, 0xb3, 0xf7, 0x83, 0x39, 0xc7, 0x9a, 0xbc, 0x4c, 0x5d, 0xce, 0x93, 0xcf, 0x38, 0xf8, 0x03, 0x62, 0x78, 0xbf, 0x19, 0x8f, 0x8b, 0xdb, 0x35, 0x7b, 0xdf, 0x93, 0x1d, 0x49, 0x42, 0x6a, 0x6f, 0x87, 0xdf, 0xdf, 0xd3, 0x05, 0xe7, 0xbe, 0xec, 0x47, 0xc0, 0xb6, 0xa9, 0xa5, 0x40, 0x76, 0x53, 0x66, 0x8c, 0x54, 0x44, 0xc5, 0x09, 0xfa, 0x09, 0xa2, 0x4d, 0x78, 0x76, 0x96, 0x47, 0x4e, 0xbe, 0xda, 0xb3, 0xed, 0xc8, 0x7e, 0xb6, 0x69, 0x26, 0xed, 0x4e, 0x18, 0x4e, 0x9f, 0x02, 0x84, 0x6b, 0xb3, 0x73, 0x07, 0x16, 0x2e, 0x3d, 0xd5, 0xe8, 0x0e, 0xe2, 0x32, 0xa3, 0x20, 0x52, 0x26, 0x92, 0xa4, 0xcf, 0x47, 0xf9, 0xbc, 0x11, 0xc1, 0x1a, 0xa8, 0x6e, 0x0a, 0x7a, 0x44, 0x2f, 0xf7, 0xa4, 0xd4, 0x68, 0x24, 0x68, 0x1d, 0xc6, 0x18, 0x37, 0xb6, 0x3b, 0x2c, 0x55, 0x60, 0x6c, 0xd9, 0x29, 0x85, 0xbe, 0x72, 0xe8, 0xae, 0x74, 0xf1, 0xdb, 0x26, 0xc5, 0x27, 0xce, 0xad, 0x40, 0x76, 0x37, 0x70, 0x77, 0x17, 0x6c, 0xa0, 0x95, 0x99, 0x50, 0x25, 0xe1, 0xf7, 0x49, 0x6d, 0x41, 0x9f, 0x47, 0x1b, 0x9b, 0x87, 0x78, 0x2f, 0xc4, 0x69, 0xbb, 0x5f, 0xd0, 0x81, 0xac, 0x79, 0xe0, 0x43, 0xa3, 0x63, 0x9f, 0x74, 0x89, 0x7b, 0x7c, 0x9f, 0x75, 0xed, 0xa9, 0x0d, 0x4d, 0xb6, 0x7e, 0x03, 0x78, 0xa3, 0xa1, 0xe4, 0x63, 0x69, 0x54, 0x83, 0xe2, 0x2c, 0x60, 0xc9, 0xa9, 0x15, 0x90, 0xb4, 0xd6, 0x92, 0x6c, 0x1b, 0x09, 0x1e, 0x66, 0xae, 0xc7, 0xa4, 0x25, 0x25, 0x58, 0x1b, 0x49, 0xbb, 0xf3, 0x10, 0xcf, 0xf7, 0x88, 0x69, 0xc5, 0x5e, 0x78, 0x2e, 0xa6, 0x34, 0xce, 0x66, 0x61, 0xa3, 0x3e, 0xed, 0xea, 0xea, 0x1c, 0x35, 0xf8, 0xfa, 0xf1, 0xb7, 0x3c, 0xd5, 0x08, 0x63, 0x83, 0x54, 0x0c, 0x3b, 0x39, 0x30, 0x47, 0xce, 0x7d, 0x59, 0x5c, 0xf4, 0x98, 0xec, 0x0a, 0x2e, 0x78, 0xcb, 0x25, 0x77, 0x35, 0x97, 0x7a, 0x2b, 0x0a, 0x7b, 0x7d, 0x47, 0x3c, 0xf2, 0x7f, 0x3b, 0x6b, 0x20, 0x74, 0x7c, 0x8e, 0x1d, 0xad, 0x03, 0x57, 0x7f, 0x17, 0x14, 0x78, 0xb3, 0xfe, 0x1d, 0xc6, 0xcd, 0x0e, 0x8c, 0xc6, 0x4e, 0xe0, 0x80, 0x8f, 0x12, 0x88, 0x27, 0x79, 0x32, 0xd3, 0xcc, 0xa7, 0x42, 0x66, 0x7e, 0x30, 0x62, 0x6b, 0x64, 0xf8, 0x49, 0xf4, 0x0a, 0x04, 0x04, 0x2c, 0x70, 0xe7, 0x9b, 0xf0, 0xba, 0xb5, 0xd9, 0x8a, 0x54, 0x61, 0xfd, 0x38, 0x1f, 0x5a, 0x81, 0xc6, 0xca, 0x48, 0x3a, 0x32, 0x3a, 0xa4, 0xf1, 0xcd, 0x06, 0xde, 0x00, 0xa6, 0x69, 0x56, 0xeb, 0x36, 0x6a, 0x79, 0xad, 0x41, 0x59, 0x8f, 0xa2, 0x38, 0xd0, 0x2d, 0x36, 0x69, 0x3d, 0xb1, 0x1a, 0xb9, 0x78, 0x52, 0x49, 0xa0, 0x53, 0x15, 0xae, 0xb7, 0x98, 0xbe, 0x0c, 0xf5, 0x87, 0x3d, 0x2e, 0xfc, 0xf8, 0x76, 0xda, 0x20, 0xca, 0xfb, 0xbb, 0xf4, 0xc2, 0x7d, 0x40, 0xe6, 0x2e, 0x7c, 0x4e, 0x4f, 0xbd, 0x0e, 0xec, 0xe3, 0x3c, 0xf9, 0xc5, 0x20, 0xa0, 0x81, 0x05, 0xec, 0x6b, 0x53, 0xdc, 0x14, 0x58, 0xfb, 0xdc, 0x57, 0xdd, 0xca, 0x1d, 0x47, 0xa3, 0x7c, 0x55, 0x08, 0x2a, 0x67, 0xe2, 0xc9, 0xcb, 0x2b, 0x09, 0xd6, 0x9f, 0x20, 0x2e, 0xc6, 0xe6, 0x92, 0x23, 0x57, 0x37, 0x2b, 0x90, 0x1d, 0xa4, 0x99, 0x3c, 0x1c, 0x3c, 0x3a, 0xa7, 0x0e, 0x8d, 0x43, 0xba, 0x0b, 0xa8, 0x48, 0xfe, 0xed, 0xaf, 0x0c, 0xc9, 0x1c, 0x3a, 0xe6, 0xbe, 0x88, 0x33, 0x9f, 0x2e, 0x52, 0x0e, 0x5d, 0xa9, 0x56, 0xcc, 0xb1, 0xe9, 0x24, 0x57, 0xba, 0x84, 0x32, 0xbb, 0xbb, 0x70, 0xf3, 0x15, 0xc7, 0xb8, 0x9d, 0x65, 0xe4, 0x0e, 0x46, 0x0a, 0xcb, 0xe4, 0xc5, 0xe0, 0xd6, 0x97, 0x31, 0x61, 0xff, 0x7c, 0xd1, 0x58, 0xab, 0xf0, 0x49, 0x79, 0x6d, 0xce, 0x74, 0xdb, 0x1f, 0x61, 0xd6, 0xed, 0xb9, 0xa2, 0x3d, 0x45, 0x38, 0x2a, 0xa3, 0x01, 0xbd, 0x13, 0x9a, 0x89, 0x2d, 0xc0, 0xc6, 0x65, 0x7c, 0xa8, 0x78, 0x21, 0xf9, 0x14, 0xd6, 0xcf, 0x2e, 0xfb, 0xbb, 0x32, 0x8c, 0x54, 0x3a, 0xd2, 0x59, 0xef, 0xfa, 0x86, 0x8b, 0xa9, 0xf5, 0xca, 0x21, 0x43, 0x64, 0x04, 0x1f, 0xe6, 0x34, 0x86, 0x0a, 0x78, 0x7e, 0x5b, 0x77, 0xe2, 0x33, 0x4c, 0x03, 0x28, 0x4a, 0x43, 0x43, 0xed, 0xab, 0x5d, 0x71, 0x27, 0x89, 0x1e, 0x60, 0x0b, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x54, 0x6f, 0xac, 0xd2, 0xf5, 0x33, 0x2c, 0xba, 0x45, 0x07, 0x6c, 0x61, 0x0b, 0x2e, 0x28, 0x8f, 0x00, 0x2e, 0x36, 0x6f, 0xb2, 0x4f, 0x99, 0x02, 0xde, 0x8a, 0xe7, 0xa3, 0xf3, 0x49, 0xc1, 0x44, 0xab, 0x21, 0x21, 0x35, 0x07, 0x00, 0x05, 0x27, 0x1f, 0xe9, 0x04, 0xfe, 0xe7, 0xbb, 0x2e, 0x02, 0xfa, 0xc3, 0xd2, 0xb1, 0x9f, 0x33, 0x25, 0x56, 0xe2, 0x92, 0x48, 0x31, 0xaf, 0xf7, 0xbc, 0x67, 0x59, 0x3b, 0x2d, 0xb6, 0x46, 0x08, 0xd5, 0x59, 0xc2, 0x98, 0x68, 0xe2, 0xa6, 0xb9, 0x9a, 0x92, 0x53, 0xbc, 0xa8, 0xff, 0x6b, 0x30, 0x00, 0x00, 0x00, 0x77, 0xe3, 0xef, 0x5d, 0x5d, 0x23, 0xc7, 0x48, 0x6b, 0xe5, 0x94, 0xbe, 0x8f, 0x9b, 0xa7, 0x8b, 0xf2, 0xc3, 0x8e, 0x70, 0xde, 0xd2, 0xfb, 0x50, 0x7a, 0x12, 0x4a, 0x40, 0xcc, 0x9b, 0x51, 0x91, 0xef, 0x1c, 0xdc, 0x5a, 0x60, 0xf0, 0xfa, 0xab, 0xac, 0xaf, 0xfb, 0x9a, 0x29, 0xce, 0xa3, 0x6f, 0x23, 0x35, 0x9d, 0x23, 0x51, 0xc2, 0x2f, 0xda, 0x93, 0x03, 0x76, 0x77, 0x28, 0xd7, 0x6f, 0x00, 0xca, 0x1c, 0xf2, 0x59, 0x0a, 0xab, 0x03, 0xe3, 0x3f, 0xac, 0xbf, 0x3c, 0x75, 0x52, 0x00, 0xd0, 0xc4, 0x1f, 0x60, 0xc2, 0x01, 0x52, 0xed, 0xa3, 0x34, 0x87, 0x2e, 0xc1, 0xd5, 0x82, 0xe0, 0xb4, 0x2c, 0xa9, 0x27, 0xab, 0x7f, 0x46, 0x66, 0x21, 0xb9, 0x84, 0x85, 0x0a, 0xfe, 0x7a, 0x71, 0xe8, 0x1c, 0xa1, 0x3f, 0xae, 0xfe, 0x00, 0xf1, 0x09, 0x0b, 0xf0, 0x20, 0x8d, 0xcb, 0x0b, 0x96, 0x91, 0xbd, 0x27, 0xee, 0x7a, 0xee, 0xde, 0x42, 0x5c, 0x69, 0x4b, 0x07, 0xb3, 0xd1, 0xef, 0xec, 0xd6, 0x91, 0x0f, 0x22, 0x70, 0x81, 0x63, 0xd6, 0xfd, 0x7e, 0x29, 0xc6, 0xbe, 0xfe, 0x1a, 0x18, 0xe8, 0x14, 0x91, 0xc5, 0xee, 0x81, 0x63, 0xd8, 0xa9, 0x0a, 0x49, 0xb7, 0x1d, 0x8f, 0x8b, 0x5c, 0xb5, 0xce, 0x46, 0x92, 0x4c, 0xa5, 0xff, 0xc9, 0x54, 0x09, 0xa1, 0xf9, 0x73, 0x23, 0xbc, 0x16, 0x9d, 0xac, 0x28, 0xa5, 0x85, 0x68, 0xea, 0x09, 0xd5, 0x0d, 0xde, 0x11, 0xde, 0xf9, 0x9b, 0x0a, 0x30, 0xf0, 0x60, 0xa3, 0xb1, 0x96, 0x6c, 0x6d, 0x97, 0xa7, 0x0a, 0xb9, 0x3a, 0xba, 0xa1, 0xc6, 0xfa, 0x63, 0xc3, 0x01, 0x2d, 0x2e, 0xd5, 0xc5, 0x29, 0xfb, 0x12, 0x8a, 0x88, 0x5a, 0x92, 0x13, 0xc0, 0x9c, 0xc9, 0xe8, 0xa2, 0x93, 0xac, 0x1d, 0xdd, 0xa6, 0xda, 0xd0, 0xa0, 0xb6, 0xb2, 0xd1, 0xb8, 0xa7, 0x1a, 0x1f, 0x21, 0xef, 0x07, 0xd0, 0xae, 0xeb, 0x54, 0x12, 0x94, 0x80, 0x25, 0x3b, 0x0f, 0xaf, 0x4b, 0x0d, 0x8a, 0xa3, 0x8d, 0xf7, 0x4b, 0x3d, 0x37, 0x8b, 0xcf, 0xf0, 0x6b, 0x84, 0x30, 0x5d, 0x20, 0xd8, 0x9a, 0xf6, 0x73, 0xb6, 0xd3, 0xc4, 0x2a, 0xc2, 0xe9, 0xc0, 0x01, 0xa6, 0x9c, 0xc8, 0x56, 0xa0, 0x0e, 0xc0, 0x1f, 0x29, 0xb2, 0xcb, 0x8c, 0x49, 0xb9, 0xf9, 0xe0, 0x85, 0x47, 0x05, 0x7d, 0xb4, 0xe9, 0xdb, 0x92, 0xbd, 0x24, 0xd5, 0xda, 0x30, 0x4e, 0xd2, 0x75, 0x55, 0x42, 0x62, 0x6a, 0x74, 0xa9, 0xb8, 0xe8, 0xd0, 0xfd, 0x88, 0xa9, 0xde, 0x84, 0x89, 0x3d, 0x9e, 0x5b, 0xc8, 0x08, 0x3c, 0x8e, 0x96, 0x47, 0x4c, 0x2d, 0x91, 0x28, 0x5c, 0xee, 0xf9, 0x74, 0xb4, 0x74, 0xc3, 0xe5, 0xb8, 0xda, 0x35, 0xf9, 0x9c, 0x83, 0x0a, 0x21, 0x70, 0xff, 0xcb, 0x95, 0x0c, 0x5a, 0xfa, 0x96, 0x01, 0x0a, 0x2c, 0x7b, 0x7d, 0x3c, 0x0e, 0xcf, 0x78, 0x81, 0x83, 0x64, 0x8c, 0x55, 0x64, 0xe2, 0xdb, 0x6e, 0x4b, 0xdd, 0xd8, 0x49, 0x23, 0x89, 0x34, 0x97, 0x86, 0x87, 0xe7, 0x36, 0x31, 0x9a, 0xb9, 0xdc, 0x60, 0x80, 0xb2, 0xea, 0x55, 0xbc, 0x82, 0x31, 0xc7, 0xb2, 0x35, 0x46, 0x2a, 0x7a, 0xe7, 0x7f, 0x94, 0xfc, 0x18, 0xef, 0x90, 0x6b, 0xe1, 0x71, 0xf0, 0x79, 0xff, 0xf8, 0xcd, 0x05, 0x2b, 0x16, 0x00, 0x3e, 0x5a, 0x3c, 0x57, 0x7d, 0x67, 0x7c, 0x13, 0x02, 0x3d, 0xed, 0xc6, 0x05, 0x29, 0x90, 0x60, 0x1c, 0x46, 0x40, 0x6f, 0xf0, 0xaa, 0xb5, 0xde, 0x7c, 0x75, 0xeb, 0x51, 0x99, 0xa7, 0xbb, 0x40, 0x85, 0xd4, 0x13, 0x9c, 0x99, 0xb5, 0x03, 0xc6, 0xbc, 0x27, 0x04, 0x65, 0x49, 0xc7, 0x3b, 0xff, 0x21, 0xa0, 0x28, 0xb2, 0x06, 0x66, 0x29, 0xdf, 0x29, 0x00, 0x3c, 0x66, 0x30, 0x8b, 0x98, 0xe5, 0xea, 0x0d, 0xf9, 0xe3, 0xbb, 0x2c, 0x45, 0x06, 0x3b, 0xff, 0x78, 0xfb, 0xf8, 0x67, 0xca, 0xe4, 0x92, 0x29, 0xd7, 0xb2, 0x3c, 0x06, 0xf3, 0x16, 0x40, 0x35, 0x3b, 0xdd, 0xd2, 0xd2, 0xdb, 0xc0, 0x73, 0xd6, 0x3e, 0xd1, 0x0a, 0xb2, 0xa6, 0x82, 0x56, 0x75, 0xf2, 0xcf, 0xa4, 0x97, 0x21, 0xbf, 0xc2, 0xa6, 0x8c, 0xc6, 0xfb, 0x5b, 0xe2, 0xf4, 0xe0, 0x6f, 0x9c, 0x73, 0x36, 0x53, 0x05, 0x09, 0x59, 0x03, 0xba, 0x28, 0xca, 0xe2, 0x68, 0xd6, 0xee, 0x38, 0x14, 0x7a, 0x74, 0xe9, 0xe4, 0x13, 0xcb, 0x82, 0xde, 0x11, 0x1a, 0x97, 0x75, 0x6a, 0xc4, 0xa6, 0x55, 0x27, 0x11, 0xc1, 0x67, 0xfb, 0xe9, 0xbf, 0x0e, 0x45, 0x02, 0x0c, 0xbf, 0xce, 0x7e, 0xde, 0xdc, 0xf7, 0x18, 0xf5, 0xff, 0x8e, 0xc7, 0xf4, 0xd5, 0xe9, 0xa4, 0x37, 0x05, 0xc8, 0x68, 0xfc, 0xc3, 0x81, 0x62, 0x15, 0x97, 0x22, 0xa6, 0x61, 0x7d, 0x58, 0x8d, 0x21, 0xc8, 0x4e, 0x0f, 0x30, 0x20, 0x4f, 0x5a, 0x8c, 0x37, 0x81, 0x8d, 0x60, 0xcb, 0xd5, 0x7d, 0x89, 0x14, 0x16, 0xc2, 0x0e, 0x7f, 0x48, 0xe3, 0x26, 0x77, 0x75, 0xc2, 0x27, 0xa6, 0xa6, 0x43, 0xeb, 0xcf, 0x37, 0xc2, 0xfa, 0x10, 0x23, 0xa9, 0xdc, 0xe1, 0x94, 0xb8, 0xf9, 0xc9, 0xd8, 0xff, 0xc8, 0xd5, 0xc5, 0xd9, 0xdf, 0xb5, 0x9e, 0x60, 0x64, 0xe1, 0x6a, 0x62, 0x1a, 0xf5, 0xcb, 0x05, 0x88, 0x15, 0xd4, 0x94, 0xc5, 0x3f, 0xdc, 0x26, 0x89, 0x7f, 0x7d, 0x63, 0x34, 0x53, 0x81, 0x8e, 0xb9, 0x4b, 0xd9, 0x5c, 0x06, 0xf6, 0x95, 0xe3, 0x4a, 0xac, 0x67, 0xed, 0x2c, 0x8d, 0x1f, 0x53, 0xf0, 0xd4, 0x10, 0x34, 0xcd, 0x50, 0x3f, 0x1b, 0x1f, 0xbe, 0x9c, 0x68, 0x16, 0x9d, 0x02, 0x66, 0xc8, 0x92, 0x5c, 0x2e, 0x22, 0xe4, 0x25, 0xa1, 0x78, 0x93, 0xfb, 0xbe, 0x4b, 0x1f, 0x50, 0x7c, 0x10, 0x99, 0xda, 0x35, 0x16, 0xb8, 0x35, 0x38, 0x79, 0x5d, 0xcd, 0xa2, 0x1c, 0x5a, 0xa4, 0x9b, 0x26, 0x56, 0x37, 0x2f, 0xa3, 0x63, 0x7e, 0x8f, 0xf7, 0x89, 0xbd, 0x62, 0x30, 0xec, 0x49, 0x5b, 0xc9, 0x13, 0x75, 0x96, 0x6e, 0x2d, 0x92, 0x32, 0x27, 0x67, 0x31, 0x4d, 0xf9, 0xf3, 0x2e, 0xc7, 0xbe, 0x01, 0x69, 0xac, 0x5a, 0x20, 0xf3, 0xfd, 0xa0, 0xf1, 0x44, 0xba, 0x45, 0x89, 0x71, 0x2a, 0xca, 0x82, 0xfa, 0x28, 0x22, 0xd9, 0x4b, 0xc4, 0x00, 0xb7, 0xa1, 0x4d, 0xd1, 0xe8, 0xa3, 0xc7, 0xd5, 0x25, 0xf5, 0xcb, 0x0e, 0xa6, 0x3e, 0xa3, 0x7a, 0x10, 0x99, 0xad, 0xc0, 0x84, 0x4d, 0x43, 0x7d, 0x04, 0x9e, 0xea, 0xf1, 0xbe, 0xa7, 0xb0, 0xf0, 0x44, 0xfa, 0x0a, 0x2f, 0xed, 0x27, 0xf6, 0x9e, 0x96, 0x0a, 0x89, 0x10, 0x07, 0x6f, 0x19, 0x3b, 0x21, 0x0e, 0xac, 0x89, 0xa1, 0xb7, 0xeb, 0x25, 0x21, 0xea, 0x4c, 0x53, 0xcc, 0x4b, 0xfc, 0xc0, 0xb9, 0x86, 0x65, 0x98, 0x92, 0xbe, 0x64, 0x26, 0x12, 0xac, 0x80, 0x74, 0x90, 0x15, 0x47, 0x67, 0x3d, 0x69, 0x56, 0x98, 0x6c, 0xaf, 0x4d, 0x04, 0x4a, 0xac, 0xcb, 0xc8, 0xe2, 0xb1, 0x75, 0xf8, 0xcf, 0xf6, 0xa2, 0x3f, 0xa1, 0x6e, 0xfe, 0xd6, 0xf7, 0x03, 0x30, 0x1f, 0x0c, 0x59, 0x3a, 0xd0, 0x31, 0x75, 0xf2, 0xd2, 0x33, 0x94, 0xdc, 0xe1, 0xb4, 0xe2, 0xe8, 0xdf, 0xaf, 0x65, 0xa3, 0x92, 0x83, 0x56, 0x27, 0x71, 0x28, 0xf6, 0x38, 0x1d, 0x25, 0x60, 0xa7, 0x0f, 0x4b, 0xb8, 0x50, 0xe9, 0x67, 0xeb, 0x72, 0x5d, 0x31, 0xae, 0x5e, 0x40, 0x23, 0x38, 0xe1, 0x5f, 0x0f, 0x10, 0x27, 0xa6, 0x6d, 0x6f, 0x11, 0xf8, 0x62, 0xc3, 0x23, 0x4f, 0x19, 0x4a, 0x7d, 0x7f, 0xdb, 0x2a, 0x39, 0x34, 0x73, 0x65, 0x45, 0x0e, 0x0d, 0xee, 0x31, 0x55, 0x60, 0x64, 0x07, 0xb9, 0x59, 0x12, 0xa0, 0x27, 0xc1, 0xc7, 0xdf, 0x65, 0x31, 0x7f, 0x8e, 0x6f, 0x32, 0x7c, 0xcc, 0x6b, 0x1d, 0xfa, 0x42, 0x4b, 0x34, 0xec, 0xd3, 0x7e, 0x65, 0x68, 0x66, 0x64, 0x86, 0x47, 0x20, 0x69, 0x21, 0xfb, 0x82, 0x06, 0x75, 0x40, 0x37, 0x18, 0x6e, 0x30, 0x6c, 0xe6, 0x8d, 0xcb, 0x2f, 0x4d, 0xf7, 0xcb, 0xe4, 0x65, 0x06, 0x75, 0xe3, 0xd8, 0x9a, 0x47, 0x09, 0x5a, 0x50, 0x07, 0x1e, 0x2e, 0xe0, 0xda, 0x77, 0xe3, 0xbb, 0x52, 0x0d, 0xf5, 0x52, 0xc0, 0xd4, 0x33, 0xbf, 0xec, 0x6e, 0x41, 0x10, 0x4f, 0xda, 0x37, 0x53, 0xfa, 0x96, 0x4f, 0x39, 0xcf, 0x06, 0xf2, 0x92, 0x3a, 0xe5, 0x43, 0x7e, 0x5a, 0x3d, 0x8d, 0xcf, 0xb1, 0x6c, 0xc6, 0x09, 0xdd, 0xda, 0x64, 0x43, 0xd5, 0xbb, 0x46, 0x56, 0x59, 0x36, 0x3d, 0x70, 0xe4, 0xd1, 0xea, 0x48, 0xd4, 0x49, 0x49, 0xb5, 0x1a, 0xbc, 0x45, 0x16, 0x04, 0x78, 0xb6, 0xa1, 0x6e, 0xea, 0x53, 0x14, 0x1a, 0x77, 0xb9, 0x01, 0x98, 0xa3, 0x66, 0x19, 0x4d, 0x5d, 0x86, 0x24, 0x08, 0x3b, 0x21, 0xbb, 0x99, 0x96, 0x90, 0x9e, 0xe3, 0x2e, 0xcb, 0xb2, 0xc4, 0x38, 0x55, 0xb5, 0x4c, 0xe4, 0x5a, 0x52, 0xe2, 0xdf, 0xc2, 0xa1, 0xfc, 0xa4, 0xe7, 0x1f, 0x10, 0xc7, 0x20, 0xc4, 0xf3, 0x21, 0x41, 0xfd, 0x42, 0x34, 0x0d, 0xa2, 0x4c, 0x56, 0x7d, 0xd4, 0xc5, 0xc1, 0x7d, 0x97, 0x6a, 0xed, 0x8a, 0x10, 0xfc, 0xec, 0x21, 0xa6, 0xfb, 0x94, 0x16, 0x6b, 0xf9, 0xe4, 0xae, 0x85, 0xbd, 0x86, 0x08, 0x35, 0xbc, 0x7e, 0x52, 0x7a, 0xb5, 0x24, 0x70, 0x81, 0x29, 0xb2, 0x6e, 0x84, 0xbd, 0x53, 0xb1, 0x0b, 0x90, 0xf1, 0x6f, 0x87, 0xe8, 0x57, 0x2d, 0x5c, 0x57, 0x2a, 0x7a, 0x11, 0xc9, 0x39, 0x60, 0x3c, 0xda, 0x5f, 0xa5, 0x20, 0x85, 0xa7, 0x5d, 0x30, 0x56, 0x78, 0xfe, 0x2c, 0x6f, 0x92, 0x99, 0x32, 0x9d, 0x28, 0x26, 0xd5, 0x4a, 0x72, 0xb0, 0x86, 0x25, 0x43, 0x21, 0xc8, 0x7b, 0x93, 0x3e, 0xdb, 0x8a, 0x6b, 0xcd, 0x1d, 0x28, 0x99, 0x9f, 0x51, 0x4b, 0x1a, 0x49, 0x49, 0x93, 0x99, 0xa8, 0x4b, 0xfd, 0xe6, 0x42, 0xaa, 0x41, 0x66, 0xec, 0xf1, 0xf2, 0xae, 0x9d, 0x6f, 0x6f, 0x17, 0xf6, 0x6d, 0x74, 0x61, 0x81, 0xb9, 0x3e, 0x80, 0x17, 0xec, 0x08, 0xe8, 0x73, 0x63, 0x0b, 0x5e, 0x3e, 0x37, 0xfd, 0x1c, 0xd8, 0x5f, 0xf4, 0xfd, 0x65, 0x7b, 0x88, 0xe8, 0x45, 0xf6, 0x02, 0x29, 0x5c, 0xab, 0xbd, 0xed, 0x34, 0xff, 0x8b, 0xcb, 0x8c, 0xd6, 0x0c, 0x4c, 0xc4, 0xa7, 0xff, 0x44, 0xd2, 0xa9, 0xf1, 0x35, 0x55, 0x5f, 0x89, 0x08, 0xa5, 0x92, 0xd9, 0x69, 0xe0, 0x8e, 0x1b, 0xa3, 0xc4, 0xdb, 0x6e, 0x10, 0xfe, 0xb9, 0x2b, 0x89, 0xfa, 0x5d, 0xf0, 0x15, 0x4c, 0xa7, 0x5c, 0xa9, 0x0d, 0x23, 0x2f, 0xf0, 0xc1, 0x29, 0xf6, 0xd6, 0x7e, 0xce, 0xc1, 0x44, 0xd9, 0xdd, 0x13, 0x2f, 0x7a, 0x72, 0x17, 0xaf, 0x89, 0xd4, 0xee, 0x9d, 0x1b, 0xb6, 0xbf, 0xc1, 0x58, 0x98, 0x22, 0xc3, 0x24, 0x89, 0xf5, 0x48, 0xb1, 0xbb, 0x84, 0x1b, 0x67, 0x5e, 0x49, 0x0b, 0xd3, 0xee, 0xa4, 0xe6, 0x34, 0x45, 0xb7, 0xeb, 0x0b, 0xd4, 0x62, 0x2e, 0x4b, 0x4b, 0xe4, 0x41, 0xc2, 0xda, 0x41, 0x58, 0x56, 0x06, 0x83, 0xdc, 0xe1, 0xda, 0xff, 0x8f, 0x57, 0x83, 0xe6, 0xeb, 0x0d, 0xfd, 0x7a, 0x2f, 0x4b, 0x33, 0x48, 0x19, 0x5f, 0xa0, 0xe0, 0x8c, 0xae, 0x03, 0x92, 0xeb, 0xb9, 0xbd, 0xef, 0xdf, 0x6c, 0x66, 0x8e, 0x5e, 0xf0, 0xd7, 0x74, 0xaa, 0xf6, 0xe6, 0x56, 0x4e, 0x51, 0x0f, 0x23, 0x68, 0xb5, 0xcb, 0x6b, 0x41, 0x0d, 0x8a, 0x6c, 0x2b, 0x0f, 0x19, 0xaf, 0xf1, 0xe5, 0xc8, 0xad, 0x43, 0x2f, 0x94, 0x44, 0xa9, 0xcb, 0x54, 0x29, 0x79, 0xa1, 0xab, 0x76, 0xec, 0x29, 0x7c, 0xaf, 0xa0, 0x83, 0x9a, 0x89, 0x0d, 0x51, 0xed, 0x19, 0xec, 0x75, 0xea, 0x72, 0xa9, 0x7d, 0x67, 0x22, 0x7d, 0x65, 0x7d, 0xc4, 0xf6, 0xd5, 0xc9, 0x0a, 0x8b, 0xba, 0x16, 0x02, 0xb5, 0x98, 0x63, 0x4a, 0x36, 0xc2, 0xae, 0x68, 0xec, 0x60, 0x0b, 0xdc, 0x53, 0x8e, 0xfd, 0x3a, 0x9c, 0xf9, 0x4e, 0x8f, 0x70, 0xec, 0x69, 0x4f, 0x6e, 0x02, 0xf3, 0x5f, 0x23, 0xf8, 0xa4, 0x28, 0xdd, 0x42, 0xaf, 0xc9, 0xaa, 0xaf, 0x2f, 0x9c, 0x10, 0xa1, 0x78, 0x26, 0x76, 0x39, 0x6f, 0x4f, 0x32, 0x60, 0xf5, 0x88, 0xb6, 0xf4, 0x98, 0x01, 0x6e, 0x65, 0x92, 0xfd, 0x86, 0x98, 0xfe, 0x11, 0xaa, 0x0f, 0xb6, 0x4f, 0x36, 0xfb, 0x0b, 0x77, 0x58, 0xfa }; +constexpr AccessUnit AC3_MULTIPLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 0, {}, { 0x79, 0x8a, 0x07, 0x46, 0x57, 0xa6, 0x1d, 0x59, 0x7a, 0xdd, 0x08, 0xfc, 0xd0, 0xe3, 0x3b, 0xef, 0xe7, 0x60, 0xa5, 0x91 } }; +constexpr AccessUnit AC3_MULTIPLE_PACK_EXPECTED_AU_2 = { 0x6c30bb8a, 0x132b3bdd, false, 0, {}, { 0x67, 0x41, 0xc8, 0x5f, 0xec, 0xad, 0xd9, 0x3d, 0xce, 0x0f, 0x03, 0x89, 0x70, 0x81, 0x04, 0x15, 0xa1, 0x4a, 0x0c, 0xf9 } }; +constexpr AccessUnit AC3_MULTIPLE_PACK_EXPECTED_AU_3 = { 0x15f90, 0x159b2, false, 0, {}, { 0x7c, 0x0e, 0xf4, 0xe5, 0x3e, 0x5d, 0x1f, 0xaa, 0x37, 0x09, 0x54, 0x74, 0x63, 0x57, 0xae, 0xc3, 0x72, 0x53, 0x53, 0xab } }; +constexpr AccessUnit AC3_MULTIPLE_PACK_EXPECTED_AU_4 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xa0, 0xcf, 0xde, 0x0c, 0x55, 0x6a, 0x70, 0x0b, 0x74, 0x55, 0x2b, 0x81, 0x2e, 0x70, 0xe7, 0x55, 0x67, 0xfa, 0x32, 0xa4 } }; + + +constexpr std::array AVC_TINY_PACKETS_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x75, 0x62, 0x06, 0xcf, 0xeb, 0x38, 0xf4, 0x91, 0x03, 0xac, 0x06, 0xee, 0xf5, 0x5a, 0x22, 0x5e, 0xb8, 0xd5, 0xf1, 0x50, 0x3f, 0x49, 0xd9, 0x47, 0x75, 0xc3, 0x8c, 0x6d, 0xac, 0x33, 0xc5, 0xc6, 0xc8, 0x25, 0x8f, 0x11, 0xd3, 0xf6, 0xf6, 0xdb, 0xad, 0xca, 0x5d, 0x4e, 0x0f, 0xb9, 0x1f, 0x1d, 0xe5, 0x5d, 0xb7, 0xd3, 0xfa, 0x76, 0xa6, 0x64, 0x99, 0xd0, 0x7b, 0x8e, 0xc2, 0x09, 0xf4, 0x2a, 0x11, 0x3c, 0x1b, 0xe4, 0xe5, 0xee, 0xe4, 0x36, 0x2f, 0x63, 0xa5, 0x8e, 0x5e, 0x32, 0x59, 0x17, 0xcd, 0x22, 0xb5, 0xf0, 0xea, 0xe3, 0xef, 0x22, 0x1e, 0x67, 0x46, 0xeb, 0x93, 0x3f, 0x90, 0x49, 0x38, 0x0c, 0xa0, 0xe5, 0x1c, 0x11, 0x94, 0xec, 0x8f, 0xc0, 0x4f, 0x87, 0xaf, 0xcb, 0x41, 0xa8, 0x17, 0xa7, 0x2e, 0xdb, 0x53, 0xaf, 0x6c, 0x07, 0x54, 0x78, 0xba, 0x15, 0xf0, 0xdc, 0xd7, 0x18, 0x9d, 0x9e, 0x6d, 0x3b, 0x0b, 0xac, 0xfb, 0x58, 0x04, 0x1c, 0x96, 0x36, 0xe8, 0x40, 0xf2, 0x76, 0xb8, 0x71, 0x30, 0x6c, 0x66, 0x24, 0x50, 0xa4, 0x58, 0x7b, 0x45, 0xaa, 0x5e, 0x04, 0x1d, 0x17, 0xf8, 0x5b, 0x68, 0x51, 0xf0, 0xb1, 0x06, 0xe5, 0x47, 0xb0, 0xb0, 0x55, 0xe1, 0xb8, 0x3d, 0x28, 0x6e, 0x8e, 0x63, 0x4c, 0x61, 0x05, 0xa8, 0xfd, 0x5a, 0x15, 0xf3, 0xed, 0xbb, 0x7d, 0xe3, 0x7e, 0x35, 0x93, 0x55, 0xb2, 0x8d, 0x0c, 0xe9, 0x89, 0xbc, 0xaa, 0xf5, 0x9f, 0x6a, 0xc3, 0x41, 0xf8, 0x34, 0xb7, 0xd5, 0x09, 0x41, 0x37, 0x6b, 0x0e, 0xc3, 0xd1, 0x1a, 0x3e, 0xe4, 0x68, 0xb9, 0x9a, 0xc4, 0x24, 0x7c, 0x57, 0x8a, 0x2c, 0x69, 0xf9, 0x4b, 0x4d, 0xd0, 0x4a, 0x9b, 0x0e, 0x93, 0x4f, 0xcd, 0xb5, 0x41, 0xc6, 0x2e, 0x98, 0x0a, 0x14, 0x8d, 0xa4, 0xf7, 0x3a, 0x19, 0x85, 0x89, 0x56, 0xcb, 0x85, 0x0b, 0x4b, 0x99, 0x8b, 0xb0, 0x11, 0xd6, 0xd7, 0xbe, 0x0c, 0xf8, 0x6d, 0x9c, 0xd9, 0xb0, 0x96, 0x8c, 0x70, 0x74, 0x10, 0x54, 0xd7, 0x98, 0x50, 0x5d, 0x4e, 0x24, 0xb9, 0x41, 0xe3, 0x6f, 0xe6, 0x9d, 0x89, 0x9e, 0xef, 0x3f, 0xc0, 0x4e, 0x11, 0x59, 0xe6, 0x5d, 0x94, 0x4e, 0x5d, 0xb6, 0x21, 0xf6, 0xcd, 0x2b, 0x8e, 0x82, 0x6e, 0xc1, 0xb1, 0x1a, 0xcd, 0xad, 0xfc, 0x4c, 0x16, 0x9b, 0x98, 0xa9, 0x6b, 0xcd, 0xd0, 0xd5, 0x78, 0x0e, 0x97, 0x97, 0x1a, 0xa2, 0xf0, 0xdb, 0xea, 0xf9, 0x88, 0x74, 0xea, 0x85, 0x8a, 0x80, 0xcb, 0x70, 0xfd, 0x6b, 0xf6, 0x31, 0xab, 0xaf, 0x8d, 0xee, 0xba, 0x67, 0xcc, 0xdc, 0x0c, 0xe7, 0x59, 0xd2, 0xba, 0x5e, 0xb7, 0x5d, 0x2f, 0x82, 0xa0, 0x77, 0xc1, 0x4a, 0x0b, 0x77, 0xd1, 0xaa, 0x1c, 0x19, 0xfa, 0xaf, 0xbc, 0xb3, 0xa0, 0x96, 0x27, 0x9c, 0x32, 0x9d, 0x34, 0x23, 0xc9, 0x7f, 0xf9, 0x7a, 0x68, 0x46, 0xa7, 0x8b, 0x0e, 0x2a, 0x4c, 0xe4, 0xbe, 0x3a, 0xca, 0x56, 0x52, 0xa2, 0x6c, 0x22, 0x00, 0x67, 0xef, 0x7a, 0x7d, 0x70, 0x7b, 0x52, 0x4a, 0xcd, 0xcd, 0xe9, 0x3e, 0x5e, 0x81, 0xf0, 0xe2, 0x41, 0x08, 0x6f, 0x4a, 0x93, 0xf2, 0xbd, 0xf2, 0xe0, 0xfa, 0x6b, 0x98, 0xc5, 0xdc, 0xea, 0xc5, 0xc3, 0x07, 0x6a, 0x15, 0x0e, 0x5e, 0xe7, 0xf0, 0xe6, 0x48, 0xe7, 0x48, 0x2f, 0x3c, 0xc1, 0x12, 0xa5, 0xe3, 0xdc, 0x49, 0x0a, 0xa2, 0x5c, 0x14, 0x37, 0x29, 0xf0, 0x29, 0x9a, 0x0c, 0xeb, 0xf9, 0xd0, 0x6e, 0x13, 0xb4, 0x3f, 0xc3, 0x35, 0x28, 0x63, 0x76, 0x89, 0xa4, 0xf2, 0x8a, 0x47, 0x7b, 0x97, 0xef, 0xa7, 0x0e, 0x86, 0xe3, 0x89, 0xa4, 0xae, 0x7d, 0xa3, 0x8e, 0x0a, 0xee, 0x17, 0x99, 0x1c, 0x56, 0xba, 0xc7, 0xca, 0x32, 0xea, 0x9b, 0x23, 0xf0, 0x88, 0xe3, 0x1c, 0xd6, 0xb0, 0xc7, 0xad, 0x6f, 0x58, 0x03, 0xaa, 0xd6, 0x79, 0x33, 0xc2, 0x43, 0xbd, 0xae, 0x1b, 0xcb, 0x17, 0xac, 0x34, 0x35, 0xfc, 0xb3, 0x50, 0x16, 0xd5, 0x1b, 0xcf, 0x99, 0xd3, 0xea, 0xe0, 0x59, 0xc8, 0x1b, 0x4d, 0xad, 0xb0, 0xa2, 0x37, 0x88, 0xa7, 0x2a, 0x45, 0x4a, 0x3b, 0xd2, 0xcd, 0x81, 0x7e, 0x4d, 0x3e, 0x9d, 0x9d, 0xe6, 0xb1, 0xfc, 0x7b, 0x1e, 0xf3, 0x7b, 0x74, 0x0a, 0x3d, 0x66, 0x02, 0x99, 0xf7, 0xdb, 0x6d, 0x4d, 0x3f, 0x1f, 0x7f, 0x6e, 0xd4, 0x57, 0x62, 0x51, 0xd6, 0x62, 0xae, 0x28, 0x3e, 0xed, 0xc3, 0x8b, 0x8d, 0x0f, 0xb9, 0x1a, 0xe6, 0x79, 0xa7, 0x28, 0xb8, 0xf9, 0xb3, 0x39, 0x50, 0x55, 0x30, 0x59, 0xef, 0x17, 0xb5, 0x18, 0xff, 0xdc, 0xbc, 0xd0, 0x22, 0x6b, 0x79, 0x62, 0x70, 0x5e, 0xdc, 0x5c, 0x24, 0xa1, 0x65, 0xb5, 0x5b, 0x96, 0x1f, 0x1b, 0xe2, 0x3c, 0xd4, 0x15, 0xf4, 0xc8, 0x1f, 0xd7, 0x9e, 0x72, 0xc2, 0x0f, 0x9e, 0x00, 0x9a, 0xf8, 0x68, 0x70, 0x6e, 0x07, 0xac, 0xde, 0x61, 0x03, 0x7d, 0x09, 0xd0, 0x45, 0xae, 0x2e, 0x98, 0x7c, 0x8f, 0xc9, 0x9a, 0x3a, 0x47, 0xd2, 0x70, 0x80, 0xd2, 0x9d, 0x19, 0xd7, 0xf4, 0x26, 0x05, 0x17, 0x0c, 0x12, 0x0d, 0x3a, 0xd8, 0xf6, 0xeb, 0x21, 0xa4, 0xd9, 0x2a, 0x83, 0x00, 0x8b, 0x9d, 0x07, 0xf9, 0x44, 0xc2, 0x18, 0x9e, 0xf9, 0xb9, 0xa0, 0xa0, 0x2a, 0x4c, 0x77, 0x50, 0xc4, 0x25, 0x3f, 0x9d, 0xab, 0x35, 0x9d, 0x41, 0x1e, 0x79, 0x5c, 0xd5, 0x61, 0x01, 0x95, 0x01, 0x26, 0x7f, 0x57, 0xe3, 0xaa, 0xfd, 0x02, 0x21, 0x01, 0xeb, 0x38, 0xfa, 0xa7, 0x4c, 0x99, 0x26, 0x46, 0xdf, 0x8d, 0x34, 0xc2, 0xc5, 0x6a, 0xc8, 0xda, 0x90, 0x48, 0xdc, 0x48, 0x3b, 0x87, 0x0b, 0x1b, 0x4f, 0xf1, 0x5b, 0x2f, 0x1e, 0x1e, 0x12, 0xd6, 0x9e, 0x7d, 0x01, 0x1d, 0x10, 0xd4, 0x1d, 0x42, 0x30, 0x08, 0xf1, 0xa8, 0x9e, 0x5c, 0xdf, 0xfe, 0xdb, 0x6f, 0x62, 0x12, 0x5d, 0x70, 0x7d, 0xe7, 0x81, 0x7b, 0xa7, 0xb2, 0xed, 0xa4, 0x3c, 0x6e, 0x51, 0xf3, 0x08, 0x44, 0xf7, 0x76, 0xaa, 0x6b, 0xb2, 0x8b, 0xd8, 0xb7, 0x9d, 0x65, 0x2a, 0x3d, 0x4a, 0xeb, 0x08, 0xfc, 0xd6, 0xc6, 0x4e, 0x52, 0xbb, 0x43, 0xd1, 0x05, 0x5e, 0x76, 0x09, 0x98, 0x2e, 0x6d, 0xcb, 0xfa, 0x22, 0x41, 0x73, 0x84, 0x00, 0x6b, 0xab, 0xf0, 0x38, 0x90, 0x2e, 0x3e, 0xe7, 0x9e, 0x16, 0xee, 0x67, 0x51, 0xb5, 0xe2, 0x49, 0x1d, 0xb1, 0x19, 0xa9, 0x0f, 0x58, 0x13, 0xec, 0x43, 0xb4, 0x6b, 0x82, 0xaf, 0x1b, 0x9a, 0x17, 0xe0, 0xab, 0x0f, 0xfe, 0xf7, 0x03, 0xf8, 0xf3, 0xc8, 0x6f, 0x09, 0x1a, 0x7a, 0x72, 0x4e, 0xa7, 0x2f, 0x9e, 0x1f, 0x63, 0x91, 0x7c, 0xca, 0x37, 0x3b, 0x26, 0x2b, 0x08, 0x75, 0x76, 0x38, 0xbb, 0xec, 0x9a, 0xa0, 0x6f, 0x8d, 0x33, 0xd4, 0xf2, 0x36, 0x31, 0x9d, 0x40, 0xb1, 0xc7, 0xe5, 0xbb, 0x8e, 0x0a, 0x23, 0xa3, 0x74, 0x90, 0xe3, 0xb2, 0x25, 0x1e, 0xab, 0x07, 0x1f, 0x0c, 0x5a, 0xe3, 0x56, 0x7f, 0xf4, 0x9c, 0x1b, 0x55, 0x07, 0x6b, 0x4b, 0xab, 0xd6, 0x49, 0xdf, 0xaf, 0x62, 0xdf, 0x6b, 0x53, 0x14, 0x1e, 0xa5, 0xa2, 0x54, 0xcb, 0xe7, 0xce, 0x41, 0x0c, 0x37, 0xe0, 0x3a, 0x54, 0xe3, 0x2e, 0x4e, 0x9a, 0x64, 0x11, 0x36, 0x59, 0xc2, 0xda, 0xc3, 0x60, 0xdd, 0x57, 0xab, 0xa4, 0xa5, 0xbc, 0x11, 0x7a, 0xf1, 0x34, 0x65, 0x95, 0x75, 0xc8, 0x60, 0x77, 0x36, 0x73, 0x7d, 0x12, 0x9b, 0xd7, 0xa5, 0x7c, 0x28, 0xe5, 0x71, 0x67, 0x6d, 0xd3, 0x0f, 0x3c, 0x10, 0x37, 0xc3, 0xfd, 0x04, 0x11, 0x3b, 0xdd, 0x83, 0x3c, 0xcc, 0x58, 0x11, 0x01, 0x4f, 0xbc, 0xb7, 0x9c, 0x0d, 0x63, 0x4a, 0xc5, 0x87, 0xf9, 0x53, 0xd2, 0xb1, 0x95, 0x2e, 0x41, 0x8d, 0x8b, 0x02, 0x0b, 0x81, 0x1d, 0x5c, 0x39, 0x5b, 0xfd, 0xc6, 0x73, 0xc9, 0x6e, 0xed, 0xe2, 0xe3, 0x2d, 0x4e, 0xb3, 0xfb, 0x95, 0xe6, 0x9a, 0x7f, 0x2f, 0x64, 0xc1, 0x83, 0xb8, 0x55, 0xb1, 0x05, 0xcb, 0xaa, 0xdc, 0xaa, 0xed, 0xf7, 0x56, 0xd5, 0xdc, 0x3b, 0x5b, 0x5c, 0xa8, 0xd4, 0x2b, 0x4c, 0xf1, 0xbf, 0xe7, 0x37, 0x47, 0x28, 0x9c, 0x74, 0x54, 0x19, 0x9d, 0xe7, 0x64, 0x09, 0x35, 0xd0, 0x78, 0xdf, 0x8d, 0xcc, 0x9e, 0x9c, 0x19, 0xa5, 0xb6, 0xe2, 0x85, 0x0e, 0x7e, 0x1f, 0x3b, 0x69, 0x63, 0xbd, 0xda, 0x79, 0xd0, 0x9d, 0x67, 0x31, 0x6a, 0xf3, 0xcf, 0xdf, 0x4e, 0x55, 0x01, 0xe8, 0x22, 0xf1, 0x4a, 0x2a, 0x06, 0xb3, 0x3a, 0x82, 0x6c, 0xa8, 0xb3, 0x39, 0xb3, 0x98, 0x09, 0xf8, 0xde, 0x66, 0x39, 0xaf, 0xb1, 0x71, 0xf9, 0x01, 0xe3, 0x5f, 0x83, 0x8c, 0x42, 0xbb, 0x66, 0x5c, 0xcc, 0xaf, 0xce, 0x38, 0xad, 0x08, 0x99, 0xf2, 0x47, 0xc7, 0xf4, 0xe6, 0xeb, 0x15, 0x68, 0x7f, 0xf3, 0xc7, 0xe6, 0x3e, 0xcc, 0x2c, 0x74, 0xdc, 0xb7, 0x57, 0xfc, 0x2d, 0x70, 0x74, 0xa0, 0xf0, 0xf2, 0x97, 0x69, 0x31, 0x14, 0x96, 0x18, 0x6d, 0x23, 0xb1, 0xd6, 0x69, 0x8d, 0x53, 0xeb, 0x46, 0xde, 0xb3, 0xb4, 0x2b, 0x45, 0x1b, 0x2c, 0x48, 0x44, 0x22, 0x72, 0x0d, 0xc2, 0xa4, 0x9b, 0x86, 0x16, 0xc7, 0x9c, 0x34, 0x47, 0xc5, 0x97, 0xd0, 0x56, 0xd7, 0x54, 0x63, 0x5d, 0x64, 0xa0, 0xbb, 0x85, 0x46, 0x77, 0xe7, 0x05, 0x1c, 0x50, 0x90, 0x4d, 0x73, 0xac, 0x2c, 0x38, 0xb5, 0xb1, 0x36, 0x34, 0x63, 0x13, 0xa8, 0x40, 0x8d, 0x6b, 0xea, 0x99, 0x71, 0x11, 0x43, 0xf3, 0x4b, 0x96, 0x19, 0x6b, 0x28, 0xf3, 0x8b, 0xaa, 0x7c, 0x19, 0x36, 0xc5, 0x64, 0xce, 0x05, 0x43, 0x58, 0x27, 0x21, 0xaa, 0x3e, 0xb1, 0xed, 0x06, 0x41, 0x8a, 0x54, 0x8f, 0xfc, 0x49, 0xbe, 0x4b, 0xf6, 0x9c, 0x39, 0xc8, 0xaa, 0xbd, 0xa8, 0xba, 0x0b, 0x8a, 0x5c, 0x2b, 0xc7, 0x85, 0x56, 0x0e, 0x75, 0x86, 0x9e, 0x24, 0x5e, 0x62, 0xd7, 0x9f, 0xbc, 0xc0, 0x55, 0x52, 0xb9, 0xca, 0xe0, 0xa8, 0xa0, 0xa6, 0x27, 0xc4, 0x26, 0xf7, 0x60, 0x5e, 0x67, 0xe8, 0xd4, 0x1b, 0x76, 0x7c, 0x9c, 0x74, 0x79, 0x1a, 0xe2, 0x14, 0xc3, 0x6e, 0xe8, 0xe1, 0x62, 0xba, 0x65, 0x06, 0xba, 0x86, 0xa1, 0x45, 0x75, 0x26, 0x18, 0xcd, 0x1f, 0x8c, 0x6e, 0x10, 0x9d, 0x7e, 0x3a, 0x21, 0x29, 0x25, 0xcb, 0x4f, 0x74, 0xb5, 0xff, 0x35, 0x2b, 0xd4, 0xd8, 0x66, 0x0b, 0x48, 0x6c, 0x86, 0xd5, 0x8b, 0x08, 0x70, 0xad, 0xf3, 0xf6, 0x5d, 0x3c, 0x36, 0x41, 0xd5, 0x92, 0xee, 0xab, 0x3e, 0x5b, 0x30, 0x4e, 0xf3, 0xfe, 0x2d, 0x1b, 0xe2, 0x68, 0xf2, 0x95, 0x8c, 0xd0, 0xb2, 0x09, 0x47, 0xc5, 0x57, 0x1b, 0x33, 0xcc, 0x63, 0xbd, 0x96, 0x44, 0xdc, 0xe1, 0xff, 0x17, 0x6a, 0xa1, 0x49, 0x2c, 0xc4, 0xab, 0x93, 0xc6, 0x3b, 0x8d, 0x60, 0xe8, 0x57, 0x43, 0x58, 0xe4, 0x20, 0x41, 0x43, 0xa3, 0x07, 0xc9, 0xeb, 0x3d, 0xfa, 0xd1, 0x21, 0xef, 0x82, 0x9a, 0x09, 0xcb, 0xf0, 0x09, 0x1f, 0xad, 0xa1, 0x0d, 0x41, 0xdd, 0x8d, 0x9d, 0x63, 0xbb, 0xcf, 0xf4, 0xee, 0x9a, 0xbc, 0x5a, 0xf2, 0x58, 0xdf, 0xcd, 0x08, 0x9c, 0xf3, 0x48, 0xd9, 0x52, 0xc2, 0x7d, 0x3a, 0xd3, 0x7b, 0x1e, 0xce, 0xf4, 0xd4, 0x90, 0x36, 0x88, 0xf3, 0xff, 0xb1, 0x11, 0x1c, 0x80, 0xa5, 0x78, 0xaa, 0xe7, 0x32, 0x78, 0x53, 0xba, 0x29, 0x24, 0x2f, 0x20, 0x6a, 0x67, 0x36, 0x66, 0x0e, 0x4b, 0x16, 0xc7, 0xf2, 0xc1, 0x69, 0xe2, 0x45, 0x04, 0x73, 0xc9, 0x15, 0x50, 0x04, 0x0d, 0x25, 0x96, 0xf6, 0xc9, 0x23, 0xb5, 0x61, 0x6c, 0x4b, 0x64, 0x3a, 0x9f, 0xa9, 0x3a, 0x13, 0xc6, 0x7c, 0x03, 0xda, 0xee, 0x4a, 0x67, 0xbb, 0xf3, 0xd7, 0xc2, 0x01, 0xd2, 0xd4, 0x9c, 0x32, 0x88, 0x04, 0x9a, 0x9b, 0xb8, 0x0d, 0xa5, 0x95, 0xe6, 0xd8, 0x10, 0x41, 0x6f, 0xf7, 0x1a, 0x00, 0x85, 0xa2, 0xa9, 0x26, 0xfd, 0xc3, 0x2c, 0xe1, 0xe7, 0xdf, 0x7d, 0x63, 0xba, 0x0d, 0xc9, 0x2e, 0x28, 0x34, 0xff, 0x40, 0x03, 0x79, 0x00, 0xcb, 0xa4, 0x97, 0xce, 0xd7, 0x14, 0x08, 0x54, 0x4c, 0xaa, 0x9e, 0x51, 0x03, 0x82, 0xcf, 0xf6, 0xe2, 0xee, 0x05, 0x2f, 0xd3, 0x70, 0x2b, 0x71, 0x62, 0xf7, 0xbc, 0xa6, 0x38, 0x56, 0x0b, 0xdc, 0xd0, 0x60, 0x59, 0x60, 0x99, 0x17, 0x7f, 0x7a, 0x0d, 0x2c, 0xd0, 0x94, 0x05, 0x88, 0x2b, 0x40, 0x91, 0xb2, 0x83, 0xd9, 0xfa, 0xd8, 0x05, 0x62, 0xec, 0xd0, 0xbf, 0xb4, 0xa2, 0xf4, 0x3d, 0x34, 0xbe, 0x8d, 0xcd, 0x9c, 0xbe, 0xe8, 0x16, 0xac, 0x4e, 0x2f, 0x71, 0xd9, 0xab, 0x3f, 0x84, 0x87, 0xb7, 0xce, 0xd7, 0xf5, 0x54, 0x75, 0x34, 0xb0, 0x63, 0xb7, 0x50, 0x3c, 0xb5, 0x32, 0xed, 0x7e, 0x6a, 0xd7, 0x7a, 0x00, 0x00, 0x01, 0x09, 0x06, 0x4c, 0x64, 0xe2, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x01, 0xbb, 0xbb, 0xbb, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x09, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +constexpr std::array M2V_TINY_PACKETS_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xf3, 0x3b, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0x7a, 0x01, 0xe0, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x1a, 0x00, 0x80, 0x20, 0x90, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xe0, 0x07, 0x5a, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xa7, 0xab, 0x1e, 0x73, 0x3b, 0x00, 0x00, 0x01, 0x00, 0x35, 0xf9, 0x2e, 0x87, 0xf2, 0x56, 0x91, 0x4f, 0xcc, 0x26, 0x6b, 0x91, 0x91, 0xb1, 0x2f, 0x9c, 0xd6, 0xe6, 0x70, 0xa4, 0xe1, 0x20, 0xae, 0x5b, 0x09, 0x39, 0x8b, 0xc5, 0x59, 0xd8, 0x6a, 0xee, 0x7a, 0x50, 0x8e, 0x52, 0x41, 0x71, 0x40, 0x1f, 0x55, 0x19, 0x85, 0xa4, 0xd1, 0x7b, 0x75, 0x89, 0xdf, 0x58, 0x41, 0xba, 0x9b, 0xa2, 0x66, 0x0a, 0xcf, 0x53, 0xb2, 0xfe, 0x4c, 0x60, 0x09, 0x51, 0xf3, 0x12, 0x11, 0x11, 0xb6, 0x41, 0x3d, 0x71, 0x22, 0x23, 0xd6, 0xaa, 0x31, 0xb6, 0xf0, 0x8a, 0x86, 0xfb, 0x86, 0x89, 0x46, 0x7b, 0x0c, 0x82, 0x2f, 0xe0, 0x48, 0x71, 0xad, 0x88, 0x3a, 0xc9, 0xf9, 0x64, 0x55, 0x3f, 0x9b, 0x93, 0x74, 0x33, 0xc3, 0x72, 0x2a, 0x01, 0x60, 0x29, 0x67, 0xe1, 0xf0, 0xe7, 0x97, 0x2e, 0x54, 0x4c, 0xa3, 0x34, 0x42, 0xbf, 0x93, 0xdd, 0x13, 0xa9, 0x9e, 0xd8, 0xfd, 0xd1, 0xee, 0x1b, 0x0d, 0x5b, 0x82, 0xda, 0x5c, 0x1b, 0xc2, 0x4a, 0x61, 0x40, 0xd5, 0xd2, 0x56, 0x99, 0xc1, 0x8b, 0x0e, 0xd9, 0xe4, 0x16, 0xb7, 0xb7, 0x4d, 0x43, 0x6c, 0xc2, 0x08, 0x05, 0x81, 0x48, 0x63, 0xaa, 0xfd, 0xb0, 0xb8, 0x5e, 0xa5, 0x13, 0x52, 0x67, 0x89, 0x0b, 0x67, 0xa7, 0x06, 0xf0, 0x47, 0x44, 0x8d, 0x0c, 0x39, 0xa2, 0xcf, 0x70, 0xa5, 0xea, 0xf6, 0x73, 0x82, 0xdc, 0x1c, 0x19, 0x2f, 0xb2, 0x30, 0xcc, 0x1c, 0x3b, 0xe9, 0x38, 0x01, 0x83, 0x84, 0x3d, 0x80, 0xab, 0x5e, 0x32, 0x5c, 0xc5, 0xc3, 0xf1, 0xc2, 0xd7, 0x60, 0x77, 0x3b, 0x5d, 0x48, 0x04, 0x49, 0xeb, 0x78, 0xfd, 0xc0, 0xbf, 0x41, 0x0d, 0x67, 0x70, 0x0a, 0x47, 0x6d, 0x09, 0x4e, 0x2f, 0xb8, 0x31, 0xd6, 0x05, 0x2b, 0x3a, 0x72, 0xb8, 0x52, 0x36, 0xd4, 0x3e, 0x27, 0x6b, 0x48, 0x5d, 0xcc, 0xc5, 0x55, 0x0c, 0x7b, 0x20, 0x9b, 0xf8, 0x07, 0x81, 0x79, 0xe4, 0xa4, 0xaa, 0x3c, 0xdb, 0xd8, 0x8d, 0xf5, 0x77, 0xcf, 0x95, 0x31, 0xb7, 0x73, 0xc4, 0x29, 0x1b, 0xf2, 0x24, 0x34, 0x0c, 0xb0, 0x02, 0x85, 0xc5, 0xb5, 0xe9, 0x82, 0x31, 0x1e, 0x78, 0x3f, 0x96, 0x2b, 0x5a, 0xf2, 0xe2, 0xdf, 0x19, 0x58, 0xf8, 0x5b, 0x8a, 0x6c, 0x66, 0x5e, 0x0d, 0xf0, 0x45, 0x9b, 0xe1, 0x9c, 0x44, 0xcf, 0x3b, 0xf0, 0x0a, 0xbb, 0xf1, 0x09, 0x85, 0x81, 0xdf, 0xf9, 0xc8, 0xfa, 0x53, 0x6c, 0x87, 0x00, 0x30, 0xb0, 0x5b, 0xd3, 0x94, 0x62, 0x61, 0x03, 0x1e, 0x50, 0xdc, 0x94, 0x3c, 0x64, 0xd9, 0x34, 0x11, 0x8f, 0x21, 0xcb, 0xd5, 0x1b, 0xe1, 0xba, 0xc6, 0xd6, 0xca, 0x7e, 0x0f, 0xf8, 0xb2, 0xa1, 0x35, 0xc3, 0xd9, 0x30, 0xf0, 0x26, 0x6b, 0x07, 0x89, 0x02, 0xde, 0xc2, 0x12, 0xc4, 0x45, 0x20, 0x26, 0x72, 0xb5, 0x19, 0xf2, 0x74, 0x59, 0x07, 0xc2, 0x99, 0xcf, 0x95, 0x50, 0x38, 0xef, 0x5e, 0x8c, 0x68, 0x0f, 0x60, 0xa0, 0xa0, 0x66, 0xc1, 0x64, 0x54, 0x33, 0x81, 0x87, 0x49, 0xa6, 0x08, 0x21, 0xbc, 0xd4, 0xcb, 0x6d, 0xa6, 0x22, 0x59, 0xea, 0x9a, 0xee, 0x96, 0x1b, 0x22, 0x6d, 0x04, 0x9e, 0x8c, 0xfc, 0x43, 0x69, 0x8c, 0x5d, 0x3c, 0x49, 0x29, 0xa3, 0x9d, 0x01, 0xd3, 0xbf, 0x95, 0xad, 0xa4, 0xf1, 0xfd, 0x2e, 0x16, 0x99, 0x55, 0xdb, 0xc7, 0x22, 0x46, 0xb7, 0x01, 0x01, 0x96, 0xd8, 0x31, 0x05, 0xaf, 0xd4, 0x78, 0x7b, 0x38, 0x55, 0xf5, 0xdb, 0x59, 0x2b, 0x97, 0xf4, 0xa2, 0x79, 0x74, 0xe0, 0xbd, 0xdf, 0xff, 0x3b, 0x55, 0xb4, 0x9d, 0x4b, 0xe3, 0xb1, 0x73, 0x21, 0x4b, 0xab, 0x6c, 0xf1, 0x6c, 0x2f, 0xc8, 0x12, 0x28, 0x2c, 0xc2, 0x6d, 0x6b, 0xf2, 0x1c, 0x4f, 0x41, 0x38, 0x8b, 0xdd, 0x0f, 0xf0, 0x6c, 0xac, 0x67, 0x1a, 0x31, 0x2b, 0x1d, 0xda, 0x6b, 0xea, 0x8d, 0x8c, 0x65, 0xee, 0x39, 0x8c, 0xb2, 0x96, 0x35, 0xf2, 0x30, 0xce, 0xfe, 0x8a, 0x3f, 0x7e, 0xb6, 0xa1, 0x5d, 0x85, 0xea, 0x95, 0x3f, 0xb2, 0x4d, 0x33, 0x2c, 0x6b, 0x18, 0x46, 0x2e, 0x1c, 0xfb, 0xf4, 0x58, 0x8b, 0xc5, 0xbf, 0x44, 0xa0, 0x39, 0x53, 0x6e, 0x57, 0xaf, 0x69, 0x31, 0xd2, 0x7a, 0x6f, 0x6f, 0xdc, 0x39, 0xc5, 0x2f, 0x37, 0x7c, 0xae, 0xc8, 0x94, 0x6c, 0x4e, 0x58, 0x19, 0x68, 0x60, 0x98, 0xbd, 0xb7, 0x63, 0x5b, 0xed, 0xc5, 0x7b, 0x44, 0x44, 0x90, 0x49, 0x76, 0x42, 0x39, 0x61, 0x5d, 0x47, 0xdc, 0x3c, 0xc3, 0x4b, 0x1d, 0xb8, 0xd6, 0x17, 0x24, 0x8e, 0xd6, 0xea, 0xd9, 0x50, 0x88, 0xdb, 0xa6, 0xd4, 0xac, 0x5d, 0x1b, 0x1d, 0x0b, 0xb9, 0x28, 0x28, 0xe6, 0x68, 0xd4, 0x3a, 0xd6, 0x90, 0xa4, 0x79, 0x5a, 0x20, 0x0f, 0x07, 0xb9, 0x46, 0xc2, 0xe6, 0xeb, 0x3b, 0x8b, 0x4b, 0xa2, 0xa2, 0x21, 0x35, 0xbd, 0xf5, 0x34, 0x6e, 0xb0, 0xb9, 0x70, 0x4a, 0xae, 0x80, 0x60, 0xc0, 0x9c, 0xe6, 0x59, 0xbf, 0x24, 0x0d, 0xe2, 0xd2, 0x69, 0x59, 0x39, 0x7b, 0x2d, 0x5b, 0xeb, 0xd8, 0x72, 0x33, 0xa8, 0x6a, 0xea, 0xdd, 0xbb, 0x29, 0xb7, 0x2e, 0xd7, 0x35, 0x4d, 0x6d, 0x25, 0xc0, 0x86, 0xda, 0xb7, 0x16, 0x28, 0x8d, 0xdd, 0xd5, 0x73, 0x6b, 0xf1, 0xb6, 0x87, 0x3e, 0x9b, 0x85, 0x9a, 0x11, 0xb0, 0x1e, 0x62, 0x63, 0x10, 0x8c, 0x34, 0xe5, 0x3f, 0xb3, 0x99, 0xb4, 0x9f, 0x07, 0x80, 0x64, 0x6c, 0x49, 0x3d, 0x3d, 0xf8, 0x50, 0xf6, 0x7b, 0xc6, 0x43, 0x36, 0x7c, 0x74, 0xe3, 0xcd, 0x25, 0xa3, 0xbd, 0x29, 0xf8, 0x46, 0x59, 0xd1, 0x8f, 0xfe, 0xd2, 0xb9, 0x7f, 0x80, 0x69, 0x87, 0xdc, 0x1c, 0xe9, 0x13, 0xe2, 0xe3, 0x07, 0xa5, 0x6d, 0x09, 0x12, 0xce, 0x50, 0x7e, 0x87, 0xd6, 0xba, 0xde, 0x79, 0x16, 0x2f, 0x25, 0xd5, 0xcd, 0xc2, 0xde, 0xe6, 0x2a, 0x9b, 0xac, 0xbd, 0xb0, 0x03, 0x5e, 0x48, 0x2a, 0x62, 0xfd, 0x43, 0xca, 0x07, 0x7d, 0x58, 0x35, 0x9a, 0xf9, 0x0a, 0x90, 0x82, 0xb1, 0x48, 0xd4, 0xc2, 0x28, 0xcb, 0xf8, 0xf6, 0x1d, 0x84, 0xbc, 0x7c, 0x3b, 0xdd, 0x20, 0xf9, 0xbc, 0x7d, 0xd7, 0xc8, 0x5d, 0xce, 0x3e, 0xf6, 0x5b, 0x8d, 0xa4, 0xdd, 0x57, 0x08, 0xed, 0x90, 0x62, 0xe4, 0xe3, 0x8d, 0x7f, 0x88, 0xba, 0x8a, 0x6d, 0x88, 0x94, 0x35, 0x7a, 0xa9, 0x13, 0x45, 0xb6, 0x65, 0x44, 0x41, 0xcd, 0xfa, 0x73, 0xc7, 0x4e, 0x6e, 0xaa, 0x43, 0x40, 0x22, 0xf1, 0x5c, 0x29, 0xc8, 0x95, 0x92, 0x0e, 0xdf, 0x0c, 0xbe, 0xf4, 0x0e, 0x2a, 0x81, 0xea, 0x04, 0xd7, 0xd1, 0xbe, 0x9f, 0x6e, 0x21, 0xc9, 0x99, 0x6d, 0xef, 0x78, 0xfb, 0x2a, 0x95, 0x8c, 0xff, 0xb5, 0xc3, 0x35, 0x38, 0x13, 0xf4, 0x6d, 0x25, 0x7b, 0xb7, 0x4c, 0x7b, 0x4a, 0xbe, 0x3f, 0xd4, 0xcf, 0xeb, 0x3d, 0x8e, 0x27, 0xe0, 0x84, 0x05, 0xc2, 0xc4, 0x6b, 0x79, 0x5b, 0x45, 0x4c, 0x46, 0x67, 0x05, 0xa6, 0x38, 0x58, 0xfd, 0xe6, 0x35, 0x29, 0x7f, 0x84, 0x75, 0x14, 0xed, 0x62, 0x05, 0x72, 0x46, 0x8d, 0x5a, 0x13, 0x16, 0xe3, 0x18, 0x9f, 0x82, 0x30, 0x71, 0xc5, 0x65, 0xc1, 0xa4, 0x47, 0xc7, 0x91, 0x92, 0x33, 0x19, 0x79, 0x6c, 0xcd, 0x03, 0x1e, 0xe5, 0xfe, 0xb4, 0x6f, 0x85, 0x4c, 0xf8, 0xfd, 0xee, 0xad, 0x84, 0x80, 0x33, 0xc4, 0x48, 0x44, 0xae, 0x48, 0xae, 0x63, 0xcb, 0xa9, 0x0f, 0xff, 0xd4, 0x47, 0xd9, 0xdb, 0xac, 0xb0, 0x14, 0x0f, 0xfb, 0xcf, 0x5d, 0xb8, 0x48, 0xfa, 0x7a, 0xd1, 0xf9, 0x41, 0x0b, 0xa8, 0x3b, 0x85, 0x19, 0x95, 0x41, 0x16, 0x7a, 0xdc, 0x70, 0xf7, 0x4c, 0xed, 0x4e, 0x0b, 0xf1, 0x72, 0x5c, 0xb0, 0x67, 0xc2, 0x28, 0xa4, 0xd6, 0xc0, 0x44, 0x2f, 0xac, 0x3f, 0xf0, 0xf1, 0xb3, 0x5d, 0x96, 0xc9, 0xdc, 0x89, 0x7e, 0xb5, 0xcb, 0x0a, 0x4a, 0xae, 0x4c, 0x4d, 0x17, 0xcc, 0x3b, 0x5b, 0x65, 0x3f, 0x95, 0x15, 0x24, 0xec, 0xaf, 0x40, 0x75, 0xb3, 0xd0, 0x72, 0x09, 0xb2, 0xa6, 0x55, 0x30, 0x0c, 0x5d, 0xf7, 0xff, 0x00, 0x43, 0xff, 0x19, 0x5e, 0x44, 0x04, 0x07, 0xa8, 0xb3, 0x64, 0x36, 0x63, 0x1d, 0x59, 0xe9, 0x6d, 0x20, 0x26, 0xd9, 0x61, 0x8b, 0x8a, 0x40, 0x4e, 0x33, 0xf9, 0x7b, 0x5f, 0x4b, 0x2c, 0x9f, 0x25, 0x2a, 0x04, 0x9c, 0xad, 0xcd, 0xea, 0xbd, 0x93, 0x7a, 0x11, 0xbf, 0xb5, 0x5e, 0x56, 0xb5, 0x3f, 0x01, 0x90, 0x74, 0x26, 0xe8, 0x99, 0x55, 0x62, 0xcd, 0x66, 0x69, 0x64, 0x39, 0xe7, 0x80, 0xa6, 0x6d, 0x92, 0x98, 0x52, 0xe2, 0xcc, 0x9a, 0x54, 0xd5, 0x9b, 0x78, 0x64, 0x9e, 0x45, 0x0b, 0xcd, 0xd1, 0xd5, 0x4c, 0x06, 0x55, 0xa7, 0xcb, 0x5f, 0x0a, 0x6f, 0x73, 0x54, 0x9e, 0x5d, 0x05, 0x5a, 0x9a, 0x58, 0xd6, 0x1b, 0xe3, 0x6d, 0xc3, 0x86, 0x2b, 0xec, 0x5a, 0x30, 0x07, 0xd4, 0xb1, 0xd9, 0xb0, 0x7c, 0x6c, 0x19, 0xa4, 0xaf, 0xe9, 0x8a, 0xa6, 0x99, 0x95, 0xfb, 0xd6, 0x36, 0xd6, 0x6b, 0xe6, 0x38, 0x24, 0xe9, 0x96, 0x80, 0x21, 0x99, 0x0b, 0xa5, 0xe4, 0x71, 0xa6, 0x25, 0xb1, 0x77, 0x66, 0x43, 0xe4, 0x87, 0x0c, 0xa0, 0xbb, 0xfd, 0x7e, 0x1d, 0x4e, 0xb9, 0x20, 0x8d, 0xe2, 0x58, 0x27, 0x49, 0x52, 0xb1, 0x22, 0xb0, 0x63, 0xd0, 0x24, 0x18, 0x16, 0x10, 0x6b, 0xcf, 0x5b, 0x0f, 0x5b, 0x19, 0xc5, 0x92, 0x27, 0x5d, 0x11, 0xa6, 0x96, 0xe9, 0xa3, 0x80, 0x9e, 0xf3, 0x57, 0xf2, 0xdb, 0xd5, 0x35, 0x7a, 0x13, 0x98, 0xf9, 0x43, 0x4c, 0x4d, 0x77, 0x8b, 0x2c, 0xdb, 0x41, 0x5d, 0x9d, 0x23, 0x28, 0x8b, 0xf2, 0xbd, 0x7d, 0x45, 0x14, 0x9f, 0x1c, 0xda, 0x59, 0x6d, 0xaa, 0x60, 0x20, 0x5c, 0xa6, 0x64, 0x59, 0xcb, 0x1a, 0xdc, 0x7b, 0x01, 0x12, 0xf3, 0xa3, 0xc8, 0x38, 0x72, 0xde, 0xbb, 0x27, 0xd9, 0xd1, 0x8c, 0x58, 0x71, 0x43, 0x94, 0xc4, 0xe2, 0x3b, 0x71, 0x94, 0x1d, 0xba, 0x90, 0x83, 0x9d, 0x4a, 0xcd, 0xbe, 0x5b, 0xce, 0xa2, 0x74, 0xee, 0x6c, 0x87, 0x5c, 0xb1, 0x74, 0x6c, 0xe2, 0xf6, 0x8a, 0x87, 0xbd, 0x91, 0x92, 0xd2, 0x2c, 0x48, 0x13, 0xed, 0x12, 0xf6, 0x12, 0x57, 0xac, 0x6b, 0x9d, 0x17, 0xa3, 0x54, 0x85, 0x54, 0xae, 0xb7, 0x09, 0x7f, 0x0c, 0xd5, 0x58, 0xf8, 0x7a, 0x73, 0x45, 0x64, 0x8b, 0xe4, 0x93, 0x16, 0x67, 0x4f, 0x95, 0x40, 0x63, 0x0e, 0x32, 0xcc, 0x06, 0x27, 0x6d, 0x16, 0x4b, 0x2e, 0x06, 0xef, 0x58, 0x1b, 0xdf, 0x8a, 0xe8, 0xe8, 0x28, 0x52, 0x18, 0xf2, 0x93, 0xc7, 0x66, 0x7b, 0xfd, 0xd3, 0x0d, 0xd0, 0x59, 0x3e, 0x0d, 0xdc, 0xcb, 0x3d, 0x79, 0x3e, 0x3d, 0x2d, 0xfa, 0x24, 0xd9, 0xfe, 0x8b, 0x7c, 0x36, 0xf6, 0xd9, 0x4b, 0x26, 0xa4, 0xe5, 0x29, 0x65, 0x4d, 0xb4, 0x3c, 0xac, 0x2d, 0x3b, 0x37, 0xd8, 0x30, 0xd7, 0x2a, 0x30, 0x2e, 0xf4, 0x30, 0xee, 0xaf, 0xbb, 0x45, 0xaa, 0xc2, 0xe4, 0xd0, 0x3e, 0x85, 0x08, 0xb3, 0x38, 0x49, 0x12, 0xe3, 0x11, 0x85, 0xa3, 0xdf, 0x9c, 0xfe, 0x91, 0x82, 0x73, 0xd2, 0xcf, 0x16, 0x59, 0x54, 0x67, 0x93, 0xcb, 0xe5, 0x5b, 0x75, 0x4b, 0x2c, 0x86, 0xa0, 0x05, 0x6d, 0xe4, 0x27, 0xe7, 0xd3, 0xd0, 0x00, 0x52, 0xf2, 0x21, 0xf2, 0xf3, 0xd4, 0x32, 0x47, 0x6d, 0x53, 0x44, 0x12, 0xe1, 0x9b, 0xc7, 0x0f, 0x7f, 0x0e, 0x6c, 0x6c, 0xb0, 0xe6, 0x18, 0x0b, 0x83, 0x58, 0x1f, 0x05, 0x61, 0x06, 0x58, 0x72, 0x45, 0x0a, 0xe1, 0xd6, 0xf5, 0xf1, 0xc6, 0xad, 0xed, 0x58, 0xcb, 0xe5, 0x09, 0x21, 0x0d, 0x60, 0x1a, 0x59, 0x42, 0xb3, 0xf2, 0x4b, 0xc2, 0xc3, 0x90, 0x65, 0xb1, 0xfc, 0x77, 0xdb, 0xe3, 0x40, 0x6d, 0x3a, 0x5b, 0xc1, 0x0e, 0x49, 0x79, 0x6f, 0xfe, 0xf9, 0x3d, 0xa9, 0xb3, 0x38, 0x36, 0x59, 0x11, 0xec, 0xf7, 0xac, 0x4e, 0x6a, 0x32, 0x0c, 0xe8, 0x25, 0xd2, 0x11, 0xa0, 0x7e, 0xb2, 0x84, 0xb1, 0xdf, 0xcb, 0xbd, 0xcc, 0x87, 0xfc, 0xde, 0x8f, 0xc1, 0xb6, 0xcd, 0x69, 0x68, 0x43, 0xdd, 0x3c, 0xe1, 0x6a, 0x89, 0x24, 0x07, 0x9c, 0xc2, 0x2f, 0x9e, 0x03, 0x9c, 0xf5, 0x51, 0x06, 0x6f, 0x59, 0x4e, 0x30, 0xa5, 0xe3, 0x09, 0x82, 0xde, 0x74, 0xb2, 0x96, 0x13, 0x55, 0x6a, 0x38, 0xe6, 0xd6, 0x44, 0x3a, 0x52, 0xf9, 0x99, 0xb4, 0x51, 0xe8, 0x4b, 0x04, 0x4a, 0x34, 0xe6, 0x27, 0x41, 0x16, 0xcd, 0x4e, 0x2d, 0x28, 0xdf, 0xc3, 0xe6, 0x63, 0x3f, 0x83, 0x91, 0x47, 0x2d, 0x20, 0x80, 0x81, 0x16, 0xcf, 0xe1, 0x76, 0x4c, 0xb5, 0xbc, 0x7d, 0x1a, 0xdd, 0x1b, 0xbf, 0x08, 0x60, 0x53, 0xf8, 0x97, 0xab, 0xd8, 0x98, 0xcf, 0xfb, 0x02, 0xf9, 0x50, 0x64, 0xb1, 0xb4, 0xd5, 0x06, 0xcd, 0x40, 0x4c, 0x50, 0xe7, 0x67, 0x00, 0x5d, 0x99, 0x3a, 0x6d, 0xd9, 0x62, 0x9a, 0xb3, 0x00, 0x10, 0x76, 0xdc, 0x94, 0x01, 0x4f, 0x54, 0xeb, 0xd2, 0xb3, 0x42, 0x65, 0x32, 0xb1, 0xb6, 0xfc, 0x00, 0x7c, 0xd0, 0xac, 0xe6, 0xbd, 0x49, 0xed, 0x11, 0x53, 0x19, 0x85, 0xca, 0x71, 0x17, 0x59, 0xf5, 0x6b, 0xbe, 0x18, 0xd4, 0x92, 0x9a, 0xd5, 0x89, 0xf6, 0xe4, 0xf9, 0x27, 0xfd, 0x5d, 0x17, 0x64, 0x01, 0x7e, 0x95, 0x36, 0x8e, 0x6d, 0x2c, 0xe3, 0xdb, 0x6a, 0xb4, 0x4d, 0x91, 0x98, 0xc4, 0x96, 0x14, 0x55, 0x0a, 0x54, 0xc6, 0x83, 0x83, 0xf1, 0x09, 0x7a, 0xd2, 0xf5, 0xf5, 0x88, 0x6f, 0x54, 0xff, 0x28, 0x7e, 0x03, 0x11, 0x69, 0x64, 0x5f, 0xcb, 0x1c, 0x7d, 0x3c, 0xeb, 0xd0, 0x99, 0x99, 0x13, 0xac, 0x02, 0x55, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x01, 0xbb, 0xbb, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + +constexpr std::array AVC_FLUSH_EXPECTED_AU_SHA1 = { 0xe6, 0xf9, 0x41, 0x5f, 0x85, 0x80, 0x14, 0x9d, 0xf1, 0x24, 0x8a, 0xf5, 0x4d, 0x4b, 0x9f, 0x22, 0xd6, 0x60, 0x46, 0x0d }; From bd7d5faa9f175f9728c873cb74934d04b2d30690 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:39:49 +0200 Subject: [PATCH 360/630] cellDmuxPamf implementation part 2: PPU thread --- rpcs3/Emu/Cell/Modules/cellDmux.cpp | 42 +- rpcs3/Emu/Cell/Modules/cellDmux.h | 168 +-- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 1663 ++++++++++++++++++++++- rpcs3/Emu/Cell/Modules/cellDmuxPamf.h | 374 ++++- rpcs3/Emu/Cell/lv2/sys_prx.cpp | 2 +- 5 files changed, 2040 insertions(+), 209 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.cpp b/rpcs3/Emu/Cell/Modules/cellDmux.cpp index d7f6f84f3f..fb1f32837d 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmux.cpp @@ -169,18 +169,18 @@ public: static const u32 id_count = 1023; SAVESTATE_INIT_POS(34); - ElementaryStream(Demuxer* dmux, u32 addr, u32 size, u32 fidMajor, u32 fidMinor, u32 sup1, u32 sup2, vm::ptr cbFunc, u32 cbArg, u32 spec); + ElementaryStream(Demuxer* dmux, vm::ptr addr, u32 size, u32 fidMajor, u32 fidMinor, u32 sup1, u32 sup2, vm::ptr cbFunc, vm::ptr cbArg, u32 spec); Demuxer* dmux; const u32 id = idm::last_id(); - const u32 memAddr; + const vm::ptr memAddr; const u32 memSize; const u32 fidMajor; const u32 fidMinor; const u32 sup1; const u32 sup2; const vm::ptr cbFunc; - const u32 cbArg; + const vm::ptr cbArg; const u32 spec; //addr std::vector raw_data; // demultiplexed data stream (managed by demuxer thread) @@ -208,13 +208,13 @@ public: const u32 memAddr; const u32 memSize; const vm::ptr cbFunc; - const u32 cbArg; + const vm::ptr cbArg; volatile bool is_finished = false; volatile bool is_closed = false; atomic_t is_running = false; atomic_t is_working = false; - Demuxer(u32 addr, u32 size, vm::ptr func, u32 arg) + Demuxer(u32 addr, u32 size, vm::ptr func, vm::ptr arg) : ppu_thread({}, "", 0) , memAddr(addr) , memSize(size) @@ -755,11 +755,11 @@ PesHeader::PesHeader(DemuxerStream& stream) is_ok = true; } -ElementaryStream::ElementaryStream(Demuxer* dmux, u32 addr, u32 size, u32 fidMajor, u32 fidMinor, u32 sup1, u32 sup2, vm::ptr cbFunc, u32 cbArg, u32 spec) - : put(utils::align(addr, 128)) +ElementaryStream::ElementaryStream(Demuxer* dmux, vm::ptr addr, u32 size, u32 fidMajor, u32 fidMinor, u32 sup1, u32 sup2, vm::ptr cbFunc, vm::ptr cbArg, u32 spec) + : put(utils::align(addr.addr(), 128)) , dmux(dmux) - , memAddr(utils::align(addr, 128)) - , memSize(size - (addr - memAddr)) + , memAddr(vm::ptr::make(utils::align(addr.addr(), 128))) + , memSize(size - (addr.addr() - memAddr.addr())) , fidMajor(fidMajor) , fidMinor(fidMinor) , sup1(sup1) @@ -788,9 +788,9 @@ bool ElementaryStream::is_full(u32 space) { return first - put < space + 128; } - else if (put + space + 128 > memAddr + memSize) + else if (put + space + 128 > memAddr.addr() + memSize) { - return first - memAddr < space + 128; + return first - memAddr.addr() < space + 128; } else { @@ -816,35 +816,35 @@ void ElementaryStream::push_au(u32 size, u64 dts, u64 pts, u64 userdata, bool ra std::lock_guard lock(m_mutex); ensure(!is_full(size)); - if (put + size + 128 > memAddr + memSize) + if (put + size + 128 > memAddr.addr() + memSize) { - put = memAddr; + put = memAddr.addr(); } std::memcpy(vm::base(put + 128), raw_data.data(), size); raw_data.erase(raw_data.begin(), raw_data.begin() + size); auto info = vm::ptr::make(put); - info->auAddr = put + 128; + info->auAddr.set(put + 128); info->auSize = size; info->dts.lower = static_cast(dts); info->dts.upper = static_cast(dts >> 32); info->pts.lower = static_cast(pts); info->pts.upper = static_cast(pts >> 32); info->isRap = rap; - info->reserved = 0; + info->auMaxSize = 0; info->userData = userdata; auto spec = vm::ptr::make(put + u32{sizeof(CellDmuxAuInfoEx)}); *spec = specific; auto inf = vm::ptr::make(put + 64); - inf->auAddr = put + 128; + inf->auAddr.set(put + 128); inf->auSize = size; - inf->dtsLower = static_cast(dts); - inf->dtsUpper = static_cast(dts >> 32); - inf->ptsLower = static_cast(pts); - inf->ptsUpper = static_cast(pts >> 32); + inf->dts.lower = static_cast(dts); + inf->dts.upper = static_cast(dts >> 32); + inf->pts.lower = static_cast(pts); + inf->pts.upper = static_cast(pts >> 32); inf->auMaxSize = 0; // ????? inf->userData = userdata; @@ -927,7 +927,7 @@ bool ElementaryStream::peek(u32& out_data, bool no_ex, u32& out_spec, bool updat void ElementaryStream::reset() { std::lock_guard lock(m_mutex); - put = memAddr; + put = memAddr.addr(); entries.clear(); put_count = 0; got_count = 0; diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.h b/rpcs3/Emu/Cell/Modules/cellDmux.h index 7c31bbf105..dc17cb3314 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.h +++ b/rpcs3/Emu/Cell/Modules/cellDmux.h @@ -33,118 +33,6 @@ enum CellDmuxEsMsgType : s32 CELL_DMUX_ES_MSG_TYPE_FLUSH_DONE = 1, }; -enum CellDmuxPamfM2vLevel : s32 -{ - CELL_DMUX_PAMF_M2V_MP_LL = 0, - CELL_DMUX_PAMF_M2V_MP_ML, - CELL_DMUX_PAMF_M2V_MP_H14, - CELL_DMUX_PAMF_M2V_MP_HL, -}; - -enum CellDmuxPamfAvcLevel : s32 -{ - CELL_DMUX_PAMF_AVC_LEVEL_2P1 = 21, - CELL_DMUX_PAMF_AVC_LEVEL_3P0 = 30, - CELL_DMUX_PAMF_AVC_LEVEL_3P1 = 31, - CELL_DMUX_PAMF_AVC_LEVEL_3P2 = 32, - CELL_DMUX_PAMF_AVC_LEVEL_4P1 = 41, - CELL_DMUX_PAMF_AVC_LEVEL_4P2 = 42, -}; - -struct CellDmuxPamfAuSpecificInfoM2v -{ - be_t reserved1; -}; - -struct CellDmuxPamfAuSpecificInfoAvc -{ - be_t reserved1; -}; - -struct CellDmuxPamfAuSpecificInfoLpcm -{ - u8 channelAssignmentInfo; - u8 samplingFreqInfo; - u8 bitsPerSample; -}; - -struct CellDmuxPamfAuSpecificInfoAc3 -{ - be_t reserved1; -}; - -struct CellDmuxPamfAuSpecificInfoAtrac3plus -{ - be_t reserved1; -}; - -struct CellDmuxPamfAuSpecificInfoUserData -{ - be_t reserved1; -}; - -struct CellDmuxPamfEsSpecificInfoM2v -{ - be_t profileLevel; -}; - -struct CellDmuxPamfEsSpecificInfoAvc -{ - be_t level; -}; - -struct CellDmuxPamfEsSpecificInfoLpcm -{ - be_t samplingFreq; - be_t numOfChannels; - be_t bitsPerSample; -}; - -struct CellDmuxPamfEsSpecificInfoAc3 -{ - be_t reserved1; -}; - -struct CellDmuxPamfEsSpecificInfoAtrac3plus -{ - be_t reserved1; -}; - -struct CellDmuxPamfEsSpecificInfoUserData -{ - be_t reserved1; -}; - -enum CellDmuxPamfSamplingFrequency : s32 -{ - CELL_DMUX_PAMF_FS_48K = 48000, -}; - -enum CellDmuxPamfBitsPerSample : s32 -{ - CELL_DMUX_PAMF_BITS_PER_SAMPLE_16 = 16, - CELL_DMUX_PAMF_BITS_PER_SAMPLE_24 = 24, -}; - -enum CellDmuxPamfLpcmChannelAssignmentInfo : s32 -{ - CELL_DMUX_PAMF_LPCM_CH_M1 = 1, - CELL_DMUX_PAMF_LPCM_CH_LR = 3, - CELL_DMUX_PAMF_LPCM_CH_LRCLSRSLFE = 9, - CELL_DMUX_PAMF_LPCM_CH_LRCLSCS1CS2RSLFE = 11, -}; - -enum CellDmuxPamfLpcmFs : s32 -{ - CELL_DMUX_PAMF_LPCM_FS_48K = 1, -}; - -enum CellDmuxPamfLpcmBitsPerSamples : s32 -{ - CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_16 = 1, - CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_24 = 3, -}; - struct CellDmuxMsg { be_t msgType; // CellDmuxMsgType @@ -163,12 +51,6 @@ struct CellDmuxType be_t reserved[2]; }; -struct CellDmuxPamfSpecificInfo -{ - be_t thisSize; - b8 programEndCodeCb; -}; - struct CellDmuxType2 { be_t streamType; // CellDmuxStreamType @@ -177,7 +59,7 @@ struct CellDmuxType2 struct CellDmuxResource { - be_t memAddr; + vm::bptr memAddr; be_t memSize; be_t ppuThreadPriority; be_t ppuThreadStackSize; @@ -187,7 +69,7 @@ struct CellDmuxResource struct CellDmuxResourceEx { - be_t memAddr; + vm::bptr memAddr; be_t memSize; be_t ppuThreadPriority; be_t ppuThreadStackSize; @@ -227,16 +109,16 @@ struct CellDmuxResource2 be_t shit[4]; }; -using CellDmuxCbMsg = u32(u32 demuxerHandle, vm::ptr demuxerMsg, u32 cbArg); +using CellDmuxCbMsg = u32(u32 demuxerHandle, vm::cptr demuxerMsg, vm::ptr cbArg); -using CellDmuxCbEsMsg = u32(u32 demuxerHandle, u32 esHandle, vm::ptr esMsg, u32 cbArg); +using CellDmuxCbEsMsg = u32(u32 demuxerHandle, u32 esHandle, vm::cptr esMsg, vm::ptr cbArg); // Used for internal callbacks as well template struct DmuxCb { vm::bptr cbFunc; - be_t cbArg; + vm::bptr cbArg; }; using CellDmuxCb = DmuxCb; @@ -250,42 +132,50 @@ struct CellDmuxAttr be_t demuxerVerLower; }; +struct CellDmuxPamfAttr +{ + be_t maxEnabledEsNum; + be_t version; + be_t memSize; +}; + struct CellDmuxEsAttr { be_t memSize; }; +struct CellDmuxPamfEsAttr +{ + be_t auQueueMaxSize; + be_t memSize; + be_t specificInfoSize; +}; + struct CellDmuxEsResource { - be_t memAddr; + vm::bptr memAddr; be_t memSize; }; struct CellDmuxAuInfo { - be_t auAddr; + vm::bptr auAddr; be_t auSize; be_t auMaxSize; - be_t userData; - be_t ptsUpper; - be_t ptsLower; - be_t dtsUpper; - be_t dtsLower; -}; - -struct CellDmuxAuInfoEx -{ - be_t auAddr; - be_t auSize; - be_t reserved; b8 isRap; be_t userData; CellCodecTimeStamp pts; CellCodecTimeStamp dts; }; -struct CellDmuxPamfAttr; -struct CellDmuxPamfEsAttr; +using CellDmuxAuInfoEx = CellDmuxAuInfo; + +struct DmuxAuInfo +{ + CellDmuxAuInfo info; + vm::bptr specific_info; + be_t specific_info_size; +}; using DmuxNotifyDemuxDone = error_code(vm::ptr, u32, vm::ptr); using DmuxNotifyFatalErr = error_code(vm::ptr, u32, vm::ptr); diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 7c0fd8ec39..cc2fd6af42 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -1,6 +1,11 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/lv2/sys_cond.h" +#include "Emu/Cell/lv2/sys_mutex.h" +#include "Emu/Cell/lv2/sys_ppu_thread.h" #include "Emu/Cell/lv2/sys_sync.h" +#include "sysPrxForUser.h" +#include "util/asm.hpp" #include "cellDmuxPamf.h" #include @@ -10,6 +15,24 @@ vm::gvar g_cell_dmux_core_ops_raw_es; LOG_CHANNEL(cellDmuxPamf) +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](CellDmuxPamfError value) + { + switch (value) + { + STR_CASE(CELL_DMUX_PAMF_ERROR_BUSY); + STR_CASE(CELL_DMUX_PAMF_ERROR_ARG); + STR_CASE(CELL_DMUX_PAMF_ERROR_UNKNOWN_STREAM); + STR_CASE(CELL_DMUX_PAMF_ERROR_NO_MEMORY); + STR_CASE(CELL_DMUX_PAMF_ERROR_FATAL); + } + + return unknown; + }); +} + inline std::pair dmuxPamfStreamIdToTypeChannel(u16 stream_id, u16 private_stream_id) { if ((stream_id & 0xf0) == 0xe0) @@ -1121,109 +1144,1659 @@ void dmux_pamf_spu_context::save(utils::serial& ar) // PPU thread +template +void DmuxPamfContext::send_spu_command_and_wait(ppu_thread& ppu, bool waiting_for_spu_state, auto&&... cmd_params) +{ + if (!waiting_for_spu_state) + { + // The caller is supposed to own the mutex until the SPU thread has consumed the command, so the queue should always be empty here + ensure(cmd_queue.emplace(type, std::forward(cmd_params)...), "The command queue wasn't empty"); + } + + lv2_obj::sleep(ppu); + + // Block until the SPU thread has consumed the command + cmd_result_queue.wait(); + + if (ppu.check_state()) + { + ppu.state += cpu_flag::again; + return; + } + + be_t result{}; + ensure(cmd_result_queue.pop(result), "The result queue was empty"); + ensure(result == static_cast(type) + 1, "The HLE SPU thread sent an invalid result"); +} + +DmuxPamfElementaryStream* DmuxPamfContext::find_es(u16 stream_id, u16 private_stream_id) +{ + const auto it = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO + ? std::ranges::find_if(elementary_streams | std::views::reverse, [&](const auto& es){ return es && es->stream_id == stream_id; }) + : std::ranges::find_if(elementary_streams | std::views::reverse, [&](const auto& es){ return es && es->stream_id == stream_id && es->private_stream_id == private_stream_id; }); + + return it != std::ranges::rend(elementary_streams) ? it->get_ptr() : nullptr; +} + +error_code DmuxPamfContext::wait_au_released_or_stream_reset(ppu_thread& ppu, u64 au_queue_full_bitset, b8& stream_reset_started, dmux_pamf_state& savestate) +{ + if (savestate == dmux_pamf_state::waiting_for_au_released) + { + goto label1_waiting_for_au_released_state; + } + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + + if (au_queue_full_bitset) + { + cellDmuxPamf.trace("Access unit queue of elementary stream no. %d is full. Waiting for access unit to be released...", std::countr_zero(au_queue_full_bitset)); + + while (!(au_queue_full_bitset & au_released_bitset) && !stream_reset_requested) + { + savestate = dmux_pamf_state::waiting_for_au_released; + label1_waiting_for_au_released_state: + + if (sys_cond_wait(ppu, cond, 0) != CELL_OK) + { + sys_mutex_unlock(ppu, mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + } + + cellDmuxPamf.trace("Access unit released"); + } + + stream_reset_started = stream_reset_requested; + stream_reset_requested = false; + + au_released_bitset = 0; + + return sys_mutex_unlock(ppu, mutex) != CELL_OK ? static_cast(CELL_DMUX_PAMF_ERROR_FATAL) : CELL_OK; +} + +template +error_code DmuxPamfContext::set_au_reset(ppu_thread& ppu) +{ + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + + std::ranges::for_each(elementary_streams | std::views::filter([](auto es){ return !!es; }), [](auto& reset_next_au) { reset_next_au = reset; }, &DmuxPamfElementaryStream::reset_next_au); + + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +template +error_code DmuxPamfContext::callback(ppu_thread& ppu, DmuxCb cb, auto&&... args) +{ + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + return cb.cbFunc(ppu, std::forward(args)..., cb.cbArg); +} + +void DmuxPamfContext::run_spu_thread() +{ + hle_spu_thread_id = idm::make(cmd_queue_addr, cmd_result_queue_addr, stream_info_queue_addr, event_queue_addr); +} + +void DmuxPamfContext::exec(ppu_thread& ppu) +{ + // These are repeated a lot in this function, in my opinion using defines here makes it more readable +#define SEND_FATAL_ERR_AND_CONTINUE()\ + savestate = dmux_pamf_state::sending_fatal_err;\ + callback(ppu, notify_fatal_err, _this, CELL_OK); /* LLE uses CELL_OK as error code */\ + if (ppu.state & cpu_flag::again)\ + {\ + return;\ + }\ + continue + +#define RETURN_ON_CPU_FLAG_AGAIN()\ + if (ppu.state & cpu_flag::again)\ + return + + switch (savestate) + { + case dmux_pamf_state::initial: break; + case dmux_pamf_state::waiting_for_au_released: goto label1_waiting_for_au_released_state; + case dmux_pamf_state::waiting_for_au_released_error: goto label2_waiting_for_au_released_error_state; + case dmux_pamf_state::waiting_for_event: goto label3_waiting_for_event_state; + case dmux_pamf_state::starting_demux_done: goto label4_starting_demux_done_state; + case dmux_pamf_state::starting_demux_done_mutex_lock_error: goto label5_starting_demux_done_mutex_lock_error_state; + case dmux_pamf_state::starting_demux_done_mutex_unlock_error: goto label6_starting_demux_done_mutex_unlock_error_state; + case dmux_pamf_state::starting_demux_done_checking_stream_reset: goto label7_starting_demux_done_check_stream_reset_state; + case dmux_pamf_state::starting_demux_done_checking_stream_reset_error: goto label8_start_demux_done_check_stream_reset_error_state; + case dmux_pamf_state::setting_au_reset: goto label9_setting_au_reset_state; + case dmux_pamf_state::setting_au_reset_error: goto label10_setting_au_reset_error_state; + case dmux_pamf_state::processing_event: goto label11_processing_event_state; + case dmux_pamf_state::au_found_waiting_for_spu: goto label12_au_found_waiting_for_spu_state; + case dmux_pamf_state::unsetting_au_cancel: goto label13_unsetting_au_cancel_state; + case dmux_pamf_state::demux_done_notifying: goto label14_demux_done_notifying_state; + case dmux_pamf_state::demux_done_mutex_lock: goto label15_demux_done_mutex_lock_state; + case dmux_pamf_state::demux_done_cond_signal: goto label16_demux_done_cond_signal_state; + case dmux_pamf_state::resuming_demux_mutex_lock: goto label17_resuming_demux_mutex_lock_state; + case dmux_pamf_state::resuming_demux_waiting_for_spu: goto label18_resuming_demux_waiting_for_spu_state; + case dmux_pamf_state::sending_fatal_err: + callback(ppu, notify_fatal_err, _this, CELL_OK); + RETURN_ON_CPU_FLAG_AGAIN(); + } + + for (;;) + { + savestate = dmux_pamf_state::initial; + + stream_reset_started = false; + + // If the access unit queue of an enabled elementary stream is full, wait until the user releases an access unit or requests a stream reset before processing the next event + label1_waiting_for_au_released_state: + + if (wait_au_released_or_stream_reset(ppu, au_queue_full_bitset, stream_reset_started, savestate) != CELL_OK) + { + savestate = dmux_pamf_state::waiting_for_au_released_error; + label2_waiting_for_au_released_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + // Wait for the next event + if (!event_queue.peek(event)) + { + savestate = dmux_pamf_state::waiting_for_event; + label3_waiting_for_event_state: + + cellDmuxPamf.trace("Waiting for the next event..."); + + lv2_obj::sleep(ppu); + event_queue.wait(); + + if (ppu.check_state()) + { + ppu.state += cpu_flag::again; + return; + } + + ensure(event_queue.peek(event)); + } + + cellDmuxPamf.trace("Event type: %d", static_cast(event.type.get())); + + // If the event is a demux done event, set the sequence state to resetting and check for a potential stream reset request again + if (event.type == DmuxPamfEventType::demux_done) + { + savestate = dmux_pamf_state::starting_demux_done; + label4_starting_demux_done_state: + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + savestate = dmux_pamf_state::starting_demux_done_mutex_lock_error; + label5_starting_demux_done_mutex_lock_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + sequence_state = DmuxPamfSequenceState::resetting; + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + savestate = dmux_pamf_state::starting_demux_done_mutex_unlock_error; + label6_starting_demux_done_mutex_unlock_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + if (!stream_reset_started) + { + savestate = dmux_pamf_state::starting_demux_done_checking_stream_reset; + label7_starting_demux_done_check_stream_reset_state: + + if (wait_au_released_or_stream_reset(ppu, 0, stream_reset_started, savestate) != CELL_OK) + { + savestate = dmux_pamf_state::starting_demux_done_checking_stream_reset_error; + label8_start_demux_done_check_stream_reset_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + } + } + + // If the user requested a stream reset, set the reset flag for every enabled elementary stream + if (stream_reset_started) + { + stream_reset_in_progress = true; + + savestate = dmux_pamf_state::setting_au_reset; + label9_setting_au_reset_state: + + if (set_au_reset(ppu) != CELL_OK) + { + savestate = dmux_pamf_state::setting_au_reset_error; + label10_setting_au_reset_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + savestate = dmux_pamf_state::processing_event; + label11_processing_event_state: + + switch (event.type) + { + case DmuxPamfEventType::au_found: + { + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + label12_au_found_waiting_for_spu_state: + + DmuxPamfElementaryStream* const es = find_es(event.au_found.stream_id, event.au_found.private_stream_id); + + // If the elementary stream of the found access unit is not enabled, don't do anything + if (!es || es->_this.get_ptr() != es || es->es_id != event.au_found.user_data) + { + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + break; + } + + // If a stream reset was requested, don't notify the user of any found access units that are still in the event queue + // We need to send the SPU thread the address of the first found access unit for each elementary stream still in the event queue, + // so that it can remove the access units from the queue. + if (stream_reset_in_progress) + { + if (es->reset_next_au) + { + send_spu_command_and_wait(ppu, savestate == dmux_pamf_state::au_found_waiting_for_spu, + event.au_found.stream_id, event.au_found.private_stream_id, event.au_found.au_addr); + + if (ppu.state & cpu_flag::again) + { + savestate = dmux_pamf_state::au_found_waiting_for_spu; + return; + } + + es->reset_next_au = false; + } + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + break; + } + + const vm::var au_info; + au_info->addr = std::bit_cast>(event.au_found.au_addr); + au_info->size = event.au_found.au_size; + au_info->pts = event.au_found.pts; + au_info->dts = event.au_found.dts; + au_info->user_data = user_data; + au_info->specific_info = es->_this.ptr(&DmuxPamfElementaryStream::au_specific_info); + au_info->specific_info_size = es->au_specific_info_size; + au_info->is_rap = static_cast(event.au_found.is_rap); + + if (!is_raw_es) + { + if (dmuxPamfStreamIdToTypeChannel(event.au_found.stream_id, event.au_found.private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_LPCM) + { + es->au_specific_info[0] = read_from_ptr(event.au_found.stream_header_buf) >> 4; + es->au_specific_info[1] = read_from_ptr(event.au_found.stream_header_buf) & 0xf; + es->au_specific_info[2] = read_from_ptr(&event.au_found.stream_header_buf[1]) >> 6; + } + } + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + if (callback(ppu, es->notify_au_found, es->_this, au_info) != CELL_OK) + { + // If the callback returns an error, the access unit queue for this elementary stream is full + au_queue_full_bitset |= 1ull << es->this_index; + continue; + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + break; + } + case DmuxPamfEventType::demux_done: + { + if (stream_reset_in_progress) + { + stream_reset_in_progress = false; + + savestate = dmux_pamf_state::unsetting_au_cancel; + label13_unsetting_au_cancel_state: + + if (set_au_reset(ppu) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + savestate = dmux_pamf_state::demux_done_notifying; + label14_demux_done_notifying_state: + + callback(ppu, notify_demux_done, _this, CELL_OK); + + RETURN_ON_CPU_FLAG_AGAIN(); + + savestate = dmux_pamf_state::demux_done_mutex_lock; + label15_demux_done_mutex_lock_state: + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + if (sequence_state == DmuxPamfSequenceState::resetting) + { + sequence_state = DmuxPamfSequenceState::dormant; + + savestate = dmux_pamf_state::demux_done_cond_signal; + label16_demux_done_cond_signal_state: + + if (sys_cond_signal_all(ppu, cond) != CELL_OK) + { + sys_mutex_unlock(ppu, mutex); + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + break; + } + case DmuxPamfEventType::close: + { + while (event_queue.pop()){} // Clear the event queue + return; + } + case DmuxPamfEventType::flush_done: + { + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + DmuxPamfElementaryStream* const es = find_es(event.flush_done.stream_id, event.flush_done.private_stream_id); + const bool valid = es && es->_this.get_ptr() == es && es->es_id == event.flush_done.user_data; + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + if (valid) + { + callback(ppu, es->notify_flush_done, es->_this); + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + break; + } + case DmuxPamfEventType::prog_end_code: + { + callback(ppu, notify_prog_end_code, _this); + + RETURN_ON_CPU_FLAG_AGAIN(); + + break; + } + case DmuxPamfEventType::fatal_error: + { + ensure(event_queue.pop()); + + SEND_FATAL_ERR_AND_CONTINUE(); + } + default: + fmt::throw_exception("Invalid event"); + } + + ensure(event_queue.pop()); + + // If there are too many events enqueued, the SPU thread will stop demuxing until it receives a new command. + // Once the event queue size is reduced to two, send a resume command + if (enabled_es_num >= 0 && event_queue.size() == 2) + { + savestate = dmux_pamf_state::resuming_demux_mutex_lock; + label17_resuming_demux_mutex_lock_state: + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + if (enabled_es_num >= 0) + { + ensure(cmd_queue.emplace(DmuxPamfCommandType::resume)); + + savestate = dmux_pamf_state::resuming_demux_waiting_for_spu; + label18_resuming_demux_waiting_for_spu_state: + + lv2_obj::sleep(ppu); + cmd_result_queue.wait(); + + if (ppu.check_state()) + { + ppu.state += cpu_flag::again; + return; + } + + ensure(cmd_result_queue.pop()); + } + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + } + + au_queue_full_bitset = 0; + } +} + +void dmuxPamfEntry(ppu_thread& ppu, vm::ptr dmux) +{ + dmux->exec(ppu); + + if (ppu.state & cpu_flag::again) + { + ppu.syscall_args[0] = dmux.addr(); + return; + } + + ppu_execute<&sys_ppu_thread_exit>(ppu, CELL_OK); +} + +error_code dmuxPamfVerifyEsSpecificInfo(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info) +{ + // The meaning of error code value 5 in here is inconsistent with how it's used elsewhere for some reason + + if (!es_specific_info) + { + return CELL_OK; + } + + switch (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + if (is_avc) + { + if (const u32 level = vm::static_ptr_cast(es_specific_info)->level; + level != CELL_DMUX_PAMF_AVC_LEVEL_2P1 && level != CELL_DMUX_PAMF_AVC_LEVEL_3P0 && level != CELL_DMUX_PAMF_AVC_LEVEL_3P1 + && level != CELL_DMUX_PAMF_AVC_LEVEL_3P2 && level != CELL_DMUX_PAMF_AVC_LEVEL_4P1 && level != CELL_DMUX_PAMF_AVC_LEVEL_4P2) + { + return 5; + } + } + else if (vm::static_ptr_cast(es_specific_info)->profileLevel > CELL_DMUX_PAMF_M2V_MP_HL) + { + return 5; + } + + return CELL_OK; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: + if (const auto [sampling_freq, nch, bps] = *vm::static_ptr_cast(es_specific_info); + sampling_freq != CELL_DMUX_PAMF_FS_48K || (nch != 1u && nch != 2u && nch != 6u && nch != 8u) || (bps != CELL_DMUX_PAMF_BITS_PER_SAMPLE_16 && bps != CELL_DMUX_PAMF_BITS_PER_SAMPLE_24)) + { + return 5; + } + + return CELL_OK; + + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: + return CELL_OK; + + default: + return 5; + } +} + +template +u32 dmuxPamfGetAuSpecificInfoSize(u16 stream_id, u16 private_stream_id, bool is_avc) +{ + if constexpr (raw_es) + { + return 0; + } + + switch (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + if (is_avc) + { + return 4; // LLE returns four, even though CellDmuxPamfAuSpecificInfoAvc only has a reserved field like the others + } + + return 0; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: // LLE returns three, even though CellDmuxPamfAuSpecificInfoAc3 only has a reserved field like the others + return 3; + + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: + default: + return 0; + } +} + +u32 dmuxPamfGetAuQueueMaxSize(u16 stream_id, u16 private_stream_id) +{ + switch (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: + return 0x100; + + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: + return 0x40; + + default: + return 0; + } +} + +u32 dmuxPamfGetLpcmAuSize(vm::cptr lpcm_info) +{ + return lpcm_info->samplingFreq * lpcm_info->bitsPerSample * (lpcm_info->numOfChannels + (lpcm_info->numOfChannels & 1)) / 1600; // Streams with an odd number of channels contain an empty dummy channel +} + +u32 dmuxPamfGetAuQueueBufferSize(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info) +{ + switch (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + if (is_avc) + { + if (!es_specific_info) + { + return 0x46a870; + } + + switch (vm::static_ptr_cast(es_specific_info)->level) + { + case CELL_DMUX_PAMF_AVC_LEVEL_2P1: return 0xb00c0; + case CELL_DMUX_PAMF_AVC_LEVEL_3P0: return 0x19f2e0; + case CELL_DMUX_PAMF_AVC_LEVEL_3P1: return 0x260120; + case CELL_DMUX_PAMF_AVC_LEVEL_3P2: return 0x35f6c0; + case CELL_DMUX_PAMF_AVC_LEVEL_4P1: return 0x45e870; + case CELL_DMUX_PAMF_AVC_LEVEL_4P2: // Same as below + default: return 0x46a870; + } + } + + if (es_specific_info && vm::static_ptr_cast(es_specific_info)->profileLevel > CELL_DMUX_PAMF_M2V_MP_ML) + { + return 0x255000; + } + + return 0x70000; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: + { + if (!es_specific_info) + { + return 0x104380; + } + + const u32 nch = vm::static_ptr_cast(es_specific_info)->numOfChannels; + const u32 lpcm_au_size = dmuxPamfGetLpcmAuSize(vm::static_ptr_cast(es_specific_info)); + + if (vm::static_ptr_cast(es_specific_info)->samplingFreq <= 96000) + { + if (nch > 0 && nch <= 2) + { + return 0x20000 + lpcm_au_size; + } + + if (nch <= 6) + { + return 0x60000 + lpcm_au_size; + } + + if (nch <= 8) + { + return 0x80000 + lpcm_au_size; + } + + return lpcm_au_size; + } + + if (nch > 0 && nch <= 2) + { + return 0x60000 + lpcm_au_size; + } + + if (nch <= 6) + { + return 0x100000 + lpcm_au_size; + } + + return lpcm_au_size; + } + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: + return 0xa000; + + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: + return 0x6400; + + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: + return 0x160000; + + default: + return 0; + } +} + +template +u32 dmuxPamfGetEsMemSize(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info) +{ + return dmuxPamfGetAuSpecificInfoSize(stream_id, private_stream_id, is_avc) * dmuxPamfGetAuQueueMaxSize(stream_id, private_stream_id) + + dmuxPamfGetAuQueueBufferSize(stream_id, private_stream_id, is_avc, es_specific_info) + 0x7f + static_cast(sizeof(DmuxPamfElementaryStream)) + 0xf; +} + +error_code dmuxPamfNotifyDemuxDone(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, error_code error, vm::ptr handle) +{ + handle->notify_demux_done.cbFunc(ppu, handle, error, handle->notify_demux_done.cbArg); + return CELL_OK; +} + +error_code dmuxPamfNotifyProgEndCode(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, vm::ptr handle) +{ + if (handle->notify_prog_end_code.cbFunc) + { + handle->notify_prog_end_code.cbFunc(ppu, handle, handle->notify_prog_end_code.cbArg); + } + + return CELL_OK; +} + +error_code dmuxPamfNotifyFatalErr(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, error_code error, vm::ptr handle) +{ + handle->notify_fatal_err.cbFunc(ppu, handle, error, handle->notify_fatal_err.cbArg); + return CELL_OK; +} + +error_code dmuxPamfEsNotifyAuFound(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, vm::cptr au_info, vm::ptr handle) +{ + const vm::var _au_info; + _au_info->info.auAddr = au_info->addr; + _au_info->info.auSize = au_info->size; + _au_info->info.isRap = au_info->is_rap; + _au_info->info.userData = au_info->user_data; + _au_info->info.pts = au_info->pts; + _au_info->info.dts = au_info->dts; + _au_info->specific_info = au_info->specific_info; + _au_info->specific_info_size = au_info->specific_info_size; + // _au_info->info.auMaxSize is left uninitialized + + return handle->notify_au_found.cbFunc(ppu, handle, _au_info, handle->notify_au_found.cbArg); +} + +error_code dmuxPamfEsNotifyFlushDone(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, vm::ptr handle) +{ + return handle->notify_flush_done.cbFunc(ppu, handle, handle->notify_flush_done.cbArg); +} + error_code _CellDmuxCoreOpQueryAttr(vm::cptr pamfSpecificInfo, vm::ptr pamfAttr) { - cellDmuxPamf.todo("_CellDmuxCoreOpQueryAttr(pamfSpecificInfo=*0x%x, pamfAttr=*0x%x)", pamfSpecificInfo, pamfAttr); + cellDmuxPamf.notice("_CellDmuxCoreOpQueryAttr(pamfSpecificInfo=*0x%x, pamfAttr=*0x%x)", pamfSpecificInfo, pamfAttr); + + if (!pamfAttr || (pamfSpecificInfo && pamfSpecificInfo->thisSize != sizeof(CellDmuxPamfSpecificInfo))) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + pamfAttr->maxEnabledEsNum = DMUX_PAMF_MAX_ENABLED_ES_NUM; + pamfAttr->version = DMUX_PAMF_VERSION; + pamfAttr->memSize = sizeof(CellDmuxPamfHandle) + sizeof(DmuxPamfContext) + 0xe7b; return CELL_OK; } -error_code _CellDmuxCoreOpOpen(vm::cptr pamfSpecificInfo, vm::cptr demuxerResource, vm::cptr demuxerResourceSpurs, vm::cptr> notifyDemuxDone, - vm::cptr> notifyProgEndCode, vm::cptr> notifyFatalErr, vm::pptr handle) +error_code DmuxPamfContext::open(ppu_thread& ppu, const CellDmuxPamfResource& res, const DmuxCb& notify_dmux_done, const DmuxCb& notify_prog_end_code, + const DmuxCb& notify_fatal_err, vm::bptr& handle) { - cellDmuxPamf.todo("_CellDmuxCoreOpOpen(pamfSpecificInfo=*0x%x, demuxerResource=*0x%x, demuxerResourceSpurs=*0x%x, notifyDemuxDone=*0x%x, notifyProgEndCode=*0x%x, notifyFatalErr=*0x%x, handle=**0x%x)", + if (res.ppuThreadPriority >= 0xc00u || res.ppuThreadStackSize < 0x1000u || res.spuThreadPriority >= 0x100u || res.numOfSpus != 1u || !res.memAddr || res.memSize < sizeof(DmuxPamfContext) + 0xe7b) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + const auto _this = vm::ptr::make(utils::align(+res.memAddr.addr(), 0x80)); + + _this->_this = _this; + _this->this_size = res.memSize; + _this->version = DMUX_PAMF_VERSION; + _this->notify_demux_done = notify_dmux_done; + _this->notify_prog_end_code = notify_prog_end_code; + _this->notify_fatal_err = notify_fatal_err; + _this->resource = res; + _this->unk = 0; + _this->ppu_thread_stack_size = res.ppuThreadStackSize; + _this->au_released_bitset = 0; + _this->stream_reset_requested = false; + _this->sequence_state = DmuxPamfSequenceState::dormant; + _this->max_enabled_es_num = DMUX_PAMF_MAX_ENABLED_ES_NUM; + _this->enabled_es_num = 0; + std::ranges::fill(_this->elementary_streams, vm::null); + _this->next_es_id = 0; + + const vm::var mutex_attr = {{ SYS_SYNC_PRIORITY, SYS_SYNC_NOT_RECURSIVE, SYS_SYNC_NOT_PROCESS_SHARED, SYS_SYNC_NOT_ADAPTIVE, 0, 0, 0, { "_dxpmtx"_u64 } }}; + const vm::var cond_attr = {{ SYS_SYNC_NOT_PROCESS_SHARED, 0, 0, { "_dxpcnd"_u64 } }}; + + if (sys_mutex_create(ppu, _this.ptr(&DmuxPamfContext::mutex), mutex_attr) != CELL_OK + || sys_cond_create(ppu, _this.ptr(&DmuxPamfContext::cond), _this->mutex, cond_attr) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + _this->spurs_context_addr = _this.ptr(&DmuxPamfContext::spurs_context); + _this->cmd_queue_addr_ = _this.ptr(&DmuxPamfContext::cmd_queue); + _this->cmd_queue_buffer_addr_ = _this.ptr(&DmuxPamfContext::cmd_queue_buffer); + _this->cmd_queue_addr = _this.ptr(&DmuxPamfContext::cmd_queue); + _this->cmd_result_queue_addr = _this.ptr(&DmuxPamfContext::cmd_result_queue); + _this->stream_info_queue_addr = _this.ptr(&DmuxPamfContext::stream_info_queue); + _this->event_queue_addr = _this.ptr(&DmuxPamfContext::event_queue); + _this->cmd_queue_buffer_addr = _this.ptr(&DmuxPamfContext::cmd_queue_buffer); + _this->cmd_result_queue_buffer_addr = _this.ptr(&DmuxPamfContext::cmd_result_queue_buffer); + _this->event_queue_buffer_addr = _this.ptr(&DmuxPamfContext::event_queue_buffer); + _this->stream_info_queue_buffer_addr = _this.ptr(&DmuxPamfContext::stream_info_queue_buffer); + _this->cmd_queue_addr__ = _this.ptr(&DmuxPamfContext::cmd_queue); + + ensure(std::snprintf(_this->spurs_taskset_name, sizeof(_this->spurs_taskset_name), "_libdmux_pamf_%08x", _this.addr()) == 22); + + _this->cmd_queue.init(_this->cmd_queue_buffer); + _this->cmd_result_queue.init(_this->cmd_result_queue_buffer); + _this->stream_info_queue.init(_this->stream_info_queue_buffer); + _this->event_queue.init(_this->event_queue_buffer); + + // HLE exclusive + _this->savestate = {}; + _this->au_queue_full_bitset = 0; + _this->stream_reset_started = false; + _this->stream_reset_in_progress = false; + + _this->run_spu_thread(); + + handle = _this; + return _this->create_thread(ppu); +} + +error_code _CellDmuxCoreOpOpen(ppu_thread& ppu, vm::cptr pamfSpecificInfo, vm::cptr demuxerResource, vm::cptr demuxerResourceSpurs, vm::cptr> notifyDemuxDone, + vm::cptr> notifyProgEndCode, vm::cptr> notifyFatalErr, vm::pptr handle) +{ + // Block savestates during ppu_execute + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + cellDmuxPamf.notice("_CellDmuxCoreOpOpen(pamfSpecificInfo=*0x%x, demuxerResource=*0x%x, demuxerResourceSpurs=*0x%x, notifyDemuxDone=*0x%x, notifyProgEndCode=*0x%x, notifyFatalErr=*0x%x, handle=**0x%x)", pamfSpecificInfo, demuxerResource, demuxerResourceSpurs, notifyDemuxDone, notifyProgEndCode, notifyFatalErr, handle); - return CELL_OK; + if ((pamfSpecificInfo && pamfSpecificInfo->thisSize != sizeof(CellDmuxPamfSpecificInfo)) + || !demuxerResource + || (demuxerResourceSpurs && !demuxerResourceSpurs->spurs) + || !notifyDemuxDone || !notifyDemuxDone->cbFunc || !notifyDemuxDone->cbArg + || !notifyProgEndCode + || !notifyFatalErr || !notifyFatalErr->cbFunc || !notifyFatalErr->cbArg + || !handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + ensure(demuxerResource->memAddr.aligned(0x10)); // Not checked on LLE + + const auto _handle = vm::static_ptr_cast(demuxerResource->memAddr); + + _handle->notify_demux_done = *notifyDemuxDone; + _handle->notify_fatal_err = *notifyFatalErr; + _handle->notify_prog_end_code = *notifyProgEndCode; + + if (!pamfSpecificInfo || !pamfSpecificInfo->programEndCodeCb) + { + _handle->notify_prog_end_code.cbFunc = vm::null; + } + + const CellDmuxPamfResource res{ demuxerResource->ppuThreadPriority, demuxerResource->ppuThreadStackSize, demuxerResource->numOfSpus, demuxerResource->spuThreadPriority, + vm::bptr::make(demuxerResource->memAddr.addr() + sizeof(CellDmuxPamfHandle)), demuxerResource->memSize - sizeof(CellDmuxPamfHandle) }; + + const auto demux_done_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyDemuxDone))); + const auto prog_end_code_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyProgEndCode))); + const auto fatal_err_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyFatalErr))); + + const error_code ret = DmuxPamfContext::open(ppu, res, { demux_done_func, _handle }, { prog_end_code_func, _handle }, { fatal_err_func, _handle }, _handle->demuxer); + + *handle = _handle; + + return ret; } -error_code _CellDmuxCoreOpClose(vm::ptr handle) +error_code DmuxPamfContext::close(ppu_thread& ppu) { - cellDmuxPamf.todo("_CellDmuxCoreOpClose(handle=*0x%x)", handle); + if (join_thread(ppu) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + ensure(idm::remove(hle_spu_thread_id)); return CELL_OK; } -error_code _CellDmuxCoreOpResetStream(vm::ptr handle) +error_code _CellDmuxCoreOpClose(ppu_thread& ppu, vm::ptr handle) { - cellDmuxPamf.todo("_CellDmuxCoreOpResetStream(handle=*0x%x)", handle); + // The PPU thread is going to use ppu_execute + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + cellDmuxPamf.notice("_CellDmuxCoreOpClose(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->close(ppu); +} + +error_code DmuxPamfContext::reset_stream(ppu_thread& ppu) +{ + auto& ar = *ppu.optional_savestate_state; + const u8 savestate = ar.try_read().second; + ar.clear(); + + switch (savestate) + { + case 0: + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(0); + return {}; + } + + if (sequence_state != DmuxPamfSequenceState::running) + { + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; + } + + [[fallthrough]]; + + case 1: + send_spu_command_and_wait(ppu, savestate); + + if (ppu.state & cpu_flag::again) + { + ar(1); + return {}; + } + + stream_reset_requested = true; + [[fallthrough]]; + + case 2: + if (const error_code ret = sys_cond_signal_to(ppu, cond, static_cast(thread_id)); ret != CELL_OK && ret != static_cast(CELL_EPERM)) + { + sys_mutex_unlock(ppu, mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(2); + return {}; + } + + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; + + default: + fmt::throw_exception("Unexpected savestate value: 0x%x", savestate); + } +} + +error_code _CellDmuxCoreOpResetStream(ppu_thread& ppu, vm::ptr handle) +{ + cellDmuxPamf.notice("_CellDmuxCoreOpResetStream(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->reset_stream(ppu); +} + +error_code DmuxPamfContext::create_thread(ppu_thread& ppu) +{ + const vm::var name = vm::make_str("HLE PAMF demuxer"); + const auto entry = g_fxo->get().func_addr(FIND_FUNC(dmuxPamfEntry)); + + if (ppu_execute<&sys_ppu_thread_create>(ppu, _this.ptr(&DmuxPamfContext::thread_id), entry, +_this.addr(), +resource.ppuThreadPriority, +resource.ppuThreadStackSize, SYS_PPU_THREAD_CREATE_JOINABLE, +name) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } return CELL_OK; } -error_code _CellDmuxCoreOpCreateThread(vm::ptr handle) +error_code _CellDmuxCoreOpCreateThread(ppu_thread& ppu, vm::ptr handle) { - cellDmuxPamf.todo("_CellDmuxCoreOpCreateThread(handle=*0x%x)", handle); + // Block savestates during ppu_execute + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; - return CELL_OK; + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + cellDmuxPamf.notice("_CellDmuxCoreOpCreateThread(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->create_thread(ppu); } -error_code _CellDmuxCoreOpJoinThread(vm::ptr handle) +error_code DmuxPamfContext::join_thread(ppu_thread& ppu) { - cellDmuxPamf.todo("_CellDmuxCoreOpJoinThread(handle=*0x%x)", handle); + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + std::ranges::fill_n(elementary_streams, enabled_es_num, vm::null); + + enabled_es_num = -1; + + send_spu_command_and_wait(ppu, false); + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + return sys_ppu_thread_join(ppu, static_cast(thread_id), +vm::var{}) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +error_code _CellDmuxCoreOpJoinThread(ppu_thread& ppu, vm::ptr handle) +{ + // The PPU thread is going to use ppu_execute + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + cellDmuxPamf.notice("_CellDmuxCoreOpJoinThread(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->join_thread(ppu); +} + +template +error_code DmuxPamfContext::set_stream(ppu_thread& ppu, vm::cptr stream_address, u32 stream_size, b8 discontinuity, u32 user_data) +{ + auto& ar = *ppu.optional_savestate_state; + const bool waiting_for_spu_state = ar.try_read().second; + ar.clear(); + + if (!waiting_for_spu_state) + { + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(false); + return {}; + } + + this->user_data = user_data; + + if (!stream_info_queue.emplace(stream_address, stream_size, user_data, !discontinuity, raw_es)) + { + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? CELL_DMUX_PAMF_ERROR_BUSY : CELL_DMUX_PAMF_ERROR_FATAL; + } + } + + send_spu_command_and_wait(ppu, waiting_for_spu_state); + + if (ppu.state & cpu_flag::again) + { + ar(true); + return {}; + } + + sequence_state = DmuxPamfSequenceState::running; + + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +template +error_code _CellDmuxCoreOpSetStream(ppu_thread& ppu, vm::ptr handle, vm::cptr streamAddress, u32 streamSize, b8 discontinuity, u64 userData) +{ + cellDmuxPamf.trace("_CellDmuxCoreOpSetStream(handle=*0x%x, streamAddress=*0x%x, streamSize=0x%x, discontinuity=%d, userData=0x%llx)", raw_es, handle, streamAddress, streamSize, +discontinuity, userData); + + if (!streamAddress || streamSize == 0) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + ensure(!!handle); // Not checked on LLE + + return handle->demuxer->set_stream(ppu, streamAddress, streamSize, discontinuity, static_cast(userData)); +} + +error_code DmuxPamfElementaryStream::release_au(ppu_thread& ppu, vm::ptr au_addr, u32 au_size) const +{ + auto& ar = *ppu.optional_savestate_state; + const u8 savestate = ar.try_read().second; + ar.clear(); + + switch (savestate) + { + case 0: + if (sys_mutex_lock(ppu, demuxer->mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(0); + return {}; + } + + [[fallthrough]]; + + case 1: + demuxer->send_spu_command_and_wait(ppu, savestate, au_addr, au_size, static_cast>(stream_id), static_cast>(private_stream_id)); + + if (ppu.state & cpu_flag::again) + { + ar(1); + return {}; + } + + demuxer->au_released_bitset |= 1ull << this_index; + [[fallthrough]]; + + case 2: + if (const error_code ret = sys_cond_signal_to(ppu, demuxer->cond, static_cast(demuxer->thread_id)); ret != CELL_OK && ret != static_cast(CELL_EPERM)) + { + sys_mutex_unlock(ppu, demuxer->mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(2); + return {}; + } + + return sys_mutex_unlock(ppu, demuxer->mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; + + default: + fmt::throw_exception("Unexpected savestate value: 0x%x", savestate); + } +} + +error_code _CellDmuxCoreOpReleaseAu(ppu_thread& ppu, vm::ptr esHandle, vm::ptr auAddr, u32 auSize) +{ + cellDmuxPamf.trace("_CellDmuxCoreOpReleaseAu(esHandle=*0x%x, auAddr=*0x%x, auSize=0x%x)", esHandle, auAddr, auSize); + + if (!auAddr || auSize == 0) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + ensure(!!esHandle); // Not checked on LLE + + return esHandle->es->release_au(ppu, auAddr, auSize); +} + +template +error_code dmuxPamfGetEsAttr(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info, CellDmuxPamfEsAttr& attr) +{ + if (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID) + { + return CELL_DMUX_PAMF_ERROR_UNKNOWN_STREAM; + } + + if (dmuxPamfVerifyEsSpecificInfo(stream_id, private_stream_id, is_avc, es_specific_info) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + attr.auQueueMaxSize = dmuxPamfGetAuQueueMaxSize(stream_id, private_stream_id); + attr.memSize = dmuxPamfGetEsMemSize(stream_id, private_stream_id, is_avc, es_specific_info); + attr.specificInfoSize = dmuxPamfGetAuSpecificInfoSize(stream_id, private_stream_id, is_avc); return CELL_OK; } template -error_code _CellDmuxCoreOpSetStream(vm::ptr handle, vm::cptr streamAddress, u32 streamSize, b8 discontinuity, u64 userData) +static inline std::tuple get_stream_ids(vm::cptr esFilterId) { - cellDmuxPamf.todo("_CellDmuxCoreOpSetStream(handle=*0x%x, streamAddress=*0x%x, streamSize=0x%x, discontinuity=%d, userData=0x%llx)", raw_es, handle, streamAddress, streamSize, +discontinuity, userData); + if constexpr (raw_es) + { + const auto filter_id = vm::static_ptr_cast(esFilterId); + return { filter_id[2], filter_id[3], filter_id[8] >> 7 }; + } - return CELL_OK; -} - -error_code _CellDmuxCoreOpReleaseAu(vm::ptr esHandle, vm::ptr memAddr, u32 memSize) -{ - cellDmuxPamf.todo("_CellDmuxCoreOpReleaseAu(esHandle=*0x%x, memAddr=*0x%x, memSize=0x%x)", esHandle, memAddr, memSize); - - return CELL_OK; + const auto filter_id = vm::static_ptr_cast(esFilterId); + return { filter_id->filterIdMajor, filter_id->filterIdMinor, filter_id->supplementalInfo1 }; } template error_code _CellDmuxCoreOpQueryEsAttr(vm::cptr esFilterId, vm::cptr esSpecificInfo, vm::ptr attr) { - cellDmuxPamf.todo("_CellDmuxCoreOpQueryEsAttr(esFilterId=*0x%x, esSpecificInfo=*0x%x, attr=*0x%x)", raw_es, esFilterId, esSpecificInfo, attr); + cellDmuxPamf.notice("_CellDmuxCoreOpQueryEsAttr(esFilterId=*0x%x, esSpecificInfo=*0x%x, attr=*0x%x)", raw_es, esFilterId, esSpecificInfo, attr); + if (!esFilterId || !attr) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + const auto [stream_id, private_stream_id, is_avc] = get_stream_ids(esFilterId); + + CellDmuxPamfEsAttr es_attr; + + const error_code ret = dmuxPamfGetEsAttr(stream_id, private_stream_id, is_avc, esSpecificInfo, es_attr); + + *attr = es_attr; + attr->memSize += static_cast(sizeof(CellDmuxPamfEsHandle)); + + return ret; +} + +template +error_code DmuxPamfContext::enable_es(ppu_thread& ppu, u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info, vm::ptr mem_addr, u32 mem_size, const DmuxCb& notify_au_found, + const DmuxCb& notify_flush_done, vm::bptr& es) +{ + auto& ar = *ppu.optional_savestate_state; + const bool waiting_for_spu_state = ar.try_read().second; + ar.clear(); + + if (mem_size < dmuxPamfGetEsMemSize(stream_id, private_stream_id, is_avc, es_specific_info)) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + const auto stream_type = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first; + + if (!waiting_for_spu_state) + { + if (stream_type == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID) + { + return CELL_DMUX_PAMF_ERROR_UNKNOWN_STREAM; + } + + if (dmuxPamfVerifyEsSpecificInfo(stream_id, private_stream_id, is_avc, es_specific_info) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + if (const error_code ret = sys_mutex_lock(ppu, mutex, 0); ret != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(false); + return {}; + } + + this->is_raw_es = raw_es; + + if (enabled_es_num == max_enabled_es_num) + { + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? CELL_DMUX_PAMF_ERROR_NO_MEMORY : CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (find_es(stream_id, private_stream_id)) + { + // Elementary stream is already enabled + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? CELL_DMUX_PAMF_ERROR_ARG : CELL_DMUX_PAMF_ERROR_FATAL; + } + } + + const be_t au_max_size = [&]() -> be_t + { + switch (stream_type) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + if (is_avc) + { + if (!es_specific_info || vm::static_ptr_cast(es_specific_info)->level == CELL_DMUX_PAMF_AVC_LEVEL_4P2) + { + return 0xcc000u; + } + + switch (vm::static_ptr_cast(es_specific_info)->level) + { + case CELL_DMUX_PAMF_AVC_LEVEL_2P1: return 0x12900u; + case CELL_DMUX_PAMF_AVC_LEVEL_3P0: return 0x25f80u; + case CELL_DMUX_PAMF_AVC_LEVEL_3P1: return 0x54600u; + case CELL_DMUX_PAMF_AVC_LEVEL_3P2: return 0x78000u; + case CELL_DMUX_PAMF_AVC_LEVEL_4P1: return 0xc0000u; + default: fmt::throw_exception("Unreachable"); // es_specific_info was already checked for invalid values in dmuxPamfVerifyEsSpecificInfo() + } + } + + if (!es_specific_info || vm::static_ptr_cast(es_specific_info)->profileLevel > CELL_DMUX_PAMF_M2V_MP_ML) + { + return 0x12a800u; + } + + return 0x38000u; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: return dmuxPamfGetLpcmAuSize(vm::static_ptr_cast(es_specific_info)); + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: return 0xf00u; + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: return 0x1008u; + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: return 0xa0000u; + default: fmt::throw_exception("Unreachable"); // stream_type was already checked + } + }(); + + const auto _es = vm::bptr::make(utils::align(mem_addr.addr(), 0x10)); + + const auto au_queue_buffer = vm::bptr::make(utils::align(_es.addr() + static_cast(sizeof(DmuxPamfElementaryStream)), 0x80)); + const be_t au_specific_info_size = dmuxPamfGetAuSpecificInfoSize(stream_id, private_stream_id, is_avc); + + send_spu_command_and_wait(ppu, waiting_for_spu_state, stream_id, private_stream_id, is_avc, au_queue_buffer, + dmuxPamfGetAuQueueBufferSize(stream_id, private_stream_id, is_avc, es_specific_info), au_max_size, au_specific_info_size, raw_es, next_es_id); + + if (ppu.state & cpu_flag::again) + { + ar(true); + return {}; + } + + u32 es_idx = umax; + while (elementary_streams[++es_idx]){} // There is guaranteed to be an empty slot, this was already checked above + + _es->_this = _es; + _es->this_size = mem_size; + _es->this_index = es_idx; + _es->demuxer = _this; + _es->notify_au_found = notify_au_found; + _es->notify_flush_done = notify_flush_done; + _es->stream_id = stream_id; + _es->private_stream_id = private_stream_id; + _es->is_avc = is_avc; + _es->au_queue_buffer = au_queue_buffer; + _es->au_max_size = au_max_size; + _es->au_specific_info_size = au_specific_info_size; + _es->reset_next_au = false; + _es->es_id = next_es_id++; + + elementary_streams[es_idx] = _es; + + enabled_es_num++; + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + es = _es; return CELL_OK; } template -error_code _CellDmuxCoreOpEnableEs(vm::ptr handle, vm::cptr esFilterId, vm::cptr esResource, vm::cptr> notifyAuFound, - vm::cptr> notifyFlushDone, vm::cptr esSpecificInfo, vm::pptr esHandle) +error_code _CellDmuxCoreOpEnableEs(ppu_thread& ppu, vm::ptr handle, vm::cptr esFilterId, vm::cptr esResource, vm::cptr> notifyAuFound, + vm::cptr> notifyFlushDone, vm::cptr esSpecificInfo, vm::pptr esHandle) { - cellDmuxPamf.todo("_CellDmuxCoreOpEnableEs(handle=*0x%x, esFilterId=*0x%x, esResource=*0x%x, notifyAuFound=*0x%x, notifyFlushDone=*0x%x, esSpecificInfo=*0x%x, esHandle)", + cellDmuxPamf.notice("_CellDmuxCoreOpEnableEs(handle=*0x%x, esFilterId=*0x%x, esResource=*0x%x, notifyAuFound=*0x%x, notifyFlushDone=*0x%x, esSpecificInfo=*0x%x, esHandle)", raw_es, handle, esFilterId, esResource, notifyAuFound, notifyFlushDone, esSpecificInfo, esHandle); - return CELL_OK; + if (!handle || !esFilterId || !esResource || !esResource->memAddr || esResource->memSize == 0u || !notifyAuFound || !notifyAuFound->cbFunc || !notifyAuFound->cbArg || !notifyFlushDone || !notifyFlushDone->cbFunc || !notifyFlushDone->cbArg) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + ensure(!!esHandle && esResource->memAddr.aligned(0x10)); // Not checked on LLE + + const auto es_handle = vm::static_ptr_cast(esResource->memAddr); + + es_handle->notify_au_found = *notifyAuFound; + es_handle->notify_flush_done = *notifyFlushDone; + + const auto au_found_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfEsNotifyAuFound))); + const auto flush_done_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfEsNotifyFlushDone))); + + const auto [stream_id, private_stream_id, is_avc] = get_stream_ids(esFilterId); + + const error_code ret = handle->demuxer->enable_es(ppu, stream_id, private_stream_id, is_avc, esSpecificInfo, vm::ptr::make(esResource->memAddr.addr() + sizeof(CellDmuxPamfEsHandle)), + esResource->memSize - sizeof(CellDmuxPamfEsHandle), { au_found_func, es_handle }, { flush_done_func, es_handle }, es_handle->es); + + *esHandle = es_handle; + + return ret; } -error_code _CellDmuxCoreOpDisableEs(vm::ptr esHandle) +error_code DmuxPamfElementaryStream::disable_es(ppu_thread& ppu) { - cellDmuxPamf.todo("_CellDmuxCoreOpDisableEs(esHandle=*0x%x)", esHandle); + const auto dmux = demuxer.get_ptr(); - return CELL_OK; + auto& ar = *ppu.optional_savestate_state; + const u8 savestate = ar.try_read().second; + ar.clear(); + + switch (savestate) + { + case 0: + if (sys_mutex_lock(ppu, dmux->mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(0); + return {}; + } + + if (!dmux->find_es(stream_id, private_stream_id)) + { + // Elementary stream is already disabled + return sys_mutex_unlock(ppu, dmux->mutex) == CELL_OK ? CELL_DMUX_PAMF_ERROR_ARG : CELL_DMUX_PAMF_ERROR_FATAL; + } + + [[fallthrough]]; + + case 1: + dmux->send_spu_command_and_wait(ppu, savestate, static_cast>(stream_id), static_cast>(private_stream_id)); + + if (ppu.state & cpu_flag::again) + { + ar(1); + return {}; + } + + _this = vm::null; + this_size = 0; + demuxer = vm::null; + notify_au_found = {}; + au_queue_buffer = vm::null; + unk = 0; + au_max_size = 0; + + dmux->elementary_streams[this_index] = vm::null; + dmux->enabled_es_num--; + + dmux->au_released_bitset |= 1ull << this_index; + + this_index = 0; + [[fallthrough]]; + + case 2: + if (const error_code ret = sys_cond_signal_to(ppu, dmux->cond, static_cast(dmux->thread_id)); ret != CELL_OK && ret != static_cast(CELL_EPERM)) + { + sys_mutex_unlock(ppu, dmux->mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(2); + return {}; + } + + return sys_mutex_unlock(ppu, dmux->mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; + + default: + fmt::throw_exception("Unexpected savestate value: 0x%x", savestate); + } } -error_code _CellDmuxCoreOpFlushEs(vm::ptr esHandle) +error_code _CellDmuxCoreOpDisableEs(ppu_thread& ppu, vm::ptr esHandle) { - cellDmuxPamf.todo("_CellDmuxCoreOpFlushEs(esHandle=*0x%x)", esHandle); + cellDmuxPamf.notice("_CellDmuxCoreOpDisableEs(esHandle=*0x%x)", esHandle); - return CELL_OK; + if (!esHandle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return esHandle->es->disable_es(ppu); } -error_code _CellDmuxCoreOpResetEs(vm::ptr esHandle) +error_code DmuxPamfElementaryStream::flush_es(ppu_thread& ppu) const { - cellDmuxPamf.todo("_CellDmuxCoreOpResetEs(esHandle=*0x%x)", esHandle); + auto& ar = *ppu.optional_savestate_state; + const bool waiting_for_spu_state = ar.try_read().second; + ar.clear(); - return CELL_OK; + if (!waiting_for_spu_state) + { + if (sys_mutex_lock(ppu, demuxer->mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(false); + return {}; + } + } + + demuxer->send_spu_command_and_wait(ppu, waiting_for_spu_state, static_cast>(stream_id), static_cast>(private_stream_id)); + + if (ppu.state & cpu_flag::again) + { + ar(true); + return {}; + } + + return sys_mutex_unlock(ppu, demuxer->mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; } -error_code _CellDmuxCoreOpResetStreamAndWaitDone(vm::ptr handle) +error_code _CellDmuxCoreOpFlushEs(ppu_thread& ppu, vm::ptr esHandle) { - cellDmuxPamf.todo("_CellDmuxCoreOpResetStreamAndWaitDone(handle=*0x%x)", handle); + cellDmuxPamf.notice("_CellDmuxCoreOpFlushEs(esHandle=*0x%x)", esHandle); - return CELL_OK; + if (!esHandle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return esHandle->es->flush_es(ppu); +} + +error_code DmuxPamfElementaryStream::reset_es(ppu_thread& ppu) const +{ + auto& ar = *ppu.optional_savestate_state; + const bool waiting_for_spu_state = ar.try_read().second; + ar.clear(); + + if (!waiting_for_spu_state) + { + if (sys_mutex_lock(ppu, demuxer->mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(false); + return {}; + } + } + + demuxer->send_spu_command_and_wait(ppu, waiting_for_spu_state, static_cast>(stream_id), static_cast>(private_stream_id), vm::null); + + if (ppu.state & cpu_flag::again) + { + ar(true); + return {}; + } + + return sys_mutex_unlock(ppu, demuxer->mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +error_code _CellDmuxCoreOpResetEs(ppu_thread& ppu, vm::ptr esHandle) +{ + cellDmuxPamf.notice("_CellDmuxCoreOpResetEs(esHandle=*0x%x)", esHandle); + + if (!esHandle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return esHandle->es->reset_es(ppu); +} + +error_code DmuxPamfContext::reset_stream_and_wait_done(ppu_thread& ppu) +{ + // Both sys_cond_wait() and DmuxPamfContext::reset_stream() are already using ppu_thread::optional_savestate_state, so we can't save this function currently + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + if (reset_stream(ppu) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + + while (sequence_state != DmuxPamfSequenceState::dormant) + { + if (sys_cond_wait(ppu, cond, 0) != CELL_OK) + { + sys_mutex_unlock(ppu, mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + } + + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +error_code _CellDmuxCoreOpResetStreamAndWaitDone(ppu_thread& ppu, vm::ptr handle) +{ + cellDmuxPamf.notice("_CellDmuxCoreOpResetStreamAndWaitDone(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->reset_stream_and_wait_done(ppu); } template @@ -1267,4 +2840,12 @@ DECLARE(ppu_module_manager::cellDmuxPamf)("cellDmuxPamf", [] REG_HIDDEN_FUNC(_CellDmuxCoreOpFlushEs); REG_HIDDEN_FUNC(_CellDmuxCoreOpResetEs); REG_HIDDEN_FUNC(_CellDmuxCoreOpResetStreamAndWaitDone); + + REG_HIDDEN_FUNC(dmuxPamfNotifyDemuxDone); + REG_HIDDEN_FUNC(dmuxPamfNotifyProgEndCode); + REG_HIDDEN_FUNC(dmuxPamfNotifyFatalErr); + REG_HIDDEN_FUNC(dmuxPamfEsNotifyAuFound); + REG_HIDDEN_FUNC(dmuxPamfEsNotifyFlushDone); + + REG_HIDDEN_FUNC(dmuxPamfEntry); }); diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h index c720fb89c5..dea9fef073 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h @@ -661,16 +661,376 @@ using dmux_pamf_spu_thread = named_thread; // PPU thread -struct CellDmuxPamfAttr +// For some reason, cellDmuxPamf doesn't use regular error code values and also has a second set of error codes that's only used internally +enum CellDmuxPamfError { - be_t maxEnabledEsNum; - be_t version; + CELL_DMUX_PAMF_ERROR_BUSY = 1, + CELL_DMUX_PAMF_ERROR_ARG = 2, + CELL_DMUX_PAMF_ERROR_UNKNOWN_STREAM = 3, + CELL_DMUX_PAMF_ERROR_NO_MEMORY = 5, + CELL_DMUX_PAMF_ERROR_FATAL = 6, +}; + +enum CellDmuxPamfM2vLevel +{ + CELL_DMUX_PAMF_M2V_MP_LL = 0, + CELL_DMUX_PAMF_M2V_MP_ML, + CELL_DMUX_PAMF_M2V_MP_H14, + CELL_DMUX_PAMF_M2V_MP_HL, +}; + +enum CellDmuxPamfAvcLevel +{ + CELL_DMUX_PAMF_AVC_LEVEL_2P1 = 21, + CELL_DMUX_PAMF_AVC_LEVEL_3P0 = 30, + CELL_DMUX_PAMF_AVC_LEVEL_3P1 = 31, + CELL_DMUX_PAMF_AVC_LEVEL_3P2 = 32, + CELL_DMUX_PAMF_AVC_LEVEL_4P1 = 41, + CELL_DMUX_PAMF_AVC_LEVEL_4P2 = 42, +}; + +struct CellDmuxPamfAuSpecificInfoM2v +{ + be_t reserved1; +}; + +struct CellDmuxPamfAuSpecificInfoAvc +{ + be_t reserved1; +}; + +struct CellDmuxPamfAuSpecificInfoLpcm +{ + u8 channelAssignmentInfo; + u8 samplingFreqInfo; + u8 bitsPerSample; +}; + +struct CellDmuxPamfAuSpecificInfoAc3 +{ + be_t reserved1; +}; + +struct CellDmuxPamfAuSpecificInfoAtrac3plus +{ + be_t reserved1; +}; + +struct CellDmuxPamfAuSpecificInfoUserData +{ + be_t reserved1; +}; + +struct CellDmuxPamfEsSpecificInfoM2v +{ + be_t profileLevel; +}; + +struct CellDmuxPamfEsSpecificInfoAvc +{ + be_t level; +}; + +struct CellDmuxPamfEsSpecificInfoLpcm +{ + be_t samplingFreq; + be_t numOfChannels; + be_t bitsPerSample; +}; + +struct CellDmuxPamfEsSpecificInfoAc3 +{ + be_t reserved1; +}; + +struct CellDmuxPamfEsSpecificInfoAtrac3plus +{ + be_t reserved1; +}; + +struct CellDmuxPamfEsSpecificInfoUserData +{ + be_t reserved1; +}; + +enum CellDmuxPamfSamplingFrequency +{ + CELL_DMUX_PAMF_FS_48K = 48000, +}; + +enum CellDmuxPamfBitsPerSample +{ + CELL_DMUX_PAMF_BITS_PER_SAMPLE_16 = 16, + CELL_DMUX_PAMF_BITS_PER_SAMPLE_24 = 24, +}; + +enum CellDmuxPamfLpcmChannelAssignmentInfo +{ + CELL_DMUX_PAMF_LPCM_CH_M1 = 1, + CELL_DMUX_PAMF_LPCM_CH_LR = 3, + CELL_DMUX_PAMF_LPCM_CH_LRCLSRSLFE = 9, + CELL_DMUX_PAMF_LPCM_CH_LRCLSCS1CS2RSLFE = 11, +}; + +enum CellDmuxPamfLpcmFs +{ + CELL_DMUX_PAMF_LPCM_FS_48K = 1, +}; + +enum CellDmuxPamfLpcmBitsPerSamples +{ + CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_16 = 1, + CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_24 = 3, +}; + +struct CellDmuxPamfSpecificInfo +{ + be_t thisSize; + b8 programEndCodeCb; +}; + +struct CellDmuxPamfResource +{ + be_t ppuThreadPriority; + be_t ppuThreadStackSize; + be_t numOfSpus; + be_t spuThreadPriority; + vm::bptr memAddr; be_t memSize; }; -struct CellDmuxPamfEsAttr +struct DmuxPamfAuInfo { - be_t auQueueMaxSize; - be_t memSize; - be_t specificInfoSize; + vm::bptr addr; + be_t size; + CellCodecTimeStamp pts; + CellCodecTimeStamp dts; + be_t user_data; + vm::bptr specific_info; + be_t specific_info_size; + b8 is_rap; }; + +CHECK_SIZE(DmuxPamfAuInfo, 0x30); + +constexpr u32 DMUX_PAMF_VERSION = 0x280000; +constexpr s32 DMUX_PAMF_MAX_ENABLED_ES_NUM = 0x40; + +// HLE exclusive, for savestates +enum class dmux_pamf_state : u8 +{ + initial, + waiting_for_au_released, + waiting_for_au_released_error, + waiting_for_event, + starting_demux_done, + starting_demux_done_mutex_lock_error, + starting_demux_done_mutex_unlock_error, + starting_demux_done_checking_stream_reset, + starting_demux_done_checking_stream_reset_error, + setting_au_reset, + setting_au_reset_error, + processing_event, + au_found_waiting_for_spu, + unsetting_au_cancel, + demux_done_notifying, + demux_done_mutex_lock, + demux_done_cond_signal, + resuming_demux_mutex_lock, + resuming_demux_waiting_for_spu, + sending_fatal_err +}; + +enum class DmuxPamfSequenceState : u32 +{ + dormant, + resetting, + running +}; + +struct DmuxPamfElementaryStream; + +class DmuxPamfContext +{ + // HLE exclusive + // These are local variables in the PPU thread function, they're here for savestates + DmuxPamfEvent event; + u64 au_queue_full_bitset; + b8 stream_reset_started; + b8 stream_reset_in_progress; + + u32 hle_spu_thread_id; + dmux_pamf_state savestate; + + [[maybe_unused]] u8 spurs[0xf6b]; // CellSpurs, 0x1000 bytes on LLE + [[maybe_unused]] vm::bptr spurs_addr; // CellSpurs* + [[maybe_unused]] b8 use_existing_spurs; + + [[maybe_unused]] alignas(0x80) u8 spurs_taskset[0x1900]; // CellSpursTaskset + [[maybe_unused]] be_t spurs_task_id; // CellSpursTaskId + vm::bptr spurs_context_addr; + + [[maybe_unused]] u8 reserved1[0x10]; + + vm::bptr _this; + be_t this_size; + be_t version; + + DmuxCb notify_demux_done; + DmuxCb notify_prog_end_code; + DmuxCb notify_fatal_err; + + CellDmuxPamfResource resource; + + be_t thread_id; // sys_ppu_thread_t + + be_t unk; // Unused + + be_t ppu_thread_stack_size; + + be_t au_released_bitset; // Each bit corresponds to an elementary stream, if a bit is set then cellDmuxReleaseAu() was called for that elementary stream + + b8 stream_reset_requested; + + be_t sequence_state; + + be_t max_enabled_es_num; + be_t enabled_es_num; + vm::bptr elementary_streams[DMUX_PAMF_MAX_ENABLED_ES_NUM]; + + be_t mutex; // sys_mutex_t + be_t cond; // sys_cond_t + + vm::bptr> cmd_queue_addr_; // Same as cmd_queue_addr, unused + vm::bptr cmd_queue_buffer_addr_; // Same as cmd_queue_buffer_addr, unused + + vm::bptr> cmd_queue_addr; // CellSpursQueue* + vm::bptr, 1>> cmd_result_queue_addr; // CellSpursQueue* + vm::bptr> stream_info_queue_addr; // CellSpursQueue* + vm::bptr> event_queue_addr; // CellSpursQueue* + + vm::bptr cmd_queue_buffer_addr; + vm::bptr[1]> cmd_result_queue_buffer_addr; + vm::bptr event_queue_buffer_addr; + vm::bptr stream_info_queue_buffer_addr; + + vm::bptr> cmd_queue_addr__; // Same as cmd_queue_addr, unused + + be_t user_data; + + b8 is_raw_es; + + be_t next_es_id; + + char spurs_taskset_name[24]; + + [[maybe_unused]] u8 reserved2[928]; // Unused + + dmux_pamf_hle_spurs_queue cmd_queue; // CellSpursQueue + dmux_pamf_hle_spurs_queue, 1> cmd_result_queue; // CellSpursQueue + dmux_pamf_hle_spurs_queue stream_info_queue; // CellSpursQueue + dmux_pamf_hle_spurs_queue event_queue; // CellSpursQueue + + DmuxPamfCommand cmd_queue_buffer[1]; + alignas(0x80) be_t cmd_result_queue_buffer[1]; + DmuxPamfStreamInfo stream_info_queue_buffer[1]; + DmuxPamfEvent event_queue_buffer[4 + 2 * DMUX_PAMF_MAX_ENABLED_ES_NUM]; + + alignas(0x80) u8 spurs_context[0x36400]; + + + template + void send_spu_command_and_wait(ppu_thread& ppu, bool waiting_for_spu_state, auto&&... cmd_params); + + error_code wait_au_released_or_stream_reset(ppu_thread& ppu, u64 au_queue_full_bitset, b8& stream_reset_started, dmux_pamf_state& savestate); + + template + error_code set_au_reset(ppu_thread& ppu); + + template + static error_code callback(ppu_thread& ppu, DmuxCb cb, auto&&... args); + + friend struct DmuxPamfElementaryStream; + +public: + void run_spu_thread(); + + DmuxPamfElementaryStream* find_es(u16 stream_id, u16 private_stream_id); + + void exec(ppu_thread& ppu); + + static error_code open(ppu_thread& ppu, const CellDmuxPamfResource& res, const DmuxCb& notify_dmux_done, const DmuxCb& notify_prog_end_code, const DmuxCb& notify_fatal_err, vm::bptr& handle); + error_code create_thread(ppu_thread& ppu); + error_code close(ppu_thread& ppu); + error_code reset_stream(ppu_thread& ppu); + error_code join_thread(ppu_thread& ppu); + + template + error_code set_stream(ppu_thread& ppu, vm::cptr stream_address, u32 stream_size, b8 discontinuity, u32 user_data); + + template + error_code enable_es(ppu_thread& ppu, u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info, vm::ptr mem_addr, u32 mem_size, const DmuxCb& notify_au_found, + const DmuxCb& notify_flush_done, vm::bptr& es); + + error_code reset_stream_and_wait_done(ppu_thread& ppu); +}; + +static_assert(std::is_standard_layout_v && std::is_trivial_v); +CHECK_SIZE_ALIGN(DmuxPamfContext, 0x3d880, 0x80); + +struct CellDmuxPamfHandle +{ + vm::bptr demuxer; + + DmuxCb notify_demux_done; + DmuxCb notify_prog_end_code; + DmuxCb notify_fatal_err; +}; + +CHECK_SIZE(CellDmuxPamfHandle, 0x1c); + +struct DmuxPamfElementaryStream +{ + vm::bptr _this; + be_t this_size; + u8 this_index; + + vm::bptr demuxer; + + DmuxCb notify_au_found; + DmuxCb notify_flush_done; + + be_t stream_id; + be_t private_stream_id; + b8 is_avc; + + vm::bptr au_queue_buffer; + be_t unk; // Likely au_queue_buffer_size, unused + be_t au_max_size; + u8 au_specific_info[0x10]; + be_t au_specific_info_size; + + b8 reset_next_au; + + be_t es_id; + + u8 reserved[72]; + + error_code release_au(ppu_thread& ppu, vm::ptr au_addr, u32 au_size) const; + error_code disable_es(ppu_thread& ppu); + error_code flush_es(ppu_thread& ppu) const; + error_code reset_es(ppu_thread& ppu) const; +}; + +static_assert(std::is_standard_layout_v && std::is_trivial_v); +CHECK_SIZE_ALIGN(DmuxPamfElementaryStream, 0x98, 4); + +struct CellDmuxPamfEsHandle +{ + vm::bptr es; + + DmuxCb notify_au_found; + DmuxCb notify_flush_done; +}; + +CHECK_SIZE(CellDmuxPamfEsHandle, 0x14); diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index f20b6be6cb..f46f3bdafa 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -64,7 +64,7 @@ extern const std::map g_prx_list { "libddpdec.sprx", 0 }, { "libdivxdec.sprx", 0 }, { "libdmux.sprx", 0 }, - { "libdmuxpamf.sprx", 0 }, + { "libdmuxpamf.sprx", 1 }, { "libdtslbrdec.sprx", 0 }, { "libfiber.sprx", 0 }, { "libfont.sprx", 0 }, From f2aa3476089378da9f5b5f3d61237455f397bde6 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 27 Sep 2025 17:14:17 +0200 Subject: [PATCH 361/630] cellDmuxPamf: review fixes + improvements --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 23 ++++++++++++----------- rpcs3/Emu/Cell/Modules/cellDmuxPamf.h | 4 +++- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index cc2fd6af42..19d85c4fb1 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -1295,7 +1295,7 @@ void DmuxPamfContext::exec(ppu_thread& ppu) case dmux_pamf_state::setting_au_reset_error: goto label10_setting_au_reset_error_state; case dmux_pamf_state::processing_event: goto label11_processing_event_state; case dmux_pamf_state::au_found_waiting_for_spu: goto label12_au_found_waiting_for_spu_state; - case dmux_pamf_state::unsetting_au_cancel: goto label13_unsetting_au_cancel_state; + case dmux_pamf_state::unsetting_au_reset: goto label13_unsetting_au_reset_state; case dmux_pamf_state::demux_done_notifying: goto label14_demux_done_notifying_state; case dmux_pamf_state::demux_done_mutex_lock: goto label15_demux_done_mutex_lock_state; case dmux_pamf_state::demux_done_cond_signal: goto label16_demux_done_cond_signal_state; @@ -1477,14 +1477,11 @@ void DmuxPamfContext::exec(ppu_thread& ppu) au_info->specific_info_size = es->au_specific_info_size; au_info->is_rap = static_cast(event.au_found.is_rap); - if (!is_raw_es) + if (!is_raw_es && dmuxPamfStreamIdToTypeChannel(event.au_found.stream_id, event.au_found.private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_LPCM) { - if (dmuxPamfStreamIdToTypeChannel(event.au_found.stream_id, event.au_found.private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_LPCM) - { - es->au_specific_info[0] = read_from_ptr(event.au_found.stream_header_buf) >> 4; - es->au_specific_info[1] = read_from_ptr(event.au_found.stream_header_buf) & 0xf; - es->au_specific_info[2] = read_from_ptr(&event.au_found.stream_header_buf[1]) >> 6; - } + es->au_specific_info[0] = read_from_ptr(event.au_found.stream_header_buf) >> 4; + es->au_specific_info[1] = read_from_ptr(event.au_found.stream_header_buf) & 0xf; + es->au_specific_info[2] = read_from_ptr(&event.au_found.stream_header_buf[1]) >> 6; } if (sys_mutex_unlock(ppu, mutex) != CELL_OK) @@ -1509,8 +1506,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { stream_reset_in_progress = false; - savestate = dmux_pamf_state::unsetting_au_cancel; - label13_unsetting_au_cancel_state: + savestate = dmux_pamf_state::unsetting_au_reset; + label13_unsetting_au_reset_state: if (set_au_reset(ppu) != CELL_OK) { @@ -1763,7 +1760,7 @@ u32 dmuxPamfGetAuQueueMaxSize(u16 stream_id, u16 private_stream_id) u32 dmuxPamfGetLpcmAuSize(vm::cptr lpcm_info) { - return lpcm_info->samplingFreq * lpcm_info->bitsPerSample * (lpcm_info->numOfChannels + (lpcm_info->numOfChannels & 1)) / 1600; // Streams with an odd number of channels contain an empty dummy channel + return lpcm_info->samplingFreq * lpcm_info->bitsPerSample / CHAR_BIT * (lpcm_info->numOfChannels + (lpcm_info->numOfChannels & 1)) / DMUX_PAMF_LPCM_FRAMES_PER_SEC; // Streams with an odd number of channels contain an empty dummy channel } u32 dmuxPamfGetAuQueueBufferSize(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info) @@ -2014,6 +2011,8 @@ error_code _CellDmuxCoreOpOpen(ppu_thread& ppu, vm::cptrmemAddr.aligned(0x10)); // Not checked on LLE + ensure(demuxerResource->memSize >= sizeof(CellDmuxPamfHandle)); // Not checked on LLE + ensure(vm::check_addr(demuxerResource->memAddr.addr(), vm::page_readable | vm::page_writable, demuxerResource->memSize)); const auto _handle = vm::static_ptr_cast(demuxerResource->memAddr); @@ -2547,6 +2546,8 @@ error_code _CellDmuxCoreOpEnableEs(ppu_thread& ppu, vm::ptr } ensure(!!esHandle && esResource->memAddr.aligned(0x10)); // Not checked on LLE + ensure(esResource->memSize >= sizeof(CellDmuxPamfEsHandle)); // Not checked on LLE + ensure(vm::check_addr(esResource->memAddr.addr(), vm::page_readable | vm::page_writable, esResource->memSize)); const auto es_handle = vm::static_ptr_cast(esResource->memAddr); diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h index dea9fef073..e04b618785 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h @@ -783,6 +783,8 @@ enum CellDmuxPamfLpcmBitsPerSamples CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_24 = 3, }; +constexpr u8 DMUX_PAMF_LPCM_FRAMES_PER_SEC = 200; + struct CellDmuxPamfSpecificInfo { be_t thisSize; @@ -832,7 +834,7 @@ enum class dmux_pamf_state : u8 setting_au_reset_error, processing_event, au_found_waiting_for_spu, - unsetting_au_cancel, + unsetting_au_reset, demux_done_notifying, demux_done_mutex_lock, demux_done_cond_signal, From 4d6da6542e48eaaaef136c94364ccf8df51ba798 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:16:39 +0100 Subject: [PATCH 362/630] tests: enable cellDmuxPamf tests in CMakeLists --- rpcs3/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 41597127b8..2aa8120752 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -195,6 +195,7 @@ if(BUILD_RPCS3_TESTS) tests/test_address_range.cpp tests/test_rsx_cfg.cpp tests/test_rsx_fp_asm.cpp + tests/test_dmux_pamf.cpp ) target_link_libraries(rpcs3_test @@ -202,6 +203,7 @@ if(BUILD_RPCS3_TESTS) rpcs3_lib rpcs3_emu GTest::gtest + GTest::gmock ) target_include_directories(rpcs3_test From 3616424b26cae2b06081b0f11dc449555cf42c04 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:22:21 +0100 Subject: [PATCH 363/630] cellDmuxPamf: fix lv2 mutex + cond not being destroyed on close --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 19d85c4fb1..7281b0edf9 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -2048,6 +2048,12 @@ error_code DmuxPamfContext::close(ppu_thread& ppu) ensure(idm::remove(hle_spu_thread_id)); + if (sys_cond_destroy(ppu, cond) != CELL_OK + || sys_mutex_destroy(ppu, mutex) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + return CELL_OK; } From b839d4d1a6de3e21605ea6f25d53c79a4c031b65 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:28:10 +0100 Subject: [PATCH 364/630] cellDmuxPamf: consume guest memory on SPU thread group creation --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 19 ++++++++++++++++--- rpcs3/Emu/Cell/Modules/cellDmuxPamf.h | 3 ++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 7281b0edf9..ba621ac3bd 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/lv2/sys_cond.h" +#include "Emu/Cell/lv2/sys_memory.h" #include "Emu/Cell/lv2/sys_mutex.h" #include "Emu/Cell/lv2/sys_ppu_thread.h" #include "Emu/Cell/lv2/sys_sync.h" @@ -1916,8 +1917,8 @@ error_code _CellDmuxCoreOpQueryAttr(vm::cptr pamfSpeci return CELL_OK; } -error_code DmuxPamfContext::open(ppu_thread& ppu, const CellDmuxPamfResource& res, const DmuxCb& notify_dmux_done, const DmuxCb& notify_prog_end_code, - const DmuxCb& notify_fatal_err, vm::bptr& handle) +error_code DmuxPamfContext::open(ppu_thread& ppu, const CellDmuxPamfResource& res, vm::cptr res_spurs, const DmuxCb& notify_dmux_done, + const DmuxCb& notify_prog_end_code, const DmuxCb& notify_fatal_err, vm::bptr& handle) { if (res.ppuThreadPriority >= 0xc00u || res.ppuThreadStackSize < 0x1000u || res.spuThreadPriority >= 0x100u || res.numOfSpus != 1u || !res.memAddr || res.memSize < sizeof(DmuxPamfContext) + 0xe7b) { @@ -1967,6 +1968,13 @@ error_code DmuxPamfContext::open(ppu_thread& ppu, const CellDmuxPamfResource& re ensure(std::snprintf(_this->spurs_taskset_name, sizeof(_this->spurs_taskset_name), "_libdmux_pamf_%08x", _this.addr()) == 22); + _this->use_existing_spurs = !!res_spurs; + + if (!res_spurs && g_fxo->get().take(0x40000) != 0x40000) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + _this->cmd_queue.init(_this->cmd_queue_buffer); _this->cmd_result_queue.init(_this->cmd_result_queue_buffer); _this->stream_info_queue.init(_this->stream_info_queue_buffer); @@ -2032,7 +2040,7 @@ error_code _CellDmuxCoreOpOpen(ppu_thread& ppu, vm::cptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyProgEndCode))); const auto fatal_err_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyFatalErr))); - const error_code ret = DmuxPamfContext::open(ppu, res, { demux_done_func, _handle }, { prog_end_code_func, _handle }, { fatal_err_func, _handle }, _handle->demuxer); + const error_code ret = DmuxPamfContext::open(ppu, res, demuxerResourceSpurs, { demux_done_func, _handle }, { prog_end_code_func, _handle }, { fatal_err_func, _handle }, _handle->demuxer); *handle = _handle; @@ -2048,6 +2056,11 @@ error_code DmuxPamfContext::close(ppu_thread& ppu) ensure(idm::remove(hle_spu_thread_id)); + if (!use_existing_spurs) + { + g_fxo->get().free(0x40000); + } + if (sys_cond_destroy(ppu, cond) != CELL_OK || sys_mutex_destroy(ppu, mutex) != CELL_OK) { diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h index e04b618785..5b42103ca7 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h @@ -961,7 +961,8 @@ public: void exec(ppu_thread& ppu); - static error_code open(ppu_thread& ppu, const CellDmuxPamfResource& res, const DmuxCb& notify_dmux_done, const DmuxCb& notify_prog_end_code, const DmuxCb& notify_fatal_err, vm::bptr& handle); + static error_code open(ppu_thread& ppu, const CellDmuxPamfResource& res, vm::cptr res_spurs, const DmuxCb& notify_dmux_done, + const DmuxCb& notify_prog_end_code, const DmuxCb& notify_fatal_err, vm::bptr& handle); error_code create_thread(ppu_thread& ppu); error_code close(ppu_thread& ppu); error_code reset_stream(ppu_thread& ppu); From c5f278ed37f7b3bb60ad4b020077c165e680a39c Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 28 Feb 2026 10:59:44 +0100 Subject: [PATCH 365/630] cellDmuxPamf: properly handle streams smaller than 0x800 bytes --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 22 ++++++++++++++-------- rpcs3/tests/test_dmux_pamf.cpp | 8 ++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index ba621ac3bd..99234de01e 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -671,19 +671,19 @@ bool dmux_pamf_base::process_next_pack() case state::initial: { // Search for the next pack start code or prog end code - std::span pack{ static_cast(nullptr), PACK_SIZE }; // This initial value is not used, can't be default constructed + std::span pack; for (;;) { - if (stream->empty()) + if (stream->size() < PACK_STUFFING_LENGTH_OFFSET + sizeof(u8)) { stream.reset(); demux_done_notified = on_demux_done(); return true; } - pack = stream->subspan<0, PACK_SIZE>(); - stream = stream->subspan(); + pack = stream->first(std::min(stream->size(), PACK_SIZE)); + stream = stream->subspan(std::min(stream->size(), PACK_SIZE)); // If the input stream is a raw elementary stream, skip everything MPEG-PS related and go straight to elementary stream parsing if (raw_es) @@ -719,6 +719,14 @@ bool dmux_pamf_base::process_next_pack() // Skip over pack header const u8 pack_stuffing_length = read_from_ptr(pack.subspan()) & 0x7; + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > pack.size()) + { + cellDmuxPamf.error("Invalid pack stuffing length"); + return false; + } + std::span current_pes_packet = pack.subspan(PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length); if (read_from_ptr>(current_pes_packet) >> 8 != PACKET_START_CODE_PREFIX) @@ -785,10 +793,8 @@ bool dmux_pamf_base::process_next_pack() return false; } - // The size of the stream is not checked here because if coming from a pack header, it is guaranteed that there is enough space, - // and if coming from a system header or private stream 2, it was already checked above - const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); - const u8 pes_header_data_length = read_from_ptr(current_pes_packet.begin() + PES_HEADER_DATA_LENGTH_OFFSET) + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8); + const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin(), PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + const u8 pes_header_data_length = read_from_ptr(current_pes_packet.begin(), PES_HEADER_DATA_LENGTH_OFFSET) + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8); // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store if (pes_packet_length > current_pes_packet.size() || pes_packet_length <= pes_header_data_length) diff --git a/rpcs3/tests/test_dmux_pamf.cpp b/rpcs3/tests/test_dmux_pamf.cpp index 40a8a02b32..b6fdbf73b4 100644 --- a/rpcs3/tests/test_dmux_pamf.cpp +++ b/rpcs3/tests/test_dmux_pamf.cpp @@ -228,6 +228,14 @@ INSTANTIATE_TEST_SUITE_P(Instance, DmuxPamfInvalidStream, Values []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x03; pack[0x11c] = 0x00; return pack; }() // PES packet header size too large )); +// Since the "pack stuffing length" field only has a size of three bits, this can only occur if the stream is not a multiple of 0x800 bytes large. +// Like the other invalid streams above, LLE does not check for this +TEST_F(DmuxPamfTest, InvalidPackStuffingLength) +{ + demuxer.set_stream({ AVC_SINGLE_PACK_STREAM.cbegin(), AVC_SINGLE_PACK_STREAM.cbegin() + 0x16 }, false); + EXPECT_FALSE(demuxer.process_next_pack()); +} + // Tests if the program end code is properly detected and the corresponding event is fired TEST_F(DmuxPamfTest, ProgEnd) { From 4828d4d2d6128afad95998ce5056e27c3eda3028 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 28 Feb 2026 16:33:08 +0100 Subject: [PATCH 366/630] cellDmuxPamf: review fixes --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 97 ++++++++++++++----------- 1 file changed, 53 insertions(+), 44 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 99234de01e..f8fd42f4a4 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -308,7 +308,7 @@ u32 dmux_pamf_base::video_stream::parse_stream(std::span stream) // Search for delimiter in cache for (; cache_idx < static_cast(cache.size()); cache_idx++) { - if (const be_t code = read_from_ptr>(buf.data() + cache_idx); + if (const be_t code = read_from_ptr>(buf.data(), cache_idx); (avc && code == AVC_AU_DELIMITER) || (!avc && (code == M2V_PIC_START || code == M2V_SEQUENCE_HEADER || code == M2V_SEQUENCE_END))) { if (current_au.state != access_unit::state::none && (avc || current_au.state != access_unit::state::m2v_sequence)) @@ -438,7 +438,7 @@ u32 dmux_pamf_base::audio_stream::parse_stream(std::span stream) // Search for delimiter in cache for (; cache_idx <= static_cast(cache.size() + std::min(sizeof(u16) - 1, stream.size()) - sizeof(u16)); cache_idx++) { - if (const be_t tmp = read_from_ptr>(buf.data() + cache_idx); current_au.size_info_offset != 0) + if (const be_t tmp = read_from_ptr>(buf.data(), cache_idx); current_au.size_info_offset != 0) { if (--current_au.size_info_offset == 0) { @@ -521,7 +521,7 @@ u32 dmux_pamf_base::user_data_stream::parse_stream_header(std::span pe return umax; } - au_size_unk = read_from_ptr>(pes_packet_data.begin() + 2) - sizeof(u32); + au_size_unk = read_from_ptr>(pes_packet_data.begin(), 2) - sizeof(u32); return 10; } @@ -718,7 +718,7 @@ bool dmux_pamf_base::process_next_pack() } // Skip over pack header - const u8 pack_stuffing_length = read_from_ptr(pack.subspan()) & 0x7; + const u8 pack_stuffing_length = read_from_ptr>(pack, PACK_STUFFING_LENGTH_OFFSET); // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store if (PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > pack.size()) @@ -729,7 +729,7 @@ bool dmux_pamf_base::process_next_pack() std::span current_pes_packet = pack.subspan(PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length); - if (read_from_ptr>(current_pes_packet) >> 8 != PACKET_START_CODE_PREFIX) + if (read_from_ptr, 8, 24>>(current_pes_packet) != PACKET_START_CODE_PREFIX) { cellDmuxPamf.error("Invalid start code after pack header"); return false; @@ -738,7 +738,7 @@ bool dmux_pamf_base::process_next_pack() // Skip over system header if present if (read_from_ptr>(current_pes_packet) == SYSTEM_HEADER) { - const u32 system_header_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + const u32 system_header_length = read_from_ptr>(current_pes_packet.begin(), PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store if (system_header_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > current_pes_packet.size()) @@ -763,7 +763,7 @@ bool dmux_pamf_base::process_next_pack() // A system header is optionally followed by a private stream 2 // The first two bytes of the stream are the stream id of a video stream. The next access unit of that stream is a random access point/keyframe - const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin(), PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store if (pes_packet_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > current_pes_packet.size()) @@ -772,7 +772,7 @@ bool dmux_pamf_base::process_next_pack() return false; } - if (const u8 channel = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET + sizeof(u16)) & 0xf; + if (const u8 channel = read_from_ptr>(current_pes_packet.begin(), PES_PACKET_LENGTH_OFFSET + sizeof(u16)) & 0xf; elementary_stream::is_enabled(elementary_streams[0][channel])) { elementary_streams[0][channel]->set_rap(); @@ -818,23 +818,23 @@ bool dmux_pamf_base::process_next_pack() if (elementary_stream::is_enabled(elementary_streams[type_idx][channel])) { - const s8 pts_dts_flag = read_from_ptr(current_pes_packet.begin() + PTS_DTS_FLAG_OFFSET); + const s8 pts_dts_flag = read_from_ptr(current_pes_packet.begin(), PTS_DTS_FLAG_OFFSET); if (pts_dts_flag < 0) { // The timestamps should be unsigned, but are sign-extended from s32 to u64 on LLE. They probably forgot about integer promotion - const s32 PTS_32_30 = read_from_ptr(current_pes_packet.begin() + 9) >> 1; - const s32 PTS_29_15 = read_from_ptr>(current_pes_packet.begin() + 10) >> 1; - const s32 PTS_14_0 = read_from_ptr>(current_pes_packet.begin() + 12) >> 1; + const s32 PTS_32_30 = read_from_ptr>(current_pes_packet.begin(), 9); + const s32 PTS_29_15 = read_from_ptr, 1, 15>>(current_pes_packet.begin(), 10); + const s32 PTS_14_0 = read_from_ptr, 1, 15>>(current_pes_packet.begin(), 12); elementary_streams[type_idx][channel]->set_pts(PTS_32_30 << 30 | PTS_29_15 << 15 | PTS_14_0); // Bit 32 is discarded } if (pts_dts_flag & 0x40) { - const s32 DTS_32_30 = read_from_ptr(current_pes_packet.begin() + 14) >> 1; - const s32 DTS_29_15 = read_from_ptr>(current_pes_packet.begin() + 15) >> 1; - const s32 DTS_14_0 = read_from_ptr>(current_pes_packet.begin() + 17) >> 1; + const s32 DTS_32_30 = read_from_ptr>(current_pes_packet.begin(), 14); + const s32 DTS_29_15 = read_from_ptr, 1, 15>>(current_pes_packet.begin(), 15); + const s32 DTS_14_0 = read_from_ptr, 1, 15>>(current_pes_packet.begin(), 17); elementary_streams[type_idx][channel]->set_dts(DTS_32_30 << 30 | DTS_29_15 << 15 | DTS_14_0); // Bit 32 is discarded } @@ -1273,16 +1273,7 @@ void DmuxPamfContext::run_spu_thread() void DmuxPamfContext::exec(ppu_thread& ppu) { - // These are repeated a lot in this function, in my opinion using defines here makes it more readable -#define SEND_FATAL_ERR_AND_CONTINUE()\ - savestate = dmux_pamf_state::sending_fatal_err;\ - callback(ppu, notify_fatal_err, _this, CELL_OK); /* LLE uses CELL_OK as error code */\ - if (ppu.state & cpu_flag::again)\ - {\ - return;\ - }\ - continue - + // This is repeated a lot in this function, in my opinion using a define here makes it more readable #define RETURN_ON_CPU_FLAG_AGAIN()\ if (ppu.state & cpu_flag::again)\ return @@ -1308,13 +1299,17 @@ void DmuxPamfContext::exec(ppu_thread& ppu) case dmux_pamf_state::demux_done_cond_signal: goto label16_demux_done_cond_signal_state; case dmux_pamf_state::resuming_demux_mutex_lock: goto label17_resuming_demux_mutex_lock_state; case dmux_pamf_state::resuming_demux_waiting_for_spu: goto label18_resuming_demux_waiting_for_spu_state; - case dmux_pamf_state::sending_fatal_err: - callback(ppu, notify_fatal_err, _this, CELL_OK); - RETURN_ON_CPU_FLAG_AGAIN(); + case dmux_pamf_state::sending_fatal_err: ; // Handled below } for (;;) { + if (savestate == dmux_pamf_state::sending_fatal_err) + { + callback(ppu, notify_fatal_err, _this, CELL_OK); + RETURN_ON_CPU_FLAG_AGAIN(); + } + savestate = dmux_pamf_state::initial; stream_reset_started = false; @@ -1427,7 +1422,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1441,7 +1437,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } break; @@ -1468,7 +1465,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } break; @@ -1486,14 +1484,15 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (!is_raw_es && dmuxPamfStreamIdToTypeChannel(event.au_found.stream_id, event.au_found.private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_LPCM) { - es->au_specific_info[0] = read_from_ptr(event.au_found.stream_header_buf) >> 4; - es->au_specific_info[1] = read_from_ptr(event.au_found.stream_header_buf) & 0xf; - es->au_specific_info[2] = read_from_ptr(&event.au_found.stream_header_buf[1]) >> 6; + es->au_specific_info[0] = read_from_ptr>(event.au_found.stream_header_buf); + es->au_specific_info[1] = read_from_ptr>(event.au_found.stream_header_buf); + es->au_specific_info[2] = read_from_ptr>(event.au_found.stream_header_buf, 1); } if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } if (callback(ppu, es->notify_au_found, es->_this, au_info) != CELL_OK) @@ -1518,7 +1517,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (set_au_reset(ppu) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1536,7 +1536,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1551,7 +1552,9 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_cond_signal_all(ppu, cond) != CELL_OK) { sys_mutex_unlock(ppu, mutex); - SEND_FATAL_ERR_AND_CONTINUE(); + + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1559,7 +1562,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } break; @@ -1573,7 +1577,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1583,7 +1588,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } if (valid) @@ -1607,7 +1613,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { ensure(event_queue.pop()); - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } default: fmt::throw_exception("Invalid event"); @@ -1624,7 +1631,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1650,7 +1658,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } } From 2573cc5fd08a2d5e4b38768ae1c69779397d70b4 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 7 Mar 2026 16:30:38 +0100 Subject: [PATCH 367/630] cellDmuxPamf: fix stream cache not being consumed in some cases --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index f8fd42f4a4..91ee7e2426 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -354,9 +354,10 @@ u32 dmux_pamf_base::video_stream::parse_stream(std::span stream) { au_chunk.data = { au_chunk_begin, stream_it }; std::copy_n(cache.begin(), cache_idx, std::back_inserter(au_chunk.cached_data)); - cache.erase(cache.begin(), cache.begin() + cache_idx); } + cache.erase(cache.begin(), cache.begin() + cache_idx); + // Cache the end of the stream if an access unit wasn't completed. There could be the beginning of a delimiter in the last three bytes if (current_au.state != access_unit::state::complete) { @@ -499,9 +500,10 @@ u32 dmux_pamf_base::audio_stream::parse_stream(std::span stream) { au_chunk.data = { au_chunk_begin, stream_it }; std::copy_n(cache.begin(), cache_idx, std::back_inserter(au_chunk.cached_data)); - cache.erase(cache.begin(), cache.begin() + cache_idx); } + cache.erase(cache.begin(), cache.begin() + cache_idx); + // Cache the end of the stream if an access unit wasn't completed. There could be the beginning of a delimiter in the last three bytes if (current_au.state != access_unit::state::complete && current_au.state != access_unit::state::size_mismatch) { From 43b295892ff7c10316bf12f6368026731f071d49 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 6 Mar 2026 20:41:02 +0100 Subject: [PATCH 368/630] PPUAnalyzer: Fix SLDI shift operand --- rpcs3/Emu/Cell/PPUAnalyser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/PPUAnalyser.cpp b/rpcs3/Emu/Cell/PPUAnalyser.cpp index 56d4398d09..783ed9e477 100644 --- a/rpcs3/Emu/Cell/PPUAnalyser.cpp +++ b/rpcs3/Emu/Cell/PPUAnalyser.cpp @@ -2535,7 +2535,7 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con // SLDI mnemonic reg_state_t rs = get_reg(op.rs); - if (!rs.shift_left(op.sh32, reg_tag_allocator)) + if (!rs.shift_left(sh, reg_tag_allocator)) { unmap_reg(op.ra); } From c38bf70464f3784d3278471c9836912bb05a70e1 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 8 Mar 2026 13:54:25 +0100 Subject: [PATCH 369/630] cellCamera: improve error logging --- rpcs3/Emu/Cell/Modules/cellCamera.cpp | 10 +++++----- rpcs3/Emu/Cell/lv2/sys_gamepad.cpp | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellCamera.cpp b/rpcs3/Emu/Cell/Modules/cellCamera.cpp index 096f9330f4..10f9a89cf0 100644 --- a/rpcs3/Emu/Cell/Modules/cellCamera.cpp +++ b/rpcs3/Emu/Cell/Modules/cellCamera.cpp @@ -919,7 +919,7 @@ error_code cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr arg1, vm if (!check_dev_num(dev_num)) { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "dev_num=%d", dev_num }; } if (g_cfg.io.camera == camera_handler::null) @@ -935,7 +935,7 @@ error_code cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr arg1, vm if (!arg1) { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "arg1=null" }; } if (error_code error = check_resolution(dev_num)) @@ -952,7 +952,7 @@ error_code cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr arg1, vm if (!attr_name) // invalid attributes don't have a name { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "attrib=0x%x", attrib }; } if (arg1) @@ -983,7 +983,7 @@ error_code cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2) if (!check_dev_num(dev_num)) { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "dev_num=%d", dev_num }; } if (g_cfg.io.camera == camera_handler::null) @@ -1004,7 +1004,7 @@ error_code cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2) if (!attr_name) // invalid attributes don't have a name { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "attrib=0x%x", attrib }; } g_camera.set_attr(attrib, arg1, arg2); diff --git a/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp b/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp index 26ffbc2696..55fd7cb885 100644 --- a/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp @@ -67,7 +67,6 @@ u32 sys_gamepad_ycon_is_gem(vm::ptr in, vm::ptr out) // syscall(621,packet_id,u8 *in,u8 *out) Talk:LV2_Functions_and_Syscalls#Syscall_621_.280x26D.29 gamepad_if usage u32 sys_gamepad_ycon_if(u8 packet_id, vm::ptr in, vm::ptr out) { - switch (packet_id) { case 0: From eeda9c7738b729f8ef282e831a484f9cd958c1c1 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 8 Mar 2026 13:56:49 +0100 Subject: [PATCH 370/630] cellGem: improve quaternion rotation rotate_vector caused wrong results for default_orientation and 0,0,x --- rpcs3/Emu/Io/ps_move_data.cpp | 46 +++++++++++++++++------------------ rpcs3/Emu/Io/ps_move_data.h | 23 ++++++++++++++++++ 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/rpcs3/Emu/Io/ps_move_data.cpp b/rpcs3/Emu/Io/ps_move_data.cpp index 0a167eed39..bf35f26a19 100644 --- a/rpcs3/Emu/Io/ps_move_data.cpp +++ b/rpcs3/Emu/Io/ps_move_data.cpp @@ -24,34 +24,34 @@ void ps_move_data::reset_sensors() angaccel_world = {}; } +ps_move_data::vect<3> ps_move_data::rotate_vector(const vect<4>& q, const vect<3>& v) +{ + const auto cross = [](const vect<3>& a, const vect<3>& b) + { + return vect<3>({ + a.y() * b.z() - a.z() * b.y(), + a.z() * b.x() - a.x() * b.z(), + a.x() * b.y() - a.y() * b.x() + }); + }; + + // q = (x, y, z, w) + const vect<3> q_vec({q.x(), q.y(), q.z()}); + + // t = 2 * cross(q_vec, v) + const vect<3> t = cross(q_vec, v) * 2.0f; + + // v' = v + w * t + cross(q_vec, t) + const vect<3> v_prime = v + t * q.w() + cross(q_vec, t); + + return v_prime; +} + void ps_move_data::update_orientation(f32 delta_time) { if (!delta_time) return; - // Rotate vector v by quaternion q - const auto rotate_vector = [](const vect<4>& q, const vect<3>& v) - { - const vect<4> qv({0.0f, v.x(), v.y(), v.z()}); - const vect<4> q_inv({q.w(), -q.x(), -q.y(), -q.z()}); - - // t = q * v - vect<4> t; - t.w() = -q.x() * qv.x() - q.y() * qv.y() - q.z() * qv.z(); - t.x() = q.w() * qv.x() + q.y() * qv.z() - q.z() * qv.y(); - t.y() = q.w() * qv.y() - q.x() * qv.z() + q.z() * qv.x(); - t.z() = q.w() * qv.z() + q.x() * qv.y() - q.y() * qv.x(); - - // r = t * q_inv - vect<4> r; - r.w() = -t.x() * q_inv.x() - t.y() * q_inv.y() - t.z() * q_inv.z(); - r.x() = t.w() * q_inv.x() + t.y() * q_inv.z() - t.z() * q_inv.y(); - r.y() = t.w() * q_inv.y() - t.x() * q_inv.z() + t.z() * q_inv.x(); - r.z() = t.w() * q_inv.z() + t.x() * q_inv.y() - t.y() * q_inv.x(); - - return vect<3>({r.x(), r.y(), r.z()}); - }; - if constexpr (use_imu_for_velocity) { // Gravity in world frame diff --git a/rpcs3/Emu/Io/ps_move_data.h b/rpcs3/Emu/Io/ps_move_data.h index 1ae30f5c66..2470e47e8c 100644 --- a/rpcs3/Emu/Io/ps_move_data.h +++ b/rpcs3/Emu/Io/ps_move_data.h @@ -15,6 +15,26 @@ struct ps_move_data template const T& operator[](I i) const { return data[i]; } + vect operator*(f32 s) const + { + vect result = *this; + for (int i = 0; i < Size; ++i) + { + result[i] *= s; + } + return result; + } + + vect operator+(const vect& other) const + { + vect result = *this; + for (int i = 0; i < Size; ++i) + { + result[i] += other[i]; + } + return result; + } + T x() const requires (Size >= 1) { return data[0]; } T y() const requires (Size >= 2) { return data[1]; } T z() const requires (Size >= 3) { return data[2]; } @@ -72,4 +92,7 @@ struct ps_move_data void reset_sensors(); void update_orientation(f32 delta_time); void update_velocity(u64 timestamp, be_t pos_world[4]); + + // Rotate vector v by quaternion q + static vect<3> rotate_vector(const vect<4>& q, const vect<3>& v); }; From 41db06b53f906fbe2941552008ea8b468fa38482 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 8 Mar 2026 14:00:57 +0100 Subject: [PATCH 371/630] cellGem: fix handle_pos calculation The handle position depends on the sphere position and the orientation --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 49 ++++++++++++++++-------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 1a1e8a7d04..f87b4349a1 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -1883,21 +1883,10 @@ static inline void pos_to_gem_state(u32 gem_num, gem_config::gem_controller& con gem_state->pos[2] = controller.distance_mm; gem_state->pos[3] = 0.f; - // TODO: calculate handle position based on our world coordinate and the angles - gem_state->handle_pos[0] = camera_x; - gem_state->handle_pos[1] = camera_y; - gem_state->handle_pos[2] = controller.distance_mm + 10.0f; - gem_state->handle_pos[3] = 0.f; - // Calculate orientation - if (g_cfg.io.move == move_handler::real || (g_cfg.io.move == move_handler::fake && move_data.orientation_enabled)) - { - gem_state->quat[0] = move_data.quaternion.x(); - gem_state->quat[1] = move_data.quaternion.y(); - gem_state->quat[2] = move_data.quaternion.z(); - gem_state->quat[3] = move_data.quaternion.w(); - } - else + ps_move_data::vect<4> quat = move_data.quaternion; + + if (g_cfg.io.move != move_handler::real && !(g_cfg.io.move == move_handler::fake && move_data.orientation_enabled)) { const f32 max_angle_per_side_h = g_cfg.io.fake_move_rotation_cone_h / 2.0f; const f32 max_angle_per_side_v = g_cfg.io.fake_move_rotation_cone_v / 2.0f; @@ -1911,17 +1900,27 @@ static inline void pos_to_gem_state(u32 gem_num, gem_config::gem_controller& con const f32 cy = std::cos(yaw * 0.5f); const f32 sy = std::sin(yaw * 0.5f); - const f32 q_x = sr * cp * cy - cr * sp * sy; - const f32 q_y = cr * sp * cy + sr * cp * sy; - const f32 q_z = cr * cp * sy - sr * sp * cy; - const f32 q_w = cr * cp * cy + sr * sp * sy; - - gem_state->quat[0] = q_x; - gem_state->quat[1] = q_y; - gem_state->quat[2] = q_z; - gem_state->quat[3] = q_w; + quat.x() = sr * cp * cy - cr * sp * sy; + quat.y() = cr * sp * cy + sr * cp * sy; + quat.z() = cr * cp * sy - sr * sp * cy; + quat.w() = cr * cp * cy + sr * sp * sy; } + gem_state->quat[0] = quat.x(); + gem_state->quat[1] = quat.y(); + gem_state->quat[2] = quat.z(); + gem_state->quat[3] = quat.w(); + + // Calculate handle position based on our world coordinate and the current orientation + constexpr ps_move_data::vect<3> offset_local_mm({0.f, 0.f, -45.f}); // handle is ~45 mm below sphere + const ps_move_data::vect<3> offset_world = ps_move_data::rotate_vector(quat, offset_local_mm); + + gem_state->handle_pos[0] = gem_state->pos[0] - offset_world.x(); // Flip x offset + gem_state->handle_pos[1] = gem_state->pos[1] - offset_world.y(); // Flip y offset + gem_state->handle_pos[2] = gem_state->pos[2] + offset_world.z(); + gem_state->handle_pos[3] = 0.f; + + // Calculate velocity if constexpr (!ps_move_data::use_imu_for_velocity) { move_data.update_velocity(shared_data.frame_timestamp_us, gem_state->pos); @@ -1930,6 +1929,10 @@ static inline void pos_to_gem_state(u32 gem_num, gem_config::gem_controller& con { gem_state->vel[i] = move_data.vel_world[i]; gem_state->accel[i] = move_data.accel_world[i]; + + // TODO: maybe this also needs to be adjusted depending on the orientation + gem_state->handle_vel[i] = gem_state->vel[i]; + gem_state->handle_accel[i] = gem_state->accel[i]; } } From 77cbdd82ab02d64bfe95048fcf8be3afd968bcc5 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Mon, 9 Mar 2026 04:27:50 +0100 Subject: [PATCH 372/630] LLVM 22 fixups From https://releases.llvm.org/22.1.0/docs/ReleaseNotes.html: The alignment argument of the @llvm.masked.load, @llvm.masked.store, @llvm.masked.gather and @llvm.masked.scatter intrinsics has been removed. Instead, the align attribute should be placed on the pointer (or vector of pointers) argument. They also changed(not in changelog for some reason): vpdpbusd_128: [v4i32] -> [v4i32, v4i32, v4i32] to vpdpbusd_128: [v4i32] -> [v4i32, v16i8, v16i8] --- rpcs3/Emu/CPU/CPUTranslator.h | 7 +++++++ rpcs3/Emu/Cell/PPUTranslator.cpp | 8 ++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index 99ddafde0a..27abb22219 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -3647,7 +3647,14 @@ public: const auto data0 = a.eval(m_ir); const auto data1 = b.eval(m_ir); const auto data2 = c.eval(m_ir); + +#if LLVM_VERSION_MAJOR >= 22 + // LLVM 22+ changed the intrinsic signature from v4i32 to v16i8 for operands 2 and 3 + result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::x86_avx512_vpdpbusd_128), + {data0, m_ir->CreateBitCast(data1, get_type()), m_ir->CreateBitCast(data2, get_type())}); +#else result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::x86_avx512_vpdpbusd_128), {data0, data1, data2}); +#endif return result; } diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index ddf7d330a0..b12cd9c55d 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -3681,9 +3681,7 @@ void PPUTranslator::STVLX(ppu_opcode_t op) const auto addr = op.ra ? m_ir->CreateAdd(GetGpr(op.ra), GetGpr(op.rb)) : GetGpr(op.rb); const auto data = pshufb(get_vr(op.vs), build(127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112) + vsplat(trunc(value(addr) & 0xf))); const auto mask = bitcast(splat(0xffff) << trunc(value(addr) & 0xf)); - const auto ptr = value(GetMemory(m_ir->CreateAnd(addr, ~0xfull))); - const auto align = splat(16); - eval(llvm_calli{"llvm.masked.store.v16i8.p0", {data, ptr, align, mask}}); + m_ir->CreateMaskedStore(data.eval(m_ir), GetMemory(m_ir->CreateAnd(addr, ~0xfull)), llvm::Align(16), mask.eval(m_ir)); } void PPUTranslator::STDBRX(ppu_opcode_t op) @@ -3711,9 +3709,7 @@ void PPUTranslator::STVRX(ppu_opcode_t op) const auto addr = op.ra ? m_ir->CreateAdd(GetGpr(op.ra), GetGpr(op.rb)) : GetGpr(op.rb); const auto data = pshufb(get_vr(op.vs), build(255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240) + vsplat(trunc(value(addr) & 0xf))); const auto mask = bitcast(trunc(splat(0xffff) << (value(addr) & 0xf) >> 16)); - const auto ptr = value(GetMemory(m_ir->CreateAnd(addr, ~0xfull))); - const auto align = splat(16); - eval(llvm_calli{"llvm.masked.store.v16i8.p0", {data, ptr, align, mask}}); + m_ir->CreateMaskedStore(data.eval(m_ir), GetMemory(m_ir->CreateAnd(addr, ~0xfull)), llvm::Align(16), mask.eval(m_ir)); } void PPUTranslator::STFSUX(ppu_opcode_t op) From 302e87c920038bae1d35f631b7c3bb8ec909379a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 21 Feb 2026 21:20:11 +0300 Subject: [PATCH 373/630] rsx/vk: Improve robustness when encountering corrupted shaders --- .../Emu/RSX/Program/FragmentProgramDecompiler.cpp | 3 +++ rpcs3/Emu/RSX/VK/VKDraw.cpp | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index c00cef47e6..8f134ebfae 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -868,8 +868,11 @@ std::string FragmentProgramDecompiler::BuildCode() if (!m_is_valid_ucode) { // If the code is broken, do not compile. Simply NOP main and write empty outputs + m_parr.params[PF_PARAM_UNIFORM].clear(); insertHeader(OS); OS << "\n"; + insertConstants(OS); + OS << "\n"; OS << "void main()\n"; OS << "{\n"; OS << "#if 0\n"; diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 634131b13b..b18ebaed3a 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -635,9 +635,16 @@ bool VKGSRender::bind_texture_env() { if (!(textures_ref & 1)) { + // Unused TIU continue; } + if (m_fs_binding_table->ftex_location[i] == umax) + { + // Corrupt shader table + break; + } + vk::image_view* view = nullptr; auto sampler_state = static_cast(fs_sampler_state[i].get()); @@ -707,9 +714,16 @@ bool VKGSRender::bind_texture_env() { if (!(textures_ref & 1)) { + // Unused TIU continue; } + if (m_vs_binding_table->vtex_location[i] == umax) + { + // Corrupt shader + break; + } + if (!rsx::method_registers.vertex_textures[i].enabled()) { const auto view_type = vk::get_view_type(current_vertex_program.get_texture_dimension(i)); From 5f6822042dff8f9324efa6e4775944329d461739 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 04:10:29 +0300 Subject: [PATCH 374/630] gl: Silence warnings --- rpcs3/Emu/RSX/GL/glutils/common.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/common.h b/rpcs3/Emu/RSX/GL/glutils/common.h index a147a6e754..24e62a9189 100644 --- a/rpcs3/Emu/RSX/GL/glutils/common.h +++ b/rpcs3/Emu/RSX/GL/glutils/common.h @@ -87,7 +87,7 @@ namespace gl void set_name(std::string_view name) { m_name = name.data(); - glObjectLabel(Ns, m_id, name.length(), name.data()); + glObjectLabel(Ns, m_id, static_cast(name.length()), name.data()); } std::string_view name() const @@ -97,9 +97,9 @@ namespace gl }; // Very useful util when capturing traces with RenderDoc - static inline void push_debug_label(const char* label) + static inline void push_debug_label(std::string_view label) { - glInsertEventMarkerEXT(static_cast(strlen(label)), label); + glInsertEventMarkerEXT(static_cast(label.size()), label.data()); } // Checks if GL state is still valid From 65320446f019281ed44d240f86b9b9771b2e7e83 Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 9 Mar 2026 11:34:07 +0100 Subject: [PATCH 375/630] vk: Add 0x13C0 NAVI2 device ID (Raphael Mendocino) This is the iGPU on 9800X3D --- rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp b/rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp index de9bf8a124..fd98fe1ca0 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp @@ -28,6 +28,7 @@ namespace vk table.add(0x7420, 0x743F, chip_class::AMD_navi2x); // Navi 24 (Beige Goby) table.add(0x163F, chip_class::AMD_navi2x); // Navi 2X (Van Gogh) table.add(0x164D, 0x1681, chip_class::AMD_navi2x); // Navi 2X (Yellow Carp) + table.add(0x13C0, chip_class::AMD_navi2x); // Navi 2X (Raphael Mendocino) table.add(0x7440, 0x745F, chip_class::AMD_navi3x); // Navi 31 (Only 744c, NAVI31XTX is confirmed) table.add(0x7460, 0x747F, chip_class::AMD_navi3x); // Navi 32 (Unverified) table.add(0x7480, 0x749F, chip_class::AMD_navi3x); // Navi 33 (Unverified) From e0a0d736c4df546cdf250f534d5b912f239134ae Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 01:45:05 +0100 Subject: [PATCH 376/630] cellGem: remove redundant check --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index f87b4349a1..2ed6d8911d 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -1609,12 +1609,6 @@ public: return false; } - if (!m_camera_info.bytesize) - { - cellGem.error("gem_tracker: unexpected image size: %d", m_camera_info.bytesize); - return false; - } - m_tracker.set_image_data(m_camera_info.buffer.get_ptr(), m_camera_info.bytesize, m_camera_info.width, m_camera_info.height, m_camera_info.format); m_framenumber++; // using framenumber instead of timestamp since the timestamp could be identical return true; From 0f92ea2578a48ee21aff2430be2d28baefde8c48 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 01:50:56 +0100 Subject: [PATCH 377/630] cellGem: fix memcpy in cellGemReadExternalPortDeviceInfo It was copying from dst to src, and the wrong size at that --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 2ed6d8911d..11cc18e547 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -3619,7 +3619,7 @@ error_code cellGemReadExternalPortDeviceInfo(u32 gem_num, vm::ptr ext_id, v if (!pad->move_data.external_device_read_requested) { *ext_id = controller.ext_id = pad->move_data.external_device_id; - std::memcpy(pad->move_data.external_device_read.data(), ext_info.get_ptr(), CELL_GEM_EXTERNAL_PORT_OUTPUT_SIZE); + std::memcpy(ext_info.get_ptr(), pad->move_data.external_device_read.data(), CELL_GEM_EXTERNAL_PORT_DEVICE_INFO_SIZE); break; } } From 763001ee91c515fc77c050258bba383acb75f25e Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 01:53:51 +0100 Subject: [PATCH 378/630] cellGem: fix gain channels --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 11cc18e547..9731474b51 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -770,8 +770,8 @@ namespace gem if constexpr (use_gain) { dst0[0] = static_cast(std::clamp(r * gain_r, 0.0f, 255.0f)); - dst0[1] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); - dst0[2] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[1] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[2] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); } else { @@ -822,8 +822,8 @@ namespace gem if constexpr (use_gain) { dst0[0] = static_cast(std::clamp(r * gain_r, 0.0f, 255.0f)); - dst0[1] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); - dst0[2] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[1] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[2] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); } else { @@ -881,9 +881,9 @@ namespace gem const u8* src_data = video_data_in.data(); const u8 alpha = vc.alpha; - const f32 gain_r = vc.gain * vc.blue_gain; + const f32 gain_r = vc.gain * vc.red_gain; const f32 gain_g = vc.gain * vc.green_gain; - const f32 gain_b = vc.gain * vc.red_gain; + const f32 gain_b = vc.gain * vc.blue_gain; // Only RAW8 should be relevant for cellGem unless I'm mistaken if (input_format == CELL_CAMERA_RAW8) From 71f0d5c60233494e7fe2c3f2ff416a00c87480fb Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 03:38:24 +0100 Subject: [PATCH 379/630] cellGem: fix RAW8 to RGBA_320x240 We were basically writing two rows into dst for each other src line. This means we were writing 480 lines in total instead of 240, overwriting one of the lines written in the previous iteration. This led to writing one line out of bounds last iteration. Let's just use a simple debayer technique which perfectly matches here. This also applies the previously missing gain factors. I also tried to first demosaic and then drop every other pixel. The result was comparatively blurred and the performance worse. --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 76 +++++++++++++++++++----------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 9731474b51..d45dace1ca 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -845,6 +845,53 @@ namespace gem debayer_raw8_impl(src, dst, alpha, gain_r, gain_g, gain_b); } + template + static inline void debayer_raw8_downscale_impl(const u8* src, u8* dst, u8 alpha, f32 gain_r, f32 gain_g, f32 gain_b) + { + constexpr u32 in_pitch = 640; + constexpr u32 out_pitch = 320 * 4; + + // Simple debayer + for (s32 y = 0; y < 240; y++) + { + const u8* src0 = src + y * 2 * in_pitch; + const u8* src1 = src0 + in_pitch; + + u8* dst0 = dst + y * out_pitch; + + for (s32 x = 0; x < 320; x++, dst0 += 4, src0 += 2, src1 += 2) + { + const u8 b = src0[0]; + const u8 g0 = src0[1]; + const u8 g1 = src1[0]; + const u8 r = src1[1]; + const u8 g = (g0 + g1) >> 1; + + if constexpr (use_gain) + { + dst0[0] = static_cast(std::clamp(r * gain_r, 0.0f, 255.0f)); + dst0[1] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[2] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); + } + else + { + dst0[0] = r; + dst0[1] = g; + dst0[2] = b; + } + dst0[3] = alpha; + } + } + } + + static void debayer_raw8_downscale(const u8* src, u8* dst, u8 alpha, f32 gain_r, f32 gain_g, f32 gain_b) + { + if (gain_r != 1.0f || gain_g != 1.0f || gain_b != 1.0f) + debayer_raw8_downscale_impl(src, dst, alpha, gain_r, gain_g, gain_b); + else + debayer_raw8_downscale_impl(src, dst, alpha, gain_r, gain_g, gain_b); + } + bool convert_image_format(CellCameraFormat input_format, const CellGemVideoConvertAttribute& vc, const std::vector& video_data_in, u32 width, u32 height, u8* video_data_out, u32 video_data_out_size, u8* buffer_memory, @@ -1183,34 +1230,7 @@ namespace gem { case CELL_CAMERA_RAW8: { - const u32 in_pitch = width; - const u32 out_pitch = width * 4 / 2; - - for (u32 y = 0; y < height - 1; y += 2) - { - const u8* src0 = src_data + y * in_pitch; - const u8* src1 = src0 + in_pitch; - - u8* dst0 = video_data_out + (y / 2) * out_pitch; - u8* dst1 = dst0 + out_pitch; - - for (u32 x = 0; x < width - 1; x += 2, src0 += 2, src1 += 2, dst0 += 4, dst1 += 4) - { - const u8 b = src0[0]; - const u8 g0 = src0[1]; - const u8 g1 = src1[0]; - const u8 r = src1[1]; - - const u8 top[4] = { r, g0, b, alpha }; - const u8 bottom[4] = { r, g1, b, alpha }; - - // Top-Left - std::memcpy(dst0, top, 4); - - // Bottom-Left Pixel - std::memcpy(dst1, bottom, 4); - } - } + debayer_raw8_downscale(src_data, video_data_out, alpha, gain_r, gain_g, gain_b); break; } case CELL_CAMERA_RGBA: From 0603d24a911013051a29b3794567ec75b760de61 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 05:33:55 +0100 Subject: [PATCH 380/630] Qt: play SND0.AT3 in game lists when a movie would play --- rpcs3/Emu/GameInfo.h | 1 + rpcs3/rpcs3qt/game_list_frame.cpp | 6 ++ rpcs3/rpcs3qt/game_list_grid.cpp | 18 +++++- rpcs3/rpcs3qt/game_list_table.cpp | 18 +++++- rpcs3/rpcs3qt/gui_game_info.h | 1 + rpcs3/rpcs3qt/qt_video_source.cpp | 89 ++++++++++++++++++++++++++- rpcs3/rpcs3qt/qt_video_source.h | 7 +++ rpcs3/rpcs3qt/save_manager_dialog.cpp | 6 ++ rpcs3/util/video_source.h | 1 + 9 files changed, 140 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/GameInfo.h b/rpcs3/Emu/GameInfo.h index 3efca1410a..da8b2638ba 100644 --- a/rpcs3/Emu/GameInfo.h +++ b/rpcs3/Emu/GameInfo.h @@ -8,6 +8,7 @@ struct GameInfo std::string path; std::string icon_path; std::string movie_path; + std::string audio_path; std::string name; std::string serial; diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index ea7b87ff6d..5ba31d9d77 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -637,6 +637,12 @@ void game_list_frame::OnParsingFinished() game.has_hover_pam = true; } + if (std::string audio_path = sfo_dir + "/SND0.AT3"; file_exists(audio_path)) + { + game.info.audio_path = std::move(audio_path); + game.has_audio_file = true; + } + const QString serial = QString::fromStdString(game.info.serial); m_games_mutex.lock(); diff --git a/rpcs3/rpcs3qt/game_list_grid.cpp b/rpcs3/rpcs3qt/game_list_grid.cpp index a33755ff54..4dfcf9744a 100644 --- a/rpcs3/rpcs3qt/game_list_grid.cpp +++ b/rpcs3/rpcs3qt/game_list_grid.cpp @@ -109,11 +109,23 @@ void game_list_grid::populate( } }); - if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam)) + if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam || game->has_audio_file)) { - item->set_video_path(game->info.movie_path); + bool check_iso = false; - if (!fs::exists(game->info.movie_path) && is_file_iso(game->info.path)) + if (game->has_hover_gif || game->has_hover_pam) + { + item->set_video_path(game->info.movie_path); + check_iso |= !fs::exists(game->info.movie_path); + } + + if (game->has_audio_file) + { + item->set_audio_path(game->info.audio_path); + check_iso |= !fs::exists(game->info.audio_path); + } + + if (check_iso && is_file_iso(game->info.path)) { item->set_iso_path(game->info.path); } diff --git a/rpcs3/rpcs3qt/game_list_table.cpp b/rpcs3/rpcs3qt/game_list_table.cpp index 98b9ef344d..737709dabb 100644 --- a/rpcs3/rpcs3qt/game_list_table.cpp +++ b/rpcs3/rpcs3qt/game_list_table.cpp @@ -299,11 +299,23 @@ void game_list_table::populate( } }); - if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam)) + if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam || game->has_audio_file)) { - icon_item->set_video_path(game->info.movie_path); + bool check_iso = false; - if (!fs::exists(game->info.movie_path) && is_file_iso(game->info.path)) + if (game->has_hover_gif || game->has_hover_pam) + { + icon_item->set_video_path(game->info.movie_path); + check_iso |= !fs::exists(game->info.movie_path); + } + + if (game->has_audio_file) + { + icon_item->set_audio_path(game->info.audio_path); + check_iso |= !fs::exists(game->info.audio_path); + } + + if (check_iso && is_file_iso(game->info.path)) { icon_item->set_iso_path(game->info.path); } diff --git a/rpcs3/rpcs3qt/gui_game_info.h b/rpcs3/rpcs3qt/gui_game_info.h index 08483fa7fb..693483dd6a 100644 --- a/rpcs3/rpcs3qt/gui_game_info.h +++ b/rpcs3/rpcs3qt/gui_game_info.h @@ -21,6 +21,7 @@ struct gui_game_info bool has_custom_icon = false; bool has_hover_gif = false; bool has_hover_pam = false; + bool has_audio_file = false; bool icon_in_archive = false; movie_item_base* item = nullptr; diff --git a/rpcs3/rpcs3qt/qt_video_source.cpp b/rpcs3/rpcs3qt/qt_video_source.cpp index d74d395c58..2d4ce34aa3 100644 --- a/rpcs3/rpcs3qt/qt_video_source.cpp +++ b/rpcs3/rpcs3qt/qt_video_source.cpp @@ -1,11 +1,19 @@ #include "stdafx.h" #include "Emu/System.h" +#include "Emu/system_config.h" #include "qt_video_source.h" #include "Loader/ISO.h" +#include #include +static video_source* s_audio_source = nullptr; +static std::unique_ptr s_audio_player = nullptr; +static std::unique_ptr s_audio_output = nullptr; +static std::unique_ptr s_audio_buffer = nullptr; +static std::unique_ptr s_audio_data = nullptr; + qt_video_source::qt_video_source() : video_source() { @@ -21,6 +29,11 @@ void qt_video_source::set_video_path(const std::string& video_path) m_video_path = QString::fromStdString(video_path); } +void qt_video_source::set_audio_path(const std::string& audio_path) +{ + m_audio_path = QString::fromStdString(audio_path); +} + void qt_video_source::set_iso_path(const std::string& iso_path) { m_iso_path = iso_path; @@ -89,7 +102,6 @@ void qt_video_source::init_movie() m_video_buffer = std::make_unique(&m_video_data); m_video_buffer->open(QIODevice::ReadOnly); m_movie = std::make_unique(m_video_buffer.get()); - } if (!m_movie->isValid()) @@ -179,6 +191,8 @@ void qt_video_source::start_movie() m_media_player->play(); } + start_audio(); + m_active = true; } @@ -196,6 +210,71 @@ void qt_video_source::stop_movie() m_media_player.reset(); m_video_buffer.reset(); m_video_data.clear(); + + stop_audio(); +} + +void qt_video_source::start_audio() +{ + if (m_audio_path.isEmpty() || s_audio_source == this) return; + + if (!s_audio_player) + { + s_audio_output = std::make_unique(); + s_audio_player = std::make_unique(); + s_audio_player->setAudioOutput(s_audio_output.get()); + } + + if (m_iso_path.empty()) + { + s_audio_player->setSource(QUrl::fromLocalFile(m_audio_path)); + } + else + { + iso_archive archive(m_iso_path); + auto audio_file = archive.open(m_audio_path.toStdString()); + const auto audio_size = audio_file.size(); + if (audio_size == 0) return; + + std::unique_ptr old_audio_data = std::move(s_audio_data); + s_audio_data = std::make_unique(audio_size, 0); + audio_file.read(s_audio_data->data(), audio_size); + + if (!s_audio_buffer) + { + s_audio_buffer = std::make_unique(); + } + + s_audio_buffer->setBuffer(s_audio_data.get()); + s_audio_buffer->open(QIODevice::ReadOnly); + s_audio_player->setSourceDevice(s_audio_buffer.get()); + + if (old_audio_data) + { + old_audio_data.reset(); + } + } + + s_audio_output->setVolume(g_cfg.audio.volume.get() / 100.0f); + s_audio_player->play(); + s_audio_source = this; +} + +void qt_video_source::stop_audio() +{ + if (s_audio_source != this) return; + + s_audio_source = nullptr; + + if (s_audio_player) + { + s_audio_player->stop(); + s_audio_player.reset(); + } + + s_audio_output.reset(); + s_audio_buffer.reset(); + s_audio_data.reset(); } QPixmap qt_video_source::get_movie_image(const QVideoFrame& frame) const @@ -288,6 +367,14 @@ void qt_video_source_wrapper::set_video_path(const std::string& video_path) }); } +void qt_video_source_wrapper::set_audio_path(const std::string& audio_path) +{ + Emu.CallFromMainThread([this, path = audio_path]() + { + // TODO + }); +} + void qt_video_source_wrapper::set_active(bool active) { Emu.CallFromMainThread([this, active]() diff --git a/rpcs3/rpcs3qt/qt_video_source.h b/rpcs3/rpcs3qt/qt_video_source.h index ce43d593d7..cda92671a2 100644 --- a/rpcs3/rpcs3qt/qt_video_source.h +++ b/rpcs3/rpcs3qt/qt_video_source.h @@ -19,7 +19,9 @@ public: void set_iso_path(const std::string& iso_path); void set_video_path(const std::string& video_path) override; + void set_audio_path(const std::string& audio_path) override; const QString& video_path() const { return m_video_path; } + const QString& audio_path() const { return m_audio_path; } void get_image(std::vector& data, int& w, int& h, int& ch, int& bpp) override; bool has_new() const override { return m_has_new; } @@ -30,6 +32,9 @@ public: void start_movie(); void stop_movie(); + void start_audio(); + void stop_audio(); + QPixmap get_movie_image(const QVideoFrame& frame) const; void image_change_callback(const QVideoFrame& frame = {}) const; @@ -44,6 +49,7 @@ protected: atomic_t m_has_new = false; QString m_video_path; + QString m_audio_path; std::string m_iso_path; // path of the source archive QByteArray m_video_data{}; QImage m_image{}; @@ -67,6 +73,7 @@ public: virtual ~qt_video_source_wrapper(); void set_video_path(const std::string& video_path) override; + void set_audio_path(const std::string& audio_path) override; void set_active(bool active) override; bool get_active() const override; bool has_new() const override { return m_qt_video_source && m_qt_video_source->has_new(); } diff --git a/rpcs3/rpcs3qt/save_manager_dialog.cpp b/rpcs3/rpcs3qt/save_manager_dialog.cpp index 2dd2a14e86..002df8d527 100644 --- a/rpcs3/rpcs3qt/save_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/save_manager_dialog.cpp @@ -360,6 +360,11 @@ void save_manager_dialog::UpdateList() icon_item->set_video_path(movie_path); } + if (const std::string audio_path = dir_path + "SND0.AT3"; fs::is_file(audio_path)) + { + icon_item->set_audio_path(audio_path); + } + icon_item->set_image_change_callback([this, icon_item](const QVideoFrame& frame) { if (!icon_item) @@ -686,6 +691,7 @@ void save_manager_dialog::UpdateDetails() const SaveDataEntry& save = ::at32(m_save_entries, idx); m_details_icon->set_video_path(icon_item->video_path().toStdString()); + m_details_icon->set_audio_path(icon_item->audio_path().toStdString()); m_details_icon->set_thumbnail(icon_item->data(SaveUserRole::Pixmap).value()); m_details_icon->set_active(false); diff --git a/rpcs3/util/video_source.h b/rpcs3/util/video_source.h index 9449ed238e..a18b564209 100644 --- a/rpcs3/util/video_source.h +++ b/rpcs3/util/video_source.h @@ -9,6 +9,7 @@ public: video_source() {}; virtual ~video_source() {}; virtual void set_video_path(const std::string& video_path) = 0; + virtual void set_audio_path(const std::string& audio_path) = 0; virtual void set_active(bool active) = 0; virtual bool get_active() const = 0; virtual bool has_new() const = 0; From 6d52415d5025a593e643d2a823a392c1a07ec920 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 17:53:45 +0300 Subject: [PATCH 381/630] gl: Ignore range offset when doing readback operations - OGL desperately needs a functioning DMA layer --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 8bfc92f902..7fb932681b 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -171,14 +171,6 @@ namespace gl { static_cast(src_area.width()), static_cast(src_area.height()), 1 } }; - u32 pbo_offset = 0; - if (valid_range.valid()) - { - const u32 section_base = get_section_base(); - pbo_offset = valid_range.start - section_base; - ensure(valid_range.start >= section_base && pbo_offset <= pbo.size()); - } - bool use_driver_pixel_transform = true; if (get_driver_caps().ARB_compute_shader_supported) [[likely]] { @@ -214,7 +206,7 @@ namespace gl real_pitch = pack_info.size * src->width(); const u64 data_length = pack_info.size * mem_info.image_size_in_texels; - scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), pbo_offset, data_length); + scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), 0, data_length); } else { @@ -237,7 +229,7 @@ namespace gl pack_settings.alignment(1); pack_settings.swap_bytes(pack_unpack_swap_bytes); - src->copy_to(pbo, pbo_offset, format, type, 0, src_rgn, pack_settings); + src->copy_to(pbo, 0, format, type, 0, src_rgn, pack_settings); } if (auto error = glGetError()) From 36cdaac3276736b0d0d719ec6948620b92697e18 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 17:54:05 +0300 Subject: [PATCH 382/630] overlays: Fix image size estimation --- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index f64fdfa47f..350a1c5901 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -40,7 +40,7 @@ namespace rsx image_info_base() {} virtual ~image_info_base() {} virtual const u8* get_data() const = 0; - virtual usz size_bytes() const { return static_cast(w * h * bpp); } + virtual usz size_bytes() const { return static_cast(w * h * 4); } // UI images get converted to RGBA8 std::span as_span() const { return { get_data(), size_bytes() }; } }; From ab72ce418eb9d0a7b3f0482dbdc47ed565f04e29 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 18:14:54 +0300 Subject: [PATCH 383/630] gl: Minor enhancements to blitter - Move some functions to cpp. Makes it easier to debug failing image operations - Add fbo validation before blit operations --- rpcs3/Emu/RSX/GL/glutils/blitter.cpp | 15 +++++++++++++++ rpcs3/Emu/RSX/GL/glutils/blitter.h | 12 ++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/blitter.cpp b/rpcs3/Emu/RSX/GL/glutils/blitter.cpp index 57998b761d..47c7d7b1ca 100644 --- a/rpcs3/Emu/RSX/GL/glutils/blitter.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/blitter.cpp @@ -8,6 +8,18 @@ namespace gl { blitter* g_hw_blitter = nullptr; + void blitter::init() + { + blit_src.create(); + blit_dst.create(); + } + + void blitter::destroy() + { + blit_dst.remove(); + blit_src.remove(); + } + void blitter::copy_image(gl::command_context&, const texture* src, const texture* dst, int src_level, int dst_level, const position3i& src_offset, const position3i& dst_offset, const size3i& size) const { ensure(src_level == 0); @@ -147,6 +159,9 @@ namespace gl gl::fbo::attachment dst_att{ blit_dst, static_cast(attachment) }; dst_att = *real_dst; + blit_src.check(); + blit_dst.check(); + blit_src.blit(blit_dst, src_rect, dst_rect, target, interp); // Release the attachments explicitly (not doing so causes glitches, e.g Journey Menu) diff --git a/rpcs3/Emu/RSX/GL/glutils/blitter.h b/rpcs3/Emu/RSX/GL/glutils/blitter.h index d7adc1dd14..d56754fcae 100644 --- a/rpcs3/Emu/RSX/GL/glutils/blitter.h +++ b/rpcs3/Emu/RSX/GL/glutils/blitter.h @@ -30,17 +30,9 @@ namespace gl public: - void init() - { - blit_src.create(); - blit_dst.create(); - } + void init(); - void destroy() - { - blit_dst.remove(); - blit_src.remove(); - } + void destroy(); void scale_image(gl::command_context& cmd, const texture* src, texture* dst, areai src_rect, areai dst_rect, bool linear_interpolation, const rsx::typeless_xfer& xfer_info); From 5f86315ae05eea9efe92e1169007cd166a4da231 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 20:51:27 +0300 Subject: [PATCH 384/630] gl: Fix shader interpreter compilation --- rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp | 1 + rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp index c7f9ec2622..fa5b3627c4 100644 --- a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp @@ -300,6 +300,7 @@ namespace gl } builder << "\n" + "#undef TEX_PARAM\n" "#define TEX_PARAM(index) texture_parameters[index + texture_base_index]\n" "#define IS_TEXTURE_RESIDENT(index) (texture_handles[index] < 0xFF)\n" "#define SAMPLER1D(index) sampler1D_array[texture_handles[index]]\n" diff --git a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp index 9315ac1593..7f6db33317 100644 --- a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp @@ -264,6 +264,7 @@ namespace vk } builder << "\n" + "#undef TEX_PARAM\n" "#define TEX_PARAM(index) texture_parameters[index + texture_base_index]\n" "#define IS_TEXTURE_RESIDENT(index) true\n" "#define SAMPLER1D(index) sampler1D_array[index]\n" From 0869ef421d0eecbe977e7ed35c0e59f2d2943bd6 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 20:51:36 +0300 Subject: [PATCH 385/630] gl: Silence compiler warning --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 7fb932681b..d4e50fd066 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -148,7 +148,7 @@ namespace gl } } - void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& valid_range, u32 pitch) + void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& /*valid_range*/, u32 pitch) { init_buffer(src); glGetError(); From ef70a6e82584d291b889a1ab04f46ecfa7ee032e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 21:09:25 +0300 Subject: [PATCH 386/630] gl: Move ownership of the global blitter object from texture cache to global --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 1 + rpcs3/Emu/RSX/GL/GLTexture.cpp | 9 +++++++++ rpcs3/Emu/RSX/GL/GLTexture.h | 1 + rpcs3/Emu/RSX/GL/GLTextureCache.h | 11 ++--------- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 408ea9f784..4ad9619d7f 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -398,6 +398,7 @@ void GLGSRender::on_init_thread() m_ui_renderer.create(); m_video_output_pass.create(); + gl::init_global_texture_resources(); m_gl_texture_cache.initialize(); m_prog_buffer.initialize diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 40c3af180c..5dfc663c68 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -22,6 +22,13 @@ namespace gl legacy_ring_buffer g_upload_transfer_buffer; scratch_ring_buffer g_compute_decode_buffer; scratch_ring_buffer g_deswizzle_scratch_buffer; + blitter g_blitter; + + void init_global_texture_resources() + { + g_blitter.init(); + g_hw_blitter = &g_blitter; + } void destroy_global_texture_resources() { @@ -29,6 +36,8 @@ namespace gl g_upload_transfer_buffer.remove(); g_compute_decode_buffer.remove(); g_deswizzle_scratch_buffer.remove(); + g_blitter.destroy(); + g_hw_blitter = nullptr; } template diff --git a/rpcs3/Emu/RSX/GL/GLTexture.h b/rpcs3/Emu/RSX/GL/GLTexture.h index 10c26dc536..7b3ff73db4 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.h +++ b/rpcs3/Emu/RSX/GL/GLTexture.h @@ -86,5 +86,6 @@ namespace gl extern std::unique_ptr g_vis_texture; } + void init_global_texture_resources(); void destroy_global_texture_resources(); } diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index d4e50fd066..6d724c216f 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -431,9 +431,7 @@ namespace gl using gl::viewable_image::viewable_image; }; - blitter m_hw_blitter; std::vector> m_temporary_surfaces; - const u32 max_cached_image_pool_size = 256; private: @@ -815,16 +813,11 @@ namespace gl using baseclass::texture_cache; void initialize() - { - m_hw_blitter.init(); - g_hw_blitter = &m_hw_blitter; - } + {} void destroy() override { clear(); - g_hw_blitter = nullptr; - m_hw_blitter.destroy(); } bool is_depth_texture(u32 rsx_address, u32 rsx_size) override @@ -870,7 +863,7 @@ namespace gl bool blit(gl::command_context& cmd, const rsx::blit_src_info& src, const rsx::blit_dst_info& dst, bool linear_interpolate, gl_render_targets& m_rtts) { - auto result = upload_scaled_image(src, dst, linear_interpolate, cmd, m_rtts, m_hw_blitter); + auto result = upload_scaled_image(src, dst, linear_interpolate, cmd, m_rtts, *g_hw_blitter); if (result.succeeded) { From 8651875e5971a6db9ac7bc253be7493f65f9ef12 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 22:08:43 +0300 Subject: [PATCH 387/630] gl: Add optional row length to GPU image routines --- rpcs3/Emu/RSX/GL/GLCompute.cpp | 6 ++-- rpcs3/Emu/RSX/GL/GLOverlays.cpp | 3 +- rpcs3/Emu/RSX/GL/GLTexture.cpp | 46 +++++++++++++++---------------- rpcs3/Emu/RSX/GL/GLTexture.h | 4 ++- rpcs3/Emu/RSX/GL/GLTextureCache.h | 6 ++-- 5 files changed, 34 insertions(+), 31 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLCompute.cpp b/rpcs3/Emu/RSX/GL/GLCompute.cpp index 5607c149ed..fd31708df7 100644 --- a/rpcs3/Emu/RSX/GL/GLCompute.cpp +++ b/rpcs3/Emu/RSX/GL/GLCompute.cpp @@ -340,7 +340,7 @@ namespace gl void cs_d24x8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) { - const auto row_pitch = region.width; + const auto row_pitch = layout.row_length ? layout.row_length : region.width; m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["output_pitch"] = row_pitch; @@ -390,14 +390,14 @@ namespace gl void cs_rgba8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) { - const auto row_pitch = region.width; + const auto row_pitch = layout.row_length ? layout.row_length : region.width; m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["output_pitch"] = row_pitch; m_program.uniforms["region_offset"] = color2i(region.x, region.y); m_program.uniforms["region_size"] = color2i(region.width, region.height); m_program.uniforms["is_bgra"] = (layout.format == static_cast(gl::texture::format::bgra)); - m_program.uniforms["block_width"] = static_cast(layout.size); + m_program.uniforms["block_width"] = static_cast(layout.block_size); auto data_view = src->get_view(rsx::default_remap_vector.with_encoding(GL_REMAP_IDENTITY), gl::image_aspect::color); diff --git a/rpcs3/Emu/RSX/GL/GLOverlays.cpp b/rpcs3/Emu/RSX/GL/GLOverlays.cpp index 0c4732430c..6be9aba6a0 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.cpp +++ b/rpcs3/Emu/RSX/GL/GLOverlays.cpp @@ -551,7 +551,8 @@ namespace gl const pixel_buffer_layout& layout) { const u32 bpp = dst->image()->pitch() / dst->image()->width(); - const u32 row_length = utils::align(dst_region.width * bpp, std::max(layout.alignment, 1)) / bpp; + const u32 aligned_width = utils::align(dst_region.width * bpp, std::max(layout.alignment, 1)) / bpp; + const u32 row_length = layout.row_length ? layout.row_length : aligned_width; program_handle.uniforms["src_pitch"] = row_length; program_handle.uniforms["swap_bytes"] = layout.swap_bytes; diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 5dfc663c68..5c85f71c2e 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -166,42 +166,42 @@ namespace gl case texture::internal_format::compressed_rgba_s3tc_dxt1: case texture::internal_format::compressed_rgba_s3tc_dxt3: case texture::internal_format::compressed_rgba_s3tc_dxt5: - return { GL_RGBA, GL_UNSIGNED_BYTE, 1, false }; + return { .format = GL_RGBA, .type = GL_UNSIGNED_BYTE, .block_size = 1, .swap_bytes = false }; case texture::internal_format::r8: - return { GL_RED, GL_UNSIGNED_BYTE, 1, false }; + return { .format = GL_RED, .type = GL_UNSIGNED_BYTE, .block_size = 1, .swap_bytes = false }; case texture::internal_format::r16: - return { GL_RED, GL_UNSIGNED_SHORT, 2, true }; + return { .format = GL_RED, .type = GL_UNSIGNED_SHORT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::r32f: - return { GL_RED, GL_FLOAT, 4, true }; + return { .format = GL_RED, .type = GL_FLOAT, .block_size = 4, .swap_bytes = true }; case texture::internal_format::rg8: - return { GL_RG, GL_UNSIGNED_SHORT, 2, true }; + return { .format = GL_RG, .type = GL_UNSIGNED_SHORT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rg16: - return { GL_RG, GL_UNSIGNED_SHORT, 2, true }; + return { .format = GL_RG, .type = GL_UNSIGNED_SHORT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rg16f: - return { GL_RG, GL_HALF_FLOAT, 2, true }; + return { .format = GL_RG, .type = GL_HALF_FLOAT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rgb565: - return { GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2, true }; + return { .format = GL_RGB, .type = GL_UNSIGNED_SHORT_5_6_5, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rgb5a1: - return { GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 2, true }; + return { .format = GL_RGB, .type = GL_UNSIGNED_SHORT_5_5_5_1, .block_size = 2, .swap_bytes = true }; case texture::internal_format::bgr5a1: - return { GL_RGB, GL_UNSIGNED_SHORT_1_5_5_5_REV, 2, true }; + return { .format = GL_RGB, .type = GL_UNSIGNED_SHORT_1_5_5_5_REV, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rgba4: - return { GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4, 2, false }; + return { .format = GL_BGRA, .type = GL_UNSIGNED_SHORT_4_4_4_4, .block_size = 2, .swap_bytes = false }; case texture::internal_format::rgba8: - return { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 4, true }; + return { .format = GL_RGBA, .type = GL_UNSIGNED_INT_8_8_8_8_REV, .block_size = 4, .swap_bytes = true }; case texture::internal_format::bgra8: - return { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 4, true }; + return { .format = GL_BGRA, .type = GL_UNSIGNED_INT_8_8_8_8_REV, .block_size = 4, .swap_bytes = true }; case texture::internal_format::rgba16f: - return { GL_RGBA, GL_HALF_FLOAT, 2, true }; + return { .format = GL_RGBA, .type = GL_HALF_FLOAT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rgba32f: - return { GL_RGBA, GL_FLOAT, 4, true }; + return { .format = GL_RGBA, .type = GL_FLOAT, .block_size = 4, .swap_bytes = true }; case texture::internal_format::depth16: - return { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 2, true }; + return { .format = GL_DEPTH_COMPONENT, .type = GL_UNSIGNED_SHORT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::depth32f: - return { GL_DEPTH_COMPONENT, GL_FLOAT, 2, true }; + return { .format = GL_DEPTH_COMPONENT, .type = GL_FLOAT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::depth24_stencil8: case texture::internal_format::depth32f_stencil8: - return { GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 4, true }; + return { .format = GL_DEPTH_STENCIL, .type = GL_UNSIGNED_INT_24_8, .block_size = 4, .swap_bytes = true }; default: fmt::throw_exception("Unexpected internal format 0x%X", static_cast(format)); } @@ -320,7 +320,7 @@ namespace gl return nullptr; } - switch (pack_info.size) + switch (pack_info.block_size) { case 1: return nullptr; @@ -780,7 +780,7 @@ namespace gl mem_layout.swap_bytes = op.require_swap; mem_layout.format = gl_format; mem_layout.type = gl_type; - mem_layout.size = block_size_in_bytes; + mem_layout.block_size = block_size_in_bytes; // 2. Upload memory to GPU if (!op.require_deswizzle) @@ -1061,7 +1061,7 @@ namespace gl skip_transform = (pack_info.format == unpack_info.format && pack_info.type == unpack_info.type && pack_info.swap_bytes == unpack_info.swap_bytes && - pack_info.size == unpack_info.size); + pack_info.block_size == unpack_info.block_size); } if (skip_transform) [[likely]] @@ -1142,7 +1142,7 @@ namespace gl if (src->aspect() & image_aspect::depth) { // Source is depth, modify unpack rule - if (pack_info.size == 4 && unpack_info.size == 4) + if (pack_info.block_size == 4 && unpack_info.block_size == 4) { unpack_info.swap_bytes = !unpack_info.swap_bytes; } @@ -1150,7 +1150,7 @@ namespace gl else { // Dest is depth, modify pack rule - if (pack_info.size == 4 && unpack_info.size == 4) + if (pack_info.block_size == 4 && unpack_info.block_size == 4) { pack_info.swap_bytes = !pack_info.swap_bytes; } diff --git a/rpcs3/Emu/RSX/GL/GLTexture.h b/rpcs3/Emu/RSX/GL/GLTexture.h index 7b3ff73db4..4a17dae081 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.h +++ b/rpcs3/Emu/RSX/GL/GLTexture.h @@ -16,9 +16,11 @@ namespace gl { GLenum format; GLenum type; - u8 size; + u32 row_length; + u8 block_size; bool swap_bytes; u8 alignment; + u8 reserved; }; struct image_memory_requirements diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 6d724c216f..1a4b4f9e1e 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -186,7 +186,7 @@ namespace gl pack_info.format = static_cast(format); pack_info.type = static_cast(type); - pack_info.size = (src->aspect() & image_aspect::stencil) ? 4 : 2; + pack_info.block_size = (src->aspect() & image_aspect::stencil) ? 4 : 2; pack_info.swap_bytes = true; mem_info.image_size_in_texels = src->width() * src->height(); @@ -204,8 +204,8 @@ namespace gl glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); - real_pitch = pack_info.size * src->width(); - const u64 data_length = pack_info.size * mem_info.image_size_in_texels; + real_pitch = pack_info.block_size * src->width(); + const u64 data_length = pack_info.block_size * mem_info.image_size_in_texels; scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), 0, data_length); } else From 7917520633490458968b833e93131bb5c8207d54 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 22:20:39 +0300 Subject: [PATCH 388/630] gl: Support packing/unpacking images with padding --- rpcs3/Emu/RSX/GL/GLTexture.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 5c85f71c2e..64e451e579 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -372,7 +372,10 @@ namespace gl } } - src->copy_to(*dst, dst_offset, static_cast(pack_info.format), static_cast(pack_info.type), src_level, src_region, {}); + pixel_pack_settings pack_settings{}; + if (pack_info.alignment) pack_settings.alignment(pack_info.alignment); + if (pack_info.row_length) pack_settings.row_length(pack_info.row_length); + src->copy_to(*dst, dst_offset, static_cast(pack_info.format), static_cast(pack_info.type), src_level, src_region, pack_settings); return false; }; @@ -620,8 +623,11 @@ namespace gl glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); + pixel_unpack_settings unpack_settings{}; + if (unpack_info.alignment) unpack_settings.alignment(unpack_info.alignment); + if (unpack_info.format) unpack_settings.row_length(unpack_info.row_length); dst->copy_from(*transfer_buf, out_offset, static_cast(unpack_info.format), - static_cast(unpack_info.type), dst_level, dst_region, {}); + static_cast(unpack_info.type), dst_level, dst_region, unpack_settings); } } From aa094ca9487873cb6c960b6e2125f53bb31fc887 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Mar 2026 03:06:08 +0300 Subject: [PATCH 389/630] gl: Trace memory readback operations to debug tracking when renderdoc compat is enabled - Renderdoc does not show these calls so we need to insert the debug message --- rpcs3/Emu/RSX/GL/glutils/capabilities.cpp | 3 +++ rpcs3/Emu/RSX/GL/glutils/capabilities.h | 1 + rpcs3/Emu/RSX/GL/glutils/image.cpp | 8 ++++++++ 3 files changed, 12 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp b/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp index d6a51beb09..a6999d6f9c 100644 --- a/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp @@ -2,6 +2,7 @@ #include "capabilities.h" #include "Utilities/StrUtil.h" +#include "Emu/system_config.h" #include @@ -43,6 +44,8 @@ namespace gl all_extensions.emplace(reinterpret_cast(glGetStringi(GL_EXTENSIONS, i))); } + RENDERDOC_debug = !!g_cfg.video.renderdoc_compatiblity; + #define CHECK_EXTENSION_SUPPORT(extension_short_name)\ do {\ if (all_extensions.contains("GL_"#extension_short_name)) {\ diff --git a/rpcs3/Emu/RSX/GL/glutils/capabilities.h b/rpcs3/Emu/RSX/GL/glutils/capabilities.h index 756250430b..cfe104ffbe 100644 --- a/rpcs3/Emu/RSX/GL/glutils/capabilities.h +++ b/rpcs3/Emu/RSX/GL/glutils/capabilities.h @@ -23,6 +23,7 @@ namespace gl bool initialized = false; version_info glsl_version; + bool RENDERDOC_debug = false; bool EXT_direct_state_access_supported = false; bool EXT_depth_bounds_test_supported = false; bool AMD_pinned_memory_supported = false; diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index e99a6e15b2..7dd3442f84 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -246,6 +246,14 @@ namespace gl pixel_settings.apply(); const auto& caps = get_driver_caps(); + if (caps.RENDERDOC_debug) + { + const auto msg = fmt::format("glGetTextureSubImage('[%u] %s', %u, %u, %u, %u, %u, %u, %u, %u, %u, %d, %p)", + m_id, m_name.c_str(), level, region.x, region.y, region.z, region.width, region.height, region.depth, + static_cast(format), static_cast(type), s32{ smax }, dst.data()); + push_debug_label(msg); + } + if (!region.x && !region.y && !region.z && region.width == m_width && region.height == m_height && region.depth == m_depth) { From 040a79ddd1794bf9ba09b3f0d09cfad1b993038b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Mar 2026 04:03:17 +0300 Subject: [PATCH 390/630] gl: Improve object annotation for renderdoc debugging --- rpcs3/Emu/RSX/GL/GLRenderTargets.cpp | 2 ++ rpcs3/Emu/RSX/GL/GLRenderTargets.h | 5 +++ rpcs3/Emu/RSX/GL/glutils/image.cpp | 52 ++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index 18058842aa..a61fb4b365 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -689,6 +689,8 @@ gl::viewable_image* gl::render_target::get_resolve_target_safe(gl::command_conte static_cast(get_internal_format()), format_class() )); + + resolve_surface->set_name(fmt::format("MSAA_Resolve_%u@0x%x", resolve_surface->id(), base_addr)); } return static_cast(resolve_surface.get()); diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.h b/rpcs3/Emu/RSX/GL/GLRenderTargets.h index 9b01746a87..ee3bc03956 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.h +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.h @@ -160,6 +160,7 @@ struct gl_render_target_traits std::unique_ptr result(new gl::render_target(width_, height_, samples, static_cast(format.internal_format), RSX_FORMAT_CLASS_COLOR)); + result->set_name(fmt::format("RTV_%u@0x%x", result->id(), address)); result->set_aa_mode(antialias); result->set_native_pitch(static_cast(width) * get_format_block_size_in_bytes(surface_color_format) * result->samples_x); result->set_surface_dimensions(static_cast(width), static_cast(height), static_cast(pitch)); @@ -203,6 +204,7 @@ struct gl_render_target_traits std::unique_ptr result(new gl::render_target(width_, height_, samples, static_cast(format.internal_format), rsx::classify_format(surface_depth_format))); + result->set_name(fmt::format("DSV_%u@0x%x", result->id(), address)); result->set_aa_mode(antialias); result->set_surface_dimensions(static_cast(width), static_cast(height), static_cast(pitch)); result->set_format(surface_depth_format); @@ -238,6 +240,7 @@ struct gl_render_target_traits sink->state_flags = rsx::surface_state_flags::erase_bkgnd; sink->format_info = ref->format_info; + sink->set_name(fmt::format("SINK_%u@0x%x", sink->id(), address)); sink->set_spp(ref->get_spp()); sink->set_native_pitch(static_cast(prev.width) * ref->get_bpp() * ref->samples_x); sink->set_rsx_pitch(ref->get_rsx_pitch()); @@ -325,6 +328,7 @@ struct gl_render_target_traits std::array native_layout = { static_cast(fmt.swizzle.a), static_cast(fmt.swizzle.r), static_cast(fmt.swizzle.g), static_cast(fmt.swizzle.b) }; surface->set_native_component_layout(native_layout); surface->set_format(format); + surface->set_name(fmt::format("RTV_%u@0x%x", surface->id(), address)); int_invalidate_surface_contents(cmd, surface, address, pitch); } @@ -338,6 +342,7 @@ struct gl_render_target_traits usz pitch) { surface->set_format(format); + surface->set_name(fmt::format("DSV_%u@0x%x", surface->id(), address)); int_invalidate_surface_contents(cmd, surface, address, pitch); } diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index 7dd3442f84..e2f02afdfa 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -19,6 +19,54 @@ namespace gl } } + static const char* gl_type_to_str(texture::type type) + { + switch (type) + { + case texture::type::ubyte: return "GL_UNSIGNED_BYTE"; + case texture::type::ushort: return "GL_UNSIGNED_SHORT"; + case texture::type::uint: return "GL_UNSIGNED_INT"; + case texture::type::ubyte_3_3_2: return "GL_UNSIGNED_BYTE_3_3_2"; + case texture::type::ubyte_2_3_3_rev: return "GL_UNSIGNED_BYTE_2_3_3_REV"; + case texture::type::ushort_5_6_5: return "GL_UNSIGNED_SHORT_5_6_5"; + case texture::type::ushort_5_6_5_rev: return "GL_UNSIGNED_SHORT_5_6_5_REV"; + case texture::type::ushort_4_4_4_4: return "GL_UNSIGNED_SHORT_4_4_4_4"; + case texture::type::ushort_4_4_4_4_rev: return "GL_UNSIGNED_SHORT_4_4_4_4_REV"; + case texture::type::ushort_5_5_5_1: return "GL_UNSIGNED_SHORT_5_5_5_1"; + case texture::type::ushort_1_5_5_5_rev: return "GL_UNSIGNED_SHORT_1_5_5_5_REV"; + case texture::type::uint_8_8_8_8: return "GL_UNSIGNED_INT_8_8_8_8"; + case texture::type::uint_8_8_8_8_rev: return "GL_UNSIGNED_INT_8_8_8_8_REV"; + case texture::type::uint_10_10_10_2: return "GL_UNSIGNED_INT_10_10_10_2"; + case texture::type::uint_2_10_10_10_rev: return "GL_UNSIGNED_INT_2_10_10_10_REV"; + case texture::type::uint_24_8: return "GL_UNSIGNED_INT_24_8"; + case texture::type::float32_uint8: return "GL_FLOAT_32_UNSIGNED_INT_24_8_REV"; + case texture::type::sbyte: return "GL_BYTE"; + case texture::type::sshort: return "GL_SHORT"; + case texture::type::sint: return "GL_INT"; + case texture::type::f16: return "GL_HALF_FLOAT"; + case texture::type::f32: return "GL_FLOAT"; + case texture::type::f64: return "GL_DOUBLE"; + default: return "UNKNOWN"; + } + } + + static const char* gl_format_to_str(texture::format format) + { + switch (format) + { + case texture::format::r: return "GL_RED"; + case texture::format::rg: return "GL_RG"; + case texture::format::rgb: return "GL_RGB"; + case texture::format::rgba: return "GL_RGBA"; + case texture::format::bgr: return "GL_BGR"; + case texture::format::bgra: return "GL_BGRA"; + case texture::format::stencil: return "GL_STENCIL_INDEX"; + case texture::format::depth: return "GL_DEPTH_COMPONENT"; + case texture::format::depth_stencil: return "GL_DEPTH_STENCIL"; + default: return "UNKNOWN"; + } + } + texture::texture(GLenum target, GLuint width, GLuint height, GLuint depth, GLuint mipmaps, GLubyte samples, GLenum sized_format, rsx::format_class format_class) { // Upgrade targets for MSAA @@ -248,9 +296,9 @@ namespace gl if (caps.RENDERDOC_debug) { - const auto msg = fmt::format("glGetTextureSubImage('[%u] %s', %u, %u, %u, %u, %u, %u, %u, %u, %u, %d, %p)", + const auto msg = fmt::format("glGetTextureSubImage('[%u] %s', %u, %u, %u, %u, %u, %u, %u, %s, %s, %d, %p)", m_id, m_name.c_str(), level, region.x, region.y, region.z, region.width, region.height, region.depth, - static_cast(format), static_cast(type), s32{ smax }, dst.data()); + gl_format_to_str(format), gl_type_to_str(type), s32{ smax }, dst.data()); push_debug_label(msg); } From c72d54bd6aa3d7aa21dade03301b297be40d26fc Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Mar 2026 04:03:48 +0300 Subject: [PATCH 391/630] gl: Add guards to catch invalid configuration in image transfer functions --- rpcs3/Emu/RSX/GL/GLCompute.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLCompute.cpp b/rpcs3/Emu/RSX/GL/GLCompute.cpp index fd31708df7..12d10d2368 100644 --- a/rpcs3/Emu/RSX/GL/GLCompute.cpp +++ b/rpcs3/Emu/RSX/GL/GLCompute.cpp @@ -341,6 +341,7 @@ namespace gl void cs_d24x8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) { const auto row_pitch = layout.row_length ? layout.row_length : region.width; + ensure(row_pitch >= region.width); m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["output_pitch"] = row_pitch; @@ -391,6 +392,7 @@ namespace gl void cs_rgba8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) { const auto row_pitch = layout.row_length ? layout.row_length : region.width; + ensure(row_pitch >= region.width); m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["output_pitch"] = row_pitch; @@ -441,6 +443,7 @@ namespace gl { const u32 bpp = dst->image()->pitch() / dst->image()->width(); const u32 row_length = utils::align(dst_region.width * bpp, std::max(layout.alignment, 1)) / bpp; + ensure(row_length >= dst_region.width); m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["src_pitch"] = row_length; From c7a576edcea465e280c6708d9cb797080890313f Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Mar 2026 04:05:33 +0300 Subject: [PATCH 392/630] gl: Implement proper, sectioned DMA transfers - Allows to transfer partial contents when needed --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 61 +++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 1a4b4f9e1e..a4b931186f 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -148,7 +148,7 @@ namespace gl } } - void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& /*valid_range*/, u32 pitch) + void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& valid_range, u32 pitch) { init_buffer(src); glGetError(); @@ -171,6 +171,14 @@ namespace gl { static_cast(src_area.width()), static_cast(src_area.height()), 1 } }; + u32 pbo_offset = 0; + if (valid_range.valid()) + { + const u32 section_base = get_section_base(); + pbo_offset = valid_range.start - section_base; + ensure(valid_range.start >= section_base && pbo_offset <= pbo.size()); + } + bool use_driver_pixel_transform = true; if (get_driver_caps().ARB_compute_shader_supported) [[likely]] { @@ -188,9 +196,10 @@ namespace gl pack_info.type = static_cast(type); pack_info.block_size = (src->aspect() & image_aspect::stencil) ? 4 : 2; pack_info.swap_bytes = true; + pack_info.row_length = rsx_pitch / pack_info.block_size; - mem_info.image_size_in_texels = src->width() * src->height(); - mem_info.image_size_in_bytes = src->pitch() * src->height(); + mem_info.image_size_in_texels = pack_info.row_length * src_area.height(); + mem_info.image_size_in_bytes = rsx_pitch * src_area.height(); mem_info.memory_required = 0; if (pack_info.type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) @@ -200,13 +209,15 @@ namespace gl } void* out_offset = copy_image_to_buffer(cmd, pack_info, src, &scratch_mem, 0, 0, src_rgn, &mem_info); + real_pitch = rsx_pitch; glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); - real_pitch = pack_info.block_size * src->width(); - const u64 data_length = pack_info.block_size * mem_info.image_size_in_texels; - scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), 0, data_length); + const u64 data_length = mem_info.image_size_in_bytes - rsx_pitch + (src_area.width() * pack_info.block_size); + ensure(data_length + pbo_offset <= static_cast(pbo.size()), "Memory allocation cannot fit image contents. Report to developers."); + + scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), pbo_offset, data_length); } else { @@ -225,11 +236,16 @@ namespace gl pack_unpack_swap_bytes = false; } + const auto bpp = src->pitch() / src->width(); + real_pitch = rsx_pitch; + ensure((real_pitch % bpp) == 0); + pixel_pack_settings pack_settings; pack_settings.alignment(1); pack_settings.swap_bytes(pack_unpack_swap_bytes); + pack_settings.row_length(rsx_pitch / bpp); - src->copy_to(pbo, 0, format, type, 0, src_rgn, pack_settings); + src->copy_to(pbo, pbo_offset, format, type, 0, src_rgn, pack_settings); } if (auto error = glGetError()) @@ -270,6 +286,7 @@ namespace gl gl::texture* target_texture = vram_texture; u32 transfer_width = width; u32 transfer_height = height; + u32 transfer_x = 0, transfer_y = 0; if (context == rsx::texture_upload_context::framebuffer_storage) { @@ -315,7 +332,35 @@ namespace gl } } - dma_transfer(cmd, target_texture, {}, {}, rsx_pitch); + const auto valid_range = get_confirmed_range(); + if (const auto section_range = get_section_range(); section_range != valid_range) + { + if (const auto offset = (valid_range.start - get_section_base())) + { + transfer_y = offset / rsx_pitch; + transfer_x = (offset % rsx_pitch) / rsx::get_format_block_size_in_bytes(gcm_format); + + ensure(transfer_width >= transfer_x); + ensure(transfer_height >= transfer_y); + transfer_width -= transfer_x; + transfer_height -= transfer_y; + } + + if (const auto tail = (section_range.end - valid_range.end)) + { + const auto row_count = tail / rsx_pitch; + + ensure(transfer_height >= row_count); + transfer_height -= row_count; + } + } + + areai src_area; + src_area.x1 = static_cast(transfer_x); + src_area.y1 = static_cast(transfer_y); + src_area.x2 = s32(transfer_x + transfer_width); + src_area.y2 = s32(transfer_y + transfer_height); + dma_transfer(cmd, target_texture, src_area, valid_range, rsx_pitch); } /** From 8afa40eaa7d55c158d71baccd693179eb9f06650 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 16:43:20 +0100 Subject: [PATCH 393/630] rpcn: Fix segfault in rpcn_settings_dialog destructor This will happen if m_rpcn failed to connect in the constructor. --- rpcs3/rpcs3qt/rpcn_settings_dialog.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp index 6de6007b31..cab71be3bc 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp @@ -1347,7 +1347,10 @@ rpcn_friends_dialog::rpcn_friends_dialog(QWidget* parent) rpcn_friends_dialog::~rpcn_friends_dialog() { - m_rpcn->remove_friend_cb(friend_callback, this); + if (m_rpcn) + { + m_rpcn->remove_friend_cb(friend_callback, this); + } } bool rpcn_friends_dialog::add_friend_with_error_dialog(const std::string& friend_username) From 3803c864f747b2d64fdb4531c4a78c9c05cc1c87 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 16:26:40 +0100 Subject: [PATCH 394/630] rpcn: Fix file access error when loading rpcn.yml with version 1 The file was still in use when saving. --- rpcs3/Emu/NP/rpcn_config.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rpcs3/Emu/NP/rpcn_config.cpp b/rpcs3/Emu/NP/rpcn_config.cpp index 0b5cabe768..6665adbf7d 100644 --- a/rpcs3/Emu/NP/rpcn_config.cpp +++ b/rpcs3/Emu/NP/rpcn_config.cpp @@ -10,8 +10,7 @@ void cfg_rpcn::load() { const std::string path = cfg_rpcn::get_path(); - fs::file cfg_file(path, fs::read); - if (cfg_file) + if (fs::file cfg_file(path, fs::read); cfg_file) { rpcn_log.notice("Loading RPCN config. Path: %s", path); from_string(cfg_file.to_string()); From 9e573a9ff2083800444251a508d9f44800b4e1e6 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 16:26:56 +0100 Subject: [PATCH 395/630] rpcn: set default version to 2 --- rpcs3/Emu/NP/rpcn_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/NP/rpcn_config.h b/rpcs3/Emu/NP/rpcn_config.h index 3ea6b707b1..113d83e408 100644 --- a/rpcs3/Emu/NP/rpcn_config.h +++ b/rpcs3/Emu/NP/rpcn_config.h @@ -4,7 +4,7 @@ struct cfg_rpcn : cfg::node { - cfg::uint32 version{this, "Version", 1}; + cfg::uint32 version{this, "Version", 2}; cfg::string host{this, "Host", "np.rpcs3.net"}; cfg::string npid{this, "NPID", ""}; cfg::string password{this, "Password", ""}; From 234f2b4648b38e41aa236752e5e5dde1f4af4360 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sat, 7 Mar 2026 09:46:22 +0200 Subject: [PATCH 396/630] Silence sys_memory_get_user_memory_size --- rpcs3/Emu/Cell/lv2/sys_memory.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.cpp b/rpcs3/Emu/Cell/lv2/sys_memory.cpp index 6110d7d4d5..0f6fb09865 100644 --- a/rpcs3/Emu/Cell/lv2/sys_memory.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_memory.cpp @@ -15,6 +15,18 @@ LOG_CHANNEL(sys_memory); // static shared_mutex s_memstats_mtx; +// This struct is for reduced logging repetition +struct last_reported_memory_stats +{ + struct inner_body + { + u32 prev_total = umax; + u32 prev_avail = umax; + }; + + atomic_t body{}; +}; + lv2_memory_container::lv2_memory_container(u32 size, bool from_idm) noexcept : size(size) , id{from_idm ? idm::last_id() : SYS_MEMORY_CONTAINER_ID_INVALID} @@ -313,8 +325,6 @@ error_code sys_memory_get_user_memory_size(cpu_thread& cpu, vm::ptrget(); @@ -332,6 +342,22 @@ error_code sys_memory_get_user_memory_size(cpu_thread& cpu, vm::ptrget().body.exchange(now); + + if (now.prev_total != out.total_user_memory || now.prev_avail != out.available_user_memory) + { + // Log on change + sys_memory.warning("sys_memory_get_user_memory_size(mem_info=*0x%x): Avail=0x%x, Total=0x%x", mem_info, out.available_user_memory, out.total_user_memory); + } + else + { + sys_memory.trace("sys_memory_get_user_memory_size(mem_info=*0x%x): Avail=0x%x, Total=0x%x", mem_info, out.available_user_memory, out.total_user_memory); + } + cpu.check_state(); *mem_info = out; return CELL_OK; From 9811e1cc3b5bf025ec38551faa81e37035e39bea Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sun, 1 Mar 2026 10:07:25 +0200 Subject: [PATCH 397/630] Debugger: Add HW PPU threads view --- rpcs3/Emu/CPU/CPUThread.cpp | 2 +- rpcs3/Emu/Cell/lv2/lv2.cpp | 22 +++++ rpcs3/Emu/Cell/lv2/sys_sync.h | 1 + rpcs3/rpcs3qt/debugger_frame.cpp | 155 +++++++++++++++++++++++++------ rpcs3/rpcs3qt/debugger_frame.h | 7 +- 5 files changed, 156 insertions(+), 31 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index e37e6ed0da..3ab011aa04 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -1373,7 +1373,7 @@ std::vector> cpu_thread::dump_callstack_list() const std::string cpu_thread::dump_misc() const { - return fmt::format("Type: %s; State: %s\n", get_class() == thread_class::ppu ? "PPU" : get_class() == thread_class::spu ? "SPU" : "RSX", state.load()); + return fmt::format("%s[0x%x]; State: %s\n", get_class() == thread_class::ppu ? "PPU" : get_class() == thread_class::spu ? "SPU" : "RSX", id, state.load()); } bool cpu_thread::suspend_work::push(cpu_thread* _this) noexcept diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index 3b923e8c41..dbe11039e7 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -2219,6 +2219,28 @@ void lv2_obj::prepare_for_sleep(cpu_thread& cpu) cpu_counter::remove(&cpu); } +ppu_thread* lv2_obj::get_running_ppu(u32 index) +{ + usz thread_count = g_cfg.core.ppu_threads; + + if (index >= thread_count) + { + return nullptr; + } + + auto target = atomic_storage::load(g_ppu); + + for (usz cur = 0; target; target = atomic_storage::load(target->next_ppu), cur++) + { + if (cur == index) + { + return target; + } + } + + return nullptr; +} + void lv2_obj::notify_all() noexcept { for (auto cpu : g_to_notify) diff --git a/rpcs3/Emu/Cell/lv2/sys_sync.h b/rpcs3/Emu/Cell/lv2/sys_sync.h index 0aff5e1e7a..6d55f4b1f0 100644 --- a/rpcs3/Emu/Cell/lv2/sys_sync.h +++ b/rpcs3/Emu/Cell/lv2/sys_sync.h @@ -453,6 +453,7 @@ public: // Can be called before the actual sleep call in order to move it out of mutex scope static void prepare_for_sleep(cpu_thread& cpu); + static ppu_thread* get_running_ppu(u32 index); struct notify_all_t { diff --git a/rpcs3/rpcs3qt/debugger_frame.cpp b/rpcs3/rpcs3qt/debugger_frame.cpp index 7ffe1b32a2..f1dd9cf892 100644 --- a/rpcs3/rpcs3qt/debugger_frame.cpp +++ b/rpcs3/rpcs3qt/debugger_frame.cpp @@ -16,6 +16,7 @@ #include "Emu/IdManager.h" #include "Emu/RSX/RSXThread.h" #include "Emu/RSX/RSXDisAsm.h" +#include "Emu/Cell/lv2/sys_sync.h" #include "Emu/Cell/PPUAnalyser.h" #include "Emu/Cell/PPUDisAsm.h" #include "Emu/Cell/PPUThread.h" @@ -804,12 +805,47 @@ cpu_thread* debugger_frame::get_cpu() return nullptr; } + if (u32 cur = m_choice_units->currentIndex(); cur >= m_hw_ppu_idx && cur < g_cfg.core.ppu_threads + m_hw_ppu_idx) + { + reader_lock lock(lv2_obj::g_mutex); + + const auto ppu = lv2_obj::get_running_ppu(cur - m_hw_ppu_idx); + + if (ppu == m_cpu.get()) + { + // Nothing to do + } + else if (ppu) + { + m_cpu = idm::get_unlocked>(ppu->id); + } + else + { + m_cpu.reset(); + } + } + + if (!!m_disasm != !!m_cpu) + { + // Fixup for HW PPU viewer + if (m_cpu) + { + m_disasm = make_disasm(m_cpu.get(), m_cpu); + } + else + { + m_disasm.reset(); + } + + m_debugger_list->UpdateCPUData(m_disasm); + m_breakpoint_list->UpdateCPUData(m_disasm); + } + // Wait flag is raised by the thread itself, acknowledging exit if (m_cpu) { if (m_cpu->state.all_of(cpu_flag::wait + cpu_flag::exit)) { - m_cpu.reset(); return nullptr; } @@ -823,12 +859,13 @@ cpu_thread* debugger_frame::get_cpu() { if (g_fxo->try_get() != m_rsx || !m_rsx->ctrl || m_rsx->state.all_of(cpu_flag::wait + cpu_flag::exit)) { - m_rsx = nullptr; return nullptr; } + + return m_rsx; } - return m_rsx; + return nullptr; } std::function debugger_frame::make_check_cpu(cpu_thread* cpu, bool unlocked) @@ -922,19 +959,20 @@ std::function debugger_frame::make_check_cpu(cpu_thread* cpu, boo void debugger_frame::UpdateUI() { - const auto cpu = get_cpu(); + auto cpu = get_cpu(); // Refresh at a high rate during initialization (looks weird otherwise) if (m_ui_update_ctr % (cpu || m_ui_update_ctr < 200 || m_debugger_list->m_dirty_flag ? 5 : 50) == 0) { // If no change to instruction position happened, update instruction list at 20hz - ShowPC(); + ShowPC(false, cpu); } if (m_ui_update_ctr % 20 == 0 && !m_thread_list_pending_update) { // Update threads list at 5hz (low priority) UpdateUnitList(); + cpu = get_cpu(); } if (!cpu) @@ -945,12 +983,13 @@ void debugger_frame::UpdateUI() { // Update threads list (thread exited) UpdateUnitList(); + cpu = get_cpu(); } - ShowPC(); + ShowPC(false, cpu); m_last_query_state.clear(); m_last_pc = -1; - DoUpdate(); + DoUpdate(cpu); } } else if (m_ui_update_ctr % 5 == 0 || m_ui_update_ctr < m_ui_fast_update_permission_deadline) @@ -966,7 +1005,7 @@ void debugger_frame::UpdateUI() std::memcpy(m_last_query_state.data(), static_cast(cpu), size_context); m_last_pc = cia; - DoUpdate(); + DoUpdate(cpu); const bool paused = !!(cpu->state & s_pause_flags); @@ -982,7 +1021,7 @@ void debugger_frame::UpdateUI() if (m_ui_update_ctr % 5) { // Call if it hasn't been called before - ShowPC(); + ShowPC(false, cpu); } if (is_using_interpreter(cpu->get_class())) @@ -1022,9 +1061,17 @@ void debugger_frame::UpdateUnitList() } std::vector>> cpu_list; - cpu_list.reserve(threads_created >= threads_deleted ? 0 : threads_created - threads_deleted); + cpu_list.reserve(threads_created >= threads_deleted ? threads_created - threads_deleted : 0); usz reselected_index = umax; + usz hw_ppu_idx = umax; + + if (u32 cur = m_choice_units->currentIndex(); cur >= m_hw_ppu_idx && cur < g_cfg.core.ppu_threads + m_hw_ppu_idx) + { + hw_ppu_idx = cur - m_hw_ppu_idx; + } + + m_hw_ppu_idx = umax; const auto on_select = [&](u32 id, cpu_thread& cpu) { @@ -1033,7 +1080,7 @@ void debugger_frame::UpdateUnitList() // Space at the end is to pad a gap on the right cpu_list.emplace_back(QString::fromStdString((id >> 24 == 0x55 ? "RSX[0x55555555]" : cpu.get_name()) + ' '), std::move(func_cpu)); - if (old_cpu_ptr == std::addressof(cpu)) + if (old_cpu_ptr == std::addressof(cpu) && hw_ppu_idx == umax) { reselected_index = cpu_list.size() - 1; } @@ -1046,6 +1093,40 @@ void debugger_frame::UpdateUnitList() idm::select>(on_select, idm::unlocked); } + m_hw_ppu_idx = cpu_list.size() + 1; // Account for NoThreadString thread + + for (u32 i = 0; i < g_cfg.core.ppu_threads + 0u; i++) + { + std::function get_ppu_at = [index = i, cpu_storage = shared_ptr>()]() mutable + { + reader_lock lock(lv2_obj::g_mutex); + + const auto ppu = lv2_obj::get_running_ppu(index); + + if (ppu == cpu_storage.get()) + { + // Nothing to do + } + else if (ppu) + { + cpu_storage = idm::get_unlocked>(ppu->id); + } + else + { + cpu_storage.reset(); + } + + return cpu_storage.get(); + }; + + if (hw_ppu_idx == i) + { + reselected_index = cpu_list.size(); + } + + cpu_list.emplace_back(tr("HwPPU[%0]: Hardware PPU Thread #%1").arg(i + 1).arg(i + 1), std::move(get_ppu_at)); + } + if (g_fxo->is_init>>()) { idm::select>(on_select, idm::unlocked); @@ -1114,6 +1195,7 @@ void debugger_frame::OnSelectUnit() } cpu_thread* selected = nullptr; + usz hw_ppu_idx = umax; if (m_emu_state != system_state::stopped) { @@ -1135,7 +1217,14 @@ void debugger_frame::OnSelectUnit() if (!selected && !m_rsx && !m_cpu) { - return; + if (u32 cur = m_choice_units->currentIndex(); cur >= m_hw_ppu_idx && cur < g_cfg.core.ppu_threads + m_hw_ppu_idx) + { + hw_ppu_idx = cur - m_hw_ppu_idx; + } + else + { + return; + } } } @@ -1144,6 +1233,15 @@ void debugger_frame::OnSelectUnit() m_rsx = nullptr; m_spu_disasm_memory.reset(); + if (hw_ppu_idx != umax) + { + if (hw_ppu_idx > 1) + { + // Sample PPU + selected = ::at32(m_threads_info, 1)(); + } + } + if (selected) { const u32 cpu_id = selected->id; @@ -1198,8 +1296,8 @@ void debugger_frame::OnSelectUnit() m_debugger_list->UpdateCPUData(m_disasm); m_breakpoint_list->UpdateCPUData(m_disasm); - ShowPC(true); - DoUpdate(); + ShowPC(true, selected); + DoUpdate(selected); UpdateUI(); } @@ -1339,30 +1437,28 @@ void debugger_frame::OnSelectSPUDisassembler() m_debugger_list->UpdateCPUData(m_disasm); m_breakpoint_list->UpdateCPUData(m_disasm); - ShowPC(true); - DoUpdate(); + ShowPC(true, nullptr); + DoUpdate(nullptr); UpdateUI(); }); m_spu_disasm_dialog->show(); } -void debugger_frame::DoUpdate() +void debugger_frame::DoUpdate(cpu_thread* cpu0) { // Check if we need to disable a step over bp - if (const auto cpu0 = get_cpu(); cpu0 && m_last_step_over_breakpoint != umax && cpu0->get_pc() == m_last_step_over_breakpoint) + if (cpu0 && m_last_step_over_breakpoint != umax && cpu0->get_pc() == m_last_step_over_breakpoint) { m_ppu_breakpoint_handler->RemoveBreakpoint(m_last_step_over_breakpoint); m_last_step_over_breakpoint = -1; } - WritePanels(); + WritePanels(cpu0); } -void debugger_frame::WritePanels() +void debugger_frame::WritePanels(cpu_thread* cpu) { - const auto cpu = get_cpu(); - if (!cpu) { m_misc_state->clear(); @@ -1412,7 +1508,9 @@ void debugger_frame::ShowGotoAddressDialog() QLineEdit* expression_input(new QLineEdit(m_goto_dialog)); expression_input->setFont(m_mono); - if (const auto thread = get_cpu(); !thread || thread->get_class() != thread_class::spu) + const auto thread = get_cpu(); + + if (!thread || thread->get_class() != thread_class::spu) { expression_input->setValidator(new HexValidator(expression_input)); } @@ -1436,8 +1534,8 @@ void debugger_frame::ShowGotoAddressDialog() m_goto_dialog->setLayout(vbox_panel); - const auto cpu_check = make_check_cpu(get_cpu()); - const auto cpu = cpu_check(); + const auto cpu_check = make_check_cpu(thread); + const auto cpu = thread; const QFont font = expression_input->font(); // -1 from get_pc() turns into 0 @@ -1544,9 +1642,12 @@ void debugger_frame::ClearCallStack() Q_EMIT CallStackUpdateRequested({}); } -void debugger_frame::ShowPC(bool user_requested) +void debugger_frame::ShowPC(bool user_requested, cpu_thread* cpu0) { - const auto cpu0 = get_cpu(); + if (!cpu0) + { + cpu0 = get_cpu(); + } const u32 pc = (cpu0 ? cpu0->get_pc() : (m_is_spu_disasm_mode ? m_spu_disasm_pc : 0)); diff --git a/rpcs3/rpcs3qt/debugger_frame.h b/rpcs3/rpcs3qt/debugger_frame.h index 6837347c3f..eb22d74680 100644 --- a/rpcs3/rpcs3qt/debugger_frame.h +++ b/rpcs3/rpcs3qt/debugger_frame.h @@ -79,6 +79,7 @@ class debugger_frame : public custom_dock_widget std::shared_ptr m_disasm; // Only shared to allow base/derived functionality shared_ptr m_cpu; rsx::thread* m_rsx = nullptr; + u32 m_hw_ppu_idx = umax; std::shared_ptr m_spu_disasm_memory; u32 m_spu_disasm_origin_eal = 0; u32 m_spu_disasm_pc = 0; @@ -107,8 +108,8 @@ public: void UpdateUI(); void UpdateUnitList(); - void DoUpdate(); - void WritePanels(); + void DoUpdate(cpu_thread* cpu0); + void WritePanels(cpu_thread* cpu); void EnableButtons(bool enable); void ShowGotoAddressDialog(); void PerformGoToRequest(const QString& text_argument); @@ -138,7 +139,7 @@ private Q_SLOTS: void OnSelectUnit(); void OnSelectSPUDisassembler(); void OnRegsContextMenu(const QPoint& pos); - void ShowPC(bool user_requested = false); + void ShowPC(bool user_requested = false, cpu_thread* cpu = nullptr); void EnableUpdateTimer(bool enable) const; void RunBtnPress(); void RegsShowMemoryViewerAction(); From fecb53f86c55fde6e260617f6b1289cabf1687bf Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Tue, 10 Mar 2026 17:35:23 +0200 Subject: [PATCH 398/630] Fix SaveStates cellDumxPamf regression --- rpcs3/Emu/savestate_utils.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index 167a060262..9306968dcf 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -23,7 +23,7 @@ struct serial_ver_t std::set compatible_versions; }; -static std::array s_serial_versions; +static std::array s_serial_versions; #define SERIALIZATION_VER(name, identifier, ...) \ \ @@ -40,7 +40,7 @@ static std::array s_serial_versions; return ::s_serial_versions[identifier].current_version;\ } -SERIALIZATION_VER(global_version, 0, 19) // For stuff not listed here +SERIALIZATION_VER(global_version, 0, 20) // For stuff not listed here SERIALIZATION_VER(ppu, 1, 1, 2/*PPU sleep order*/, 3/*PPU FNID and module*/) SERIALIZATION_VER(spu, 2, 1) SERIALIZATION_VER(lv2_sync, 3, 1) @@ -87,6 +87,15 @@ SERIALIZATION_VER(HLE, 25, 1) SERIALIZATION_VER(cellSysutil, 26, 1, 2/*AVC2 Muting,Volume*/) SERIALIZATION_VER(cellDmuxPamf, 27, 1) +// For future modules +SERIALIZATION_VER(cellReserved1, 27, 1) +SERIALIZATION_VER(cellReserved2, 28, 1) +SERIALIZATION_VER(cellReserved3, 29, 1) +SERIALIZATION_VER(cellReserved4, 30, 1) +SERIALIZATION_VER(cellReserved6, 31, 1) +SERIALIZATION_VER(cellReserved7, 32, 1) +SERIALIZATION_VER(cellReserved8, 33, 1) + template <> void fmt_class_string>::format(std::string& out, u64 arg) { From 29346412375d5eba0f5fb8eea721223aa1a1ab44 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 07:34:45 +0100 Subject: [PATCH 399/630] overlays: support playing audio with video_view --- .../Emu/RSX/Overlays/overlay_save_dialog.cpp | 7 ++++--- rpcs3/Emu/RSX/Overlays/overlay_video.cpp | 19 +++++++++---------- rpcs3/Emu/RSX/Overlays/overlay_video.h | 8 ++++---- rpcs3/rpcs3qt/qt_video_source.cpp | 14 ++++++++++++-- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp index 604dee7fc4..2847db969c 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp @@ -9,10 +9,11 @@ namespace rsx { save_dialog::save_dialog_entry::save_dialog_entry(const std::string& text1, const std::string& text2, const std::string& text3, u8 resource_id, const std::vector& icon_buf, const std::string& video_path) { + const std::string audio_path; // no audio here std::unique_ptr image = resource_id != image_resource_id::raw_image - ? std::make_unique(video_path, resource_id) - : !icon_buf.empty() ? std::make_unique(video_path, icon_buf) - : std::make_unique(video_path, resource_config::standard_image_resource::save); // Fallback + ? std::make_unique(video_path, audio_path, resource_id) + : !icon_buf.empty() ? std::make_unique(video_path, audio_path, icon_buf) + : std::make_unique(video_path, audio_path, resource_config::standard_image_resource::save); // Fallback image->set_size(160, 110); image->set_padding(36, 36, 11, 11); // Square image, 88x88 diff --git a/rpcs3/Emu/RSX/Overlays/overlay_video.cpp b/rpcs3/Emu/RSX/Overlays/overlay_video.cpp index ac6017d35f..44ca1f53ef 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_video.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_video.cpp @@ -6,9 +6,9 @@ namespace rsx { namespace overlays { - video_view::video_view(const std::string& video_path, const std::string& thumbnail_path) + video_view::video_view(const std::string& video_path, const std::string& audio_path, const std::string& thumbnail_path) { - init_video(video_path); + init_video(video_path, audio_path); if (!thumbnail_path.empty()) { @@ -17,9 +17,9 @@ namespace rsx } } - video_view::video_view(const std::string& video_path, const std::vector& thumbnail_buf) + video_view::video_view(const std::string& video_path, const std::string& audio_path, const std::vector& thumbnail_buf) { - init_video(video_path); + init_video(video_path, audio_path); if (!thumbnail_buf.empty()) { @@ -28,10 +28,10 @@ namespace rsx } } - video_view::video_view(const std::string& video_path, u8 thumbnail_id) + video_view::video_view(const std::string& video_path, const std::string& audio_path, u8 thumbnail_id) : m_thumbnail_id(thumbnail_id) { - init_video(video_path); + init_video(video_path, audio_path); set_image_resource(thumbnail_id); } @@ -39,13 +39,11 @@ namespace rsx { } - void video_view::init_video(const std::string& video_path) + void video_view::init_video(const std::string& video_path, const std::string& audio_path) { if (video_path.empty()) return; - m_video_source = Emu.GetCallbacks().make_video_source(); - ensure(!!m_video_source); - + m_video_source = ensure(Emu.GetCallbacks().make_video_source()); m_video_source->set_update_callback([this]() { if (m_video_active) @@ -54,6 +52,7 @@ namespace rsx } }); m_video_source->set_video_path(video_path); + m_video_source->set_audio_path(audio_path); } void video_view::set_active(bool active) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_video.h b/rpcs3/Emu/RSX/Overlays/overlay_video.h index 92297dee42..ab148c508d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_video.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_video.h @@ -19,9 +19,9 @@ namespace rsx class video_view final : public image_view { public: - video_view(const std::string& video_path, const std::string& thumbnail_path); - video_view(const std::string& video_path, const std::vector& thumbnail_buf); - video_view(const std::string& video_path, u8 thumbnail_id); + video_view(const std::string& video_path, const std::string& audio_path, const std::string& thumbnail_path); + video_view(const std::string& video_path, const std::string& audio_path, const std::vector& thumbnail_buf); + video_view(const std::string& video_path, const std::string& audio_path, u8 thumbnail_id); virtual ~video_view(); void set_active(bool active); @@ -30,7 +30,7 @@ namespace rsx compiled_resource& get_compiled() override; private: - void init_video(const std::string& video_path); + void init_video(const std::string& video_path, const std::string& audio_path); usz m_buffer_index = 0; std::array, 2> m_video_info; // double buffer diff --git a/rpcs3/rpcs3qt/qt_video_source.cpp b/rpcs3/rpcs3qt/qt_video_source.cpp index 2d4ce34aa3..8877e00c0c 100644 --- a/rpcs3/rpcs3qt/qt_video_source.cpp +++ b/rpcs3/rpcs3qt/qt_video_source.cpp @@ -335,7 +335,11 @@ void qt_video_source_wrapper::set_video_path(const std::string& video_path) { Emu.CallFromMainThread([this, path = video_path]() { - m_qt_video_source = std::make_unique(); + if (!m_qt_video_source) + { + m_qt_video_source = std::make_unique(); + } + m_qt_video_source->m_image_change_callback = [this](const QVideoFrame& frame) { std::unique_lock lock(m_qt_video_source->m_image_mutex); @@ -371,7 +375,12 @@ void qt_video_source_wrapper::set_audio_path(const std::string& audio_path) { Emu.CallFromMainThread([this, path = audio_path]() { - // TODO + if (!m_qt_video_source) + { + m_qt_video_source = std::make_unique(); + } + + m_qt_video_source->set_audio_path(path); }); } @@ -379,6 +388,7 @@ void qt_video_source_wrapper::set_active(bool active) { Emu.CallFromMainThread([this, active]() { + ensure(m_qt_video_source); m_qt_video_source->set_active(true); }); } From ee01d1186ffe80042a5f61830a6407ac739d07df Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 08:56:04 +0100 Subject: [PATCH 400/630] overlays: play SND0.AT3 during initialization --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/RSX/Overlays/overlay_audio.cpp | 30 ++++++++++++++++++++++ rpcs3/Emu/RSX/Overlays/overlay_audio.h | 23 +++++++++++++++++ rpcs3/Emu/RSX/Overlays/overlay_manager.cpp | 17 ++++++++++++ rpcs3/Emu/RSX/Overlays/overlay_manager.h | 6 +++++ rpcs3/Emu/RSX/RSXThread.cpp | 10 ++++++++ rpcs3/emucore.vcxproj | 4 ++- rpcs3/emucore.vcxproj.filters | 6 +++++ 8 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_audio.cpp create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_audio.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index edb98a6fa8..63951cfe92 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -500,6 +500,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/overlays.cpp RSX/Overlays/overlay_animated_icon.cpp RSX/Overlays/overlay_animation.cpp + RSX/Overlays/overlay_audio.cpp RSX/Overlays/overlay_compile_notification.cpp RSX/Overlays/overlay_controls.cpp RSX/Overlays/overlay_cursor.cpp diff --git a/rpcs3/Emu/RSX/Overlays/overlay_audio.cpp b/rpcs3/Emu/RSX/Overlays/overlay_audio.cpp new file mode 100644 index 0000000000..5483a5242e --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_audio.cpp @@ -0,0 +1,30 @@ +#include "stdafx.h" +#include "overlay_audio.h" +#include "Emu/System.h" + +namespace rsx +{ + namespace overlays + { + audio_player::audio_player(const std::string& audio_path) + { + init_audio(audio_path); + } + + void audio_player::init_audio(const std::string& audio_path) + { + if (audio_path.empty()) return; + + m_video_source = ensure(Emu.GetCallbacks().make_video_source()); + m_video_source->set_audio_path(audio_path); + } + + void audio_player::set_active(bool active) + { + if (m_video_source) + { + m_video_source->set_active(active); + } + } + } +} diff --git a/rpcs3/Emu/RSX/Overlays/overlay_audio.h b/rpcs3/Emu/RSX/Overlays/overlay_audio.h new file mode 100644 index 0000000000..cb37569225 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_audio.h @@ -0,0 +1,23 @@ +#pragma once + +#include "util/video_source.h" + +namespace rsx +{ + namespace overlays + { + class audio_player + { + public: + audio_player(const std::string& audio_path); + ~audio_player() = default; + + void set_active(bool active); + + private: + void init_audio(const std::string& audio_path); + + std::unique_ptr m_video_source; + }; + } +} diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp index 485a59443e..9ffa9b14e3 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp @@ -167,6 +167,23 @@ namespace rsx } } + void display_manager::start_audio(const std::string& audio_path) + { + if (audio_path.empty()) + { + m_audio_player.reset(); + return; + } + + m_audio_player = std::make_unique(audio_path); + m_audio_player->set_active(true); + } + + void display_manager::stop_audio() + { + m_audio_player.reset(); + } + void display_manager::on_overlay_activated(const std::shared_ptr& /*item*/) { // TODO: Internal management, callbacks, etc diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.h b/rpcs3/Emu/RSX/Overlays/overlay_manager.h index 7146be3dda..e42f3721b3 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.h @@ -1,6 +1,7 @@ #pragma once #include "overlays.h" +#include "overlay_audio.h" #include "Emu/IdManager.h" #include "Utilities/mutex.h" @@ -25,6 +26,8 @@ namespace rsx lf_queue m_type_ids_to_remove; atomic_t m_pending_removals_count = 0; + std::unique_ptr m_audio_player; + bool remove_type(u32 type_id); bool remove_uid(u32 uid); @@ -167,6 +170,9 @@ namespace rsx std::function on_input_loop_exit = nullptr, // [optional] What to do with the result if any std::function input_loop_override = nullptr); // [optional] What to do during the input loop. By default calls user_interface::run_input_loop + void start_audio(const std::string& audio_path); + void stop_audio(); + private: struct overlay_input_thread { diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index a8aa7cdf60..7d634de677 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -711,6 +711,11 @@ namespace rsx if (g_cfg.misc.use_native_interface && (g_cfg.video.renderer == video_renderer::opengl || g_cfg.video.renderer == video_renderer::vulkan)) { m_overlay_manager = g_fxo->init(0); + + if (const std::string audio_path = Emu.GetSfoDir(true) + "/SND0.AT3"; fs::is_file(audio_path)) + { + m_overlay_manager->start_audio(audio_path); + } } if (!_ar) @@ -1101,6 +1106,11 @@ namespace rsx thread_ctrl::set_thread_affinity_mask(thread_ctrl::get_affinity_mask(thread_class::rsx)); } + if (auto manager = g_fxo->try_get()) + { + manager->stop_audio(); + } + while (!test_stopped()) { // Wait for external pause events diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 8df2ef3092..0e07226729 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -145,6 +145,7 @@ + @@ -704,6 +705,7 @@ + @@ -1103,4 +1105,4 @@ - + \ No newline at end of file diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 5ca602fbec..7dfd6a3f34 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1411,6 +1411,9 @@ Loader + + Emu\GPU\RSX\Overlays + @@ -2833,6 +2836,9 @@ Loader + + Emu\GPU\RSX\Overlays + From 6b6dd6c43260311aa5a99c128fd61b442d19865d Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 9 Mar 2026 18:42:13 +0100 Subject: [PATCH 401/630] Qt: Rename Shortcuts to Keyboard Shortcuts --- rpcs3/rpcs3qt/main_window.ui | 2 +- rpcs3/rpcs3qt/shortcut_dialog.ui | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index 1f6a75c6f7..ba72c86a1e 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -1379,7 +1379,7 @@ - Shortcuts + Keyboard Shortcuts diff --git a/rpcs3/rpcs3qt/shortcut_dialog.ui b/rpcs3/rpcs3qt/shortcut_dialog.ui index efafa998a2..04dbdb2157 100644 --- a/rpcs3/rpcs3qt/shortcut_dialog.ui +++ b/rpcs3/rpcs3qt/shortcut_dialog.ui @@ -11,7 +11,7 @@ - Shortcuts + Keyboard Shortcuts @@ -25,10 +25,10 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::MinimumExpanding + QSizePolicy::Policy::MinimumExpanding @@ -50,10 +50,10 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::MinimumExpanding + QSizePolicy::Policy::MinimumExpanding @@ -71,7 +71,7 @@ - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Save + QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Save From e6cf05cfb73e156818685495814b0b7b8edaa97b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 11 Mar 2026 12:58:09 +0100 Subject: [PATCH 402/630] Qt: Fix log levels tooltip --- rpcs3/rpcs3qt/settings_dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index b903db0f52..66f0ae3476 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -2497,7 +2497,7 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std SubscribeTooltip(ui->gb_vulkansched, tooltips.settings.vulkan_async_scheduler); // Log levels - SubscribeTooltip(ui->gb_log_levels, tooltips.settings.vulkan_async_scheduler); + SubscribeTooltip(ui->gb_log_levels, tooltips.settings.log_levels); connect(ui->pb_log_levels, &QAbstractButton::clicked, this, [this]() { log_level_dialog* dlg = new log_level_dialog(this, m_emu_settings); From 6f07e8453a8cb84ac400bd96f825751c9cf661c8 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 18:57:39 +0100 Subject: [PATCH 403/630] Update curl to 8.19.0 --- 3rdparty/curl/curl | 2 +- 3rdparty/curl/libcurl.vcxproj | 28 ++++----- 3rdparty/curl/libcurl.vcxproj.filters | 84 +++++++++++++-------------- 3 files changed, 57 insertions(+), 57 deletions(-) diff --git a/3rdparty/curl/curl b/3rdparty/curl/curl index 400fffa90f..8c908d2d0a 160000 --- a/3rdparty/curl/curl +++ b/3rdparty/curl/curl @@ -1 +1 @@ -Subproject commit 400fffa90f30c7a2dc762fa33009d24851bd2016 +Subproject commit 8c908d2d0a6d32abdedda2c52e90bd56ec76c24d diff --git a/3rdparty/curl/libcurl.vcxproj b/3rdparty/curl/libcurl.vcxproj index dae28be346..4db28782a3 100644 --- a/3rdparty/curl/libcurl.vcxproj +++ b/3rdparty/curl/libcurl.vcxproj @@ -79,12 +79,16 @@ + + + + @@ -106,6 +110,7 @@ + @@ -169,14 +174,13 @@ - + - @@ -184,10 +188,8 @@ - - @@ -204,6 +206,7 @@ + @@ -224,13 +227,11 @@ - - @@ -272,6 +273,7 @@ + @@ -280,6 +282,9 @@ + + + @@ -300,9 +305,7 @@ - - @@ -312,6 +315,7 @@ + @@ -352,7 +356,6 @@ - @@ -367,7 +370,7 @@ - + @@ -376,7 +379,6 @@ - @@ -384,7 +386,6 @@ - @@ -405,6 +406,7 @@ + @@ -418,12 +420,10 @@ - - diff --git a/3rdparty/curl/libcurl.vcxproj.filters b/3rdparty/curl/libcurl.vcxproj.filters index 17f760c54b..d38316e767 100644 --- a/3rdparty/curl/libcurl.vcxproj.filters +++ b/3rdparty/curl/libcurl.vcxproj.filters @@ -204,9 +204,6 @@ Source Files - - Source Files - Source Files @@ -222,9 +219,6 @@ Source Files - - Source Files - Source Files @@ -246,18 +240,12 @@ Source Files - - Source Files - Source Files Source Files - - Source Files - Source Files @@ -318,9 +306,6 @@ Source Files - - Source Files - Source Files @@ -333,9 +318,6 @@ Source Files - - Source Files - Source Files @@ -549,6 +531,27 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -653,9 +656,6 @@ Header Files - - Header Files - Header Files @@ -758,9 +758,6 @@ Header Files - - Header Files - Header Files @@ -791,9 +788,6 @@ Header Files - - Header Files - Header Files @@ -812,9 +806,6 @@ Header Files - - Header Files - Header Files @@ -836,9 +827,6 @@ Header Files - - Header Files - Header Files @@ -887,9 +875,6 @@ Header Files - - Header Files - Header Files @@ -899,9 +884,6 @@ Header Files - - Header Files - Header Files @@ -1103,9 +1085,6 @@ Header Files - - Header Files - Header Files @@ -1121,6 +1100,27 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + From 951d47c94c1428a40f1f676129a3ab901bd41860 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Fri, 13 Mar 2026 21:54:15 -0700 Subject: [PATCH 404/630] Use System Protobuf for Intel Mac --- .ci/build-mac.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/build-mac.sh b/.ci/build-mac.sh index 300f69cb06..f386866264 100755 --- a/.ci/build-mac.sh +++ b/.ci/build-mac.sh @@ -122,6 +122,7 @@ cmake .. \ -DUSE_SYSTEM_MVK=ON \ -DUSE_SYSTEM_SDL=ON \ -DUSE_SYSTEM_OPENCV=ON \ + -DUSE_SYSTEM_PROTOBUF=ON \ -G Ninja fi From b734ceb2e7ad279567bd2fad88c8e778f27264e9 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 13 Mar 2026 13:55:10 +0100 Subject: [PATCH 405/630] overlays: allow to reset current setting --- .../HomeMenu/overlay_home_menu_page.cpp | 21 +++++- .../HomeMenu/overlay_home_menu_page.h | 3 + .../HomeMenu/overlay_home_menu_settings.h | 75 ++++++++++++++++--- rpcs3/Emu/localized_string_id.h | 1 + rpcs3/rpcs3qt/localized_emu.h | 1 + 5 files changed, 87 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp index edfb932d26..551f3dc82b 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp @@ -11,6 +11,7 @@ namespace rsx : list_view(width, height, use_separators) , parent(parent) , title(title) + , m_reset_btn(120, 30) , m_save_btn(120, 30) , m_discard_btn(120, 30) { @@ -20,15 +21,19 @@ namespace rsx m_config_changed = parent->m_config_changed; } + m_reset_btn.set_image_resource(resource_config::standard_image_resource::select); m_save_btn.set_image_resource(resource_config::standard_image_resource::square); m_discard_btn.set_image_resource(resource_config::standard_image_resource::triangle); + m_reset_btn.set_pos((width - 120) / 2, height + 20); m_save_btn.set_pos(width - 2 * (30 + 120), height + 20); m_discard_btn.set_pos(width - (30 + 120), height + 20); + m_reset_btn.set_text(localized_string_id::HOME_MENU_SETTINGS_RESET_BUTTON); m_save_btn.set_text(localized_string_id::HOME_MENU_SETTINGS_SAVE_BUTTON); m_discard_btn.set_text(localized_string_id::HOME_MENU_SETTINGS_DISCARD_BUTTON); + m_reset_btn.set_font("Arial", 16); m_save_btn.set_font("Arial", 16); m_discard_btn.set_font("Arial", 16); @@ -152,6 +157,7 @@ namespace rsx case pad_button::ls_left: case pad_button::ls_right: case pad_button::cross: + case pad_button::select: { if (const usz index = static_cast(get_selected_index()); index < m_callbacks.size()) { @@ -266,6 +272,7 @@ namespace rsx list_view::translate(_x, _y); m_save_btn.translate(_x, _y); m_discard_btn.translate(_x, _y); + m_reset_btn.translate(_x, _y); } compiled_resource& home_menu_page::get_compiled() @@ -286,10 +293,18 @@ namespace rsx { compiled_resources.add(m_message_box->get_compiled()); } - else if (m_config_changed && *m_config_changed) + else { - compiled_resources.add(m_save_btn.get_compiled()); - compiled_resources.add(m_discard_btn.get_compiled()); + if (show_reset_button()) + { + compiled_resources.add(m_reset_btn.get_compiled()); + } + + if (m_config_changed && *m_config_changed) + { + compiled_resources.add(m_save_btn.get_compiled()); + compiled_resources.add(m_discard_btn.get_compiled()); + } } } diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h index 862baf5062..dcbfcc805f 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h @@ -20,6 +20,8 @@ namespace rsx void translate(s16 _x, s16 _y) override; compiled_resource& get_compiled() override; + virtual bool show_reset_button() const { return false; } + bool is_current_page = false; home_menu_page* parent = nullptr; std::string title; @@ -36,6 +38,7 @@ namespace rsx std::vector> m_pages; private: + image_button m_reset_btn; image_button m_save_btn; image_button m_discard_btn; std::vector> m_entries; diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h index 9e54cfd441..3bff68138a 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h @@ -21,6 +21,8 @@ namespace rsx { using home_menu_page::home_menu_page; + bool show_reset_button() const override { return true; } + void add_checkbox(cfg::_bool* setting, localized_string_id loc_id) { ensure(setting && setting->get_is_dynamic()); @@ -30,16 +32,30 @@ namespace rsx add_item(elem, [this, setting](pad_button btn) -> page_navigation { - if (btn != pad_button::cross) return page_navigation::stay; - if (setting) { - const bool value = !setting->get(); - rsx_log.notice("User toggled checkbox in '%s'. Setting '%s' to %d", title, setting->get_name(), value); - setting->set(value); - Emu.GetCallbacks().update_emu_settings(); - if (m_config_changed) *m_config_changed = true; - refresh(); + bool value = setting->get(); + + switch (btn) + { + case pad_button::cross: + value = !value; + break; + case pad_button::select: + value = setting->def; + break; + default: + return page_navigation::stay; + } + + if (value != setting->get()) + { + rsx_log.notice("User toggled checkbox in '%s'. Setting '%s' to %d", title, setting->get_name(), value); + setting->set(value); + Emu.GetCallbacks().update_emu_settings(); + if (m_config_changed) *m_config_changed = true; + refresh(); + } } return page_navigation::stay; @@ -56,12 +72,33 @@ namespace rsx add_item(elem, [this, setting](pad_button btn) -> page_navigation { - if (btn != pad_button::cross) return page_navigation::stay; - if (setting) { + bool set_default = false; + switch (btn) + { + case pad_button::cross: + break; + case pad_button::select: + set_default = true; + break; + default: + return page_navigation::stay; + } + + T value = setting->get(); + + if (set_default) + { + if (value == setting->def) + { + return page_navigation::stay; + } + + value = setting->def; + } + usz new_index = 0; - const T value = setting->get(); const std::string val = fmt::format("%s", value); const std::vector list = setting->to_list(); @@ -70,10 +107,17 @@ namespace rsx const std::string& entry = list[i]; if (entry == val) { + if (set_default) + { + new_index = i; + break; + } + new_index = (i + 1) % list.size(); break; } } + if (const std::string& next_value = ::at32(list, new_index); setting->from_string(next_value)) { rsx_log.notice("User toggled dropdown in '%s'. Setting '%s' to %s", title, setting->get_name(), next_value); @@ -114,6 +158,9 @@ namespace rsx case pad_button::ls_right: value = std::min(value + step_size, maximum); break; + case pad_button::select: + value = setting->def; + break; default: return page_navigation::stay; } @@ -164,6 +211,9 @@ namespace rsx } while (exceptions.contains(value)); break; + case pad_button::select: + value = setting->def; + break; default: return page_navigation::stay; } @@ -205,6 +255,9 @@ namespace rsx case pad_button::ls_right: value = std::min(value + step_size, static_cast(maximum)); break; + case pad_button::select: + value = setting->def; + break; default: return page_navigation::stay; } diff --git a/rpcs3/Emu/localized_string_id.h b/rpcs3/Emu/localized_string_id.h index 9ab9f57a9b..b4ef2516fe 100644 --- a/rpcs3/Emu/localized_string_id.h +++ b/rpcs3/Emu/localized_string_id.h @@ -204,6 +204,7 @@ enum class localized_string_id HOME_MENU_SETTINGS_SAVE_BUTTON, HOME_MENU_SETTINGS_DISCARD, HOME_MENU_SETTINGS_DISCARD_BUTTON, + HOME_MENU_SETTINGS_RESET_BUTTON, HOME_MENU_SETTINGS_AUDIO, HOME_MENU_SETTINGS_AUDIO_MASTER_VOLUME, HOME_MENU_SETTINGS_AUDIO_BACKEND, diff --git a/rpcs3/rpcs3qt/localized_emu.h b/rpcs3/rpcs3qt/localized_emu.h index d05d3e52ee..920f9d9d14 100644 --- a/rpcs3/rpcs3qt/localized_emu.h +++ b/rpcs3/rpcs3qt/localized_emu.h @@ -225,6 +225,7 @@ private: case localized_string_id::HOME_MENU_SETTINGS_SAVE_BUTTON: return tr("Save"); case localized_string_id::HOME_MENU_SETTINGS_DISCARD: return tr("Discard the current settings' changes?"); case localized_string_id::HOME_MENU_SETTINGS_DISCARD_BUTTON: return tr("Discard"); + case localized_string_id::HOME_MENU_SETTINGS_RESET_BUTTON: return tr("To default"); case localized_string_id::HOME_MENU_SETTINGS_AUDIO: return tr("Audio"); case localized_string_id::HOME_MENU_SETTINGS_AUDIO_MASTER_VOLUME: return tr("Master Volume", "Audio"); case localized_string_id::HOME_MENU_SETTINGS_AUDIO_BACKEND: return tr("Audio Backend", "Audio"); From 4542020c869f044fca2bf5b630587e5b47148afb Mon Sep 17 00:00:00 2001 From: Malcolm Date: Tue, 17 Feb 2026 18:27:32 -0500 Subject: [PATCH 406/630] SPU LLVM: ARM64: Use UDOT for emulating SUMB --- rpcs3/Emu/CPU/CPUTranslator.cpp | 7 ++++++ rpcs3/Emu/CPU/CPUTranslator.h | 37 ++++++++++++++++++++++++++++ rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 13 +++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.cpp b/rpcs3/Emu/CPU/CPUTranslator.cpp index f799e4b6be..08e8e9ad30 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.cpp +++ b/rpcs3/Emu/CPU/CPUTranslator.cpp @@ -201,6 +201,13 @@ void cpu_translator::initialize(llvm::LLVMContext& context, llvm::ExecutionEngin m_use_vnni = true; m_use_gfni = true; } + +#ifdef ARCH_ARM64 + if (utils::has_dotprod()) + { + m_use_dotprod = true; + } +#endif } llvm::Value* cpu_translator::bitcast(llvm::Value* val, llvm::Type* type) const diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index 27abb22219..81049c6074 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -3090,6 +3090,9 @@ protected: // For now, setting this flag will speed up SPU verification // but I will remove this later with explicit parralelism - Whatcookie bool m_use_avx = true; + + // ARMv8 SDOT/UDOT + bool m_use_dotprod = false; #else // Allow FMA bool m_use_fma = false; @@ -3658,6 +3661,40 @@ public: return result; } +template + value_t udot(T1 a, T2 b, T3 c) + { + value_t result; + + const auto data0 = a.eval(m_ir); + const auto data1 = b.eval(m_ir); + const auto data2 = c.eval(m_ir); + + // ARM hardware requires the multipliers to be treated as 16-byte vectors + //const auto op1 = bitcast(data1, get_type()); + //const auto op2 = bitcast(data2, get_type()); + + // Use the variadic get_intrinsic to resolve the overloaded AArch64 intrinsic + result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::aarch64_neon_udot), {data0, data1, data2}); + return result; + } + + template + value_t sdot(T1 a, T2 b, T3 c) + { + value_t result; + + const auto data0 = a.eval(m_ir); + const auto data1 = b.eval(m_ir); + const auto data2 = c.eval(m_ir); + + //const auto op1 = bitcast(data1, get_type()); + //const auto op2 = bitcast(data2, get_type()); + + result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::aarch64_neon_sdot), {data0, data1, data2}); + return result; + } + template value_t vpermb(T1 a, T2 b) { diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index d42acd3560..45b4c83ecf 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -5313,13 +5313,24 @@ public: return; } +#ifdef ARCH_ARM64 + if (m_use_dotprod) +#else if (m_use_vnni) +#endif { - const auto [a, b] = get_vrs(op.ra, op.rb); const auto zeroes = splat(0); +#ifdef ARCH_ARM64 + const auto [a, b] = get_vrs(op.ra, op.rb); + const auto ones = splat(0x01); + const auto ax = bitcast(udot(zeroes, a, ones)); + const auto bx = bitcast(udot(zeroes, b, ones)); +#else + const auto [a, b] = get_vrs(op.ra, op.rb); const auto ones = splat(0x01010101); const auto ax = bitcast(vpdpbusd(zeroes, a, ones)); const auto bx = bitcast(vpdpbusd(zeroes, b, ones)); +#endif set_vr(op.rt, shuffle2(ax, bx, 0, 8, 2, 10, 4, 12, 6, 14)); return; } From 16277576089e1733987deeac54b627b25d67d800 Mon Sep 17 00:00:00 2001 From: Malcolm Date: Wed, 18 Feb 2026 23:53:48 -0500 Subject: [PATCH 407/630] SPU LLVM: Emulate GBB with udot/sdot Greatly simplifies GB, GBH, and GBH. Uses udot/sdot with power of two masks to shift values and sum them in a single step, effectively gathering them --- rpcs3/Emu/CPU/CPUTranslator.h | 24 +++-- rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 139 +++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index 81049c6074..9b9804fd39 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -3661,6 +3661,7 @@ public: return result; } +#ifdef ARCH_ARM64 template value_t udot(T1 a, T2 b, T3 c) { @@ -3670,11 +3671,6 @@ template const auto data1 = b.eval(m_ir); const auto data2 = c.eval(m_ir); - // ARM hardware requires the multipliers to be treated as 16-byte vectors - //const auto op1 = bitcast(data1, get_type()); - //const auto op2 = bitcast(data2, get_type()); - - // Use the variadic get_intrinsic to resolve the overloaded AArch64 intrinsic result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::aarch64_neon_udot), {data0, data1, data2}); return result; } @@ -3688,12 +3684,24 @@ template const auto data1 = b.eval(m_ir); const auto data2 = c.eval(m_ir); - //const auto op1 = bitcast(data1, get_type()); - //const auto op2 = bitcast(data2, get_type()); - result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::aarch64_neon_sdot), {data0, data1, data2}); return result; } + +template + auto addp(T1 a, T2 b) + { + using T_vector = typename is_llvm_expr::type; + const auto data1 = a.eval(m_ir); + const auto data2 = b.eval(m_ir); + + const auto func = get_intrinsic(llvm::Intrinsic::aarch64_neon_addp); + + value_t result; + result.value = m_ir->CreateCall(func, {data1, data2}); + return result; + } +#endif template value_t vpermb(T1 a, T2 b) diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 45b4c83ecf..856a039e5e 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -4759,6 +4759,50 @@ public: } const auto a = get_vr(op.ra); + +#ifdef ARCH_ARM64 + // Use dot product instructions with special values to shift then sum results into the preferred slot + if (m_use_dotprod) + { + if (match_vr(op.ra, [&](auto c, auto MP) + { + using VT = typename decltype(MP)::type; + + if (auto [ok, x] = match_expr(c, sext(match]>())); ok) + { + const auto zeroes = splat(0); + + const auto es = zshuffle(bitcast(a), 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 4, 8, 12); + + set_vr(op.rt, sdot(zeroes, es, build( + -0x01, -0x02, -0x04, -0x08, + -0x01, -0x02, -0x04, -0x08, + -0x01, -0x02, -0x04, -0x08, + -0x01, -0x02, -0x04, -0x08 + ))); + return true; + } + return false; + })) + { + return; + } + + const auto zeroes = splat(0); + const auto masked = a & 0x01; + + const auto es = zshuffle(bitcast(masked), 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 4, 8, 12); + + set_vr(op.rt, udot(zeroes, es, build( + 0x01, 0x02, 0x04, 0x08, + 0x01, 0x02, 0x04, 0x08, + 0x01, 0x02, 0x04, 0x08, + 0x01, 0x02, 0x04, 0x08 + ))); + return; + } +#endif + const auto m = zext(bitcast(trunc(a))); set_vr(op.rt, insert(splat(0), 3, eval(m))); } @@ -4774,6 +4818,54 @@ public: } const auto a = get_vr(op.ra); + +#ifdef ARCH_ARM64 + // Use dot product instructions with special values to shift then sum results into the preferred slot + if (m_use_dotprod) + { + if (match_vr(op.ra, [&](auto c, auto MP) + { + using VT = typename decltype(MP)::type; + + if (auto [ok, x] = match_expr(c, sext(match]>())); ok) + { + const auto zeroes = splat(0); + + const auto es = zshuffle(bitcast(a), 16, 16, 16, 16, 16, 16, 16, 16, 0, 2, 4, 6, 8, 10, 12, 14); + + const auto extracted = sdot(zeroes, es, build( + -0x01, -0x02, -0x04, -0x08, + -0x10, -0x20, -0x40, -0x80, + -0x01, -0x02, -0x04, -0x08, + -0x10, -0x20, -0x40, -0x80 + )); + + set_vr(op.rt, addp(zeroes, bitcast(extracted))); + return true; + } + return false; + })) + { + return; + } + + const auto zeroes = splat(0); + const auto masked = a & 0x01; + + const auto es = zshuffle(bitcast(masked), 16, 16, 16, 16, 16, 16, 16, 16, 0, 2, 4, 6, 8, 10, 12, 14); + + const auto extracted = udot(zeroes, es, build( + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80 + )); + + set_vr(op.rt, addp(zeroes, bitcast(extracted))); + return; + } +#endif + const auto m = zext(bitcast(trunc(a))); set_vr(op.rt, insert(splat(0), 3, eval(m))); } @@ -4782,6 +4874,53 @@ public: { const auto a = get_vr(op.ra); +#ifdef ARCH_ARM64 + // Use dot product instructions with special values to shift then sum results into the preferred slot + if (m_use_dotprod) + { + if (match_vr(op.ra, [&](auto c, auto MP) + { + using VT = typename decltype(MP)::type; + + if (auto [ok, x] = match_expr(c, sext(match]>())); ok) + { + const auto zeroes = splat(0); + + const auto extracted = sdot(zeroes, a, build( + -0x01, -0x02, -0x04, -0x08, + -0x10, -0x20, -0x40, -0x80, + -0x01, -0x02, -0x04, -0x08, + -0x10, -0x20, -0x40, -0x80 + )); + + const auto es = zshuffle(bitcast(extracted), 16, 16, 16, 16, 16, 16, 16, 16, 0, 8, 4, 12, 16, 16, 16, 16); + const auto zeroes16 = splat(0); + set_vr(op.rt, addp(zeroes16, bitcast(es))); + return true; + } + return false; + })) + { + return; + } + + const auto zeroes = splat(0); + const auto masked = a & 0x01; + + const auto extracted = udot(zeroes, masked, build( + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80 + )); + + const auto es = zshuffle(bitcast(extracted), 16, 16, 16, 16, 16, 16, 16, 16, 0, 8, 4, 12, 16, 16, 16, 16); + const auto zeroes16 = splat(0); + set_vr(op.rt, addp(zeroes16, bitcast(es))); + return; + } +#endif + if (m_use_gfni) { const auto as = zshuffle(a, 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8); From 5274210ba8307f1c0a45a8398d3ba9e9c8840f19 Mon Sep 17 00:00:00 2001 From: jfleezy23 Date: Sun, 15 Mar 2026 01:53:07 -0700 Subject: [PATCH 408/630] VK: scale auto shader compiler workers on wide CPUs --- rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp | 44 ++++++++++++++++--------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp index 26e0b64098..99462e0602 100644 --- a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp @@ -216,16 +216,27 @@ namespace vk return {}; } - void initialize_pipe_compiler(int num_worker_threads) - { - if (num_worker_threads == 0) - { - // Select optimal number of compiler threads - const auto hw_threads = utils::get_thread_count(); - if (hw_threads > 12) - { - num_worker_threads = 6; - } + void initialize_pipe_compiler(int num_worker_threads) + { + if (num_worker_threads == 0) + { + // Select a conservative but modern default for async pipeline compilation. + // Older heuristics topped out too early on high-core CPUs and left large + // shader bursts queued longer than necessary. + const auto hw_threads = utils::get_thread_count(); + + if (hw_threads >= 24) + { + num_worker_threads = 12; + } + else if (hw_threads >= 16) + { + num_worker_threads = 8; + } + else if (hw_threads > 12) + { + num_worker_threads = 6; + } else if (hw_threads > 8) { num_worker_threads = 4; @@ -234,11 +245,14 @@ namespace vk { num_worker_threads = 2; } - else - { - num_worker_threads = 1; - } - } + else + { + num_worker_threads = 1; + } + + rsx_log.notice("Async pipeline compiler auto-selected %d worker(s) for %u host thread(s).", + num_worker_threads, hw_threads); + } ensure(num_worker_threads >= 1); ensure(g_render_device); // "Cannot initialize pipe compiler before creating a logical device" From 9733d8c8572ba6c32a830e0fc251f7220ddc71b6 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:37:20 +0100 Subject: [PATCH 409/630] config: Move FSR CAS out of Vulkan subcategory FSR1 was already implemented for OpenGL as well, so this setting is no longer exclusive to the Vulkan render --- rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp | 2 +- rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp | 2 +- rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp | 2 +- rpcs3/Emu/system_config.h | 2 +- rpcs3/rpcs3qt/emu_settings_type.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp b/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp index cfd7b1cc08..75e2d3f3db 100644 --- a/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp +++ b/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp @@ -152,7 +152,7 @@ namespace gl void rcas_pass::configure() { // 0 is actually the sharpest with 2 being the chosen limit. Each progressive unit 'halves' the sharpening intensity. - auto cas_attenuation = 2.f - (g_cfg.video.vk.rcas_sharpening_intensity / 50.f); + auto cas_attenuation = 2.f - (g_cfg.video.rcas_sharpening_intensity / 50.f); FsrRcasCon(&m_constants_buf[0], cas_attenuation); } } diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp index c0e3a72b6f..34999eb775 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp @@ -44,7 +44,7 @@ namespace rsx add_dropdown(&g_cfg.video.output_scaling, localized_string_id::HOME_MENU_SETTINGS_VIDEO_OUTPUT_SCALING); if (g_cfg.video.renderer == video_renderer::vulkan && g_cfg.video.output_scaling == output_scaling_mode::fsr) { - add_unsigned_slider(&g_cfg.video.vk.rcas_sharpening_intensity, localized_string_id::HOME_MENU_SETTINGS_VIDEO_RCAS_SHARPENING, " %", 1); + add_unsigned_slider(&g_cfg.video.rcas_sharpening_intensity, localized_string_id::HOME_MENU_SETTINGS_VIDEO_RCAS_SHARPENING, " %", 1); } add_checkbox(&g_cfg.video.stretch_to_display_area, localized_string_id::HOME_MENU_SETTINGS_VIDEO_STRETCH_TO_DISPLAY); diff --git a/rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp b/rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp index 869dba6fa9..fbd4e868f9 100644 --- a/rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp +++ b/rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp @@ -176,7 +176,7 @@ namespace vk void rcas_pass::configure(const vk::command_buffer& cmd) { // 0 is actually the sharpest with 2 being the chosen limit. Each progressive unit 'halves' the sharpening intensity. - auto cas_attenuation = 2.f - (g_cfg.video.vk.rcas_sharpening_intensity / 50.f); + auto cas_attenuation = 2.f - (g_cfg.video.rcas_sharpening_intensity / 50.f); FsrRcasCon(&m_constants_buf[0], cas_attenuation); vkCmdPushConstants(cmd, m_program->layout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, push_constants_size, m_constants_buf); diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 8ccf91db0e..1f13629878 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -177,6 +177,7 @@ struct cfg_root : cfg::node cfg::_enum output_scaling{ this, "Output Scaling Mode", output_scaling_mode::bilinear, true }; cfg::_bool record_with_overlays{ this, "Record With Overlays", true, true }; cfg::_bool disable_hardware_texel_remapping{ this, "Disable Hardware ColorSpace Remapping", false, true }; + cfg::uint<0, 100> rcas_sharpening_intensity{ this, "FidelityFX CAS Sharpening Intensity", 50, true }; struct node_vk : cfg::node { @@ -187,7 +188,6 @@ struct cfg_root : cfg::node cfg::_bool force_primitive_restart{ this, "Force primitive restart flag" }; cfg::_enum exclusive_fullscreen_mode{ this, "Exclusive Fullscreen Mode", vk_exclusive_fs_mode::unspecified}; cfg::_bool asynchronous_texture_streaming{ this, "Asynchronous Texture Streaming 2", false }; - cfg::uint<0, 100> rcas_sharpening_intensity{ this, "FidelityFX CAS Sharpening Intensity", 50, true }; cfg::_enum asynchronous_scheduler{ this, "Asynchronous Queue Scheduler", vk_gpu_scheduler_mode::safe }; cfg::uint<256, 65536> vram_allocation_limit{ this, "VRAM allocation limit (MB)", 65536, false }; cfg::_bool use_rebar_upload_heap{ this, "Use Re-BAR for GPU uploads", true, false }; diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index 67238571d3..73ed86e267 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -317,11 +317,11 @@ inline static const std::map settings_location { emu_settings_type::DisableAsyncHostMM, { "Video", "Disable Asynchronous Memory Manager"}}, { emu_settings_type::RecordWithOverlays, { "Video", "Record With Overlays"}}, { emu_settings_type::DisableHWTexelRemapping, { "Video", "Disable Hardware ColorSpace Remapping"}}, + { emu_settings_type::FsrSharpeningStrength, { "Video", "FidelityFX CAS Sharpening Intensity"}}, // Vulkan { emu_settings_type::VulkanAsyncTextureUploads, { "Video", "Vulkan", "Asynchronous Texture Streaming 2"}}, { emu_settings_type::VulkanAsyncSchedulerDriver, { "Video", "Vulkan", "Asynchronous Queue Scheduler"}}, - { emu_settings_type::FsrSharpeningStrength, { "Video", "Vulkan", "FidelityFX CAS Sharpening Intensity"}}, { emu_settings_type::ExclusiveFullscreenMode, { "Video", "Vulkan", "Exclusive Fullscreen Mode"}}, { emu_settings_type::UseReBAR, { "Video", "Vulkan", "Use Re-BAR for GPU uploads"}}, From 60eb1ce2ecf95cd9de7f7ebf54eb234de9fd4960 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:38:42 +0100 Subject: [PATCH 410/630] config: Fix naming of Asynchronous Texture Streaming Rename from 'Asynchronous Texture Streaming 2' to 'Asynchronous Texture Streaming' --- rpcs3/Emu/system_config.h | 2 +- rpcs3/rpcs3qt/emu_settings_type.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 1f13629878..89da08e884 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -187,7 +187,7 @@ struct cfg_root : cfg::node cfg::_bool force_fifo{ this, "Force FIFO present mode" }; cfg::_bool force_primitive_restart{ this, "Force primitive restart flag" }; cfg::_enum exclusive_fullscreen_mode{ this, "Exclusive Fullscreen Mode", vk_exclusive_fs_mode::unspecified}; - cfg::_bool asynchronous_texture_streaming{ this, "Asynchronous Texture Streaming 2", false }; + cfg::_bool asynchronous_texture_streaming{ this, "Asynchronous Texture Streaming", false }; cfg::_enum asynchronous_scheduler{ this, "Asynchronous Queue Scheduler", vk_gpu_scheduler_mode::safe }; cfg::uint<256, 65536> vram_allocation_limit{ this, "VRAM allocation limit (MB)", 65536, false }; cfg::_bool use_rebar_upload_heap{ this, "Use Re-BAR for GPU uploads", true, false }; diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index 73ed86e267..b2014dd7bc 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -320,7 +320,7 @@ inline static const std::map settings_location { emu_settings_type::FsrSharpeningStrength, { "Video", "FidelityFX CAS Sharpening Intensity"}}, // Vulkan - { emu_settings_type::VulkanAsyncTextureUploads, { "Video", "Vulkan", "Asynchronous Texture Streaming 2"}}, + { emu_settings_type::VulkanAsyncTextureUploads, { "Video", "Vulkan", "Asynchronous Texture Streaming"}}, { emu_settings_type::VulkanAsyncSchedulerDriver, { "Video", "Vulkan", "Asynchronous Queue Scheduler"}}, { emu_settings_type::ExclusiveFullscreenMode, { "Video", "Vulkan", "Exclusive Fullscreen Mode"}}, { emu_settings_type::UseReBAR, { "Video", "Vulkan", "Use Re-BAR for GPU uploads"}}, From b24524fc753ca4584a1da93d25dc0bda21852e13 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:40:12 +0100 Subject: [PATCH 411/630] config: Fix naming of SPU XFloat Accuracy Rename from 'XFloat Accuracy' to 'SPU XFloat Accuracy' --- rpcs3/Emu/system_config.h | 2 +- rpcs3/rpcs3qt/emu_settings_type.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 89da08e884..3d7dba8798 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -61,7 +61,7 @@ struct cfg_root : cfg::node cfg::uint<0, 16> mfc_transfers_shuffling{ this, "MFC Commands Shuffling Limit", 0 }; cfg::uint<0, 10000> mfc_transfers_timeout{ this, "MFC Commands Timeout", 0, true }; cfg::_bool mfc_shuffling_in_steps{ this, "MFC Commands Shuffling In Steps", false, true }; - cfg::_enum spu_xfloat_accuracy{ this, "XFloat Accuracy", xfloat_accuracy::approximate, false }; + cfg::_enum spu_xfloat_accuracy{ this, "SPU XFloat Accuracy", xfloat_accuracy::approximate, false }; cfg::_int<-1, 14> ppu_128_reservations_loop_max_length{ this, "Accurate PPU 128-byte Reservation Op Max Length", 0, true }; // -1: Always accurate, 0: Never accurate, 1-14: max accurate loop length cfg::_int<-64, 64> stub_ppu_traps{ this, "Stub PPU Traps", 0, true }; // Hack, skip PPU traps for rare cases where the trap is continueable (specify relative instructions to skip) cfg::_bool precise_spu_verification{ this, "Precise SPU Verification", false }; // Disables use of xorsum based spu verification if enabled. diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index b2014dd7bc..a3e47fe733 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -241,7 +241,7 @@ inline static const std::map settings_location { emu_settings_type::AccurateClineStores, { "Core", "Accurate Cache Line Stores"}}, { emu_settings_type::AccurateRSXAccess, { "Core", "Accurate RSX reservation access"}}, { emu_settings_type::FIFOAccuracy, { "Core", "RSX FIFO Fetch Accuracy"}}, - { emu_settings_type::XFloatAccuracy, { "Core", "XFloat Accuracy"}}, + { emu_settings_type::XFloatAccuracy, { "Core", "SPU XFloat Accuracy"}}, { emu_settings_type::MFCCommandsShuffling, { "Core", "MFC Commands Shuffling Limit"}}, { emu_settings_type::SetDAZandFTZ, { "Core", "Set DAZ and FTZ"}}, { emu_settings_type::SPUBlockSize, { "Core", "SPU Block Size"}}, From 0bb6299e39c904722e5297fd46dc6f423a86dc4d Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:41:55 +0100 Subject: [PATCH 412/630] ui: Specify Anti-Aliasing as MSAA --- rpcs3/rpcs3qt/settings_dialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 76a418298d..7a5e8b6865 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -473,7 +473,7 @@ - Anti-Aliasing + Anti-Aliasing (MSAA) From bc58dff7154ad014df6ea606bc3c77af141bec84 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:52:48 +0100 Subject: [PATCH 413/630] ui: Rename depth buffers to depth buffer Removes ambiguity between config and ui --- rpcs3/rpcs3qt/settings_dialog.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 7a5e8b6865..4ced973883 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2674,14 +2674,14 @@ - Read Depth Buffers + Read Depth Buffer - Write Depth Buffers + Write Depth Buffer From 7712584bd492796784d971edf11c4dffb1f6a317 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 10:46:51 +0100 Subject: [PATCH 414/630] ui: Merge exit/boot game dialog options --- rpcs3/rpcs3qt/settings_dialog.cpp | 5 ----- rpcs3/rpcs3qt/settings_dialog.ui | 9 +-------- rpcs3/rpcs3qt/tooltips.h | 3 +-- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 66f0ae3476..d206a40de8 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -2165,7 +2165,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std SubscribeTooltip(ui->cb_custom_colors, tooltips.settings.custom_colors); SubscribeTooltip(ui->cb_show_welcome, tooltips.settings.show_welcome); SubscribeTooltip(ui->cb_show_exit_game, tooltips.settings.show_exit_game); - SubscribeTooltip(ui->cb_show_boot_game, tooltips.settings.show_boot_game); SubscribeTooltip(ui->cb_show_pkg_install, tooltips.settings.show_pkg_install); SubscribeTooltip(ui->cb_show_pup_install, tooltips.settings.show_pup_install); SubscribeTooltip(ui->cb_show_obsolete_cfg_dialog, tooltips.settings.show_obsolete_cfg); @@ -2273,7 +2272,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std ui->cb_show_welcome->setChecked(m_gui_settings->GetValue(gui::ib_show_welcome).toBool()); ui->cb_show_exit_game->setChecked(m_gui_settings->GetValue(gui::ib_confirm_exit).toBool()); - ui->cb_show_boot_game->setChecked(m_gui_settings->GetValue(gui::ib_confirm_boot).toBool()); ui->cb_show_pkg_install->setChecked(m_gui_settings->GetValue(gui::ib_pkg_success).toBool()); ui->cb_show_pup_install->setChecked(m_gui_settings->GetValue(gui::ib_pup_success).toBool()); ui->cb_show_obsolete_cfg_dialog->setChecked(m_gui_settings->GetValue(gui::ib_obsolete_cfg).toBool()); @@ -2305,9 +2303,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std connect(ui->cb_show_exit_game, &QCheckBox::toggled, [this](bool checked) { m_gui_settings->SetValue(gui::ib_confirm_exit, checked); - }); - connect(ui->cb_show_boot_game, &QCheckBox::toggled, [this](bool checked) - { m_gui_settings->SetValue(gui::ib_confirm_boot, checked); }); connect(ui->cb_show_pkg_install, &QCheckBox::toggled, [this](bool checked) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 4ced973883..3b6a5b5776 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -4007,14 +4007,7 @@ - Show Exit Game Dialog - - - - - - - Show Boot Game Dialog + Show Exit Game Confirmation diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index b56e093dff..def114e4dd 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -216,8 +216,7 @@ public: const QString tty_limit = tr("Sets the maximum amount of blocks that the TTY can display.\nThis usually equals the number of lines.\nSet 0 in order to remove the limit."); const QString stylesheets = tr("Changes the overall look of RPCS3.\nChoose a stylesheet and click Apply to change between styles."); const QString show_welcome = tr("Shows the initial welcome screen upon starting RPCS3."); - const QString show_exit_game = tr("Shows a confirmation dialog when the game window is being closed."); - const QString show_boot_game = tr("Shows a confirmation dialog when a game was booted while another game is running."); + const QString show_exit_game = tr("Shows a confirmation dialog when the game window is being closed and when a game was booted while another game is running."); const QString show_pkg_install = tr("Shows a dialog when packages were installed successfully."); const QString show_pup_install = tr("Shows a dialog when firmware was installed successfully."); const QString show_obsolete_cfg = tr("Shows a dialog when obsolete settings were found."); From 86f453f67702b150c922f2379f138e7142e86b98 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 11:02:20 +0100 Subject: [PATCH 415/630] ui: Merge pkg/pup install dialog options --- rpcs3/rpcs3qt/settings_dialog.cpp | 5 ----- rpcs3/rpcs3qt/settings_dialog.ui | 9 +-------- rpcs3/rpcs3qt/tooltips.h | 3 +-- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index d206a40de8..add8f3e798 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -2166,7 +2166,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std SubscribeTooltip(ui->cb_show_welcome, tooltips.settings.show_welcome); SubscribeTooltip(ui->cb_show_exit_game, tooltips.settings.show_exit_game); SubscribeTooltip(ui->cb_show_pkg_install, tooltips.settings.show_pkg_install); - SubscribeTooltip(ui->cb_show_pup_install, tooltips.settings.show_pup_install); SubscribeTooltip(ui->cb_show_obsolete_cfg_dialog, tooltips.settings.show_obsolete_cfg); SubscribeTooltip(ui->cb_show_same_buttons_dialog, tooltips.settings.show_same_buttons); SubscribeTooltip(ui->cb_show_restart_hint, tooltips.settings.show_restart_hint); @@ -2273,7 +2272,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std ui->cb_show_welcome->setChecked(m_gui_settings->GetValue(gui::ib_show_welcome).toBool()); ui->cb_show_exit_game->setChecked(m_gui_settings->GetValue(gui::ib_confirm_exit).toBool()); ui->cb_show_pkg_install->setChecked(m_gui_settings->GetValue(gui::ib_pkg_success).toBool()); - ui->cb_show_pup_install->setChecked(m_gui_settings->GetValue(gui::ib_pup_success).toBool()); ui->cb_show_obsolete_cfg_dialog->setChecked(m_gui_settings->GetValue(gui::ib_obsolete_cfg).toBool()); ui->cb_show_same_buttons_dialog->setChecked(m_gui_settings->GetValue(gui::ib_same_buttons).toBool()); ui->cb_show_restart_hint->setChecked(m_gui_settings->GetValue(gui::ib_restart_hint).toBool()); @@ -2308,9 +2306,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std connect(ui->cb_show_pkg_install, &QCheckBox::toggled, [this](bool checked) { m_gui_settings->SetValue(gui::ib_pkg_success, checked); - }); - connect(ui->cb_show_pup_install, &QCheckBox::toggled, [this](bool checked) - { m_gui_settings->SetValue(gui::ib_pup_success, checked); }); connect(ui->cb_show_obsolete_cfg_dialog, &QCheckBox::toggled, [this](bool checked) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 3b6a5b5776..eefc4e499c 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -4014,14 +4014,7 @@ - Show PKG Installation Dialog - - - - - - - Show PUP Installation Dialog + Show PKG/PUP Installation Result diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index def114e4dd..6152506c1d 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -217,8 +217,7 @@ public: const QString stylesheets = tr("Changes the overall look of RPCS3.\nChoose a stylesheet and click Apply to change between styles."); const QString show_welcome = tr("Shows the initial welcome screen upon starting RPCS3."); const QString show_exit_game = tr("Shows a confirmation dialog when the game window is being closed and when a game was booted while another game is running."); - const QString show_pkg_install = tr("Shows a dialog when packages were installed successfully."); - const QString show_pup_install = tr("Shows a dialog when firmware was installed successfully."); + const QString show_pkg_install = tr("Shows a dialog when packages and firmware were installed successfully."); const QString show_obsolete_cfg = tr("Shows a dialog when obsolete settings were found."); const QString show_same_buttons = tr("Shows a dialog in the game pad configuration when the same button was assigned twice."); const QString show_restart_hint = tr("Shows a dialog when RPCS3 is ready to restart after an update."); From 5a921bca462516029a0c171f624382bdf7460f88 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 12:11:54 +0100 Subject: [PATCH 416/630] ui: Allow toggling pad navigation on BSD --- rpcs3/rpcs3qt/settings_dialog.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index add8f3e798..d25d3ad9fb 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -2177,7 +2177,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std SubscribeTooltip(ui->cb_global_pad_navigation, tooltips.settings.global_navigation); ui->cb_pad_navigation->setChecked(m_gui_settings->GetValue(gui::nav_enabled).toBool()); ui->cb_global_pad_navigation->setChecked(m_gui_settings->GetValue(gui::nav_global).toBool()); -#if defined(_WIN32) || defined(__linux__) || defined(__APPLE__) connect(ui->cb_pad_navigation, &QCheckBox::toggled, [this](bool checked) { m_gui_settings->SetValue(gui::nav_enabled, checked); @@ -2186,9 +2185,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std { m_gui_settings->SetValue(gui::nav_global, checked); }); -#else - ui->gb_gui_pad_input->setEnabled(false); -#endif // Discord: SubscribeTooltip(ui->useRichPresence, tooltips.settings.use_rich_presence); From 9bdacc64aae4e390200563859cf1a8a1f27e6b6a Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 12:12:56 +0100 Subject: [PATCH 417/630] config: Enable pad navigation by default --- rpcs3/rpcs3qt/gui_settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index 21a46259c2..bdc6401031 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -315,7 +315,7 @@ namespace gui const gui_save sc_shortcuts = gui_save(sc, "shortcuts", QVariantMap()); - const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", false); + const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", true); const gui_save nav_global = gui_save(navigation, "allow_global_pad_input", false); } From 67a67feb68426c72850f26813ecfea63f636ba54 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 12:42:28 +0100 Subject: [PATCH 418/630] ui: A-Z order advanced tab settings --- rpcs3/rpcs3qt/settings_dialog.ui | 98 ++++++++++++++++---------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index eefc4e499c..8e6c64e1d3 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2414,13 +2414,6 @@ Core - - - - Debug Console Mode - - - @@ -2431,7 +2424,7 @@ - Accurate RSX reservation access + Accurate RSX Reservation Access @@ -2442,6 +2435,27 @@ + + + + Anti-Cheat Savestates Mode + + + + + + + Debug Console Mode + + + + + + + Delay each odd MFC Command + + + @@ -2471,30 +2485,16 @@ - + - Delay each odd MFC Command - - - - - - - Anti-Cheat Savestates Mode + Silence All Logs - SPU-Compatible Savestates Mode - - - - - - - Silence All Logs + SPU Compatible Savestates Mode @@ -2672,30 +2672,16 @@ - + - Read Depth Buffer + Allow Host GPU Labels (Experimental) - + - Write Depth Buffer - - - - - - - Read Color Buffers - - - - - - - Handle RSX memory tiling + Disable MSL Fast Math @@ -2707,16 +2693,30 @@ - + - Allow Host GPU Labels (Experimental) + Force Hardware MSAA Resolve - + - Force Hardware MSAA Resolve + Handle RSX Memory Tiling + + + + + + + Read Depth Buffer + + + + + + + Read Color Buffers @@ -2728,9 +2728,9 @@ - + - Disable MSL Fast Math + Write Depth Buffer From 90ebc7f319b81ae2dae419ed5af7a720c089dbf6 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 13:07:11 +0100 Subject: [PATCH 419/630] ui: Move Accurate DFMA to debug --- rpcs3/rpcs3qt/settings_dialog.ui | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 8e6c64e1d3..601ea5ec92 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2414,13 +2414,6 @@ Core - - - - Accurate DFMA - - - @@ -4334,6 +4327,13 @@ Core + + + + Accurate DFMA + + + From e2a26f937fc0c1a670ad28fcc7f106b40624b804 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 13:09:33 +0100 Subject: [PATCH 420/630] ui: Move PPU Non-Java Fixup to debug --- rpcs3/rpcs3qt/settings_dialog.ui | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 601ea5ec92..5e38fd787d 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2463,13 +2463,6 @@ - - - - PPU Non-Java Mode Fixup - - - @@ -4397,6 +4390,13 @@ + + + + PPU Non-Java Mode Fixup + + + From 8587fca5dbffd3334e52feb237df06ccd9b0b7db Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 13:36:27 +0100 Subject: [PATCH 421/630] ui: Move SPU Loop Detection to advanced --- rpcs3/rpcs3qt/settings_dialog.ui | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 5e38fd787d..f663266206 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -181,22 +181,6 @@ - - - - Additional Settings - - - - - - Enable SPU loop detection - - - - - - @@ -2463,6 +2447,13 @@ + + + + Enable SPU loop detection + + + From 315f88b0e48e97f7e6d0dc007e4ff6b509f37577 Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 9 Mar 2026 16:50:45 +0100 Subject: [PATCH 422/630] ui: Split overlay settings, A-Z order emulator tab settings --- rpcs3/rpcs3qt/settings_dialog.ui | 149 ++++++++++++++++--------------- 1 file changed, 79 insertions(+), 70 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index f663266206..30100b7935 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2922,16 +2922,16 @@ - + - Exit RPCS3 when process finishes + Enable GameMode - + - Pause emulation on RPCS3 focus loss + Exit RPCS3 when process finishes @@ -2949,6 +2949,13 @@ + + + + Pause emulation on RPCS3 focus loss + + + @@ -2956,69 +2963,6 @@ - - - - Show trophy popups - - - - - - - Show RPCN popups - - - - - - - Show shader compilation hint - - - - - - - Show PPU compilation hint - - - - - - - Show autosave/autoload hint - - - - - - - Show analog limiter toggle hint - - - - - - - Show pressure intensity toggle hint - - - - - - - Show mouse and keyboard toggle hint - - - - - - - Show capture hints - - - @@ -3033,17 +2977,82 @@ + + + + + + + Overlay Settings + + - Record with overlays + Record and screenshot with overlays - + - Enable GameMode + Show analog limiter toggle hint + + + + + + + Show autosave/autoload hint + + + + + + + Show capture hints + + + + + + + Show mouse and keyboard toggle hint + + + + + + + Show netplay popups + + + + + + + Show pressure intensity toggle hint + + + + + + + Show PPU compilation hint + + + + + + + Show shader compilation hint + + + + + + + Show trophy popups From 5714eb0ba537dc7efe5b50e9e6d08f8e66b12dfb Mon Sep 17 00:00:00 2001 From: Ani Date: Sat, 14 Mar 2026 17:44:50 +0100 Subject: [PATCH 423/630] config/ui: Unify Shader Mode values Have the same values between UI and Config for easing automatic configuration --- rpcs3/Emu/system_config_types.cpp | 6 +++--- rpcs3/rpcs3qt/emu_settings.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/system_config_types.cpp b/rpcs3/Emu/system_config_types.cpp index 7c9c5ef592..beb13db4d5 100644 --- a/rpcs3/Emu/system_config_types.cpp +++ b/rpcs3/Emu/system_config_types.cpp @@ -522,9 +522,9 @@ void fmt_class_string::format(std::string& out, u64 arg) { switch (value) { - case shader_mode::recompiler: return "Shader Recompiler"; - case shader_mode::async_recompiler: return "Async Shader Recompiler"; - case shader_mode::async_with_interpreter: return "Async with Shader Interpreter"; + case shader_mode::recompiler: return "Legacy Recompiler (single-threaded)"; + case shader_mode::async_recompiler: return "Async Recompiler (multi-threaded)"; + case shader_mode::async_with_interpreter: return "Async Recompiler with Shader Interpreter"; case shader_mode::interpreter_only: return "Shader Interpreter only"; } diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index c686394c10..22cf9b4032 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -1054,9 +1054,9 @@ QString emu_settings::GetLocalizedSetting(const QString& original, emu_settings_ case emu_settings_type::ShaderMode: switch (static_cast(index)) { - case shader_mode::recompiler: return tr("Legacy (single threaded)", "Shader Mode"); - case shader_mode::async_recompiler: return tr("Async (multi threaded)", "Shader Mode"); - case shader_mode::async_with_interpreter: return tr("Async with Shader Interpreter", "Shader Mode"); + case shader_mode::recompiler: return tr("Legacy Recompiler (single-threaded)", "Shader Mode"); + case shader_mode::async_recompiler: return tr("Async Recompiler (multi-threaded)", "Shader Mode"); + case shader_mode::async_with_interpreter: return tr("Async Recompiler with Shader Interpreter", "Shader Mode"); case shader_mode::interpreter_only: return tr("Shader Interpreter only", "Shader Mode"); } break; From 433816148a30ed79e395f10810d47dd681787e98 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 15 Mar 2026 16:19:45 +0100 Subject: [PATCH 424/630] Fix iso shortcuts --- rpcs3/Emu/System.cpp | 36 ++++++++++++++++++----------- rpcs3/rpcs3qt/game_list_actions.cpp | 7 +++++- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 717e4ab59a..3548df869d 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -1329,18 +1329,18 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, argv.emplace_back(m_path); } - resolve_path_as_vfs_path = true; + resolve_path_as_vfs_path = true; } else if (m_path.starts_with(game_id_boot_prefix)) { // Try to boot a game through game ID only - m_title_id = m_path.substr(game_id_boot_prefix.size()); - m_title_id = m_title_id.substr(0, m_title_id.find_first_of(fs::delim)); + const std::string_view boot_suffix = std::string_view(m_path).substr(game_id_boot_prefix.size()); + m_title_id = boot_suffix.substr(0, boot_suffix.find_first_of(fs::delim)); if (m_title_id.size() < 3 && m_title_id.find_first_not_of('.') == umax) { // Do not allow if TITLE_ID result in path redirection - sys_log.fatal("Game directory not found using GAMEID token. ('%s')", m_title_id); + sys_log.fatal("Game directory not found using GAMEID token. (m_path='%s', title_id='%s')", m_title_id); return game_boot_result::invalid_file_or_folder; } @@ -1361,19 +1361,27 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, title_path = std::move(game_path); } - for (std::string test_path : + if (is_file_iso(title_path)) { - rpcs3::utils::get_hdd0_dir() + "game/" + m_title_id + "/USRDIR/EBOOT.BIN" - , tail.empty() ? "" : title_path + tail + "/USRDIR/EBOOT.BIN" - , title_path + "/PS3_GAME/USRDIR/EBOOT.BIN" - , title_path + "/USRDIR/EBOOT.BIN" - }) + m_path = std::move(title_path); + ok = true; + } + else { - if (!test_path.empty() && fs::is_file(test_path)) + for (std::string test_path : { - m_path = std::move(test_path); - ok = true; - break; + rpcs3::utils::get_hdd0_dir() + "game/" + m_title_id + "/USRDIR/EBOOT.BIN" + , tail.empty() ? "" : title_path + tail + "/USRDIR/EBOOT.BIN" + , title_path + "/PS3_GAME/USRDIR/EBOOT.BIN" + , title_path + "/USRDIR/EBOOT.BIN" + }) + { + if (!test_path.empty() && fs::is_file(test_path)) + { + m_path = std::move(test_path); + ok = true; + break; + } } } diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp index b37348f49d..5e3e305860 100644 --- a/rpcs3/rpcs3qt/game_list_actions.cpp +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -7,6 +7,7 @@ #include "progress_dialog.h" #include "Utilities/File.h" +#include "Loader/ISO.h" #include "Emu/System.h" #include "Emu/system_utils.hpp" @@ -1460,7 +1461,11 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con const std::string dev_flash = g_cfg_vfs.get_dev_flash(); - if (gameinfo->info.category == "DG" && !fs::is_file(rpcs3::utils::get_hdd0_dir() + "/game/" + gameinfo->info.serial + "/USRDIR/EBOOT.BIN")) + if (is_file_iso(gameinfo->info.path)) + { + gameid_token_value = gameinfo->info.serial; + } + else if (gameinfo->info.category == "DG" && !fs::is_file(rpcs3::utils::get_hdd0_dir() + "/game/" + gameinfo->info.serial + "/USRDIR/EBOOT.BIN")) { const usz ps3_game_dir_pos = fs::get_parent_dir(gameinfo->info.path).size(); std::string relative_boot_dir = gameinfo->info.path.substr(ps3_game_dir_pos); From 74fbca8c809475cb5acee29761d42d8723593436 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 15 Mar 2026 11:17:23 +0100 Subject: [PATCH 425/630] input: simplify mmjoy handler --- rpcs3/Emu/Io/PadHandler.cpp | 147 +++++++++++++-------- rpcs3/Emu/Io/PadHandler.h | 91 ++----------- rpcs3/Input/ds3_pad_handler.cpp | 14 +- rpcs3/Input/ds3_pad_handler.h | 12 +- rpcs3/Input/ds4_pad_handler.cpp | 16 +-- rpcs3/Input/ds4_pad_handler.h | 14 +- rpcs3/Input/dualsense_pad_handler.cpp | 16 +-- rpcs3/Input/dualsense_pad_handler.h | 14 +- rpcs3/Input/evdev_joystick_handler.cpp | 38 +++--- rpcs3/Input/evdev_joystick_handler.h | 10 +- rpcs3/Input/keyboard_pad_handler.cpp | 2 +- rpcs3/Input/mm_joystick_handler.cpp | 170 ++++++++++++------------- rpcs3/Input/mm_joystick_handler.h | 39 +++--- rpcs3/Input/ps_move_handler.cpp | 10 +- rpcs3/Input/ps_move_handler.h | 8 +- rpcs3/Input/sdl_pad_handler.cpp | 16 +-- rpcs3/Input/sdl_pad_handler.h | 14 +- rpcs3/Input/skateboard_pad_handler.cpp | 6 +- rpcs3/Input/skateboard_pad_handler.h | 4 +- rpcs3/Input/xinput_pad_handler.cpp | 22 ++-- rpcs3/Input/xinput_pad_handler.h | 18 ++- 21 files changed, 325 insertions(+), 356 deletions(-) diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index a2ae41349e..953e6be55f 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -11,17 +11,69 @@ PadHandlerBase::PadHandlerBase(pad_handler type) : m_type(type) { } -std::set PadHandlerBase::narrow_set(const std::set& src) +std::set PadHandlerBase::FindKeyCodes(const std::unordered_map& map, const cfg::string& cfg_string, bool fallback) { - if (src.empty()) - return {}; + std::set key_codes; - std::set dst; - for (const u64& s : src) + const std::string& def = cfg_string.def; + const std::vector names = cfg_pad::get_buttons(cfg_string.to_string()); + u32 def_code = umax; + + for (const std::string& nam : names) { - dst.insert(::narrow(s)); + for (const auto& [code, name] : map) + { + if (name == nam) + { + key_codes.insert(code); + } + + if (fallback && name == def) + def_code = code; + } } - return dst; + + if (!key_codes.empty()) + { + return key_codes; + } + + if (fallback) + { + if (!names.empty()) + input_log.error("FindKeyCode for [name = %s] returned with [def_code = %d] for [def = %s]", cfg_string.to_string(), def_code, def); + + if (def_code != umax) + { + return { def_code }; + } + } + + return {}; +} + +std::set PadHandlerBase::FindKeyCodes(const std::unordered_map& map, const std::vector& names) +{ + std::set key_codes; + + for (const std::string& name : names) + { + for (const auto& [code, nam] : map) + { + if (nam == name) + { + key_codes.insert(code); + break; + } + } + } + + if (!key_codes.empty()) + { + return key_codes; + } + + return {}; } s32 PadHandlerBase::MultipliedInput(s32 raw_value, s32 multiplier) @@ -396,7 +448,7 @@ void PadHandlerBase::convert_stick_values(u16& x_out, u16& y_out, s32 x_in, s32 } // Update the pad button values based on their type and thresholds. With this you can use axis or triggers as buttons or vice versa -void PadHandlerBase::TranslateButtonPress(const std::shared_ptr& device, u64 keyCode, bool& pressed, u16& val, bool use_stick_multipliers, bool ignore_stick_threshold, bool ignore_trigger_threshold) +void PadHandlerBase::TranslateButtonPress(const std::shared_ptr& device, u32 keyCode, bool& pressed, u16& val, bool use_stick_multipliers, bool ignore_stick_threshold, bool ignore_trigger_threshold) { if (!device || !device->config) { @@ -556,63 +608,52 @@ std::array, PadHandlerBase::button::button_count> PadHandlerBase:: if (!device || !cfg) return mapping; - device->trigger_code_left = FindKeyCodes(button_list, cfg->l2); - device->trigger_code_right = FindKeyCodes(button_list, cfg->r2); - device->axis_code_left[0] = FindKeyCodes(button_list, cfg->ls_left); - device->axis_code_left[1] = FindKeyCodes(button_list, cfg->ls_right); - device->axis_code_left[2] = FindKeyCodes(button_list, cfg->ls_down); - device->axis_code_left[3] = FindKeyCodes(button_list, cfg->ls_up); - device->axis_code_right[0] = FindKeyCodes(button_list, cfg->rs_left); - device->axis_code_right[1] = FindKeyCodes(button_list, cfg->rs_right); - device->axis_code_right[2] = FindKeyCodes(button_list, cfg->rs_down); - device->axis_code_right[3] = FindKeyCodes(button_list, cfg->rs_up); + mapping[button::up] = FindKeyCodes(button_list, cfg->up); + mapping[button::down] = FindKeyCodes(button_list, cfg->down); + mapping[button::left] = FindKeyCodes(button_list, cfg->left); + mapping[button::right] = FindKeyCodes(button_list, cfg->right); + mapping[button::cross] = FindKeyCodes(button_list, cfg->cross); + mapping[button::square] = FindKeyCodes(button_list, cfg->square); + mapping[button::circle] = FindKeyCodes(button_list, cfg->circle); + mapping[button::triangle] = FindKeyCodes(button_list, cfg->triangle); + mapping[button::start] = FindKeyCodes(button_list, cfg->start); + mapping[button::select] = FindKeyCodes(button_list, cfg->select); + mapping[button::l1] = FindKeyCodes(button_list, cfg->l1); + mapping[button::l2] = FindKeyCodes(button_list, cfg->l2); + mapping[button::l3] = FindKeyCodes(button_list, cfg->l3); + mapping[button::r1] = FindKeyCodes(button_list, cfg->r1); + mapping[button::r2] = FindKeyCodes(button_list, cfg->r2); + mapping[button::r3] = FindKeyCodes(button_list, cfg->r3); + mapping[button::ls_left] = FindKeyCodes(button_list, cfg->ls_left); + mapping[button::ls_right] = FindKeyCodes(button_list, cfg->ls_right); + mapping[button::ls_down] = FindKeyCodes(button_list, cfg->ls_down); + mapping[button::ls_up] = FindKeyCodes(button_list, cfg->ls_up); + mapping[button::rs_left] = FindKeyCodes(button_list, cfg->rs_left); + mapping[button::rs_right] = FindKeyCodes(button_list, cfg->rs_right); + mapping[button::rs_down] = FindKeyCodes(button_list, cfg->rs_down); + mapping[button::rs_up] = FindKeyCodes(button_list, cfg->rs_up); + mapping[button::ps] = FindKeyCodes(button_list, cfg->ps); - mapping[button::up] = FindKeyCodes(button_list, cfg->up); - mapping[button::down] = FindKeyCodes(button_list, cfg->down); - mapping[button::left] = FindKeyCodes(button_list, cfg->left); - mapping[button::right] = FindKeyCodes(button_list, cfg->right); - mapping[button::cross] = FindKeyCodes(button_list, cfg->cross); - mapping[button::square] = FindKeyCodes(button_list, cfg->square); - mapping[button::circle] = FindKeyCodes(button_list, cfg->circle); - mapping[button::triangle] = FindKeyCodes(button_list, cfg->triangle); - mapping[button::start] = FindKeyCodes(button_list, cfg->start); - mapping[button::select] = FindKeyCodes(button_list, cfg->select); - mapping[button::l1] = FindKeyCodes(button_list, cfg->l1); - mapping[button::l2] = narrow_set(device->trigger_code_left); - mapping[button::l3] = FindKeyCodes(button_list, cfg->l3); - mapping[button::r1] = FindKeyCodes(button_list, cfg->r1); - mapping[button::r2] = narrow_set(device->trigger_code_right); - mapping[button::r3] = FindKeyCodes(button_list, cfg->r3); - mapping[button::ls_left] = narrow_set(device->axis_code_left[0]); - mapping[button::ls_right] = narrow_set(device->axis_code_left[1]); - mapping[button::ls_down] = narrow_set(device->axis_code_left[2]); - mapping[button::ls_up] = narrow_set(device->axis_code_left[3]); - mapping[button::rs_left] = narrow_set(device->axis_code_right[0]); - mapping[button::rs_right] = narrow_set(device->axis_code_right[1]); - mapping[button::rs_down] = narrow_set(device->axis_code_right[2]); - mapping[button::rs_up] = narrow_set(device->axis_code_right[3]); - mapping[button::ps] = FindKeyCodes(button_list, cfg->ps); - - mapping[button::skateboard_ir_nose] = FindKeyCodes(button_list, cfg->ir_nose); - mapping[button::skateboard_ir_tail] = FindKeyCodes(button_list, cfg->ir_tail); - mapping[button::skateboard_ir_left] = FindKeyCodes(button_list, cfg->ir_left); - mapping[button::skateboard_ir_right] = FindKeyCodes(button_list, cfg->ir_right); - mapping[button::skateboard_tilt_left] = FindKeyCodes(button_list, cfg->tilt_left); - mapping[button::skateboard_tilt_right] = FindKeyCodes(button_list, cfg->tilt_right); + mapping[button::skateboard_ir_nose] = FindKeyCodes(button_list, cfg->ir_nose); + mapping[button::skateboard_ir_tail] = FindKeyCodes(button_list, cfg->ir_tail); + mapping[button::skateboard_ir_left] = FindKeyCodes(button_list, cfg->ir_left); + mapping[button::skateboard_ir_right] = FindKeyCodes(button_list, cfg->ir_right); + mapping[button::skateboard_tilt_left] = FindKeyCodes(button_list, cfg->tilt_left); + mapping[button::skateboard_tilt_right] = FindKeyCodes(button_list, cfg->tilt_right); if (b_has_pressure_intensity_button) { - mapping[button::pressure_intensity_button] = FindKeyCodes(button_list, cfg->pressure_intensity_button); + mapping[button::pressure_intensity_button] = FindKeyCodes(button_list, cfg->pressure_intensity_button); } if (b_has_analog_limiter_button) { - mapping[button::analog_limiter_button] = FindKeyCodes(button_list, cfg->analog_limiter_button); + mapping[button::analog_limiter_button] = FindKeyCodes(button_list, cfg->analog_limiter_button); } if (b_has_orientation) { - mapping[button::orientation_reset_button] = FindKeyCodes(button_list, cfg->orientation_reset_button); + mapping[button::orientation_reset_button] = FindKeyCodes(button_list, cfg->orientation_reset_button); } return mapping; diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index a273beb3de..f6d18a63ca 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -36,10 +36,6 @@ public: u8 small_motor{0}; bool new_output_data{true}; steady_clock::time_point last_output; - std::set trigger_code_left{}; - std::set trigger_code_right{}; - std::array, 4> axis_code_left{}; - std::array, 4> axis_code_right{}; struct color { @@ -196,76 +192,11 @@ protected: std::shared_ptr m_pad_for_pad_settings; - static std::set narrow_set(const std::set& src); + // Search an unordered map for a string value and return found keycode + static std::set FindKeyCodes(const std::unordered_map& map, const cfg::string& cfg_string, bool fallback = true); // Search an unordered map for a string value and return found keycode - template - static std::set FindKeyCodes(const std::unordered_map& map, const cfg::string& cfg_string, bool fallback = true) - { - std::set key_codes; - - const std::string& def = cfg_string.def; - const std::vector names = cfg_pad::get_buttons(cfg_string.to_string()); - T def_code = umax; - - for (const std::string& nam : names) - { - for (const auto& [code, name] : map) - { - if (name == nam) - { - key_codes.insert(static_cast(code)); - } - - if (fallback && name == def) - def_code = static_cast(code); - } - } - - if (!key_codes.empty()) - { - return key_codes; - } - - if (fallback) - { - if (!names.empty()) - input_log.error("FindKeyCode for [name = %s] returned with [def_code = %d] for [def = %s]", cfg_string.to_string(), def_code, def); - - if (def_code != umax) - { - return { def_code }; - } - } - - return {}; - } - - // Search an unordered map for a string value and return found keycode - template - static std::set FindKeyCodes(const std::unordered_map& map, const std::vector& names) - { - std::set key_codes; - - for (const std::string& name : names) - { - for (const auto& [code, nam] : map) - { - if (nam == name) - { - key_codes.insert(static_cast(code)); - break; - } - } - } - - if (!key_codes.empty()) - { - return key_codes; - } - - return {}; - } + static std::set FindKeyCodes(const std::unordered_map& map, const std::vector& names); // Get normalized trigger value based on the range defined by a threshold u16 NormalizeTriggerInput(u16 value, u32 threshold) const; @@ -375,23 +306,23 @@ public: private: virtual std::shared_ptr get_device(const std::string& /*device*/) { return nullptr; } - virtual bool get_is_left_trigger(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } - virtual bool get_is_right_trigger(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } - virtual bool get_is_left_stick(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } - virtual bool get_is_right_stick(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } - virtual bool get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } + virtual bool get_is_left_trigger(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } + virtual bool get_is_right_trigger(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } + virtual bool get_is_left_stick(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } + virtual bool get_is_right_stick(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } + virtual bool get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } virtual PadHandlerBase::connection update_connection(const std::shared_ptr& /*device*/) { return connection::disconnected; } virtual void get_extended_info(const pad_ensemble& /*binding*/) {} virtual void apply_pad_data(const pad_ensemble& /*binding*/) {} - virtual std::unordered_map get_button_values(const std::shared_ptr& /*device*/) { return {}; } - virtual pad_preview_values get_preview_values(const std::unordered_map& /*data*/) { return {}; } + virtual std::unordered_map get_button_values(const std::shared_ptr& /*device*/) { return {}; } + virtual pad_preview_values get_preview_values(const std::unordered_map& /*data*/) { return {}; } void get_orientation(const pad_ensemble& binding) const; protected: virtual std::array, PadHandlerBase::button::button_count> get_mapped_key_codes(const std::shared_ptr& device, const cfg_pad* cfg); virtual void get_mapping(const pad_ensemble& binding); - void TranslateButtonPress(const std::shared_ptr& device, u64 keyCode, bool& pressed, u16& val, bool use_stick_multipliers, bool ignore_stick_threshold = false, bool ignore_trigger_threshold = false); + void TranslateButtonPress(const std::shared_ptr& device, u32 keyCode, bool& pressed, u16& val, bool use_stick_multipliers, bool ignore_stick_threshold = false, bool ignore_trigger_threshold = false); void init_configs(); cfg_pad* get_config(const std::string& pad_id); diff --git a/rpcs3/Input/ds3_pad_handler.cpp b/rpcs3/Input/ds3_pad_handler.cpp index 8d8318ce45..dfeb174a2c 100644 --- a/rpcs3/Input/ds3_pad_handler.cpp +++ b/rpcs3/Input/ds3_pad_handler.cpp @@ -348,9 +348,9 @@ ds3_pad_handler::DataStatus ds3_pad_handler::get_data(ds3_device* ds3dev) return DataStatus::NoNewData; } -std::unordered_map ds3_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map ds3_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map key_buf; + std::unordered_map key_buf; ds3_device* dev = static_cast(device.get()); if (!dev) return key_buf; @@ -397,7 +397,7 @@ std::unordered_map ds3_pad_handler::get_button_values(const std::share return key_buf; } -pad_preview_values ds3_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values ds3_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, L2), @@ -460,17 +460,17 @@ void ds3_pad_handler::get_extended_info(const pad_ensemble& binding) set_raw_orientation(*pad); } -bool ds3_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds3_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DS3KeyCodes::L2; } -bool ds3_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds3_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DS3KeyCodes::R2; } -bool ds3_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds3_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -484,7 +484,7 @@ bool ds3_pad_handler::get_is_left_stick(const std::shared_ptr& /*devi } } -bool ds3_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds3_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { diff --git a/rpcs3/Input/ds3_pad_handler.h b/rpcs3/Input/ds3_pad_handler.h index 47dfbf4587..6b0423903c 100644 --- a/rpcs3/Input/ds3_pad_handler.h +++ b/rpcs3/Input/ds3_pad_handler.h @@ -147,13 +147,13 @@ private: int send_output_report(ds3_device* ds3dev) override; void check_add_device(hid_device* hidDevice, hid_enumerated_device_view path, std::wstring_view serial) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; }; diff --git a/rpcs3/Input/ds4_pad_handler.cpp b/rpcs3/Input/ds4_pad_handler.cpp index 77c59fc48f..50d38773a3 100644 --- a/rpcs3/Input/ds4_pad_handler.cpp +++ b/rpcs3/Input/ds4_pad_handler.cpp @@ -250,9 +250,9 @@ void ds4_pad_handler::SetPadData(const std::string& padId, u8 player_id, u8 larg } } -std::unordered_map ds4_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map ds4_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map keyBuffer; + std::unordered_map keyBuffer; DS4Device* dev = static_cast(device.get()); if (!dev) return keyBuffer; @@ -405,7 +405,7 @@ std::unordered_map ds4_pad_handler::get_button_values(const std::share return keyBuffer; } -pad_preview_values ds4_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values ds4_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, L2), @@ -774,17 +774,17 @@ ds4_pad_handler::DataStatus ds4_pad_handler::get_data(DS4Device* device) return DataStatus::NewData; } -bool ds4_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DS4KeyCodes::L2; } -bool ds4_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DS4KeyCodes::R2; } -bool ds4_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -798,7 +798,7 @@ bool ds4_pad_handler::get_is_left_stick(const std::shared_ptr& /*devi } } -bool ds4_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -812,7 +812,7 @@ bool ds4_pad_handler::get_is_right_stick(const std::shared_ptr& /*dev } } -bool ds4_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { diff --git a/rpcs3/Input/ds4_pad_handler.h b/rpcs3/Input/ds4_pad_handler.h index 4fdb829d73..da663090ad 100644 --- a/rpcs3/Input/ds4_pad_handler.h +++ b/rpcs3/Input/ds4_pad_handler.h @@ -186,14 +186,14 @@ private: int send_output_report(DS4Device* device) override; void check_add_device(hid_device* hidDevice, hid_enumerated_device_view path, std::wstring_view serial) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_touch_pad_motion(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_touch_pad_motion(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; }; diff --git a/rpcs3/Input/dualsense_pad_handler.cpp b/rpcs3/Input/dualsense_pad_handler.cpp index 5585c0ef12..91713afa34 100644 --- a/rpcs3/Input/dualsense_pad_handler.cpp +++ b/rpcs3/Input/dualsense_pad_handler.cpp @@ -505,17 +505,17 @@ bool dualsense_pad_handler::get_calibration_data(DualSenseDevice* dev) const return true; } -bool dualsense_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DualSenseKeyCodes::L2; } -bool dualsense_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DualSenseKeyCodes::R2; } -bool dualsense_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -529,7 +529,7 @@ bool dualsense_pad_handler::get_is_left_stick(const std::shared_ptr& } } -bool dualsense_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -543,7 +543,7 @@ bool dualsense_pad_handler::get_is_right_stick(const std::shared_ptr& } } -bool dualsense_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -635,9 +635,9 @@ void dualsense_pad_handler::get_extended_info(const pad_ensemble& binding) set_raw_orientation(pad->move_data, accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z); } -std::unordered_map dualsense_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map dualsense_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map keyBuffer; + std::unordered_map keyBuffer; DualSenseDevice* dev = static_cast(device.get()); if (!dev) return keyBuffer; @@ -777,7 +777,7 @@ std::unordered_map dualsense_pad_handler::get_button_values(const std: return keyBuffer; } -pad_preview_values dualsense_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values dualsense_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, L2), diff --git a/rpcs3/Input/dualsense_pad_handler.h b/rpcs3/Input/dualsense_pad_handler.h index 77b85f320b..c4bc8687c8 100644 --- a/rpcs3/Input/dualsense_pad_handler.h +++ b/rpcs3/Input/dualsense_pad_handler.h @@ -248,14 +248,14 @@ private: void check_add_device(hid_device* hidDevice, hid_enumerated_device_view path, std::wstring_view wide_serial) override; int send_output_report(DualSenseDevice* device) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_touch_pad_motion(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_touch_pad_motion(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; }; diff --git a/rpcs3/Input/evdev_joystick_handler.cpp b/rpcs3/Input/evdev_joystick_handler.cpp index 03f2016c27..07c39aab26 100644 --- a/rpcs3/Input/evdev_joystick_handler.cpp +++ b/rpcs3/Input/evdev_joystick_handler.cpp @@ -259,9 +259,9 @@ void evdev_joystick_handler::close_devices() } } -std::unordered_map> evdev_joystick_handler::GetButtonValues(const std::shared_ptr& device) +std::unordered_map> evdev_joystick_handler::GetButtonValues(const std::shared_ptr& device) { - std::unordered_map> button_values; + std::unordered_map> button_values; if (!device) return button_values; @@ -379,23 +379,23 @@ PadHandlerBase::connection evdev_joystick_handler::get_next_button_press(const s const auto set_value = [&value, &data](u32 code, bool dir) { - if (const auto it = data.find(static_cast(code)); it != data.cend() && dir == it->second.second) + if (const auto it = data.find(code); it != data.cend() && dir == it->second.second) { value = std::max(value, it->second.first); } }; - for (const u32 code : FindKeyCodes(rev_axis_list, names)) + for (const u32 code : FindKeyCodes(rev_axis_list, names)) { set_value(code, true); } - for (const u32 code : FindKeyCodes(axis_list, names)) + for (const u32 code : FindKeyCodes(axis_list, names)) { set_value(code, false); } - for (const u32 code : FindKeyCodes(button_list, names)) + for (const u32 code : FindKeyCodes(button_list, names)) { set_value(code, false); } @@ -435,7 +435,7 @@ PadHandlerBase::connection evdev_joystick_handler::get_next_button_press(const s return; // Ignore codes that aren't part of the latest events. Otherwise we will get value 0 which will reset our min_value. - const auto it = data.find(static_cast(code)); + const auto it = data.find(code); if (it == data.cend()) { if (call_type == gui_call_type::reset_input) @@ -1351,17 +1351,17 @@ bool evdev_joystick_handler::bindPadToDevice(std::shared_ptr pad) // In evdev we store indices to an EvdevButton vector in our pad objects instead of the usual key codes. std::set indices; - for (const u32 code : FindKeyCodes(axis_list, names)) + for (const u32 code : FindKeyCodes(axis_list, names)) { indices.insert(register_evdevbutton(code, true, false)); } - for (const u32 code : FindKeyCodes(rev_axis_list, names)) + for (const u32 code : FindKeyCodes(rev_axis_list, names)) { indices.insert(register_evdevbutton(code, true, true)); } - for (const u32 code : FindKeyCodes(button_list, names)) + for (const u32 code : FindKeyCodes(button_list, names)) { indices.insert(register_evdevbutton(code, false, false)); } @@ -1376,7 +1376,7 @@ bool evdev_joystick_handler::bindPadToDevice(std::shared_ptr pad) e_sensor.mirrored = sensor.mirrored.get(); e_sensor.shift = sensor.shift.get(); - const std::set keys = FindKeyCodes(motion_axis_list, sensor.axis); + const std::set keys = FindKeyCodes(motion_axis_list, sensor.axis); if (!keys.empty()) e_sensor.code = *keys.begin(); // We should only have one key for each of our sensors return e_sensor; }; @@ -1533,24 +1533,24 @@ bool evdev_joystick_handler::check_button_sets(const std::array, 4 return std::any_of(sets.begin(), sets.end(), [this, code](const std::set& indices) { return check_button_set(indices, code); }); }; -bool evdev_joystick_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool evdev_joystick_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { - return check_button_set(m_dev->trigger_left, static_cast(keyCode)); + return check_button_set(m_dev->trigger_left, keyCode); } -bool evdev_joystick_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool evdev_joystick_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { - return check_button_set(m_dev->trigger_right, static_cast(keyCode)); + return check_button_set(m_dev->trigger_right, keyCode); } -bool evdev_joystick_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool evdev_joystick_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { - return check_button_sets(m_dev->axis_left, static_cast(keyCode)); + return check_button_sets(m_dev->axis_left, keyCode); } -bool evdev_joystick_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool evdev_joystick_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { - return check_button_sets(m_dev->axis_right, static_cast(keyCode)); + return check_button_sets(m_dev->axis_right, keyCode); } #endif diff --git a/rpcs3/Input/evdev_joystick_handler.h b/rpcs3/Input/evdev_joystick_handler.h index 6919a32205..a76426e3fb 100644 --- a/rpcs3/Input/evdev_joystick_handler.h +++ b/rpcs3/Input/evdev_joystick_handler.h @@ -397,7 +397,7 @@ private: bool update_device(const std::shared_ptr& device); std::shared_ptr add_device(const std::string& device, bool in_settings = false); std::shared_ptr add_motion_device(const std::string& device, bool in_settings); - std::unordered_map> GetButtonValues(const std::shared_ptr& device); + std::unordered_map> GetButtonValues(const std::shared_ptr& device); void SetRumble(EvdevDevice* device, u8 large, u8 small); positive_axis m_pos_axis_config; @@ -420,10 +420,10 @@ protected: void get_mapping(const pad_ensemble& binding) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; }; #endif diff --git a/rpcs3/Input/keyboard_pad_handler.cpp b/rpcs3/Input/keyboard_pad_handler.cpp index e70cf8d45b..3aca96100d 100644 --- a/rpcs3/Input/keyboard_pad_handler.cpp +++ b/rpcs3/Input/keyboard_pad_handler.cpp @@ -980,7 +980,7 @@ bool keyboard_pad_handler::bindPadToDevice(std::shared_ptr pad) const auto find_keys = [this](const cfg::string& name) { - std::set keys = FindKeyCodes(mouse_list, name, false); + std::set keys = FindKeyCodes(mouse_list, name, false); for (const u32& key : GetKeyCodes(name)) keys.insert(key); if (!keys.empty()) diff --git a/rpcs3/Input/mm_joystick_handler.cpp b/rpcs3/Input/mm_joystick_handler.cpp index fed1f428df..8861f74b0d 100644 --- a/rpcs3/Input/mm_joystick_handler.cpp +++ b/rpcs3/Input/mm_joystick_handler.cpp @@ -34,23 +34,23 @@ void mm_joystick_handler::init_config(cfg_pad* cfg) cfg->rs_down.def = ::at32(axis_list, mmjoy_axis::joy_r_neg); cfg->rs_right.def = ::at32(axis_list, mmjoy_axis::joy_z_pos); cfg->rs_up.def = ::at32(axis_list, mmjoy_axis::joy_r_pos); - cfg->start.def = ::at32(button_list, JOY_BUTTON9); - cfg->select.def = ::at32(button_list, JOY_BUTTON10); - cfg->ps.def = ::at32(button_list, JOY_BUTTON17); - cfg->square.def = ::at32(button_list, JOY_BUTTON4); - cfg->cross.def = ::at32(button_list, JOY_BUTTON3); - cfg->circle.def = ::at32(button_list, JOY_BUTTON2); - cfg->triangle.def = ::at32(button_list, JOY_BUTTON1); - cfg->left.def = ::at32(pov_list, JOY_POVLEFT); - cfg->down.def = ::at32(pov_list, JOY_POVBACKWARD); - cfg->right.def = ::at32(pov_list, JOY_POVRIGHT); - cfg->up.def = ::at32(pov_list, JOY_POVFORWARD); - cfg->r1.def = ::at32(button_list, JOY_BUTTON8); - cfg->r2.def = ::at32(button_list, JOY_BUTTON6); - cfg->r3.def = ::at32(button_list, JOY_BUTTON12); - cfg->l1.def = ::at32(button_list, JOY_BUTTON7); - cfg->l2.def = ::at32(button_list, JOY_BUTTON5); - cfg->l3.def = ::at32(button_list, JOY_BUTTON11); + cfg->start.def = ::at32(button_list, static_cast(JOY_BUTTON9)); + cfg->select.def = ::at32(button_list, static_cast(JOY_BUTTON10)); + cfg->ps.def = ::at32(button_list, static_cast(JOY_BUTTON17)); + cfg->square.def = ::at32(button_list, static_cast(JOY_BUTTON4)); + cfg->cross.def = ::at32(button_list, static_cast(JOY_BUTTON3)); + cfg->circle.def = ::at32(button_list, static_cast(JOY_BUTTON2)); + cfg->triangle.def = ::at32(button_list, static_cast(JOY_BUTTON1)); + cfg->left.def = ::at32(pov_list, static_cast(JOY_POVLEFT)); + cfg->down.def = ::at32(pov_list, static_cast(JOY_POVBACKWARD)); + cfg->right.def = ::at32(pov_list, static_cast(JOY_POVRIGHT)); + cfg->up.def = ::at32(pov_list, static_cast(JOY_POVFORWARD)); + cfg->r1.def = ::at32(button_list, static_cast(JOY_BUTTON8)); + cfg->r2.def = ::at32(button_list, static_cast(JOY_BUTTON6)); + cfg->r3.def = ::at32(button_list, static_cast(JOY_BUTTON12)); + cfg->l1.def = ::at32(button_list, static_cast(JOY_BUTTON7)); + cfg->l2.def = ::at32(button_list, static_cast(JOY_BUTTON5)); + cfg->l3.def = ::at32(button_list, static_cast(JOY_BUTTON11)); cfg->pressure_intensity_button.def = ::at32(button_list, NO_BUTTON); cfg->analog_limiter_button.def = ::at32(button_list, NO_BUTTON); @@ -102,7 +102,7 @@ void mm_joystick_handler::enumerate_devices() { MMJOYDevice dev; - if (GetMMJOYDevice(i, &dev) == false) + if (get_device(i, &dev) == false) continue; auto it = m_devices.find(dev.device_name); @@ -145,20 +145,18 @@ std::vector mm_joystick_handler::list_devices() return devices; } -template -std::set mm_joystick_handler::find_keys(const cfg::string& cfg_string) const +std::set mm_joystick_handler::find_keys(const cfg::string& cfg_string) const { - return find_keys(cfg_pad::get_buttons(cfg_string.to_string())); + return find_keys(cfg_pad::get_buttons(cfg_string.to_string())); } -template -std::set mm_joystick_handler::find_keys(const std::vector& names) const +std::set mm_joystick_handler::find_keys(const std::vector& names) const { - std::set keys; + std::set keys; - for (const T& k : FindKeyCodes(axis_list, names)) keys.insert(k); - for (const T& k : FindKeyCodes(pov_list, names)) keys.insert(k); - for (const T& k : FindKeyCodes(button_list, names)) keys.insert(k); + for (u32 k : FindKeyCodes(axis_list, names)) keys.insert(k); + for (u32 k : FindKeyCodes(pov_list, names)) keys.insert(k); + for (u32 k : FindKeyCodes(button_list, names)) keys.insert(k); return keys; } @@ -171,58 +169,58 @@ std::array, PadHandlerBase::button::button_count> mm_joystick_hand if (!dev || !cfg) return mapping; - dev->trigger_code_left = find_keys(cfg->l2); - dev->trigger_code_right = find_keys(cfg->r2); - dev->axis_code_left[0] = find_keys(cfg->ls_left); - dev->axis_code_left[1] = find_keys(cfg->ls_right); - dev->axis_code_left[2] = find_keys(cfg->ls_down); - dev->axis_code_left[3] = find_keys(cfg->ls_up); - dev->axis_code_right[0] = find_keys(cfg->rs_left); - dev->axis_code_right[1] = find_keys(cfg->rs_right); - dev->axis_code_right[2] = find_keys(cfg->rs_down); - dev->axis_code_right[3] = find_keys(cfg->rs_up); + dev->trigger_code_left = find_keys(cfg->l2); + dev->trigger_code_right = find_keys(cfg->r2); + dev->axis_code_left[0] = find_keys(cfg->ls_left); + dev->axis_code_left[1] = find_keys(cfg->ls_right); + dev->axis_code_left[2] = find_keys(cfg->ls_down); + dev->axis_code_left[3] = find_keys(cfg->ls_up); + dev->axis_code_right[0] = find_keys(cfg->rs_left); + dev->axis_code_right[1] = find_keys(cfg->rs_right); + dev->axis_code_right[2] = find_keys(cfg->rs_down); + dev->axis_code_right[3] = find_keys(cfg->rs_up); - mapping[button::up] = find_keys(cfg->up); - mapping[button::down] = find_keys(cfg->down); - mapping[button::left] = find_keys(cfg->left); - mapping[button::right] = find_keys(cfg->right); - mapping[button::cross] = find_keys(cfg->cross); - mapping[button::square] = find_keys(cfg->square); - mapping[button::circle] = find_keys(cfg->circle); - mapping[button::triangle] = find_keys(cfg->triangle); - mapping[button::l1] = find_keys(cfg->l1); - mapping[button::l2] = narrow_set(dev->trigger_code_left); - mapping[button::l3] = find_keys(cfg->l3); - mapping[button::r1] = find_keys(cfg->r1); - mapping[button::r2] = narrow_set(dev->trigger_code_right); - mapping[button::r3] = find_keys(cfg->r3); - mapping[button::start] = find_keys(cfg->start); - mapping[button::select] = find_keys(cfg->select); - mapping[button::ps] = find_keys(cfg->ps); - mapping[button::ls_left] = narrow_set(dev->axis_code_left[0]); - mapping[button::ls_right] = narrow_set(dev->axis_code_left[1]); - mapping[button::ls_down] = narrow_set(dev->axis_code_left[2]); - mapping[button::ls_up] = narrow_set(dev->axis_code_left[3]); - mapping[button::rs_left] = narrow_set(dev->axis_code_right[0]); - mapping[button::rs_right] = narrow_set(dev->axis_code_right[1]); - mapping[button::rs_down] = narrow_set(dev->axis_code_right[2]); - mapping[button::rs_up] = narrow_set(dev->axis_code_right[3]); + mapping[button::up] = find_keys(cfg->up); + mapping[button::down] = find_keys(cfg->down); + mapping[button::left] = find_keys(cfg->left); + mapping[button::right] = find_keys(cfg->right); + mapping[button::cross] = find_keys(cfg->cross); + mapping[button::square] = find_keys(cfg->square); + mapping[button::circle] = find_keys(cfg->circle); + mapping[button::triangle] = find_keys(cfg->triangle); + mapping[button::l1] = find_keys(cfg->l1); + mapping[button::l2] = dev->trigger_code_left; + mapping[button::l3] = find_keys(cfg->l3); + mapping[button::r1] = find_keys(cfg->r1); + mapping[button::r2] = dev->trigger_code_right; + mapping[button::r3] = find_keys(cfg->r3); + mapping[button::start] = find_keys(cfg->start); + mapping[button::select] = find_keys(cfg->select); + mapping[button::ps] = find_keys(cfg->ps); + mapping[button::ls_left] = dev->axis_code_left[0]; + mapping[button::ls_right] = dev->axis_code_left[1]; + mapping[button::ls_down] = dev->axis_code_left[2]; + mapping[button::ls_up] = dev->axis_code_left[3]; + mapping[button::rs_left] = dev->axis_code_right[0]; + mapping[button::rs_right] = dev->axis_code_right[1]; + mapping[button::rs_down] = dev->axis_code_right[2]; + mapping[button::rs_up] = dev->axis_code_right[3]; - mapping[button::skateboard_ir_nose] = find_keys(cfg->ir_nose); - mapping[button::skateboard_ir_tail] = find_keys(cfg->ir_tail); - mapping[button::skateboard_ir_left] = find_keys(cfg->ir_left); - mapping[button::skateboard_ir_right] = find_keys(cfg->ir_right); - mapping[button::skateboard_tilt_left] = find_keys(cfg->tilt_left); - mapping[button::skateboard_tilt_right] = find_keys(cfg->tilt_right); + mapping[button::skateboard_ir_nose] = find_keys(cfg->ir_nose); + mapping[button::skateboard_ir_tail] = find_keys(cfg->ir_tail); + mapping[button::skateboard_ir_left] = find_keys(cfg->ir_left); + mapping[button::skateboard_ir_right] = find_keys(cfg->ir_right); + mapping[button::skateboard_tilt_left] = find_keys(cfg->tilt_left); + mapping[button::skateboard_tilt_right] = find_keys(cfg->tilt_right); if (b_has_pressure_intensity_button) { - mapping[button::pressure_intensity_button] = find_keys(cfg->pressure_intensity_button); + mapping[button::pressure_intensity_button] = find_keys(cfg->pressure_intensity_button); } if (b_has_analog_limiter_button) { - mapping[button::analog_limiter_button] = find_keys(cfg->analog_limiter_button); + mapping[button::analog_limiter_button] = find_keys(cfg->analog_limiter_button); } return mapping; @@ -295,7 +293,7 @@ PadHandlerBase::connection mm_joystick_handler::get_next_button_press(const std: std::string name; } pressed_button{}; - const auto set_button_press = [&](const u64& keycode, const std::string& name, std::string_view type, u16 threshold) + const auto set_button_press = [&](u32 keycode, const std::string& name, std::string_view type, u16 threshold) { if (call_type != gui_call_type::blacklist && m_blacklist.contains(keycode)) return; @@ -365,7 +363,7 @@ PadHandlerBase::connection mm_joystick_handler::get_next_button_press(const std: const auto get_key_value = [this, &data](const std::string& str) -> u16 { u16 value{}; - for (u32 key_code : find_keys(cfg_pad::get_buttons(str))) + for (u32 key_code : find_keys(cfg_pad::get_buttons(str))) { if (const auto it = data.find(key_code); it != data.cend()) { @@ -399,9 +397,9 @@ PadHandlerBase::connection mm_joystick_handler::get_next_button_press(const std: return connection::no_data; } -std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOEX& js_info, const JOYCAPS& js_caps) +std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOEX& js_info, const JOYCAPS& js_caps) { - std::unordered_map button_values; + std::unordered_map button_values; for (const auto& entry : button_list) { @@ -424,7 +422,7 @@ std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOE } else { - auto emplacePOVs = [&](float val, u64 pov_neg, u64 pov_pos) + const auto emplacePOVs = [&](float val, u32 pov_neg, u32 pov_pos) { if (val < 0) { @@ -461,7 +459,7 @@ std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOE } } - auto add_axis_value = [&](DWORD axis, UINT min, UINT max, u64 pos, u64 neg) + auto add_axis_value = [&](DWORD axis, UINT min, UINT max, u32 pos, u32 neg) { constexpr f32 deadzone = 0.0f; const float val = ScaledAxisInput(static_cast(axis), static_cast(min), static_cast(max), deadzone); @@ -495,11 +493,11 @@ std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOE return button_values; } -std::unordered_map mm_joystick_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map mm_joystick_handler::get_button_values(const std::shared_ptr& device) { MMJOYDevice* dev = static_cast(device.get()); if (!dev) - return std::unordered_map(); + return std::unordered_map(); return GetButtonValues(dev->device_info, dev->device_caps); } @@ -539,7 +537,7 @@ std::shared_ptr mm_joystick_handler::create_de return dev; } -bool mm_joystick_handler::GetMMJOYDevice(int index, MMJOYDevice* dev) const +bool mm_joystick_handler::get_device(int index, MMJOYDevice* dev) const { if (!dev) return false; @@ -578,28 +576,28 @@ std::shared_ptr mm_joystick_handler::get_device(const std::string& de return get_device_by_name(device); } -bool mm_joystick_handler::get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) +bool mm_joystick_handler::get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) { const MMJOYDevice* dev = static_cast(device.get()); return dev && dev->trigger_code_left.contains(keyCode); } -bool mm_joystick_handler::get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) +bool mm_joystick_handler::get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) { const MMJOYDevice* dev = static_cast(device.get()); return dev && dev->trigger_code_right.contains(keyCode); } -bool mm_joystick_handler::get_is_left_stick(const std::shared_ptr& device, u64 keyCode) +bool mm_joystick_handler::get_is_left_stick(const std::shared_ptr& device, u32 keyCode) { const MMJOYDevice* dev = static_cast(device.get()); - return dev && std::any_of(dev->axis_code_left.cbegin(), dev->axis_code_left.cend(), [&keyCode](const std::set& s){ return s.contains(keyCode); }); + return dev && std::any_of(dev->axis_code_left.cbegin(), dev->axis_code_left.cend(), [&keyCode](const std::set& s){ return s.contains(keyCode); }); } -bool mm_joystick_handler::get_is_right_stick(const std::shared_ptr& device, u64 keyCode) +bool mm_joystick_handler::get_is_right_stick(const std::shared_ptr& device, u32 keyCode) { const MMJOYDevice* dev = static_cast(device.get()); - return dev && std::any_of(dev->axis_code_right.cbegin(), dev->axis_code_right.cend(), [&keyCode](const std::set& s){ return s.contains(keyCode); }); + return dev && std::any_of(dev->axis_code_right.cbegin(), dev->axis_code_right.cend(), [&keyCode](const std::set& s){ return s.contains(keyCode); }); } PadHandlerBase::connection mm_joystick_handler::update_connection(const std::shared_ptr& device) @@ -630,7 +628,7 @@ PadHandlerBase::connection mm_joystick_handler::update_connection(const std::sha } // Try to connect properly again - if (GetMMJOYDevice(dev->device_id, dev)) + if (get_device(dev->device_id, dev)) return connection::connected; return connection::disconnected; diff --git a/rpcs3/Input/mm_joystick_handler.h b/rpcs3/Input/mm_joystick_handler.h index 1459e9be82..e8cad683b3 100644 --- a/rpcs3/Input/mm_joystick_handler.h +++ b/rpcs3/Input/mm_joystick_handler.h @@ -16,10 +16,10 @@ class mm_joystick_handler final : public PadHandlerBase { - static constexpr u64 NO_BUTTON = u64{umax}; + static constexpr u32 NO_BUTTON = u32{umax}; // Unique names for the config files and our pad settings dialog - const std::unordered_map button_list = + const std::unordered_map button_list = { { NO_BUTTON , "" }, { JOY_BUTTON1 , "Button 1" }, @@ -57,7 +57,7 @@ class mm_joystick_handler final : public PadHandlerBase }; // Unique names for the config files and our pad settings dialog - const std::unordered_map pov_list = + const std::unordered_map pov_list = { { JOY_POVFORWARD, "POV Up" }, { JOY_POVRIGHT, "POV Right" }, @@ -65,7 +65,7 @@ class mm_joystick_handler final : public PadHandlerBase { JOY_POVLEFT, "POV Left" } }; - enum mmjoy_axis + enum mmjoy_axis : u32 { joy_x_pos = 9700, joy_x_neg, @@ -82,7 +82,7 @@ class mm_joystick_handler final : public PadHandlerBase }; // Unique names for the config files and our pad settings dialog - const std::unordered_map axis_list = + const std::unordered_map axis_list = { { joy_x_pos, "X+" }, { joy_x_neg, "X-" }, @@ -106,6 +106,10 @@ class mm_joystick_handler final : public PadHandlerBase JOYCAPS device_caps{}; MMRESULT device_status = JOYERR_UNPLUGGED; steady_clock::time_point last_update{}; + std::set trigger_code_left{}; + std::set trigger_code_right{}; + std::array, 4> axis_code_left{}; + std::array, 4> axis_code_right{}; }; public: @@ -118,31 +122,28 @@ public: void init_config(cfg_pad* cfg) override; private: - std::unordered_map GetButtonValues(const JOYINFOEX& js_info, const JOYCAPS& js_caps); + std::unordered_map GetButtonValues(const JOYINFOEX& js_info, const JOYCAPS& js_caps); std::shared_ptr get_device_by_name(const std::string& name); std::shared_ptr create_device_by_name(const std::string& name); - bool GetMMJOYDevice(int index, MMJOYDevice* dev) const; + bool get_device(int index, MMJOYDevice* dev) const; void enumerate_devices(); bool m_is_init = false; - std::set m_blacklist; - std::unordered_map m_min_button_values; + std::set m_blacklist; + std::unordered_map m_min_button_values; std::map> m_devices; - template - std::set find_keys(const std::vector& names) const; - - template - std::set find_keys(const cfg::string& cfg_string) const; + std::set find_keys(const std::vector& names) const; + std::set find_keys(const cfg::string& cfg_string) const; std::array, PadHandlerBase::button::button_count> get_mapped_key_codes(const std::shared_ptr& device, const cfg_pad* cfg) override; std::shared_ptr get_device(const std::string& device) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; }; #endif diff --git a/rpcs3/Input/ps_move_handler.cpp b/rpcs3/Input/ps_move_handler.cpp index 059ffee2bf..38c89a1de0 100644 --- a/rpcs3/Input/ps_move_handler.cpp +++ b/rpcs3/Input/ps_move_handler.cpp @@ -580,21 +580,21 @@ void ps_move_handler::handle_external_device(const pad_ensemble& binding) move_data.external_device_write_requested = false; } -bool ps_move_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ps_move_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { // We also report the T button as left trigger return keyCode == ps_move_key_codes::L2 || keyCode == ps_move_key_codes::t; } -bool ps_move_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ps_move_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { // We also report the Throttle button as right trigger return keyCode == ps_move_key_codes::R2 || keyCode == ps_move_key_codes::throttle; } -std::unordered_map ps_move_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map ps_move_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map key_buf; + std::unordered_map key_buf; ps_move_device* dev = static_cast(device.get()); if (!dev) return key_buf; @@ -760,7 +760,7 @@ void ps_move_handler::get_extended_info(const pad_ensemble& binding) handle_external_device(binding); } -pad_preview_values ps_move_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values ps_move_handler::get_preview_values(const std::unordered_map& data) { return { std::max(::at32(data, ps_move_key_codes::L2), ::at32(data, ps_move_key_codes::t)), diff --git a/rpcs3/Input/ps_move_handler.h b/rpcs3/Input/ps_move_handler.h index 6584364556..deac588862 100644 --- a/rpcs3/Input/ps_move_handler.h +++ b/rpcs3/Input/ps_move_handler.h @@ -192,11 +192,11 @@ private: void check_add_device(hid_device* hidDevice, hid_enumerated_device_view path, std::wstring_view wide_serial) override; int send_output_report(ps_move_device* device) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; diff --git a/rpcs3/Input/sdl_pad_handler.cpp b/rpcs3/Input/sdl_pad_handler.cpp index c47514f6ae..f681018d80 100644 --- a/rpcs3/Input/sdl_pad_handler.cpp +++ b/rpcs3/Input/sdl_pad_handler.cpp @@ -881,17 +881,17 @@ void sdl_pad_handler::set_rumble(SDLDevice* dev, u8 speed_large, u8 speed_small) } } -bool sdl_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == SDLKeyCodes::LT; } -bool sdl_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == SDLKeyCodes::RT; } -bool sdl_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -905,7 +905,7 @@ bool sdl_pad_handler::get_is_left_stick(const std::shared_ptr& /*devi } } -bool sdl_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -919,7 +919,7 @@ bool sdl_pad_handler::get_is_right_stick(const std::shared_ptr& /*dev } } -bool sdl_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -933,9 +933,9 @@ bool sdl_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& } } -std::unordered_map sdl_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map sdl_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map values; + std::unordered_map values; SDLDevice* dev = static_cast(device.get()); if (!dev || !dev->sdl.gamepad) return values; @@ -1086,7 +1086,7 @@ std::unordered_map sdl_pad_handler::get_button_values(const std::share return values; } -pad_preview_values sdl_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values sdl_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, LT), diff --git a/rpcs3/Input/sdl_pad_handler.h b/rpcs3/Input/sdl_pad_handler.h index d889463934..f65d31a78a 100644 --- a/rpcs3/Input/sdl_pad_handler.h +++ b/rpcs3/Input/sdl_pad_handler.h @@ -171,13 +171,13 @@ private: PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_touch_pad_motion(const std::shared_ptr& device, u64 keyCode) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_touch_pad_motion(const std::shared_ptr& device, u32 keyCode) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; u32 get_battery_color(int power_level, u32 brightness) const; void set_rumble(SDLDevice* dev, u8 speed_large, u8 speed_small); diff --git a/rpcs3/Input/skateboard_pad_handler.cpp b/rpcs3/Input/skateboard_pad_handler.cpp index fdcc5be727..577d30d8e3 100644 --- a/rpcs3/Input/skateboard_pad_handler.cpp +++ b/rpcs3/Input/skateboard_pad_handler.cpp @@ -272,9 +272,9 @@ PadHandlerBase::connection skateboard_pad_handler::update_connection(const std:: return connection::connected; } -std::unordered_map skateboard_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map skateboard_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map key_buf; + std::unordered_map key_buf; skateboard_device* dev = static_cast(device.get()); if (!dev) return key_buf; @@ -328,7 +328,7 @@ void skateboard_pad_handler::get_extended_info(const pad_ensemble& binding) set_raw_orientation(*pad); } -pad_preview_values skateboard_pad_handler::get_preview_values(const std::unordered_map& /*data*/) +pad_preview_values skateboard_pad_handler::get_preview_values(const std::unordered_map& /*data*/) { // There is no proper user interface for skateboard values yet return {}; diff --git a/rpcs3/Input/skateboard_pad_handler.h b/rpcs3/Input/skateboard_pad_handler.h index e7f15c494e..92e4174acc 100644 --- a/rpcs3/Input/skateboard_pad_handler.h +++ b/rpcs3/Input/skateboard_pad_handler.h @@ -183,8 +183,8 @@ private: int send_output_report(skateboard_device* device) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; }; diff --git a/rpcs3/Input/xinput_pad_handler.cpp b/rpcs3/Input/xinput_pad_handler.cpp index 4feec000e3..b9d4450200 100644 --- a/rpcs3/Input/xinput_pad_handler.cpp +++ b/rpcs3/Input/xinput_pad_handler.cpp @@ -201,9 +201,9 @@ int xinput_pad_handler::GetDeviceNumber(const std::string& padId) return device_number; } -std::unordered_map xinput_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map xinput_pad_handler::get_button_values(const std::shared_ptr& device) { - PadButtonValues values; + std::unordered_map values; XInputDevice* dev = static_cast(device.get()); if (!dev || dev->state != ERROR_SUCCESS) // the state has to be aquired with update_connection before calling this function return values; @@ -217,9 +217,9 @@ std::unordered_map xinput_pad_handler::get_button_values(const std::sh return get_button_values_base(dev->state_base, m_trigger_recognition_mode); } -xinput_pad_handler::PadButtonValues xinput_pad_handler::get_button_values_base(const XINPUT_STATE& state, trigger_recognition_mode trigger_mode) +std::unordered_map xinput_pad_handler::get_button_values_base(const XINPUT_STATE& state, trigger_recognition_mode trigger_mode) { - PadButtonValues values; + std::unordered_map values; // Triggers if (trigger_mode == trigger_recognition_mode::any || trigger_mode == trigger_recognition_mode::one_directional) @@ -291,9 +291,9 @@ xinput_pad_handler::PadButtonValues xinput_pad_handler::get_button_values_base(c return values; } -xinput_pad_handler::PadButtonValues xinput_pad_handler::get_button_values_scp(const SCP_EXTN& state, trigger_recognition_mode trigger_mode) +std::unordered_map xinput_pad_handler::get_button_values_scp(const SCP_EXTN& state, trigger_recognition_mode trigger_mode) { - PadButtonValues values; + std::unordered_map values; // Triggers if (trigger_mode == trigger_recognition_mode::any || trigger_mode == trigger_recognition_mode::one_directional) @@ -359,7 +359,7 @@ xinput_pad_handler::PadButtonValues xinput_pad_handler::get_button_values_scp(co return values; } -pad_preview_values xinput_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values xinput_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, LT), @@ -455,17 +455,17 @@ std::shared_ptr xinput_pad_handler::get_device(const std::string& dev return dev; } -bool xinput_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool xinput_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == XInputKeyCodes::LT; } -bool xinput_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool xinput_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == XInputKeyCodes::RT; } -bool xinput_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool xinput_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -479,7 +479,7 @@ bool xinput_pad_handler::get_is_left_stick(const std::shared_ptr& /*d } } -bool xinput_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool xinput_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { diff --git a/rpcs3/Input/xinput_pad_handler.h b/rpcs3/Input/xinput_pad_handler.h index 899e649b13..d4233bae4a 100644 --- a/rpcs3/Input/xinput_pad_handler.h +++ b/rpcs3/Input/xinput_pad_handler.h @@ -93,8 +93,6 @@ class xinput_pad_handler final : public PadHandlerBase RSYPos }; - using PadButtonValues = std::unordered_map; - struct XInputDevice : public PadDevice { u32 deviceNumber{ 0 }; @@ -123,8 +121,8 @@ private: using PFN_XINPUTGETBATTERYINFORMATION = DWORD(WINAPI*)(DWORD, BYTE, XINPUT_BATTERY_INFORMATION*); int GetDeviceNumber(const std::string& padId); - static PadButtonValues get_button_values_base(const XINPUT_STATE& state, trigger_recognition_mode trigger_mode); - static PadButtonValues get_button_values_scp(const SCP_EXTN& state, trigger_recognition_mode trigger_mode); + static std::unordered_map get_button_values_base(const XINPUT_STATE& state, trigger_recognition_mode trigger_mode); + static std::unordered_map get_button_values_scp(const SCP_EXTN& state, trigger_recognition_mode trigger_mode); PFN_XINPUTGETEXTENDED xinputGetExtended{ nullptr }; PFN_XINPUTGETCUSTOMDATA xinputGetCustomData{ nullptr }; @@ -134,13 +132,13 @@ private: utils::dynamic_library library; std::shared_ptr get_device(const std::string& device) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; }; From 477ae6c6dfa5beaa46f892beed27cf469e59db20 Mon Sep 17 00:00:00 2001 From: p0yr4s Date: Sat, 14 Mar 2026 18:20:02 +0100 Subject: [PATCH 426/630] cmake: Only use Qt6::GuiPrivate for Qt >= 6.10 --- 3rdparty/qt6.cmake | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/3rdparty/qt6.cmake b/3rdparty/qt6.cmake index e15e0abdcb..969967fa40 100644 --- a/3rdparty/qt6.cmake +++ b/3rdparty/qt6.cmake @@ -6,15 +6,22 @@ find_package(Qt6 ${QT_MIN_VER} CONFIG COMPONENTS Widgets Concurrent Multimedia M if(WIN32) target_link_libraries(3rdparty_qt6 INTERFACE Qt6::Widgets Qt6::Concurrent Qt6::Multimedia Qt6::MultimediaWidgets Qt6::Svg Qt6::SvgWidgets) else() - set(QT_NO_PRIVATE_MODULE_WARNING ON) - find_package(Qt6 ${QT_MIN_VER} COMPONENTS DBus Gui GuiPrivate) + find_package(Qt6 ${QT_MIN_VER} COMPONENTS DBus Gui) + if(Qt6_VERSION VERSION_GREATER_EQUAL "6.10.0") + set(QT_NO_PRIVATE_MODULE_WARNING ON) + find_package(Qt6 ${QT_MIN_VER} COMPONENTS GuiPrivate) + endif() if(Qt6DBus_FOUND) target_link_libraries(3rdparty_qt6 INTERFACE Qt6::Widgets Qt6::DBus Qt6::Concurrent Qt6::Multimedia Qt6::MultimediaWidgets Qt6::Svg Qt6::SvgWidgets) target_compile_definitions(3rdparty_qt6 INTERFACE -DHAVE_QTDBUS) else() target_link_libraries(3rdparty_qt6 INTERFACE Qt6::Widgets Qt6::Concurrent Qt6::Multimedia Qt6::MultimediaWidgets Qt6::Svg Qt6::SvgWidgets) endif() - target_link_libraries(3rdparty_qt6 INTERFACE Qt6::GuiPrivate) + if(Qt6_VERSION VERSION_GREATER_EQUAL "6.10.0") + target_link_libraries(3rdparty_qt6 INTERFACE Qt6::GuiPrivate) + else() + target_include_directories(3rdparty_qt6 INTERFACE ${Qt6Gui_PRIVATE_INCLUDE_DIRS}) + endif() endif() if(Qt6Widgets_FOUND) From 297db8713fbb02bfb156edb6c03c68850825a83e Mon Sep 17 00:00:00 2001 From: p0yr4s Date: Sat, 14 Mar 2026 18:20:15 +0100 Subject: [PATCH 427/630] qt: import QJsonDocument --- rpcs3/rpcs3qt/downloader.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/rpcs3qt/downloader.cpp b/rpcs3/rpcs3qt/downloader.cpp index 65f481bff8..852449c0af 100644 --- a/rpcs3/rpcs3qt/downloader.cpp +++ b/rpcs3/rpcs3qt/downloader.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "downloader.h" #include "curl_handle.h" From 722101259383b21fedd681559a40bec4785bba16 Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 16 Mar 2026 01:19:40 +0100 Subject: [PATCH 428/630] config: Disable pad navigation by default Pad navigation is currently crashing with the SDL handler, see #18362. Disable it until the issue is fixed. --- rpcs3/rpcs3qt/gui_settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index bdc6401031..21a46259c2 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -315,7 +315,7 @@ namespace gui const gui_save sc_shortcuts = gui_save(sc, "shortcuts", QVariantMap()); - const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", true); + const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", false); const gui_save nav_global = gui_save(navigation, "allow_global_pad_input", false); } From 1fb97734a0ee70588bd9124ec204782d874c0b47 Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 16 Mar 2026 01:12:51 +0100 Subject: [PATCH 429/630] cellDmuxPamf: LLE by default again HLE implementation is crashing on a few games, see #18360, revert it back to LLE until issues with HLE are fixed --- rpcs3/Emu/Cell/lv2/sys_prx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index f46f3bdafa..f20b6be6cb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -64,7 +64,7 @@ extern const std::map g_prx_list { "libddpdec.sprx", 0 }, { "libdivxdec.sprx", 0 }, { "libdmux.sprx", 0 }, - { "libdmuxpamf.sprx", 1 }, + { "libdmuxpamf.sprx", 0 }, { "libdtslbrdec.sprx", 0 }, { "libfiber.sprx", 0 }, { "libfont.sprx", 0 }, From b422cb86f277f9ce668048d084e91e69564ea31f Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 16 Mar 2026 01:07:29 +0100 Subject: [PATCH 430/630] cmake: Build with SDL by default --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 738d9bbf17..e5b77091cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,7 @@ option(USE_LIBEVDEV "libevdev-based joystick support" ON) option(USE_DISCORD_RPC "Discord rich presence integration" OFF) option(USE_VULKAN "Vulkan render backend" ON) option(USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF) -option(USE_SDL "Enables SDL input handler" OFF) +option(USE_SDL "Enables SDL input handler" ON) option(USE_SYSTEM_CUBEB "Prefer system cubeb instead of the builtin one" OFF) option(USE_SYSTEM_CURL "Prefer system Curl instead of the prebuild one" ON) option(USE_SYSTEM_FAUDIO "Prefer system FAudio instead of the builtin one" OFF) From 6c48bd8f93fee36cafa4438d8bd262673191c437 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 16 Mar 2026 08:08:36 +0100 Subject: [PATCH 431/630] Fix callback initialization order We need to initialize the emu callbacks before creating the main window. Otherwise CallFromMainThread segs since call_from_main_thread is null. The same goes for the CallFromMainThread connect in gui_application. If we create the connection too late, we will simply never wake up the caller and therefore softlock eventually. --- rpcs3/Emu/System.cpp | 4 ++- rpcs3/rpcs3qt/gui_application.cpp | 45 +++++++++++++++---------------- rpcs3/rpcs3qt/gui_settings.h | 2 +- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 3548df869d..85b753d130 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -166,6 +166,8 @@ void fmt_class_string::format(std::string& out, u64 arg) void Emulator::CallFromMainThread(std::function&& func, atomic_t* wake_up, bool track_emu_state, u64 stop_ctr, std::source_location src_loc) const { + ensure(func); + std::function final_func = [this, before = IsStopped(true), track_emu_state, thread_name = thread_ctrl::get_name(), src = src_loc , count = (stop_ctr == umax ? +m_stop_ctr : stop_ctr), func = std::move(func)] { @@ -179,7 +181,7 @@ void Emulator::CallFromMainThread(std::function&& func, atomic_t* w } }; - m_cb.call_from_main_thread(std::move(final_func), wake_up); + ensure(m_cb.call_from_main_thread)(std::move(final_func), wake_up); } void Emulator::BlockingCallFromMainThread(std::function&& func, bool track_emu_state, std::source_location src_loc) const diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index 113f5a6ebb..606a081fff 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -154,6 +154,12 @@ bool gui_application::Init() // Force init the emulator InitializeEmulator(m_active_user, m_show_gui); + // Create callbacks from the emulator, which reference the handlers. + InitializeCallbacks(); + + // Create connects to propagate events throughout Gui. + InitializeConnects(); + // Create the main window if (m_show_gui) { @@ -164,14 +170,23 @@ bool gui_application::Init() const auto index = codes.indexOf(language); LoadLanguage(index < 0 ? QLocale(QLocale::English).bcp47Name() : ::at32(codes, index)); + + connect(m_main_window, &main_window::RequestLanguageChange, this, &gui_application::LoadLanguage); + connect(m_main_window, &main_window::RequestGlobalStylesheetChange, this, &gui_application::OnChangeStyleSheetRequest); + connect(m_main_window, &main_window::NotifyEmuSettingsChange, this, [this](){ OnEmuSettingsChange(); }); + connect(m_main_window, &main_window::NotifyShortcutHandlers, this, &gui_application::OnShortcutChange); + + connect(this, &gui_application::OnEmulatorRun, m_main_window, &main_window::OnEmuRun); + connect(this, &gui_application::OnEmulatorStop, m_main_window, &main_window::OnEmuStop); + connect(this, &gui_application::OnEmulatorPause, m_main_window, &main_window::OnEmuPause); + connect(this, &gui_application::OnEmulatorResume, m_main_window, &main_window::OnEmuResume); + connect(this, &gui_application::OnEmulatorReady, m_main_window, &main_window::OnEmuReady); + connect(this, &gui_application::OnEnableDiscEject, m_main_window, &main_window::OnEnableDiscEject); + connect(this, &gui_application::OnEnableDiscInsert, m_main_window, &main_window::OnEnableDiscInsert); + + connect(QGuiApplication::styleHints(), &QStyleHints::colorSchemeChanged, this, [this](){ OnChangeStyleSheetRequest(); }); } - // Create callbacks from the emulator, which reference the handlers. - InitializeCallbacks(); - - // Create connects to propagate events throughout Gui. - InitializeConnects(); - if (m_gui_settings->GetValue(gui::ib_show_welcome).toBool()) { welcome_dialog* welcome = new welcome_dialog(m_gui_settings, false); @@ -438,24 +453,6 @@ void gui_application::InitializeConnects() connect(this, &gui_application::OnEmulatorResume, this, &gui_application::StartPlaytime); connect(this, &QGuiApplication::applicationStateChanged, this, &gui_application::OnAppStateChanged); - if (m_main_window) - { - connect(m_main_window, &main_window::RequestLanguageChange, this, &gui_application::LoadLanguage); - connect(m_main_window, &main_window::RequestGlobalStylesheetChange, this, &gui_application::OnChangeStyleSheetRequest); - connect(m_main_window, &main_window::NotifyEmuSettingsChange, this, [this](){ OnEmuSettingsChange(); }); - connect(m_main_window, &main_window::NotifyShortcutHandlers, this, &gui_application::OnShortcutChange); - - connect(this, &gui_application::OnEmulatorRun, m_main_window, &main_window::OnEmuRun); - connect(this, &gui_application::OnEmulatorStop, m_main_window, &main_window::OnEmuStop); - connect(this, &gui_application::OnEmulatorPause, m_main_window, &main_window::OnEmuPause); - connect(this, &gui_application::OnEmulatorResume, m_main_window, &main_window::OnEmuResume); - connect(this, &gui_application::OnEmulatorReady, m_main_window, &main_window::OnEmuReady); - connect(this, &gui_application::OnEnableDiscEject, m_main_window, &main_window::OnEnableDiscEject); - connect(this, &gui_application::OnEnableDiscInsert, m_main_window, &main_window::OnEnableDiscInsert); - - connect(QGuiApplication::styleHints(), &QStyleHints::colorSchemeChanged, this, [this](){ OnChangeStyleSheetRequest(); }); - } - #ifdef WITH_DISCORD_RPC connect(this, &gui_application::OnEmulatorRun, [this](bool /*start_playtime*/) { diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index 21a46259c2..bdc6401031 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -315,7 +315,7 @@ namespace gui const gui_save sc_shortcuts = gui_save(sc, "shortcuts", QVariantMap()); - const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", false); + const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", true); const gui_save nav_global = gui_save(navigation, "allow_global_pad_input", false); } From 2c2ec6e109f0314080e1e40fe65bdc1e4d9d915c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 12 Mar 2026 18:08:14 +0100 Subject: [PATCH 432/630] VS: Add missing test files I'm having some gmock issues, so let's just exclude them for now. --- rpcs3/tests/rpcs3_test.vcxproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rpcs3/tests/rpcs3_test.vcxproj b/rpcs3/tests/rpcs3_test.vcxproj index 263334d19e..fb9d0d21d4 100644 --- a/rpcs3/tests/rpcs3_test.vcxproj +++ b/rpcs3/tests/rpcs3_test.vcxproj @@ -85,8 +85,16 @@ + + + true + + + + true + From 8b74ea8757889eed03e3e11975e78ceb9b2a4faa Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 20:20:12 +0100 Subject: [PATCH 433/630] Qt: Add steam shortcuts --- rpcs3/rpcs3.cpp | 2 +- rpcs3/rpcs3.vcxproj | 2 + rpcs3/rpcs3.vcxproj.filters | 6 + rpcs3/rpcs3qt/CMakeLists.txt | 1 + rpcs3/rpcs3qt/debugger_frame.cpp | 2 +- rpcs3/rpcs3qt/game_list_actions.cpp | 23 +- rpcs3/rpcs3qt/game_list_context_menu.cpp | 27 + rpcs3/rpcs3qt/main_window.cpp | 95 +-- rpcs3/rpcs3qt/main_window.h | 3 +- rpcs3/rpcs3qt/pkg_install_dialog.cpp | 12 + rpcs3/rpcs3qt/pkg_install_dialog.h | 2 + rpcs3/rpcs3qt/shortcut_utils.cpp | 125 +++- rpcs3/rpcs3qt/shortcut_utils.h | 1 + rpcs3/rpcs3qt/steam_utils.cpp | 807 +++++++++++++++++++++++ rpcs3/rpcs3qt/steam_utils.h | 104 +++ 15 files changed, 1136 insertions(+), 76 deletions(-) create mode 100644 rpcs3/rpcs3qt/steam_utils.cpp create mode 100644 rpcs3/rpcs3qt/steam_utils.h diff --git a/rpcs3/rpcs3.cpp b/rpcs3/rpcs3.cpp index 6c2130eca6..cb2058874e 100644 --- a/rpcs3/rpcs3.cpp +++ b/rpcs3/rpcs3.cpp @@ -131,7 +131,7 @@ std::set get_one_drive_paths() do { path_buffer.resize(path_buffer.size() + MAX_PATH); - DWORD buffer_size = static_cast(path_buffer.size() - 1); + DWORD buffer_size = static_cast((path_buffer.size() - 1) * sizeof(wchar_t)); status = RegQueryValueExW(hkey, L"UserFolder", NULL, &type, reinterpret_cast(path_buffer.data()), &buffer_size); } while (status == ERROR_MORE_DATA); diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index cd5d7c8bc4..5401efb323 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -891,6 +891,7 @@ + @@ -1719,6 +1720,7 @@ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + $(QTDIR)\bin\moc.exe;%(FullPath) diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 6c7841b4fc..d9ebc34ef6 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1278,6 +1278,9 @@ Gui\settings + + Gui\utils + @@ -1523,6 +1526,9 @@ Gui\settings + + Gui\utils + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index 6fe8d9db13..5c330c7ae4 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -104,6 +104,7 @@ add_library(rpcs3_ui STATIC shortcut_settings.cpp skylander_dialog.cpp sound_effect_manager_dialog.cpp + steam_utils.cpp syntax_highlighter.cpp system_cmd_dialog.cpp table_item_delegate.cpp diff --git a/rpcs3/rpcs3qt/debugger_frame.cpp b/rpcs3/rpcs3qt/debugger_frame.cpp index f1dd9cf892..0859e19856 100644 --- a/rpcs3/rpcs3qt/debugger_frame.cpp +++ b/rpcs3/rpcs3qt/debugger_frame.cpp @@ -1093,7 +1093,7 @@ void debugger_frame::UpdateUnitList() idm::select>(on_select, idm::unlocked); } - m_hw_ppu_idx = cpu_list.size() + 1; // Account for NoThreadString thread + m_hw_ppu_idx = ::size32(cpu_list) + 1; // Account for NoThreadString thread for (u32 i = 0; i < g_cfg.core.ppu_threads + 0u; i++) { diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp index 5e3e305860..af295b5176 100644 --- a/rpcs3/rpcs3qt/game_list_actions.cpp +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -1496,13 +1496,6 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con gameid_token_value = gameinfo->info.serial; } -#ifdef __linux__ - const std::string target_cli_args = gameinfo->info.path.starts_with(dev_flash) ? fmt::format("--no-gui \"%%%%RPCS3_VFS%%%%:dev_flash/%s\"", gameinfo->info.path.substr(dev_flash.size())) - : fmt::format("--no-gui \"%%%%RPCS3_GAMEID%%%%:%s\"", gameid_token_value); -#else - const std::string target_cli_args = gameinfo->info.path.starts_with(dev_flash) ? fmt::format("--no-gui \"%%RPCS3_VFS%%:dev_flash/%s\"", gameinfo->info.path.substr(dev_flash.size())) - : fmt::format("--no-gui \"%%RPCS3_GAMEID%%:%s\"", gameid_token_value); -#endif const std::string target_icon_dir = fmt::format("%sIcons/game_icons/%s/", fs::get_config_dir(), gameinfo->info.serial); if (!fs::create_path(target_icon_dir)) @@ -1512,7 +1505,11 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con continue; } - for (const gui::utils::shortcut_location& location : locations) + const bool is_vsh = gameinfo->info.path.starts_with(dev_flash); + const std::string cli_arg_token = is_vsh ? "RPCS3_VFS" : "RPCS3_GAMEID"; + const std::string cli_arg_value = is_vsh ? ("dev_flash/" + gameinfo->info.path.substr(dev_flash.size())) : gameid_token_value; + + for (gui::utils::shortcut_location location : locations) { std::string destination; @@ -1524,6 +1521,9 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con case gui::utils::shortcut_location::applications: destination = "application menu"; break; + case gui::utils::shortcut_location::steam: + destination = "Steam"; + break; #ifdef _WIN32 case gui::utils::shortcut_location::rpcs3_shortcuts: destination = "/games/shortcuts/"; @@ -1531,6 +1531,13 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con #endif } +#ifdef __linux__ + const std::string percent = location == gui::utils::shortcut_location::steam ? "%" : "%%"; +#else + const std::string percent = "%"; +#endif + const std::string target_cli_args = fmt::format("--no-gui \"%s%s%s:%s\"", percent, cli_arg_token, percent, cli_arg_value); + if (!gameid_token_value.empty() && gui::utils::create_shortcut(gameinfo->info.name, gameinfo->icon_in_archive ? gameinfo->info.path : "", gameinfo->info.serial, target_cli_args, gameinfo->info.name, gameinfo->info.icon_path, target_icon_dir, location)) { game_list_log.success("Created %s shortcut for %s", destination, QString::fromStdString(gameinfo->info.name).simplified()); diff --git a/rpcs3/rpcs3qt/game_list_context_menu.cpp b/rpcs3/rpcs3qt/game_list_context_menu.cpp index 720aac8596..81f6f6e973 100644 --- a/rpcs3/rpcs3qt/game_list_context_menu.cpp +++ b/rpcs3/rpcs3qt/game_list_context_menu.cpp @@ -6,6 +6,7 @@ #include "input_dialog.h" #include "qt_utils.h" #include "shortcut_utils.h" +#include "steam_utils.h" #include "settings_dialog.h" #include "pad_settings_dialog.h" #include "patch_manager_dialog.h" @@ -273,6 +274,7 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& { m_game_list_actions->CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::desktop}); }); + #ifdef _WIN32 QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Start Menu Shortcut")); #elif defined(__APPLE__) @@ -285,6 +287,17 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& m_game_list_actions->CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::applications}); }); + if (gui::utils::steam_shortcut::steam_installed()) + { + const bool steam_running = gui::utils::steam_shortcut::is_steam_running(); + QAction* create_steam_shortcut = manage_game_menu->addAction(steam_running ? tr("&Create Steam Shortcut (Steam must be closed)") : tr("&Create Steam Shortcut")); + connect(create_steam_shortcut, &QAction::triggered, this, [this, gameinfo]() + { + m_game_list_actions->CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::steam}); + }); + create_steam_shortcut->setEnabled(!steam_running); + } + manage_game_menu->addSeparator(); // Hide/rename game in game list @@ -843,6 +856,20 @@ void game_list_context_menu::show_multi_selection_context_menu(const std::vector m_game_list_actions->CreateShortcuts(games, {gui::utils::shortcut_location::applications}); }); + if (gui::utils::steam_shortcut::steam_installed()) + { + const bool steam_running = gui::utils::steam_shortcut::is_steam_running(); + QAction* create_steam_shortcut = manage_game_menu->addAction(steam_running ? tr("&Create Steam Shortcut (Steam must be closed)") : tr("&Create Steam Shortcut")); + connect(create_steam_shortcut, &QAction::triggered, this, [this, games]() + { + if (QMessageBox::question(m_game_list_frame, tr("Confirm Creation"), tr("Create Steam shortcut?")) != QMessageBox::Yes) + return; + + m_game_list_actions->CreateShortcuts(games, {gui::utils::shortcut_location::steam}); + }); + create_steam_shortcut->setEnabled(!steam_running); + } + manage_game_menu->addSeparator(); // Hide game in game list diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 687358d625..1b77f8f2b1 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -35,9 +35,9 @@ #include "camera_settings_dialog.h" #include "ps_move_tracker_dialog.h" #include "ipc_settings_dialog.h" -#include "shortcut_utils.h" #include "config_checker.h" #include "shortcut_dialog.h" +#include "steam_utils.h" #include "system_cmd_dialog.h" #include "emulated_pad_settings_dialog.h" #include "emulated_logitech_g27_settings_dialog.h" @@ -935,9 +935,8 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo } std::vector packages; + std::set shortcut_locations; bool precompile_caches = false; - bool create_desktop_shortcuts = false; - bool create_app_shortcut = false; bool canceled = false; game_compatibility* compat = m_game_list_frame ? m_game_list_frame->GetGameCompatibility() : nullptr; @@ -954,8 +953,15 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo packages = dlg.get_paths_to_install(); precompile_caches = dlg.precompile_caches(); - create_desktop_shortcuts = dlg.create_desktop_shortcuts(); - create_app_shortcut = dlg.create_app_shortcut(); + + if (dlg.create_desktop_shortcuts()) + shortcut_locations.insert(gui::utils::shortcut_location::desktop); + + if (dlg.create_app_shortcut()) + shortcut_locations.insert(gui::utils::shortcut_location::applications); + + if (dlg.create_steam_shortcut()) + shortcut_locations.insert(gui::utils::shortcut_location::steam); }); dlg.exec(); @@ -1136,7 +1142,7 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo if (!bootable_paths_installed.empty()) { - m_game_list_frame->AddRefreshedSlot([this, create_desktop_shortcuts, precompile_caches, create_app_shortcut, paths = std::move(bootable_paths_installed)](std::set& claimed_paths) mutable + m_game_list_frame->AddRefreshedSlot([this, shortcut_locations, precompile_caches, paths = std::move(bootable_paths_installed)](std::set& claimed_paths) mutable { // Try to claim operations on ID for (auto it = paths.begin(); it != paths.end();) @@ -1154,7 +1160,7 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo } } - CreateShortCuts(paths, create_desktop_shortcuts, create_app_shortcut); + CreateShortCuts(paths, shortcut_locations); if (precompile_caches) { @@ -2370,6 +2376,7 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri #else QCheckBox* quick_check = new QCheckBox(tr("Add launcher shortcut(s)")); #endif + QLabel* label = new QLabel(tr("%1\nWould you like to precompile caches and install shortcuts to the installed software? (%2 new software detected)\n\n").arg(message).arg(bootable_paths.size()), dlg); vlayout->addWidget(label); @@ -2381,6 +2388,17 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri vlayout->addWidget(quick_check); vlayout->addStretch(3); + QCheckBox* steam_check = nullptr; + if (gui::utils::steam_shortcut::steam_installed()) + { + const bool steam_running = gui::utils::steam_shortcut::is_steam_running(); + steam_check = new QCheckBox(steam_running ? tr("Add Steam Shortcut(s) (Steam must be closed)") : tr("Add Steam shortcut(s)")); + steam_check->setEnabled(!steam_running); + + vlayout->addWidget(steam_check); + vlayout->addStretch(3); + } + QDialogButtonBox* btn_box = new QDialogButtonBox(QDialogButtonBox::Ok); vlayout->addWidget(btn_box); @@ -2389,13 +2407,22 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri connect(btn_box, &QDialogButtonBox::accepted, this, [=, this, paths = std::move(bootable_paths)]() { const bool precompile_caches = precompile_check->isChecked(); - const bool create_desktop_shortcuts = desk_check->isChecked(); - const bool create_app_shortcut = quick_check->isChecked(); + + std::set shortcut_locations; + + if (desk_check->isChecked()) + shortcut_locations.insert(gui::utils::shortcut_location::desktop); + + if (quick_check->isChecked()) + shortcut_locations.insert(gui::utils::shortcut_location::applications); + + if (steam_check && steam_check->isChecked()) + shortcut_locations.insert(gui::utils::shortcut_location::steam); dlg->hide(); dlg->accept(); - CreateShortCuts(paths, create_desktop_shortcuts, create_app_shortcut); + CreateShortCuts(paths, shortcut_locations); if (precompile_caches) { @@ -2407,52 +2434,40 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri dlg->open(); } -void main_window::CreateShortCuts(const std::map& paths, bool create_desktop_shortcuts, bool create_app_shortcut) +void main_window::CreateShortCuts(const std::map& paths, std::set locations) { if (paths.empty()) return; - std::set locations; - #ifdef _WIN32 locations.insert(gui::utils::shortcut_location::rpcs3_shortcuts); +#else + if (locations.empty()) + { + return; + } #endif - if (create_desktop_shortcuts) - { - locations.insert(gui::utils::shortcut_location::desktop); - } - if (create_app_shortcut) - { - locations.insert(gui::utils::shortcut_location::applications); - } + std::vector game_data_shortcuts; - if (!locations.empty()) + for (const auto& [boot_path, title_id] : paths) { - std::vector game_data_shortcuts; - - for (const auto& [boot_path, title_id] : paths) + for (const game_info& gameinfo : m_game_list_frame->GetGameInfo()) { - for (const game_info& gameinfo : m_game_list_frame->GetGameInfo()) + if (gameinfo && gameinfo->info.serial == title_id.toStdString()) { - if (gameinfo && gameinfo->info.serial == title_id.toStdString()) + if (Emu.IsPathInsideDir(boot_path, gameinfo->info.path)) { - if (Emu.IsPathInsideDir(boot_path, gameinfo->info.path)) - { - if (!locations.empty()) - { - game_data_shortcuts.push_back(gameinfo); - } - } - - break; + game_data_shortcuts.push_back(gameinfo); } + + break; } } + } - if (!game_data_shortcuts.empty() && !locations.empty()) - { - m_game_list_frame->actions()->CreateShortcuts(game_data_shortcuts, locations); - } + if (!game_data_shortcuts.empty()) + { + m_game_list_frame->actions()->CreateShortcuts(game_data_shortcuts, locations); } } diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index 588c6e6918..7f0bb8e2ea 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -10,6 +10,7 @@ #include "update_manager.h" #include "settings.h" #include "shortcut_handler.h" +#include "shortcut_utils.h" #include "Emu/config_mode.h" #include "Emu/System.h" @@ -145,7 +146,7 @@ private: static bool InstallFileInExData(const std::string& extension, const QString& path, const std::string& filename); bool HandlePackageInstallation(QStringList file_paths, bool from_boot); - void CreateShortCuts(const std::map& paths, bool create_desktop_shortcuts, bool create_app_shortcut); + void CreateShortCuts(const std::map& paths, std::set locations); void HandlePupInstallation(const QString& file_path, const QString& dir_path = ""); void ExtractPup(); diff --git a/rpcs3/rpcs3qt/pkg_install_dialog.cpp b/rpcs3/rpcs3qt/pkg_install_dialog.cpp index 9b0f926484..3d4193d4e5 100644 --- a/rpcs3/rpcs3qt/pkg_install_dialog.cpp +++ b/rpcs3/rpcs3qt/pkg_install_dialog.cpp @@ -3,6 +3,7 @@ #include "numbered_widget_item.h" #include "richtext_item_delegate.h" #include "qt_utils.h" +#include "steam_utils.h" #include "Emu/system_utils.hpp" #include "Utilities/File.h" @@ -194,6 +195,17 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil vbox->addWidget(precompile_check); vbox->addWidget(desk_check); vbox->addWidget(quick_check); + + if (gui::utils::steam_shortcut::steam_installed()) + { + const bool steam_running = gui::utils::steam_shortcut::is_steam_running(); + QCheckBox* steam_check = new QCheckBox(steam_running ? tr("Add Steam Shortcut(s) (Steam must be closed)") : tr("Add Steam shortcut(s)")); + connect(steam_check, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state){ m_create_steam_shortcut = state != Qt::CheckState::Unchecked; }); + steam_check->setEnabled(!steam_running); + + vbox->addWidget(steam_check); + } + vbox->addWidget(installation_info); vbox->addWidget(buttons); diff --git a/rpcs3/rpcs3qt/pkg_install_dialog.h b/rpcs3/rpcs3qt/pkg_install_dialog.h index f1a623009d..b1f3dbeb9d 100644 --- a/rpcs3/rpcs3qt/pkg_install_dialog.h +++ b/rpcs3/rpcs3qt/pkg_install_dialog.h @@ -22,6 +22,7 @@ public: bool precompile_caches() const { return m_precompile_caches; } bool create_desktop_shortcuts() const { return m_create_desktop_shortcuts; } bool create_app_shortcut() const { return m_create_app_shortcut; } + bool create_steam_shortcut() const { return m_create_steam_shortcut; } private: void update_info(QLabel* installation_info, QDialogButtonBox* buttons) const; @@ -31,4 +32,5 @@ private: bool m_precompile_caches = false; bool m_create_desktop_shortcuts = false; bool m_create_app_shortcut = false; + bool m_create_steam_shortcut = false; }; diff --git a/rpcs3/rpcs3qt/shortcut_utils.cpp b/rpcs3/rpcs3qt/shortcut_utils.cpp index 2bc2bfc578..8194bd184b 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.cpp +++ b/rpcs3/rpcs3qt/shortcut_utils.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "shortcut_utils.h" +#include "steam_utils.h" #include "qt_utils.h" #include "Emu/VFS.h" #include "Utilities/File.h" @@ -30,6 +31,25 @@ LOG_CHANNEL(sys_log, "SYS"); +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](gui::utils::shortcut_location value) + { + switch (value) + { + case gui::utils::shortcut_location::desktop: return "desktop"; + case gui::utils::shortcut_location::applications: return "applications"; + case gui::utils::shortcut_location::steam: return "steam"; +#ifdef _WIN32 + case gui::utils::shortcut_location::rpcs3_shortcuts: return "rpcs3"; +#endif + } + + return unknown; + }); +} + namespace gui::utils { #ifdef _WIN32 @@ -109,6 +129,7 @@ namespace gui::utils } std::string link_path; + bool append_rpcs3 = false; switch (location) { @@ -117,6 +138,13 @@ namespace gui::utils break; case shortcut_location::applications: link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ApplicationsLocation).toStdString(); + append_rpcs3 = true; + break; + case shortcut_location::steam: +#ifdef __APPLE__ + link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ApplicationsLocation).toStdString(); + append_rpcs3 = true; +#endif break; #ifdef _WIN32 case shortcut_location::rpcs3_shortcuts: @@ -126,13 +154,13 @@ namespace gui::utils #endif } - if (!fs::is_dir(link_path) && !fs::create_dir(link_path)) + if (!link_path.empty() && !fs::is_dir(link_path) && !fs::create_dir(link_path)) { sys_log.error("Failed to create shortcut. Folder does not exist: %s", link_path); return false; } - if (location == shortcut_location::applications) + if (append_rpcs3) { link_path += "/RPCS3"; @@ -144,6 +172,29 @@ namespace gui::utils } #ifdef _WIN32 + const std::string working_dir{fs::get_executable_dir()}; + const std::string rpcs3_path{fs::get_executable_path()}; + std::string target_icon_path; + + if (!src_icon_path.empty() && !target_icon_dir.empty()) + { + if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) + { + sys_log.error("Failed to create shortcut: .ico creation failed"); + return false; + } + } + + if (location == shortcut_location::steam) + { + sys_log.notice("Creating %s shortcut with arguments '%s' and icon path '%s'", location, target_cli_args, target_icon_path); + steam_shortcut steam_sc{}; + steam_sc.add_shortcut(simple_name, rpcs3_path, working_dir, target_cli_args, target_icon_path); + return steam_sc.write_file(); + } + + sys_log.notice("Creating %s shortcut '%s' with arguments '%s' and .ico dir '%s'", location, link_path, target_cli_args, target_icon_dir); + const auto str_error = [](HRESULT hr) -> std::string { _com_error err(hr); @@ -153,8 +204,6 @@ namespace gui::utils fmt::append(link_path, "/%s.lnk", simple_name); - sys_log.notice("Creating shortcut '%s' with arguments '%s' and .ico dir '%s'", link_path, target_cli_args, target_icon_dir); - // https://stackoverflow.com/questions/3906974/how-to-programmatically-create-a-shortcut-using-win32 HRESULT res = CoInitialize(NULL); if (FAILED(res)) @@ -177,9 +226,6 @@ namespace gui::utils if (FAILED(res)) return cleanup(false, "CoCreateInstance failed"); - const std::string working_dir{ fs::get_executable_dir() }; - const std::string rpcs3_path{ working_dir + "rpcs3.exe" }; - const std::wstring w_target_file = utf8_to_wchar(rpcs3_path); res = pShellLink->SetPath(w_target_file.c_str()); if (FAILED(res)) @@ -206,12 +252,8 @@ namespace gui::utils return cleanup(false, fmt::format("SetDescription failed (%s)", str_error(res))); } - if (!src_icon_path.empty() && !target_icon_dir.empty()) + if (!target_icon_path.empty()) { - std::string target_icon_path; - if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) - return cleanup(false, ".ico creation failed"); - const std::wstring w_icon_path = utf8_to_wchar(target_icon_path); res = pShellLink->SetIconLocation(w_icon_path.c_str(), 0); if (FAILED(res)) @@ -241,9 +283,10 @@ namespace gui::utils return cleanup(true, {}); #elif defined(__APPLE__) + fmt::append(link_path, "/%s.app", simple_name); - sys_log.notice("Creating shortcut '%s' with arguments '%s'", link_path, target_cli_args); + sys_log.notice("Creating %s shortcut '%s' with arguments '%s'", location, link_path, target_cli_args); const std::string contents_dir = link_path + "/Contents/"; const std::string macos_dir = contents_dir + "MacOS/"; @@ -320,9 +363,10 @@ namespace gui::utils } plist_file.close(); + std::string target_icon_path; if (!src_icon_path.empty()) { - std::string target_icon_path = resources_dir; + target_icon_path = resources_dir; if (!create_square_shortcut_icon_file(path, src_icon_path, resources_dir, target_icon_path, 512)) { // Error is logged in create_square_shortcut_icon_file @@ -330,10 +374,16 @@ namespace gui::utils } } + if (location == shortcut_location::steam) + { + steam_shortcut steam_sc{}; + steam_sc.add_shortcut(simple_name, launcher_path, macos_dir, ""/*target_cli_args are already in the launcher*/, target_icon_path); + return steam_sc.write_file(); + } + return true; #else - const std::string exe_path = fs::get_executable_path(); if (exe_path.empty()) { @@ -341,9 +391,28 @@ namespace gui::utils return false; } + std::string target_icon_path; + if (!src_icon_path.empty() && !target_icon_dir.empty()) + { + if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) + { + // Error is logged in create_square_shortcut_icon_file + return false; + } + } + + if (location == shortcut_location::steam) + { + sys_log.notice("Creating %s shortcut with arguments '%s' and icon path '%s'", location, target_cli_args, target_icon_path); + const std::string working_dir{fs::get_executable_dir()}; + steam_shortcut steam_sc{}; + steam_sc.add_shortcut(simple_name, exe_path, working_dir, target_cli_args, target_icon_path); + return steam_sc.write_file(); + } + fmt::append(link_path, "/%s.desktop", simple_name); - sys_log.notice("Creating shortcut '%s' for '%s' with arguments '%s'", link_path, exe_path, target_cli_args); + sys_log.notice("Creating %s shortcut '%s' for '%s' with arguments '%s'", location, link_path, exe_path, target_cli_args); std::string file_content; fmt::append(file_content, "[Desktop Entry]\n"); @@ -360,15 +429,8 @@ namespace gui::utils fmt::append(file_content, "Comment=%s\n", QString::fromStdString(description).simplified()); } - if (!src_icon_path.empty() && !target_icon_dir.empty()) + if (!target_icon_path.empty()) { - std::string target_icon_path; - if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) - { - // Error is logged in create_square_shortcut_icon_file - return false; - } - fmt::append(file_content, "Icon=%s\n", target_icon_path); } @@ -438,7 +500,8 @@ namespace gui::utils std::vector locations = { shortcut_location::desktop, - shortcut_location::applications + shortcut_location::applications, + shortcut_location::steam, }; #ifdef _WIN32 locations.push_back(shortcut_location::rpcs3_shortcuts); @@ -457,6 +520,18 @@ namespace gui::utils link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ApplicationsLocation).toStdString(); link_path += "/RPCS3"; break; + case shortcut_location::steam: + { + const std::string exe_path = fs::get_executable_path(); + const std::string working_dir = fs::get_executable_dir(); + steam_shortcut steam_sc{}; + steam_sc.remove_shortcut(simple_name, exe_path, working_dir); + if (!steam_sc.write_file()) + { + sys_log.error("Failed to remove steam shortcut for '%s'", simple_name); + } + continue; + } #ifdef _WIN32 case shortcut_location::rpcs3_shortcuts: link_path = rpcs3::utils::get_games_shortcuts_dir(); diff --git a/rpcs3/rpcs3qt/shortcut_utils.h b/rpcs3/rpcs3qt/shortcut_utils.h index 4e7fcdf0ce..2b5d302710 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.h +++ b/rpcs3/rpcs3qt/shortcut_utils.h @@ -6,6 +6,7 @@ namespace gui::utils { desktop, applications, + steam, #ifdef _WIN32 rpcs3_shortcuts, #endif diff --git a/rpcs3/rpcs3qt/steam_utils.cpp b/rpcs3/rpcs3qt/steam_utils.cpp new file mode 100644 index 0000000000..24ceec273e --- /dev/null +++ b/rpcs3/rpcs3qt/steam_utils.cpp @@ -0,0 +1,807 @@ +#include "stdafx.h" +#include "steam_utils.h" + +#include + +#ifdef _WIN32 +#include +#include +#else +#include +#include +#endif + +LOG_CHANNEL(sys_log, "SYS"); + +namespace gui::utils +{ + void steam_shortcut::add_shortcut( + const std::string& app_name, + const std::string& exe, + const std::string& start_dir, + const std::string& launch_options, + const std::string& icon_path) + { + shortcut_entry entry{}; + entry.app_name = app_name; + entry.exe = quote(fix_slashes(exe), true); + entry.start_dir = quote(fix_slashes(start_dir), false); + entry.launch_options = launch_options; + entry.icon = quote(fix_slashes(icon_path), false); + entry.appid = steam_appid(exe, app_name); + + m_entries_to_add.push_back(std::move(entry)); + } + + void steam_shortcut::remove_shortcut( + const std::string& app_name, + const std::string& exe, + const std::string& start_dir) + { + shortcut_entry entry{}; + entry.app_name = app_name; + entry.exe = quote(fix_slashes(exe), true); + entry.start_dir = quote(fix_slashes(start_dir), false); + entry.appid = steam_appid(exe, app_name); + + m_entries_to_remove.push_back(std::move(entry)); + } + + bool steam_shortcut::parse_file(const std::string& path) + { + m_vdf_entries.clear(); + + fs::file vdf(path); + if (!vdf) + { + sys_log.error("Failed to parse steam shortcut file '%s': %s", path, fs::g_tls_error); + return false; + } + + const std::vector data = vdf.to_vector(); + usz last_pos = 0; + usz pos = 0; + + const auto read_type_id = [&]() -> u8 + { + if (pos >= data.size()) + { + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: read_type_id: end of file", path, pos); + return umax; + } + + last_pos = pos; + return data[pos++]; + }; + + const auto read_u32 = [&]() -> std::optional + { + if ((pos + sizeof(u32)) > data.size()) + { + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: read_u32: end of file", path, pos); + return {}; + } + + last_pos = pos; + + u32 v {}; + std::memcpy(&v, &data[pos], sizeof(u32)); + pos += sizeof(u32); + return v; + }; + + const auto read_string = [&]() -> std::optional + { + if (pos >= data.size()) + { + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: read_string: end of file", path, pos); + return {}; + } + + last_pos = pos; + + std::string str; + + while (pos < data.size()) + { + const u8 c = data[pos++]; + if (!c) break; + str += c; + } + + if (pos >= data.size()) + { + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: read_string: not null terminated", path, last_pos); + return {}; + } + + return str; + }; + + #define CHECK_VDF(cond, msg) \ + if (!(cond)) \ + { \ + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: %s", path, last_pos, msg); \ + return false; \ + } + + #define READ_VDF_STRING(name) \ + const std::optional name##_opt = read_string(); \ + if (!name##_opt.has_value()) return false; \ + std::string name = name##_opt.value(); + + #define READ_VDF_U32(name) \ + const std::optional name##_opt = read_u32(); \ + if (!name##_opt.has_value()) return false; \ + const u32 name = name##_opt.value(); + + CHECK_VDF(read_type_id() == type_id::Start, "expected type_id::Start for shortcuts"); + READ_VDF_STRING(shortcuts); + CHECK_VDF(shortcuts == "shortcuts", "expected 'shortcuts' key"); + + for (usz index = 0; true; index++) + { + vdf_shortcut_entry entry {}; + + u8 type = read_type_id(); + if (type == type_id::End) + { + // End of shortcuts + break; + } + + CHECK_VDF(type == type_id::Start, "expected type_id::Start for entry"); + + READ_VDF_STRING(entry_index_str); + u64 entry_index = 0; + CHECK_VDF(try_to_uint64(&entry_index, entry_index_str, 0, umax), "failed to convert entry index"); + CHECK_VDF(entry_index == index, "unexpected entry index"); + + type = umax; + while (type != type_id::Start) + { + type = read_type_id(); + + switch (type) + { + case type_id::String: + { + READ_VDF_STRING(key); + READ_VDF_STRING(value); + CHECK_VDF(!key.empty(), "key is empty"); + entry.values.push_back({std::move(key), std::move(value)}); + break; + } + case type_id::Integer: + { + READ_VDF_STRING(key); + READ_VDF_U32(value); + CHECK_VDF(!key.empty(), "key is empty"); + entry.values.push_back({std::move(key), value}); + break; + } + case type_id::Start: + // Expect tags next + break; + default: + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: unexpected type id 0x%x", path, last_pos, type); + return false; + } + } + + CHECK_VDF(type == type_id::Start, "expected type_id::Start for tags"); + READ_VDF_STRING(tags); + CHECK_VDF(tags == "tags", "key is empty"); + type = umax; + while (type != type_id::End) + { + type = read_type_id(); + + switch (type) + { + case type_id::String: + { + READ_VDF_STRING(key); + READ_VDF_STRING(value); + CHECK_VDF(!key.empty(), "key is empty"); + entry.tags.push_back({std::move(key), std::move(value)}); + break; + } + case type_id::End: + break; + default: + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: unexpected type id 0x%x", path, last_pos, type); + return false; + } + } + CHECK_VDF(type == type_id::End, "expected type_id::End for tags"); + + CHECK_VDF(read_type_id() == type_id::End, "expected type_id::End for entry"); + + m_vdf_entries.push_back(std::move(entry)); + } + + CHECK_VDF(read_type_id() == type_id::End, "expected type_id::End for end of file"); + CHECK_VDF(pos == data.size(), fmt::format("bytes found at end of file (pos=%d, size=%d)", pos, data.size())); + + #undef CHECK_VDF_OPT + #undef CHECK_VDF + return true; + } + + bool steam_shortcut::write_file() + { + if (m_entries_to_add.empty() && m_entries_to_remove.empty()) + { + sys_log.error("Failed to create steam shortcut: No entries."); + return false; + } + + const std::string steam_path = get_steam_path(); + if (steam_path.empty()) + { + sys_log.error("Failed to create steam shortcut: Steam directory not found."); + return false; + } + + if (!fs::is_dir(steam_path)) + { + sys_log.error("Failed to create steam shortcut: '%s' not a directory.", steam_path); + return false; + } + + const std::string user_id = get_last_active_steam_user(steam_path); + if (user_id.empty()) + { + sys_log.error("Failed to create steam shortcut: last active user not found."); + return false; + } + + const std::string user_dir = steam_path + "/userdata/" + user_id + "/config/"; + if (!fs::is_dir(user_dir)) + { + sys_log.error("Failed to create steam shortcut: '%s' not a directory.", user_dir); + return false; + } + + if (is_steam_running()) + { + sys_log.error("Failed to create steam shortcut: steam is running."); + return false; + } + + const std::string file_path = user_dir + "shortcuts.vdf"; + const std::string backup_path = fs::get_config_dir() + "/shortcuts.vdf.backup"; + + if (fs::is_file(file_path)) + { + if (!fs::copy_file(file_path, backup_path, true)) + { + sys_log.error("Failed to backup steam shortcut file '%s'", file_path); + return false; + } + + if (!parse_file(file_path)) + { + sys_log.error("Failed to parse steam shortcut file '%s'", file_path); + return false; + } + } + + std::vector removed_entries; + + for (const shortcut_entry& entry : m_entries_to_remove) + { + bool removed_entry = false; + for (auto it = m_vdf_entries.begin(); it != m_vdf_entries.end();) + { + const auto appid = it->value("appid"); + const auto exe = it->value("Exe"); + const auto start_dir = it->value("StartDir"); + + if (appid.has_value() && appid.value() == entry.appid && + exe.has_value() && exe.value() == entry.exe && + start_dir.has_value() && start_dir.value() == entry.start_dir) + { + sys_log.notice("Removing steam shortcut for '%s'", entry.app_name); + it = m_vdf_entries.erase(it); + removed_entry = true; + } + else + { + it++; + } + } + + if (removed_entry) + { + removed_entries.push_back(entry); + } + + if (m_vdf_entries.empty()) + { + break; + } + } + + for (const vdf_shortcut_entry& entry : m_vdf_entries) + { + for (auto it = m_entries_to_add.begin(); it != m_entries_to_add.end();) + { + const auto appid = entry.value("appid"); + const auto exe = entry.value("Exe"); + const auto start_dir = entry.value("StartDir"); + const auto launch_options = entry.value("LaunchOptions"); + const auto icon = entry.value("icon"); + + if (appid.has_value() && appid.value() == it->appid && + exe.has_value() && exe.value() == it->exe && + start_dir.has_value() && start_dir.value() == it->start_dir && + launch_options.has_value() && launch_options.value() == it->launch_options && + icon.has_value() && icon.value() == it->icon) + { + sys_log.notice("Entry '%s' already exists in steam shortcut file '%s'.", it->app_name, file_path); + it = m_entries_to_add.erase(it); + } + else + { + it++; + } + } + + if (m_entries_to_add.empty()) + { + break; + } + } + + if (m_entries_to_add.empty() && removed_entries.empty()) + { + sys_log.notice("No matching entries found in steam shortcut file '%s'.", file_path); + return true; + } + + usz index = 0; + std::string content; + + content += type_id::Start; + append(content, "shortcuts"); + for (const vdf_shortcut_entry& entry : m_vdf_entries) + { + const auto val = entry.build_binary_blob(index++); + if (!val.has_value()) + { + sys_log.error("Failed to create steam shortcut '%s': '%s'", file_path, val.error()); + return false; + } + content += val.value(); + } + for (const shortcut_entry& entry : m_entries_to_add) + { + content += entry.build_binary_blob(index++); + } + content += type_id::End; + content += type_id::End; // End of file + + if (!fs::write_file(file_path, fs::rewrite, content)) + { + sys_log.error("Failed to create steam shortcut '%s': '%s'", file_path, fs::g_tls_error); + + if (!fs::copy_file(backup_path, file_path, true)) + { + sys_log.error("Failed to restore steam shortcuts backup: '%s'", fs::g_tls_error); + } + + return false; + } + + for (const shortcut_entry& entry : m_entries_to_add) + { + sys_log.success("Created steam shortcut for '%s'", entry.app_name); + } + for (const shortcut_entry& entry : removed_entries) + { + sys_log.success("Removed steam shortcut(s) for '%s'", entry.app_name); + } + return true; + } + + u32 steam_shortcut::crc32(const std::string& data) + { + u32 crc = 0xFFFFFFFF; + + for (u8 c : data) + { + crc ^= c; + + for (int i = 0; i < 8; i++) + { + crc = (crc >> 1) ^ (0xEDB88320 & -static_cast(crc & 1)); + } + } + + return ~crc; + } + + bool steam_shortcut::steam_installed() + { + const std::string path = get_steam_path(); + return !path.empty() && fs::is_dir(path); + } + + u32 steam_shortcut::steam_appid(const std::string& exe, const std::string& name) + { + return crc32(exe + name) | 0x80000000; + } + + void steam_shortcut::append(std::string& s, const std::string& val) + { + s += val; + s += '\0'; // append null terminator + } + + std::string steam_shortcut::quote(const std::string& s, bool force) + { + if (force || s.contains(" ")) + { + return "\"" + s + "\""; + } + + return s; + } + + std::string steam_shortcut::fix_slashes(const std::string& s) + { +#ifdef _WIN32 + return fmt::replace_all(s, "/", "\\"); +#else + return s; +#endif + } + + std::string steam_shortcut::kv_string(const std::string& key, const std::string& value) + { + std::string ret; + ret += type_id::String; + append(ret, key); + append(ret, value); + return ret; + } + + std::string steam_shortcut::kv_int(const std::string& key, u32 value) + { + std::string str; + str.reserve(64); + str += type_id::Integer; + append(str, key); + str += static_cast(value & 0xFF); + str += static_cast((value >> 8) & 0xFF); + str += static_cast((value >> 16) & 0xFF); + str += static_cast((value >> 24) & 0xFF); + return str; + } + + std::string steam_shortcut::shortcut_entry::build_binary_blob(usz index) const + { + std::string str; + str.reserve(1024); + str += type_id::Start; + + append(str, std::to_string(index)); + + str += kv_int("appid", appid); + str += kv_string("AppName", app_name); + str += kv_string("Exe", exe); + str += kv_string("StartDir", start_dir); + str += kv_string("icon", icon); + str += kv_string("ShortcutPath", ""); + str += kv_string("LaunchOptions", launch_options); + str += kv_int("IsHidden", 0); + str += kv_int("AllowDesktopConfig", 1); + str += kv_int("AllowOverlay", 1); + str += kv_int("OpenVR", 0); + str += kv_int("Devkit", 0); + str += kv_string("DevkitGameID", ""); + str += kv_int("DevkitOverrideAppID", 0); + str += kv_int("LastPlayTime", 0); + str += kv_string("FlatpakAppID", ""); + str += kv_string("sortas", ""); + + str += type_id::Start; + append(str, "tags"); + str += type_id::End; + + str += type_id::End; + return str; + } + + std::expected steam_shortcut::vdf_shortcut_entry::build_binary_blob(usz index) const + { + std::string str; + str.reserve(1024); + str += type_id::Start; + + append(str, std::to_string(index)); + + std::optional error = std::nullopt; + for (const auto& [key, value] : values) + { + std::visit([&key, &str, &error](const auto& value) + { + using T = std::decay_t; + + if constexpr (std::is_same_v) + { + str += kv_string(key, value); + } + else if constexpr (std::is_same_v) + { + str += kv_int(key, value); + } + else + { + error = fmt::format("vdf entry for key '%s' has unexpected type '%s'", key, typeid(value).name()); + } + }, + value); + + if (error.has_value()) + { + return std::unexpected(error.value()); + } + } + + str += type_id::Start; + append(str, "tags"); + for (const auto& [key, value] : tags) + { + str += kv_string(key, value); + } + str += type_id::End; + + str += type_id::End; + return str; + } + +#ifdef _WIN32 + std::string get_registry_string(const wchar_t* key, const wchar_t* name) + { + HKEY hkey = NULL; + LSTATUS status = RegOpenKeyW(HKEY_CURRENT_USER, key, &hkey); + if (status != ERROR_SUCCESS) + { + sys_log.trace("get_registry_string: RegOpenKeyW failed: %s (key='%s', name='%s')", fmt::win_error{static_cast(status), nullptr}, wchar_to_utf8(key), wchar_to_utf8(name)); + return ""; + } + + std::wstring path_buffer; + DWORD type = 0U; + do + { + path_buffer.resize(path_buffer.size() + MAX_PATH); + DWORD buffer_size = static_cast((path_buffer.size() - 1) * sizeof(wchar_t)); + status = RegQueryValueExW(hkey, name, NULL, &type, reinterpret_cast(path_buffer.data()), &buffer_size); + } + while (status == ERROR_MORE_DATA); + + const LSTATUS close_status = RegCloseKey(hkey); + if (close_status != ERROR_SUCCESS) + { + sys_log.error("get_registry_string: RegCloseKey failed: %s (key='%s', name='%s')", fmt::win_error{static_cast(close_status), nullptr}, wchar_to_utf8(key), wchar_to_utf8(name)); + } + + if (status != ERROR_SUCCESS) + { + sys_log.trace("get_registry_string: RegQueryValueExW failed: %s (key='%s', name='%s')", fmt::win_error{static_cast(status), nullptr}, wchar_to_utf8(key), wchar_to_utf8(name)); + return ""; + } + + if ((type == REG_SZ) || (type == REG_EXPAND_SZ) || (type == REG_MULTI_SZ)) + { + return wchar_to_utf8(path_buffer.data()); + } + + return ""; + } +#endif + + std::string steam_shortcut::steamid64_to_32(const std::string& steam_id) + { + u64 id = 0; + if (!try_to_uint64(&id, steam_id, 0, umax)) + { + sys_log.error("Failed to convert steam id '%s' to u64", steam_id); + return ""; + } + constexpr u64 base = 76561197960265728ULL; + const u32 id32 = static_cast(id - base); + return std::to_string(id32); + } + + std::string steam_shortcut::get_steam_path() + { +#ifdef _WIN32 + const std::string path = get_registry_string(L"Software\\Valve\\Steam", L"SteamPath"); + if (path.empty()) + { + sys_log.notice("get_steam_path: SteamPath not found in registry"); + return ""; + } + + // The path might be lowercase... sigh + std::error_code ec; + const std::filesystem::path canonical_path = std::filesystem::canonical(std::filesystem::path(path), ec); + if (ec) + { + sys_log.error("get_steam_path: Failed to canonicalize path '%s': %s", path, ec.message()); + return ""; + } + + const std::string path_fixed = canonical_path.string(); + sys_log.notice("get_steam_path: Found steam registry path: '%s'", path_fixed); + return path_fixed; +#else + if (const char* home = ::getenv("HOME")) + { +#if __APPLE__ + const std::string path = std::string(home) + "/Library/Application Support/Steam/"; +#else + const std::string path = std::string(home) + "/.local/share/Steam/"; +#endif + return path; + } + + return ""; +#endif + } + + std::string steam_shortcut::get_last_active_steam_user(const std::string& steam_path) + { + const std::string vdf_path = steam_path + "/config/loginusers.vdf"; + fs::file vdf(vdf_path); + if (!vdf) + { + sys_log.error("get_last_active_steam_user: Failed to parse steam loginusers file '%s': %s", vdf_path, fs::g_tls_error); + return ""; + } + + // The file looks roughly like this. We need the numerical ID. + // "users" + // { + // "12345678901234567" + // { + // "AccountName" "myusername" + // "MostRecent" "1" + // ... + // } + // ... + // } + + const std::string content = vdf.to_string(); + + usz user_count = 0; + + const auto find_user_id = [&content, &user_count](const std::string& key, const std::string& comp) -> std::string + { + user_count = 0; + usz pos = 0; + while (true) + { + pos = content.find(key, pos); + if (pos == umax) break; + + user_count++; + + const usz val_start = content.find('"', pos + key.size()); + if (val_start == umax) break; + + const usz val_end = content.find('"', val_start + 1); + if (val_end == umax) break; + + const std::string value = content.substr(val_start + 1, val_end - val_start - 1); + + if (value != comp) + { + pos = val_end + 1; + continue; + } + + const usz pos_brace = content.rfind('{', pos - 2); + if (pos_brace == umax) return ""; + + const usz pos_end = content.rfind('"', pos_brace - 2); + if (pos_end == umax) return ""; + + const usz pos_start = content.rfind('"', pos_end - 1); + if (pos_start == umax) return ""; + + const std::string user_id_64 = content.substr(pos_start + 1, pos_end - pos_start - 1); + return steamid64_to_32(user_id_64); + } + + return ""; + }; + + if (const std::string id = find_user_id("\"MostRecent\"", "1"); !id.empty()) + { + return id; + } + +#ifdef _WIN32 + // Fallback to AutoLoginUser + const std::string username = get_registry_string(L"Software\\Valve\\Steam", L"AutoLoginUser"); + if (username.empty()) + { + sys_log.notice("get_last_active_steam_user: AutoLoginUser not found in registry"); + return ""; + } + + sys_log.notice("get_last_active_steam_user: Found steam user: '%s'", username); + + if (const std::string id = find_user_id("\"AccountName\"", username); !id.empty()) + { + return id; + } +#endif + + sys_log.error("get_last_active_steam_user: Failed to parse steam loginusers file '%s' (user_count=%d)", vdf_path, user_count); + return ""; + } + + bool steam_shortcut::is_steam_running() + { +#ifdef _WIN32 + if (HANDLE mutex = OpenMutexA(SYNCHRONIZE, FALSE, "Global\\SteamClientRunning")) + { + CloseHandle(mutex); + return true; + } + + // Fallback to check process + PROCESSENTRY32 entry{}; + entry.dwSize = sizeof(entry); + + HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + + if (Process32First(snapshot, &entry)) + { + do + { + if (lstrcmpiW(entry.szExeFile, L"steam.exe") == 0) + { + CloseHandle(snapshot); + return true; + } + } while (Process32Next(snapshot, &entry)); + } + + CloseHandle(snapshot); +#else + std::vector pid_paths = { get_steam_path() }; +#ifdef __linux__ + if (const char* home = ::getenv("HOME")) + { + pid_paths.push_back(std::string(home) + "/.steam"); + pid_paths.push_back(std::string(home) + "/.steam/steam"); + } +#endif + for (const std::string& pid_path : pid_paths) + { + if (fs::file pid_file(pid_path + "/steam.pid"); pid_file) + { + const std::string pid = pid_file.to_string(); + pid_file.close(); + + if (pid.empty()) + { + continue; + } + + const pid_t pid_val = std::stoi(pid); + return kill(pid_val, 0) == 0 || errno != ESRCH; + } + } +#endif + return false; + } +} diff --git a/rpcs3/rpcs3qt/steam_utils.h b/rpcs3/rpcs3qt/steam_utils.h new file mode 100644 index 0000000000..3a1ce2c3a1 --- /dev/null +++ b/rpcs3/rpcs3qt/steam_utils.h @@ -0,0 +1,104 @@ +#pragma once + +#include "util/types.hpp" +#include "Utilities/StrFmt.h" +#include +#include + +namespace gui::utils +{ + class steam_shortcut + { + public: + steam_shortcut() {} + ~steam_shortcut() {} + + void add_shortcut( + const std::string& app_name, + const std::string& exe, + const std::string& start_dir, + const std::string& launch_options, + const std::string& icon_path); + + void remove_shortcut( + const std::string& app_name, + const std::string& exe, + const std::string& start_dir); + + bool write_file(); + + static bool steam_installed(); + static bool is_steam_running(); + + private: + enum type_id + { + Null = 0x00, + Start = Null, + String = 0x01, + Integer = 0x02, + Float = 0x03, + Pointer = 0x04, + Nested = 0x05, + Array = 0x06, + Bool = 0x07, + End = 0x08, + }; + + struct shortcut_entry + { + std::string app_name; + std::string exe; + std::string start_dir; + std::string launch_options; + std::string icon; + u32 appid = 0; + + std::string build_binary_blob(usz index) const; + }; + + struct vdf_shortcut_entry + { + std::vector>> values; + std::vector> tags; + + template + std::expected value(const std::string& key) const + { + const auto it = std::find_if(values.cbegin(), values.cend(), [&key](const auto& v){ return v.first == key; }); + if (it == values.cend()) + { + return std::unexpected(fmt::format("key '%s' not found", key)); + } + + if (const auto* p = std::get_if(&it->second)) + { + return *p; + } + + return std::unexpected(fmt::format("value for key '%s' has wrong type", key)); + } + + std::expected build_binary_blob(usz index) const; + }; + + bool parse_file(const std::string& path); + + static u32 crc32(const std::string& data); + static u32 steam_appid(const std::string& exe, const std::string& name); + + static void append(std::string& s, const std::string& val); + + static std::string quote(const std::string& s, bool force); + static std::string fix_slashes(const std::string& s); + static std::string kv_string(const std::string& key, const std::string& value); + static std::string kv_int(const std::string& key, u32 value); + static std::string steamid64_to_32(const std::string& steam_id); + static std::string get_steam_path(); + static std::string get_last_active_steam_user(const std::string& steam_path); + + std::vector m_entries_to_add; + std::vector m_entries_to_remove; + std::vector m_vdf_entries; + }; +} From 7859a5f9d2dc6a578241d620fbd33c53e696829c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 16 Mar 2026 10:37:40 +0100 Subject: [PATCH 434/630] input: log warning instead of throwing an exception when the dpad has an unknown value --- rpcs3/Input/ds4_pad_handler.cpp | 7 ++++++- rpcs3/Input/dualsense_pad_handler.cpp | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rpcs3/Input/ds4_pad_handler.cpp b/rpcs3/Input/ds4_pad_handler.cpp index 50d38773a3..d983a95e2c 100644 --- a/rpcs3/Input/ds4_pad_handler.cpp +++ b/rpcs3/Input/ds4_pad_handler.cpp @@ -334,7 +334,12 @@ std::unordered_map ds4_pad_handler::get_button_values(const std::share keyBuffer[DS4KeyCodes::Right] = 0; break; default: - fmt::throw_exception("ds4 dpad state encountered unexpected input"); + keyBuffer[DS4KeyCodes::Up] = 0; + keyBuffer[DS4KeyCodes::Down] = 0; + keyBuffer[DS4KeyCodes::Left] = 0; + keyBuffer[DS4KeyCodes::Right] = 0; + ds4_log.warning("dpad state encountered unexpected input: 0x%x", dpadState); + break; } // square, cross, circle, triangle diff --git a/rpcs3/Input/dualsense_pad_handler.cpp b/rpcs3/Input/dualsense_pad_handler.cpp index 91713afa34..8c07e5f028 100644 --- a/rpcs3/Input/dualsense_pad_handler.cpp +++ b/rpcs3/Input/dualsense_pad_handler.cpp @@ -723,7 +723,12 @@ std::unordered_map dualsense_pad_handler::get_button_values(const std: keyBuffer[DualSenseKeyCodes::Right] = 0; break; default: - fmt::throw_exception("dualsense dpad state encountered unexpected input"); + keyBuffer[DualSenseKeyCodes::Up] = 0; + keyBuffer[DualSenseKeyCodes::Down] = 0; + keyBuffer[DualSenseKeyCodes::Left] = 0; + keyBuffer[DualSenseKeyCodes::Right] = 0; + dualsense_log.warning("dpad state encountered unexpected input: 0x%x", data); + break; } data = (is_simple_mode ? input.z : input.buttons[0]) >> 4; From 5cb688f30900be302d4c7baed30e06c72122b529 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 1 Mar 2026 17:17:42 +0300 Subject: [PATCH 435/630] rsx/overlays: Implement tabbed containers --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/RSX/Overlays/overlay_controls.cpp | 316 +++++++++++-------- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 5 +- rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp | 87 +++-- rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp | 4 + rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp | 142 +++++++++ rpcs3/Emu/RSX/Overlays/overlay_tabs.h | 40 +++ rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 + 9 files changed, 442 insertions(+), 161 deletions(-) create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_tabs.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 63951cfe92..c7eea83995 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -517,6 +517,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/overlay_perf_metrics.cpp RSX/Overlays/overlay_progress_bar.cpp RSX/Overlays/overlay_save_dialog.cpp + RSX/Overlays/overlay_tabs.cpp RSX/Overlays/overlay_trophy_notification.cpp RSX/Overlays/overlay_user_list_dialog.cpp RSX/Overlays/overlay_utils.cpp diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp index 65ef78be4d..96ffaac93d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp @@ -579,43 +579,49 @@ namespace rsx compiled_resource& overlay_element::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - compiled_resources.clear(); + return compiled_resources; + } - compiled_resource compiled_resources_temp = {}; - auto& cmd_bg = compiled_resources_temp.append({}); - auto& config = cmd_bg.config; + m_is_compiled = true; + compiled_resources.clear(); - config.color = back_color; - config.pulse_glow = pulse_effect_enabled; - config.pulse_sinus_offset = pulse_sinus_offset; - config.pulse_speed_modifier = pulse_speed_modifier; + if (!is_visible()) + { + return compiled_resources; + } - auto& verts = compiled_resources_temp.draw_commands.front().verts; - verts.resize(4); + compiled_resource compiled_resources_temp = {}; + auto& cmd_bg = compiled_resources_temp.append({}); + auto& config = cmd_bg.config; - verts[0].vec4(x, y, 0.f, 0.f); - verts[1].vec4(f32(x + w), y, 1.f, 0.f); - verts[2].vec4(x, f32(y + h), 0.f, 1.f); - verts[3].vec4(f32(x + w), f32(y + h), 1.f, 1.f); + config.color = back_color; + config.pulse_glow = pulse_effect_enabled; + config.pulse_sinus_offset = pulse_sinus_offset; + config.pulse_speed_modifier = pulse_speed_modifier; - compiled_resources.add(std::move(compiled_resources_temp), margin_left, margin_top); + auto& verts = compiled_resources_temp.draw_commands.front().verts; + verts.resize(4); - if (!text.empty()) - { - compiled_resources_temp.clear(); - auto& cmd_text = compiled_resources_temp.append({}); + verts[0].vec4(x, y, 0.f, 0.f); + verts[1].vec4(f32(x + w), y, 1.f, 0.f); + verts[2].vec4(x, f32(y + h), 0.f, 1.f); + verts[3].vec4(f32(x + w), f32(y + h), 1.f, 1.f); - cmd_text.config.set_font(get_font()); - cmd_text.config.color = fore_color; - cmd_text.verts = render_text(text.c_str(), static_cast(x), static_cast(y)); + compiled_resources.add(std::move(compiled_resources_temp), margin_left, margin_top); - if (!cmd_text.verts.empty()) - compiled_resources.add(std::move(compiled_resources_temp), margin_left - horizontal_scroll_offset, margin_top - vertical_scroll_offset); - } + if (!text.empty()) + { + compiled_resources_temp.clear(); + auto& cmd_text = compiled_resources_temp.append({}); - m_is_compiled = true; + cmd_text.config.set_font(get_font()); + cmd_text.config.color = fore_color; + cmd_text.verts = render_text(text.c_str(), static_cast(x), static_cast(y)); + + if (!cmd_text.verts.empty()) + compiled_resources.add(std::move(compiled_resources_temp), margin_left - horizontal_scroll_offset, margin_top - vertical_scroll_offset); } return compiled_resources; @@ -722,6 +728,13 @@ namespace rsx add_element(spacer_element); } + void layout_container::clear_items() + { + m_items.clear(); + advance_pos = 0; + scroll_offset_value = 0; + } + overlay_element* vertical_layout::add_element(std::unique_ptr& item, int offset) { if (auto_resize) @@ -888,27 +901,36 @@ namespace rsx compiled_resource& image_view::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - auto& result = overlay_element::get_compiled(); - auto& cmd_img = result.draw_commands.front(); - - cmd_img.config.set_image_resource(image_resource_ref); - cmd_img.config.color = fore_color; - cmd_img.config.external_data_ref = external_ref; - cmd_img.config.blur_strength = blur_strength; - - // Make padding work for images (treat them as the content instead of the 'background') - auto& verts = cmd_img.verts; - - verts[0] += vertex(padding_left, padding_bottom, 0, 0); - verts[1] += vertex(-padding_right, padding_bottom, 0, 0); - verts[2] += vertex(padding_left, -padding_top, 0, 0); - verts[3] += vertex(-padding_right, -padding_top, 0, 0); - - m_is_compiled = true; + return compiled_resources; } + compiled_resources.clear(); + + if (!is_visible()) + { + m_is_compiled = true; + return compiled_resources; + } + + auto& result = overlay_element::get_compiled(); + auto& cmd_img = result.draw_commands.front(); + + cmd_img.config.set_image_resource(image_resource_ref); + cmd_img.config.color = fore_color; + cmd_img.config.external_data_ref = external_ref; + cmd_img.config.blur_strength = blur_strength; + + // Make padding work for images (treat them as the content instead of the 'background') + auto& verts = cmd_img.verts; + + verts[0] += vertex(padding_left, padding_bottom, 0, 0); + verts[1] += vertex(-padding_right, padding_bottom, 0, 0); + verts[2] += vertex(padding_left, -padding_top, 0, 0); + verts[3] += vertex(-padding_right, -padding_top, 0, 0); + + m_is_compiled = true; return compiled_resources; } @@ -961,29 +983,40 @@ namespace rsx compiled_resource& image_button::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - auto& compiled = image_view::get_compiled(); - for (auto& cmd : compiled.draw_commands) + return compiled_resources; + } + + compiled_resources.clear(); + + if (!is_visible()) + { + m_is_compiled = true; + return compiled_resources; + } + + auto& compiled = image_view::get_compiled(); + for (auto& cmd : compiled.draw_commands) + { + if (cmd.config.texture_ref == image_resource_id::font_file) { - if (cmd.config.texture_ref == image_resource_id::font_file) + // Text, translate geometry to the right + for (auto &v : cmd.verts) { - // Text, translate geometry to the right - for (auto &v : cmd.verts) - { - v.values[0] += m_text_offset_x; - v.values[1] += m_text_offset_y; - } + v.values[0] += m_text_offset_x; + v.values[1] += m_text_offset_y; } } } + m_is_compiled = true; return compiled_resources; } - label::label(const std::string& text) + label::label(std::string_view text) { - set_text(text); + set_text(text.data()); } bool label::auto_resize(bool grow_only, u16 limit_w, u16 limit_h) @@ -1013,90 +1046,97 @@ namespace rsx compiled_resource& rounded_rect::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - compiled_resources.clear(); - -#ifdef __APPLE__ - if (true) -#else - if (radius == 0 || radius > (w / 2)) -#endif - { - // Invalid radius - compiled_resources = overlay_element::get_compiled(); - } - else - { - compiled_resource compiled_resources_temp = {}; - compiled_resources_temp.append({}); // Bg horizontal mid - compiled_resources_temp.append({}); // Bg horizontal top - compiled_resources_temp.append({}); // Bg horizontal bottom - compiled_resources_temp.append({}); // Bg upper-left - compiled_resources_temp.append({}); // Bg lower-left - compiled_resources_temp.append({}); // Bg upper-right - compiled_resources_temp.append({}); // Bg lower-right - - for (auto& draw_cmd : compiled_resources_temp.draw_commands) - { - auto& config = draw_cmd.config; - config.color = back_color; - config.disable_vertex_snap = true; - config.pulse_glow = pulse_effect_enabled; - config.pulse_sinus_offset = pulse_sinus_offset; - config.pulse_speed_modifier = pulse_speed_modifier; - } - - auto& bg0 = compiled_resources_temp.draw_commands[0]; - auto& bg1 = compiled_resources_temp.draw_commands[1]; - auto& bg2 = compiled_resources_temp.draw_commands[2]; - - bg0.verts.emplace_back(f32(x), f32(y + radius), 0.f, 0.f); - bg0.verts.emplace_back(f32(x + w), f32(y + radius), 0.f, 0.f); - bg0.verts.emplace_back(f32(x), f32(y + h) - radius, 0.f, 0.f); - bg0.verts.emplace_back(f32(x + w), f32(y + h) - radius, 0.f, 0.f); - - bg1.verts.emplace_back(f32(x + radius), f32(y), 0.f, 0.f); - bg1.verts.emplace_back(f32(x + w) - radius, f32(y), 0.f, 0.f); - bg1.verts.emplace_back(f32(x + radius), f32(y + radius), 0.f, 0.f); - bg1.verts.emplace_back(f32(x + w) - radius, f32(y + radius), 0.f, 0.f); - - bg2.verts.emplace_back(f32(x + radius), f32(y + h) - radius, 0.f, 0.f); - bg2.verts.emplace_back(f32(x + w) - radius, f32(y + h) - radius, 0.f, 0.f); - bg2.verts.emplace_back(f32(x + radius), f32(y + h), 0.f, 0.f); - bg2.verts.emplace_back(f32(x + w) - radius, f32(y + h), 0.f, 0.f); - - // Generate the quadrants - const f32 corners[4][2] = - { - { f32(x + radius), f32(y + radius) }, - { f32(x + radius), f32(y + h) - radius }, - { f32(x + w) - radius, f32(y + radius) }, - { f32(x + w) - radius, f32(y + h) - radius } - }; - - const f32 radius_f = static_cast(radius); - const f32 scale[4][2] = - { - { -radius_f, -radius_f }, - { -radius_f, +radius_f }, - { +radius_f, -radius_f }, - { +radius_f, +radius_f } - }; - - for (int i = 0; i < 4; ++i) - { - auto& command = compiled_resources_temp.draw_commands[i + 3]; - command.config.primitives = rsx::overlays::primitive_type::triangle_fan; - command.verts = generate_unit_quadrant(num_control_points, corners[i], scale[i]); - } - - compiled_resources.add(std::move(compiled_resources_temp), margin_left, margin_top); - } - - m_is_compiled = true; + return compiled_resources; } + compiled_resources.clear(); + + if (!is_visible()) + { + m_is_compiled = true; + return compiled_resources; + } + +#ifdef __APPLE__ + if (true) +#else + if (radius == 0 || radius > (w / 2)) +#endif + { + // Invalid radius + compiled_resources = overlay_element::get_compiled(); + m_is_compiled = true; + return compiled_resources; + } + + compiled_resource compiled_resources_temp = {}; + compiled_resources_temp.append({}); // Bg horizontal mid + compiled_resources_temp.append({}); // Bg horizontal top + compiled_resources_temp.append({}); // Bg horizontal bottom + compiled_resources_temp.append({}); // Bg upper-left + compiled_resources_temp.append({}); // Bg lower-left + compiled_resources_temp.append({}); // Bg upper-right + compiled_resources_temp.append({}); // Bg lower-right + + for (auto& draw_cmd : compiled_resources_temp.draw_commands) + { + auto& config = draw_cmd.config; + config.color = back_color; + config.disable_vertex_snap = true; + config.pulse_glow = pulse_effect_enabled; + config.pulse_sinus_offset = pulse_sinus_offset; + config.pulse_speed_modifier = pulse_speed_modifier; + } + + auto& bg0 = compiled_resources_temp.draw_commands[0]; + auto& bg1 = compiled_resources_temp.draw_commands[1]; + auto& bg2 = compiled_resources_temp.draw_commands[2]; + + bg0.verts.emplace_back(f32(x), f32(y + radius), 0.f, 0.f); + bg0.verts.emplace_back(f32(x + w), f32(y + radius), 0.f, 0.f); + bg0.verts.emplace_back(f32(x), f32(y + h) - radius, 0.f, 0.f); + bg0.verts.emplace_back(f32(x + w), f32(y + h) - radius, 0.f, 0.f); + + bg1.verts.emplace_back(f32(x + radius), f32(y), 0.f, 0.f); + bg1.verts.emplace_back(f32(x + w) - radius, f32(y), 0.f, 0.f); + bg1.verts.emplace_back(f32(x + radius), f32(y + radius), 0.f, 0.f); + bg1.verts.emplace_back(f32(x + w) - radius, f32(y + radius), 0.f, 0.f); + + bg2.verts.emplace_back(f32(x + radius), f32(y + h) - radius, 0.f, 0.f); + bg2.verts.emplace_back(f32(x + w) - radius, f32(y + h) - radius, 0.f, 0.f); + bg2.verts.emplace_back(f32(x + radius), f32(y + h), 0.f, 0.f); + bg2.verts.emplace_back(f32(x + w) - radius, f32(y + h), 0.f, 0.f); + + // Generate the quadrants + const f32 corners[4][2] = + { + { f32(x + radius), f32(y + radius) }, + { f32(x + radius), f32(y + h) - radius }, + { f32(x + w) - radius, f32(y + radius) }, + { f32(x + w) - radius, f32(y + h) - radius } + }; + + const f32 radius_f = static_cast(radius); + const f32 scale[4][2] = + { + { -radius_f, -radius_f }, + { -radius_f, +radius_f }, + { +radius_f, -radius_f }, + { +radius_f, +radius_f } + }; + + for (int i = 0; i < 4; ++i) + { + auto& command = compiled_resources_temp.draw_commands[i + 3]; + command.config.primitives = rsx::overlays::primitive_type::triangle_fan; + command.verts = generate_unit_quadrant(num_control_points, corners[i], scale[i]); + } + + compiled_resources.add(std::move(compiled_resources_temp), margin_left, margin_top); + + m_is_compiled = true; return compiled_resources; } } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index 350a1c5901..7b95ce4950 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -219,6 +219,8 @@ namespace rsx virtual compiled_resource& get_compiled(); void measure_text(u16& width, u16& height, bool ignore_word_wrap = false) const; virtual void set_selected(bool selected) { static_cast(selected); } + virtual void set_visible(bool visible) { this->visible = visible; m_is_compiled = false; } + virtual bool is_visible() const { return visible; } protected: bool m_is_compiled = false; // Only use m_is_compiled as a getter in is_compiled() if possible @@ -233,6 +235,7 @@ namespace rsx bool auto_resize = true; virtual overlay_element* add_element(std::unique_ptr&, int = -1) = 0; + void clear_items(); layout_container(); @@ -320,7 +323,7 @@ namespace rsx struct label : public overlay_element { label() = default; - label(const std::string& text); + label(std::string_view text); bool auto_resize(bool grow_only = false, u16 limit_w = -1, u16 limit_h = -1); }; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp b/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp index 1b6f4e8fc6..2ff654254c 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp @@ -18,8 +18,8 @@ namespace rsx m_cancel_btn = std::make_unique(120, 20); m_highlight_box = std::make_unique(width, 0); - m_scroll_indicator_top->set_size(width, 40); - m_scroll_indicator_bottom->set_size(width, 40); + m_scroll_indicator_top->set_size(width, 10); + m_scroll_indicator_bottom->set_size(width, 10); m_accept_btn->set_size(120, 30); m_cancel_btn->set_size(120, 30); @@ -37,7 +37,7 @@ namespace rsx m_cancel_btn->set_image_resource(resource_config::standard_image_resource::circle); } - m_scroll_indicator_bottom->set_pos(0, height - 40); + m_scroll_indicator_bottom->set_pos(0, height - 10); m_accept_btn->set_pos(30, height + 20); if (can_deny) @@ -199,6 +199,37 @@ namespace rsx return m_selected_entry; } + void list_view::hide_prompt_buttons(bool hidden) + { + m_accept_btn->set_visible(!hidden); + m_cancel_btn->set_visible(!hidden); + + if (m_deny_btn) + { + m_deny_btn->set_visible(!hidden); + } + + refresh(); + } + + void list_view::hide_scroll_indicators(bool hidden) + { + m_scroll_indicator_top->set_visible(!hidden); + m_scroll_indicator_bottom->set_visible(!hidden); + m_highlight_box->set_visible(!hidden); + + refresh(); + } + + void list_view::disable_selection_pulse(bool disabled) + { + m_highlight_box->pulse_effect_enabled = !disabled; + m_highlight_box->set_sinus_offset(1.5f); + m_highlight_box->refresh(); + + refresh(); + } + void list_view::set_cancel_only(bool cancel_only) { if (cancel_only) @@ -209,7 +240,7 @@ namespace rsx m_cancel_btn->set_pos(x + 180, y + h + 20); m_cancel_only = cancel_only; - m_is_compiled = false; + refresh(); } bool list_view::get_cancel_only() const @@ -233,27 +264,39 @@ namespace rsx compiled_resource& list_view::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - auto& compiled = vertical_layout::get_compiled(); - compiled.add(m_highlight_box->get_compiled()); - compiled.add(m_scroll_indicator_top->get_compiled()); - compiled.add(m_scroll_indicator_bottom->get_compiled()); - compiled.add(m_cancel_btn->get_compiled()); - - if (!m_cancel_only) - { - compiled.add(m_accept_btn->get_compiled()); - - if (m_deny_btn) - { - compiled.add(m_deny_btn->get_compiled()); - } - } - - compiled_resources = compiled; + return compiled_resources; } + compiled_resources.clear(); + + if (!is_visible()) + { + m_is_compiled = true; + return compiled_resources; + } + + auto& compiled = vertical_layout::get_compiled(); + compiled.add(m_highlight_box->get_compiled()); + compiled.add(m_scroll_indicator_top->get_compiled()); + compiled.add(m_scroll_indicator_bottom->get_compiled()); + compiled.add(m_cancel_btn->get_compiled()); + + if (m_cancel_only) + { + m_is_compiled = true; + return compiled_resources; + } + + compiled.add(m_accept_btn->get_compiled()); + + if (m_deny_btn) + { + compiled.add(m_deny_btn->get_compiled()); + } + + m_is_compiled = true; return compiled_resources; } } // namespace overlays diff --git a/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp b/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp index 8f191dd404..ffe2b2f9bf 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp @@ -39,6 +39,10 @@ namespace rsx bool get_cancel_only() const; const overlay_element* get_selected_entry() const; + void hide_prompt_buttons(bool hidden = true); + void hide_scroll_indicators(bool hidden = true); + void disable_selection_pulse(bool disabled = true); + void set_cancel_only(bool cancel_only); void translate(s16 _x, s16 _y) override; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp b/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp new file mode 100644 index 0000000000..91ff87899e --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp @@ -0,0 +1,142 @@ +#include "stdafx.h" +#include "overlay_tabs.h" + +namespace rsx::overlays +{ + tabbed_container::tabbed_container(u16 header_width) + : m_headers_width(header_width) + { + auto_resize = false; + } + + overlay_element* tabbed_container::add_element(std::unique_ptr& item, int offset) + { + return horizontal_layout::add_element(item, offset); + } + + void tabbed_container::add_tab(std::string_view title, std::shared_ptr& panel) + { + std::unique_ptr label_widget = std::make_unique @@ -2839,6 +2842,9 @@ Emu\GPU\RSX\Overlays + + Emu\GPU\RSX\Overlays + From 3c16105c3bcad260416b27421ebf0254802d6cd9 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 8 Mar 2026 18:07:06 +0300 Subject: [PATCH 436/630] overlays/home: Refactor to support having some home pages inside other containers --- .../HomeMenu/overlay_home_menu_components.cpp | 4 +-- .../HomeMenu/overlay_home_menu_components.h | 2 +- .../HomeMenu/overlay_home_menu_main_menu.cpp | 16 ++++----- .../HomeMenu/overlay_home_menu_page.cpp | 35 +++++++++++++++++-- .../HomeMenu/overlay_home_menu_page.h | 4 +++ .../HomeMenu/overlay_home_menu_savestate.cpp | 4 +-- 6 files changed, 50 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp index d0ed9dc460..62a7f3614e 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp @@ -5,14 +5,14 @@ namespace rsx { namespace overlays { - home_menu_entry::home_menu_entry(const std::string& text) + home_menu_entry::home_menu_entry(const std::string& text, u16 width) { std::unique_ptr text_stack = std::make_unique(); std::unique_ptr padding = std::make_unique(); std::unique_ptr title = std::make_unique